firefly-compiler 0.4.40 → 0.4.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.hintrc +4 -4
- package/.vscode/settings.json +4 -4
- package/bin/Release.ff +136 -71
- package/bin/firefly.mjs +1 -1
- package/compiler/Builder.ff +257 -257
- package/compiler/Compiler.ff +227 -227
- package/compiler/Dependencies.ff +186 -186
- package/compiler/DependencyLock.ff +17 -17
- package/compiler/JsEmitter.ff +946 -946
- package/compiler/LspHook.ff +202 -202
- package/compiler/ModuleCache.ff +178 -178
- package/compiler/Workspace.ff +88 -88
- package/core/.firefly/include/package-lock.json +394 -394
- package/core/.firefly/include/package.json +5 -5
- package/core/.firefly/include/prepare.sh +1 -1
- package/core/.firefly/package.ff +2 -2
- package/core/Array.ff +265 -265
- package/core/Atomic.ff +64 -64
- package/core/Box.ff +7 -7
- package/core/BrowserSystem.ff +40 -40
- package/core/BuildSystem.ff +148 -148
- package/core/Crypto.ff +96 -102
- package/core/Equal.ff +36 -36
- package/core/HttpClient.ff +87 -87
- package/core/JsSystem.ff +69 -69
- package/core/Json.ff +434 -434
- package/core/List.ff +486 -415
- package/core/Lock.ff +144 -144
- package/core/NodeSystem.ff +189 -189
- package/core/Ordering.ff +161 -161
- package/core/Path.ff +401 -401
- package/core/Random.ff +134 -134
- package/core/RbMap.ff +216 -216
- package/core/Show.ff +43 -43
- package/core/SourceLocation.ff +68 -68
- package/core/Task.ff +141 -141
- package/experimental/benchmarks/ListGrab.ff +23 -23
- package/experimental/benchmarks/ListGrab.java +55 -55
- package/experimental/benchmarks/Pyrotek45.ff +30 -30
- package/experimental/benchmarks/Pyrotek45.java +64 -64
- package/experimental/bidirectional/Bidi.ff +88 -88
- package/experimental/random/Index.ff +53 -53
- package/experimental/random/Process.ff +120 -120
- package/experimental/random/Scrape.ff +51 -51
- package/experimental/random/Symbols.ff +73 -73
- package/experimental/random/Tensor.ff +52 -52
- package/experimental/random/Units.ff +36 -36
- package/experimental/s3/S3TestAuthorizationHeader.ff +38 -38
- package/experimental/s3/S3TestPut.ff +15 -15
- package/experimental/tests/TestJson.ff +26 -26
- package/firefly.sh +0 -0
- package/fireflysite/Main.ff +13 -13
- package/lsp/.firefly/package.ff +1 -1
- package/lsp/CompletionHandler.ff +808 -811
- package/lsp/Handler.ff +714 -714
- package/lsp/HoverHandler.ff +79 -79
- package/lsp/LanguageServer.ff +272 -272
- package/lsp/SignatureHelpHandler.ff +55 -55
- package/lsp/SymbolHandler.ff +181 -181
- package/lsp/TestReferences.ff +16 -16
- package/lsp/TestReferencesCase.ff +7 -7
- package/lsp/stderr.txt +1 -1
- package/lsp/stdin.txt +10 -10
- package/lsp/stdout.txt +40 -40
- package/lux/.firefly/package.ff +1 -1
- package/lux/Css.ff +648 -648
- package/lux/CssTest.ff +48 -48
- package/lux/Lux.ff +487 -487
- package/lux/LuxEvent.ff +116 -116
- package/lux/Main.ff +128 -128
- package/lux/Main2.ff +144 -144
- package/output/js/ff/compiler/Builder.mjs +43 -43
- package/output/js/ff/compiler/Dependencies.mjs +3 -3
- package/output/js/ff/core/Array.mjs +59 -59
- package/output/js/ff/core/Atomic.mjs +36 -36
- package/output/js/ff/core/BrowserSystem.mjs +11 -11
- package/output/js/ff/core/BuildSystem.mjs +30 -30
- package/output/js/ff/core/Crypto.mjs +58 -62
- package/output/js/ff/core/HttpClient.mjs +24 -24
- package/output/js/ff/core/Json.mjs +147 -147
- package/output/js/ff/core/List.mjs +196 -50
- package/output/js/ff/core/Lock.mjs +97 -97
- package/output/js/ff/core/NodeSystem.mjs +77 -77
- package/output/js/ff/core/Ordering.mjs +8 -8
- package/output/js/ff/core/Path.mjs +231 -231
- package/output/js/ff/core/Random.mjs +56 -56
- package/output/js/ff/core/Task.mjs +31 -31
- package/package.json +29 -29
- package/rpc/.firefly/package.ff +1 -1
- package/rpc/Rpc.ff +69 -69
- package/s3/.firefly/package.ff +1 -1
- package/s3/S3.ff +93 -93
- package/unsafejs/UnsafeJs.ff +19 -19
- package/vscode/LICENSE.txt +21 -21
- package/vscode/Prepublish.ff +15 -15
- package/vscode/README.md +16 -16
- package/vscode/client/package.json +22 -22
- package/vscode/client/src/extension.ts +104 -104
- package/vscode/icons/firefly-icon.svg +10 -10
- package/vscode/language-configuration.json +61 -61
- package/vscode/package-lock.json +3623 -3623
- package/vscode/package.json +160 -160
- package/vscode/snippets.json +241 -241
- package/webserver/.firefly/include/package-lock.json +16 -16
- package/webserver/.firefly/include/package.json +5 -5
- package/webserver/.firefly/package.ff +2 -2
- package/webserver/WebServer.ff +685 -685
- package/websocket/.firefly/package.ff +1 -1
- package/websocket/WebSocket.ff +131 -131
|
@@ -96,26 +96,26 @@ import * as ff_core_Unit from "../../ff/core/Unit.mjs"
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
export function new_() {
|
|
99
|
-
|
|
100
|
-
return [];
|
|
99
|
+
|
|
100
|
+
return [];
|
|
101
101
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
export function fill_(size_, value_) {
|
|
105
|
-
|
|
106
|
-
return new Array(size_).fill(value_);
|
|
105
|
+
|
|
106
|
+
return new Array(size_).fill(value_);
|
|
107
107
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
export function fillBy_(size_, body_) {
|
|
111
|
-
|
|
112
|
-
return Array.from({length: size_}, (_, i) => body_(i));
|
|
111
|
+
|
|
112
|
+
return Array.from({length: size_}, (_, i) => body_(i));
|
|
113
113
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
export function range_(size_) {
|
|
117
|
-
|
|
118
|
-
return Array.from({length: size_}, (_, i) => i);
|
|
117
|
+
|
|
118
|
+
return Array.from({length: size_}, (_, i) => i);
|
|
119
119
|
|
|
120
120
|
}
|
|
121
121
|
|
|
@@ -124,8 +124,8 @@ return left_ === right_
|
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
export function internalGrab_(self_, index_) {
|
|
127
|
-
|
|
128
|
-
return index_ < 0 || index_ >= self_.length ? ff_core_Try.internalThrowGrabException_() : self_[index_];
|
|
127
|
+
|
|
128
|
+
return index_ < 0 || index_ >= self_.length ? ff_core_Try.internalThrowGrabException_() : self_[index_];
|
|
129
129
|
|
|
130
130
|
}
|
|
131
131
|
|
|
@@ -138,12 +138,12 @@ throw new Error('Function fill is missing on this target in async context.');
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
export async function fillBy_$(size_, body_, $task) {
|
|
141
|
-
|
|
142
|
-
const array = new Array(size_);
|
|
143
|
-
for(let i = 0; i < size_; i++) {
|
|
144
|
-
array[i] = await(body_(_i));
|
|
145
|
-
}
|
|
146
|
-
return array;
|
|
141
|
+
|
|
142
|
+
const array = new Array(size_);
|
|
143
|
+
for(let i = 0; i < size_; i++) {
|
|
144
|
+
array[i] = await(body_(_i));
|
|
145
|
+
}
|
|
146
|
+
return array;
|
|
147
147
|
|
|
148
148
|
}
|
|
149
149
|
|
|
@@ -172,16 +172,16 @@ return self_.length
|
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
export function List_get(self_, index_) {
|
|
175
|
-
|
|
176
|
-
return index_ >= 0 && index_ < self_.length
|
|
177
|
-
? ff_core_Option.Some(self_[index_])
|
|
178
|
-
: ff_core_Option.None()
|
|
175
|
+
|
|
176
|
+
return index_ >= 0 && index_ < self_.length
|
|
177
|
+
? ff_core_Option.Some(self_[index_])
|
|
178
|
+
: ff_core_Option.None()
|
|
179
179
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
export function List_grab(self_, index_) {
|
|
183
|
-
|
|
184
|
-
return self_[index_] ?? internalGrab_(self_, index_);
|
|
183
|
+
|
|
184
|
+
return self_[index_] ?? internalGrab_(self_, index_);
|
|
185
185
|
|
|
186
186
|
}
|
|
187
187
|
|
|
@@ -217,6 +217,64 @@ export function List_dropLast(self_, count_ = 1) {
|
|
|
217
217
|
return self_.slice(0, self_.length - count_)
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
export function List_count(self_, body_) {
|
|
221
|
+
let result_ = 0;
|
|
222
|
+
let i_ = 0;
|
|
223
|
+
while((i_ < ff_core_List.List_size(self_))) {
|
|
224
|
+
if(body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_)))) {
|
|
225
|
+
result_ += 1
|
|
226
|
+
};
|
|
227
|
+
i_ += 1
|
|
228
|
+
};
|
|
229
|
+
return result_
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function List_countWhile(self_, body_) {
|
|
233
|
+
let i_ = 0;
|
|
234
|
+
while(((i_ < ff_core_List.List_size(self_)) && body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_))))) {
|
|
235
|
+
i_ += 1
|
|
236
|
+
};
|
|
237
|
+
return i_
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function List_takeWhile(self_, body_) {
|
|
241
|
+
const result_ = ff_core_Array.new_();
|
|
242
|
+
let i_ = 0;
|
|
243
|
+
while(((i_ < ff_core_List.List_size(self_)) && body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_))))) {
|
|
244
|
+
ff_core_Array.Array_push(result_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
245
|
+
i_ += 1
|
|
246
|
+
};
|
|
247
|
+
return ff_core_Array.Array_drain(result_)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export function List_dropWhile(self_, body_) {
|
|
251
|
+
const result_ = ff_core_Array.new_();
|
|
252
|
+
let i_ = 0;
|
|
253
|
+
while(((i_ < ff_core_List.List_size(self_)) && body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_))))) {
|
|
254
|
+
i_ += 1
|
|
255
|
+
};
|
|
256
|
+
while((i_ < ff_core_List.List_size(self_))) {
|
|
257
|
+
ff_core_Array.Array_push(result_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
258
|
+
i_ += 1
|
|
259
|
+
};
|
|
260
|
+
return ff_core_Array.Array_drain(result_)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function List_partitionWhile(self_, body_) {
|
|
264
|
+
const first_ = ff_core_Array.new_();
|
|
265
|
+
const second_ = ff_core_Array.new_();
|
|
266
|
+
let i_ = 0;
|
|
267
|
+
while(((i_ < ff_core_List.List_size(self_)) && body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_))))) {
|
|
268
|
+
ff_core_Array.Array_push(first_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
269
|
+
i_ += 1
|
|
270
|
+
};
|
|
271
|
+
while((i_ < ff_core_List.List_size(self_))) {
|
|
272
|
+
ff_core_Array.Array_push(second_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
273
|
+
i_ += 1
|
|
274
|
+
};
|
|
275
|
+
return ff_core_Pair.Pair(ff_core_Array.Array_drain(first_), ff_core_Array.Array_drain(second_))
|
|
276
|
+
}
|
|
277
|
+
|
|
220
278
|
export function List_pairs(self_) {
|
|
221
279
|
let i_ = 0;
|
|
222
280
|
return ff_core_List.List_map(self_, ((x_) => {
|
|
@@ -245,13 +303,13 @@ return value_
|
|
|
245
303
|
}
|
|
246
304
|
|
|
247
305
|
export function List_modify(self_, index_, body_) {
|
|
248
|
-
|
|
249
|
-
if(index_ < 0 || index_ >= self_.length) {
|
|
250
|
-
ff_core_Try.internalThrowGrabException_()
|
|
251
|
-
}
|
|
252
|
-
let result = self_.slice();
|
|
253
|
-
result[index_] = body_(result[index_]);
|
|
254
|
-
return result;
|
|
306
|
+
|
|
307
|
+
if(index_ < 0 || index_ >= self_.length) {
|
|
308
|
+
ff_core_Try.internalThrowGrabException_()
|
|
309
|
+
}
|
|
310
|
+
let result = self_.slice();
|
|
311
|
+
result[index_] = body_(result[index_]);
|
|
312
|
+
return result;
|
|
255
313
|
|
|
256
314
|
}
|
|
257
315
|
|
|
@@ -316,8 +374,8 @@ return {array: self_.slice()}
|
|
|
316
374
|
}
|
|
317
375
|
|
|
318
376
|
export function List_each(self_, body_) {
|
|
319
|
-
|
|
320
|
-
return self_.forEach(body_);
|
|
377
|
+
|
|
378
|
+
return self_.forEach(body_);
|
|
321
379
|
|
|
322
380
|
}
|
|
323
381
|
|
|
@@ -343,6 +401,21 @@ return (!result_)
|
|
|
343
401
|
return result_
|
|
344
402
|
}
|
|
345
403
|
|
|
404
|
+
export function List_indexWhere(self_, body_) {
|
|
405
|
+
let result_ = ff_core_Option.None();
|
|
406
|
+
let i_ = 0;
|
|
407
|
+
ff_core_List.List_eachWhile(self_, ((x_) => {
|
|
408
|
+
if(body_(x_)) {
|
|
409
|
+
result_ = ff_core_Option.Some(i_);
|
|
410
|
+
return false
|
|
411
|
+
} else {
|
|
412
|
+
i_ += 1;
|
|
413
|
+
return true
|
|
414
|
+
}
|
|
415
|
+
}));
|
|
416
|
+
return result_
|
|
417
|
+
}
|
|
418
|
+
|
|
346
419
|
export function List_find(self_, body_) {
|
|
347
420
|
let result_ = ff_core_Option.None();
|
|
348
421
|
ff_core_List.List_eachWhile(self_, ((x_) => {
|
|
@@ -373,8 +446,8 @@ return (!body_(_w1))
|
|
|
373
446
|
}
|
|
374
447
|
|
|
375
448
|
export function List_map(self_, body_) {
|
|
376
|
-
|
|
377
|
-
return self_.map(body_)
|
|
449
|
+
|
|
450
|
+
return self_.map(body_)
|
|
378
451
|
|
|
379
452
|
}
|
|
380
453
|
|
|
@@ -500,6 +573,64 @@ export async function List_dropLast$(self_, count_ = 1, $task) {
|
|
|
500
573
|
throw new Error('Function List_dropLast is missing on this target in async context.');
|
|
501
574
|
}
|
|
502
575
|
|
|
576
|
+
export async function List_count$(self_, body_, $task) {
|
|
577
|
+
let result_ = 0;
|
|
578
|
+
let i_ = 0;
|
|
579
|
+
while((i_ < ff_core_List.List_size(self_))) {
|
|
580
|
+
if((await body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_)), $task))) {
|
|
581
|
+
result_ += 1
|
|
582
|
+
};
|
|
583
|
+
i_ += 1
|
|
584
|
+
};
|
|
585
|
+
return result_
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
export async function List_countWhile$(self_, body_, $task) {
|
|
589
|
+
let i_ = 0;
|
|
590
|
+
while(((i_ < ff_core_List.List_size(self_)) && (await body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_)), $task)))) {
|
|
591
|
+
i_ += 1
|
|
592
|
+
};
|
|
593
|
+
return i_
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
export async function List_takeWhile$(self_, body_, $task) {
|
|
597
|
+
const result_ = ff_core_Array.new_();
|
|
598
|
+
let i_ = 0;
|
|
599
|
+
while(((i_ < ff_core_List.List_size(self_)) && (await body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_)), $task)))) {
|
|
600
|
+
ff_core_Array.Array_push(result_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
601
|
+
i_ += 1
|
|
602
|
+
};
|
|
603
|
+
return ff_core_Array.Array_drain(result_)
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
export async function List_dropWhile$(self_, body_, $task) {
|
|
607
|
+
const result_ = ff_core_Array.new_();
|
|
608
|
+
let i_ = 0;
|
|
609
|
+
while(((i_ < ff_core_List.List_size(self_)) && (await body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_)), $task)))) {
|
|
610
|
+
i_ += 1
|
|
611
|
+
};
|
|
612
|
+
while((i_ < ff_core_List.List_size(self_))) {
|
|
613
|
+
ff_core_Array.Array_push(result_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
614
|
+
i_ += 1
|
|
615
|
+
};
|
|
616
|
+
return ff_core_Array.Array_drain(result_)
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
export async function List_partitionWhile$(self_, body_, $task) {
|
|
620
|
+
const first_ = ff_core_Array.new_();
|
|
621
|
+
const second_ = ff_core_Array.new_();
|
|
622
|
+
let i_ = 0;
|
|
623
|
+
while(((i_ < ff_core_List.List_size(self_)) && (await body_((self_[i_] ?? ff_core_List.internalGrab_(self_, i_)), $task)))) {
|
|
624
|
+
ff_core_Array.Array_push(first_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
625
|
+
i_ += 1
|
|
626
|
+
};
|
|
627
|
+
while((i_ < ff_core_List.List_size(self_))) {
|
|
628
|
+
ff_core_Array.Array_push(second_, (self_[i_] ?? ff_core_List.internalGrab_(self_, i_)));
|
|
629
|
+
i_ += 1
|
|
630
|
+
};
|
|
631
|
+
return ff_core_Pair.Pair(ff_core_Array.Array_drain(first_), ff_core_Array.Array_drain(second_))
|
|
632
|
+
}
|
|
633
|
+
|
|
503
634
|
export async function List_pairs$(self_, $task) {
|
|
504
635
|
let i_ = 0;
|
|
505
636
|
return ff_core_List.List_map(self_, ((x_) => {
|
|
@@ -528,13 +659,13 @@ return value_
|
|
|
528
659
|
}
|
|
529
660
|
|
|
530
661
|
export async function List_modify$(self_, index_, body_, $task) {
|
|
531
|
-
|
|
532
|
-
if(index_ < 0 || index_ >= self_.length) {
|
|
533
|
-
ff_core_Try.internalThrowGrabException_()
|
|
534
|
-
}
|
|
535
|
-
let result = self_.slice();
|
|
536
|
-
result[index_] = await body_(result[index_], $task);
|
|
537
|
-
return result;
|
|
662
|
+
|
|
663
|
+
if(index_ < 0 || index_ >= self_.length) {
|
|
664
|
+
ff_core_Try.internalThrowGrabException_()
|
|
665
|
+
}
|
|
666
|
+
let result = self_.slice();
|
|
667
|
+
result[index_] = await body_(result[index_], $task);
|
|
668
|
+
return result;
|
|
538
669
|
|
|
539
670
|
}
|
|
540
671
|
|
|
@@ -599,10 +730,10 @@ throw new Error('Function List_toArray is missing on this target in async contex
|
|
|
599
730
|
}
|
|
600
731
|
|
|
601
732
|
export async function List_each$(self_, body_, $task) {
|
|
602
|
-
|
|
603
|
-
for(let i = 0; i < self_.length; i++) {
|
|
604
|
-
await body_(self_[i], $task)
|
|
605
|
-
}
|
|
733
|
+
|
|
734
|
+
for(let i = 0; i < self_.length; i++) {
|
|
735
|
+
await body_(self_[i], $task)
|
|
736
|
+
}
|
|
606
737
|
|
|
607
738
|
}
|
|
608
739
|
|
|
@@ -628,6 +759,21 @@ return (!result_)
|
|
|
628
759
|
return result_
|
|
629
760
|
}
|
|
630
761
|
|
|
762
|
+
export async function List_indexWhere$(self_, body_, $task) {
|
|
763
|
+
let result_ = ff_core_Option.None();
|
|
764
|
+
let i_ = 0;
|
|
765
|
+
(await ff_core_List.List_eachWhile$(self_, (async (x_, $task) => {
|
|
766
|
+
if((await body_(x_, $task))) {
|
|
767
|
+
result_ = ff_core_Option.Some(i_);
|
|
768
|
+
return false
|
|
769
|
+
} else {
|
|
770
|
+
i_ += 1;
|
|
771
|
+
return true
|
|
772
|
+
}
|
|
773
|
+
}), $task));
|
|
774
|
+
return result_
|
|
775
|
+
}
|
|
776
|
+
|
|
631
777
|
export async function List_find$(self_, body_, $task) {
|
|
632
778
|
let result_ = ff_core_Option.None();
|
|
633
779
|
(await ff_core_List.List_eachWhile$(self_, (async (x_, $task) => {
|
|
@@ -658,12 +804,12 @@ return (!(await body_(_w1, $task)))
|
|
|
658
804
|
}
|
|
659
805
|
|
|
660
806
|
export async function List_map$(self_, body_, $task) {
|
|
661
|
-
|
|
662
|
-
let result = [];
|
|
663
|
-
for(let i = 0; i < self_.length; i++) {
|
|
664
|
-
result.push(await body_(self_[i], $task));
|
|
665
|
-
}
|
|
666
|
-
return result;
|
|
807
|
+
|
|
808
|
+
let result = [];
|
|
809
|
+
for(let i = 0; i < self_.length; i++) {
|
|
810
|
+
result.push(await body_(self_[i], $task));
|
|
811
|
+
}
|
|
812
|
+
return result;
|
|
667
813
|
|
|
668
814
|
}
|
|
669
815
|
|
|
@@ -124,58 +124,58 @@ ff_core_Lock.Lock_release(self_)
|
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
export async function Lock_condition$(self_, $task) {
|
|
127
|
-
|
|
128
|
-
return {lock: self_, stack: [], queue: []}
|
|
127
|
+
|
|
128
|
+
return {lock: self_, stack: [], queue: []}
|
|
129
129
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
export async function Lock_acquire$(self_, reentrant_, $task) {
|
|
133
|
-
|
|
134
|
-
if(self_.level === 0) {
|
|
135
|
-
self_.owner = $task
|
|
136
|
-
self_.level += 1
|
|
137
|
-
} else {
|
|
138
|
-
if(self_.owner !== $task || !reentrant_) {
|
|
139
|
-
try {
|
|
140
|
-
await new Promise((resolve, reject) => {
|
|
141
|
-
$task.controller.signal.addEventListener('abort', reject)
|
|
142
|
-
try {
|
|
143
|
-
self_.queue.push({owner: $task, resolve: resolve})
|
|
144
|
-
} finally {
|
|
145
|
-
$task.controller.signal.removeEventListener('abort', reject)
|
|
146
|
-
}
|
|
147
|
-
})
|
|
148
|
-
} finally {
|
|
149
|
-
if($task.controller.signal.aborted) $task.controller = new AbortController()
|
|
150
|
-
}
|
|
151
|
-
} else {
|
|
152
|
-
self_.level += 1
|
|
153
|
-
}
|
|
154
|
-
}
|
|
133
|
+
|
|
134
|
+
if(self_.level === 0) {
|
|
135
|
+
self_.owner = $task
|
|
136
|
+
self_.level += 1
|
|
137
|
+
} else {
|
|
138
|
+
if(self_.owner !== $task || !reentrant_) {
|
|
139
|
+
try {
|
|
140
|
+
await new Promise((resolve, reject) => {
|
|
141
|
+
$task.controller.signal.addEventListener('abort', reject)
|
|
142
|
+
try {
|
|
143
|
+
self_.queue.push({owner: $task, resolve: resolve})
|
|
144
|
+
} finally {
|
|
145
|
+
$task.controller.signal.removeEventListener('abort', reject)
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
} finally {
|
|
149
|
+
if($task.controller.signal.aborted) $task.controller = new AbortController()
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
self_.level += 1
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
155
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
export async function Lock_release$(self_, $task) {
|
|
159
|
-
|
|
160
|
-
if(self_.owner !== $task) {
|
|
161
|
-
throw new Error("Tried to release a lock without acquiring it first.")
|
|
162
|
-
} else if(self_.level > 1) {
|
|
163
|
-
self_.level -= 1
|
|
164
|
-
} else {
|
|
165
|
-
self_.owner = null
|
|
166
|
-
self_.level = 0
|
|
167
|
-
if(self_.stack.length === 0) {
|
|
168
|
-
const empty = self_.stack
|
|
169
|
-
self_.stack = self_.queue.reverse()
|
|
170
|
-
self_.queue = empty
|
|
171
|
-
}
|
|
172
|
-
if(self_.stack.length !== 0) {
|
|
173
|
-
const pending = self_.stack.pop()
|
|
174
|
-
self_.owner = pending.owner
|
|
175
|
-
self_.level = 1
|
|
176
|
-
pending.resolve()
|
|
177
|
-
}
|
|
178
|
-
}
|
|
159
|
+
|
|
160
|
+
if(self_.owner !== $task) {
|
|
161
|
+
throw new Error("Tried to release a lock without acquiring it first.")
|
|
162
|
+
} else if(self_.level > 1) {
|
|
163
|
+
self_.level -= 1
|
|
164
|
+
} else {
|
|
165
|
+
self_.owner = null
|
|
166
|
+
self_.level = 0
|
|
167
|
+
if(self_.stack.length === 0) {
|
|
168
|
+
const empty = self_.stack
|
|
169
|
+
self_.stack = self_.queue.reverse()
|
|
170
|
+
self_.queue = empty
|
|
171
|
+
}
|
|
172
|
+
if(self_.stack.length !== 0) {
|
|
173
|
+
const pending = self_.stack.pop()
|
|
174
|
+
self_.owner = pending.owner
|
|
175
|
+
self_.level = 1
|
|
176
|
+
pending.resolve()
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
179
|
|
|
180
180
|
}
|
|
181
181
|
|
|
@@ -225,37 +225,37 @@ throw new Error('Function LockCondition_wakeAll is missing on this target in syn
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
export async function LockCondition_sleep$(self_, $task) {
|
|
228
|
-
|
|
229
|
-
if(self_.lock.owner !== $task) {
|
|
230
|
-
throw new Error("Tried to sleep on a condition without acquiring it first.")
|
|
231
|
-
}
|
|
232
|
-
const level = self_.lock.level
|
|
233
|
-
self_.lock.level = 1
|
|
234
|
-
await ff_core_Lock.Lock_release$(self_.lock)
|
|
235
|
-
try {
|
|
236
|
-
await new Promise((resolve, reject) => {
|
|
237
|
-
$task.controller.signal.addEventListener('abort', reject)
|
|
238
|
-
try {
|
|
239
|
-
self_.queue.push(resolve)
|
|
240
|
-
} finally {
|
|
241
|
-
$task.controller.signal.removeEventListener('abort', reject)
|
|
242
|
-
if($task.controller.signal.aborted) $task.controller = new AbortController()
|
|
243
|
-
}
|
|
244
|
-
})
|
|
245
|
-
} finally {
|
|
246
|
-
let exception = null
|
|
247
|
-
let acquired = false
|
|
248
|
-
while(!acquired) {
|
|
249
|
-
try {
|
|
250
|
-
await ff_core_Lock.Lock_acquire$(self_.lock)
|
|
251
|
-
self_.lock.level = level
|
|
252
|
-
acquired = true
|
|
253
|
-
} catch(e) {
|
|
254
|
-
exception = e
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
if(e !== null) throw e;
|
|
258
|
-
}
|
|
228
|
+
|
|
229
|
+
if(self_.lock.owner !== $task) {
|
|
230
|
+
throw new Error("Tried to sleep on a condition without acquiring it first.")
|
|
231
|
+
}
|
|
232
|
+
const level = self_.lock.level
|
|
233
|
+
self_.lock.level = 1
|
|
234
|
+
await ff_core_Lock.Lock_release$(self_.lock)
|
|
235
|
+
try {
|
|
236
|
+
await new Promise((resolve, reject) => {
|
|
237
|
+
$task.controller.signal.addEventListener('abort', reject)
|
|
238
|
+
try {
|
|
239
|
+
self_.queue.push(resolve)
|
|
240
|
+
} finally {
|
|
241
|
+
$task.controller.signal.removeEventListener('abort', reject)
|
|
242
|
+
if($task.controller.signal.aborted) $task.controller = new AbortController()
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
} finally {
|
|
246
|
+
let exception = null
|
|
247
|
+
let acquired = false
|
|
248
|
+
while(!acquired) {
|
|
249
|
+
try {
|
|
250
|
+
await ff_core_Lock.Lock_acquire$(self_.lock)
|
|
251
|
+
self_.lock.level = level
|
|
252
|
+
acquired = true
|
|
253
|
+
} catch(e) {
|
|
254
|
+
exception = e
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if(e !== null) throw e;
|
|
258
|
+
}
|
|
259
259
|
|
|
260
260
|
}
|
|
261
261
|
|
|
@@ -284,32 +284,32 @@ return
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
export async function LockCondition_wakeOne$(self_, $task) {
|
|
287
|
-
|
|
288
|
-
if(self_.stack.length === 0) {
|
|
289
|
-
const empty = self_.stack
|
|
290
|
-
self_.stack = self_.queue.reverse()
|
|
291
|
-
self_.queue = empty
|
|
292
|
-
}
|
|
293
|
-
if(self_.stack.length !== 0) {
|
|
294
|
-
const resolve = self_.stack.pop()
|
|
295
|
-
resolve()
|
|
296
|
-
}
|
|
287
|
+
|
|
288
|
+
if(self_.stack.length === 0) {
|
|
289
|
+
const empty = self_.stack
|
|
290
|
+
self_.stack = self_.queue.reverse()
|
|
291
|
+
self_.queue = empty
|
|
292
|
+
}
|
|
293
|
+
if(self_.stack.length !== 0) {
|
|
294
|
+
const resolve = self_.stack.pop()
|
|
295
|
+
resolve()
|
|
296
|
+
}
|
|
297
297
|
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
export async function LockCondition_wakeAll$(self_, $task) {
|
|
301
|
-
|
|
302
|
-
while(self_.stack.length !== 0) {
|
|
303
|
-
const resolve = self_.stack.pop()
|
|
304
|
-
resolve()
|
|
305
|
-
}
|
|
306
|
-
const empty = self_.stack
|
|
307
|
-
self_.stack = self_.queue.reverse()
|
|
308
|
-
self_.queue = empty
|
|
309
|
-
while(self_.stack.length !== 0) {
|
|
310
|
-
const resolve = self_.stack.pop()
|
|
311
|
-
resolve()
|
|
312
|
-
}
|
|
301
|
+
|
|
302
|
+
while(self_.stack.length !== 0) {
|
|
303
|
+
const resolve = self_.stack.pop()
|
|
304
|
+
resolve()
|
|
305
|
+
}
|
|
306
|
+
const empty = self_.stack
|
|
307
|
+
self_.stack = self_.queue.reverse()
|
|
308
|
+
self_.queue = empty
|
|
309
|
+
while(self_.stack.length !== 0) {
|
|
310
|
+
const resolve = self_.stack.pop()
|
|
311
|
+
resolve()
|
|
312
|
+
}
|
|
313
313
|
|
|
314
314
|
}
|
|
315
315
|
|