@scriptc/compiler 0.3.0 → 0.3.2
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/ambient/scriptc-node-fallback.d.ts +346 -17
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/literals.d.ts +7 -0
- package/dist/backend/literals.js +32 -0
- package/dist/backend/literals.js.map +1 -1
- package/dist/backend/literals.test.js +17 -1
- package/dist/backend/literals.test.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +15 -4
- package/dist/backend/llvm/alloc.js +39 -15
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +15 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
- package/dist/backend/llvm/appended-array-literals.js +109 -0
- package/dist/backend/llvm/appended-array-literals.js.map +1 -0
- package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
- package/dist/backend/llvm/appended-array-literals.test.js +90 -0
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
- package/dist/backend/llvm/bigint-wrap.d.ts +4 -0
- package/dist/backend/llvm/bigint-wrap.js +590 -0
- package/dist/backend/llvm/bigint-wrap.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +2 -0
- package/dist/backend/llvm/blocks.js +4 -0
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
- package/dist/backend/llvm/call-lifetimes.js +66 -7
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +14 -3
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.test.js +1 -1
- package/dist/backend/llvm/checked-narrows.test.js.map +1 -1
- package/dist/backend/llvm/classes.js +67 -14
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +6 -6
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +7 -5
- package/dist/backend/llvm/common.js +7 -5
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.js +10 -28
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.js +146 -53
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +68 -3
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +4 -0
- package/dist/backend/llvm/dyn.js +15 -2
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +163 -8
- package/dist/backend/llvm/emitter.js +973 -100
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +14 -7
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +242 -49
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.js +1 -1
- package/dist/backend/llvm/expr-async.test.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +51 -36
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
- package/dist/backend/llvm/expr-callbacks.js +153 -4
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +12 -1
- package/dist/backend/llvm/expr-calls.js +279 -78
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-calls.test.d.ts +1 -0
- package/dist/backend/llvm/expr-calls.test.js +132 -0
- package/dist/backend/llvm/expr-calls.test.js.map +1 -0
- package/dist/backend/llvm/expr-containers.d.ts +7 -0
- package/dist/backend/llvm/expr-containers.js +49 -5
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +4 -0
- package/dist/backend/llvm/expr-control.d.ts +8 -0
- package/dist/backend/llvm/expr-control.js +103 -69
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +3 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +28 -6
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +14 -0
- package/dist/backend/llvm/expr-primitives.js +110 -48
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +95 -5
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +9 -0
- package/dist/backend/llvm/expr-records.js +144 -16
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +9 -1
- package/dist/backend/llvm/expr-stream-bridges.js +152 -4
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +98 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/int32-abi.d.ts +47 -0
- package/dist/backend/llvm/int32-abi.js +83 -0
- package/dist/backend/llvm/int32-abi.js.map +1 -0
- package/dist/backend/llvm/int32-abi.test.d.ts +1 -0
- package/dist/backend/llvm/int32-abi.test.js +181 -0
- package/dist/backend/llvm/int32-abi.test.js.map +1 -0
- package/dist/backend/llvm/int32-locals.d.ts +30 -0
- package/dist/backend/llvm/int32-locals.js +95 -0
- package/dist/backend/llvm/int32-locals.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +4 -0
- package/dist/backend/llvm/integer-values.js +30 -1
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/integer-views.d.ts +8 -1
- package/dist/backend/llvm/integer-views.js +47 -2
- package/dist/backend/llvm/integer-views.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +16 -0
- package/dist/backend/llvm/lazy-captures.js +88 -2
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.test.js +48 -0
- package/dist/backend/llvm/lazy-captures.test.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +21 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +61 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +83 -9
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +26 -5
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +3 -2
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +24 -2
- package/dist/backend/llvm/local-union-storage.js +127 -12
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +108 -3
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +26 -0
- package/dist/backend/llvm/record-results.js +252 -0
- package/dist/backend/llvm/record-results.js.map +1 -0
- package/dist/backend/llvm/reference-effects.js +4 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +3 -0
- package/dist/backend/llvm/reference-writes.js +25 -11
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.d.ts +39 -0
- package/dist/backend/llvm/regex-matchers.js +1649 -0
- package/dist/backend/llvm/regex-matchers.js.map +1 -0
- package/dist/backend/llvm/regex-matchers.test.d.ts +1 -0
- package/dist/backend/llvm/regex-matchers.test.js +96 -0
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -0
- package/dist/backend/llvm/regions.d.ts +67 -0
- package/dist/backend/llvm/regions.js +309 -0
- package/dist/backend/llvm/regions.js.map +1 -0
- package/dist/backend/llvm/regions.test.d.ts +1 -0
- package/dist/backend/llvm/regions.test.js +173 -0
- package/dist/backend/llvm/regions.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +70 -8
- package/dist/backend/llvm/shapes.js +157 -29
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +7 -6
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.js +1 -1
- package/dist/backend/llvm/split-loops.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +29 -0
- package/dist/backend/llvm/stack-objects.js +130 -0
- package/dist/backend/llvm/stack-objects.js.map +1 -0
- package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
- package/dist/backend/llvm/stack-objects.test.js +252 -0
- package/dist/backend/llvm/stack-objects.test.js.map +1 -0
- package/dist/backend/llvm/stack-unions.test.js +1 -1
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +2 -2
- package/dist/backend/llvm/string-construction.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +5 -5
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-literal-equality.d.ts +22 -0
- package/dist/backend/llvm/string-literal-equality.js +78 -0
- package/dist/backend/llvm/string-literal-equality.js.map +1 -0
- package/dist/backend/llvm/string-reads.d.ts +4 -1
- package/dist/backend/llvm/string-reads.js +89 -9
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.js +60 -13
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +71 -6
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/union-retype.test.d.ts +1 -0
- package/dist/backend/llvm/union-retype.test.js +229 -0
- package/dist/backend/llvm/union-retype.test.js.map +1 -0
- package/dist/backend/llvm/walkers.d.ts +2 -0
- package/dist/backend/llvm/walkers.js +4 -2
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +17 -0
- package/dist/backend/llvm/wrapping-sums.js +113 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -0
- package/dist/backend/loop-polls.js +1 -0
- package/dist/backend/loop-polls.js.map +1 -1
- package/dist/backend/mangle.d.ts +9 -0
- package/dist/backend/mangle.js +15 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.js +7 -3
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +16 -1
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +2 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +1 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/backend/target-diagnostics.js +14 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +13 -0
- package/dist/backend/target-diagnostics.test.js.map +1 -1
- package/dist/contracts/check.js +4 -0
- package/dist/contracts/check.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +12 -0
- package/dist/frontend/experimental-import.js +63 -0
- package/dist/frontend/experimental-import.js.map +1 -0
- package/dist/frontend/lowering/array-values.d.ts +14 -0
- package/dist/frontend/lowering/array-values.js +29 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
- package/dist/frontend/lowering/builtin-calls.js +36 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/console.d.ts +16 -6
- package/dist/frontend/lowering/builtins/console.js +33 -9
- package/dist/frontend/lowering/builtins/console.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +20 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.d.ts +2 -2
- package/dist/frontend/lowering/builtins/json.js +13 -4
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +16 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +17 -0
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
- package/dist/frontend/lowering/builtins/operating-system.js +361 -1
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +15 -3
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +109 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
- package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
- package/dist/frontend/lowering/checked-promise-all.js +52 -6
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -3
- package/dist/frontend/lowering/class-dynamic-dispatch.js +54 -31
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +74 -4
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +8 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.d.ts +54 -0
- package/dist/frontend/lowering/containers/array-pipelines.js +1827 -0
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -0
- package/dist/frontend/lowering/containers/exec-result-uses.d.ts +10 -0
- package/dist/frontend/lowering/containers/exec-result-uses.js +88 -0
- package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +106 -7
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.d.ts +2 -1
- package/dist/frontend/lowering/containers/string-replacement.js +32 -136
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
- package/dist/frontend/lowering/cycle-initialization.js +166 -12
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.d.ts +33 -0
- package/dist/frontend/lowering/devirtualize.js +199 -0
- package/dist/frontend/lowering/devirtualize.js.map +1 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js +55 -7
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +5 -56
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +231 -10
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/identifier-uses.d.ts +7 -0
- package/dist/frontend/lowering/identifier-uses.js +23 -0
- package/dist/frontend/lowering/identifier-uses.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +51 -3
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
- package/dist/frontend/lowering/lifetime-regions.js +216 -0
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +28 -2
- package/dist/frontend/lowering/lower-array-sort.js +112 -2
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +99 -2
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +135 -131
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +4 -3
- package/dist/frontend/lowering/lower-classes.js +117 -13
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-console.d.ts +27 -0
- package/dist/frontend/lowering/lower-console.js +651 -0
- package/dist/frontend/lowering/lower-console.js.map +1 -0
- package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
- package/dist/frontend/lowering/lower-event-emitter.js +124 -38
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +272 -25
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +7 -3
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +25 -7
- package/dist/frontend/lowering/lower-generators.js +264 -113
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
- package/dist/frontend/lowering/lower-inspect.js +119 -18
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +24 -14
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
- package/dist/frontend/lowering/lower-stdlib.js +35 -1
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +66 -11
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +13 -10
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +47 -5
- package/dist/frontend/lowering/lowerer.js +235 -54
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/nan-coded-reads.d.ts +16 -0
- package/dist/frontend/lowering/nan-coded-reads.js +108 -1
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
- package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
- package/dist/frontend/lowering/regex-span-reads.js +164 -0
- package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.d.ts +4 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js +2 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-bounds.test.js +27 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -1
- package/dist/frontend/lowering/split-consumers.js +2 -18
- package/dist/frontend/lowering/split-consumers.js.map +1 -1
- package/dist/frontend/lowering/surfaces.js +115 -18
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-retag.d.ts +6 -1
- package/dist/frontend/lowering/union-retag.js +64 -1
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +46 -0
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
- package/dist/frontend/lowering/var-hoisting.js +261 -0
- package/dist/frontend/lowering/var-hoisting.js.map +1 -0
- package/dist/frontend/pipeline.js +5 -3
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.d.ts +3 -2
- package/dist/frontend/program.js +23 -5
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +13 -0
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +160 -14
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +31 -2
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +157 -16
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/function-references.d.ts +12 -0
- package/dist/ir/function-references.js +29 -0
- package/dist/ir/function-references.js.map +1 -0
- package/dist/ir/function-references.test.d.ts +1 -0
- package/dist/ir/function-references.test.js +277 -0
- package/dist/ir/function-references.test.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +7 -4
- package/dist/ir/int32-slots.js +215 -49
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +38 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +4 -4
- package/dist/ir/integer-ranges.js +89 -64
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +71 -9
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/intrinsic-signatures.js +3 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -1
- package/dist/ir/ir.d.ts +111 -20
- package/dist/ir/ir.js +6 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +1 -0
- package/dist/ir/runtime-features.js +38 -3
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.js +1 -2
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/traverse.js +4 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +201 -25
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +90 -7
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +159 -17
package/dist/ir/validate.js
CHANGED
|
@@ -55,6 +55,8 @@ export function validateModule(mod) {
|
|
|
55
55
|
const moduleLoc = { file: mod.sourceFile, start: 0, end: 0 };
|
|
56
56
|
if (mod.workers !== undefined && typeof mod.workers !== "boolean")
|
|
57
57
|
errors.push({ message: "worker execution mode must be a boolean", loc: moduleLoc });
|
|
58
|
+
if (mod.lifetimeRegions !== undefined && mod.lifetimeRegions !== true)
|
|
59
|
+
errors.push({ message: "lifetimeRegions must be true when present", loc: moduleLoc });
|
|
58
60
|
if (mod.workers && mod.lib !== undefined)
|
|
59
61
|
errors.push({
|
|
60
62
|
message: "worker execution requires a native static executable",
|
|
@@ -359,6 +361,10 @@ export function validateModule(mod) {
|
|
|
359
361
|
if (cls.jsLength !== undefined && (!Number.isSafeInteger(cls.jsLength) || cls.jsLength < 0)) {
|
|
360
362
|
errors.push({ message: `class ${cls.name}: invalid constructor length`, loc: cls.loc });
|
|
361
363
|
}
|
|
364
|
+
if (cls.prototypeNames !== undefined &&
|
|
365
|
+
new Set(cls.prototypeNames).size !== cls.prototypeNames.length) {
|
|
366
|
+
errors.push({ message: `class ${cls.name}: duplicate prototype member names`, loc: cls.loc });
|
|
367
|
+
}
|
|
362
368
|
if (cls.tracksOwnFields &&
|
|
363
369
|
(cls.runtime ||
|
|
364
370
|
cls.fields.find((field) => field.name === DYN_CLASS_PROPERTIES)?.type.kind !== "dyn")) {
|
|
@@ -854,11 +860,11 @@ export function validateModule(mod) {
|
|
|
854
860
|
}
|
|
855
861
|
}
|
|
856
862
|
for (const fn of mod.functions) {
|
|
857
|
-
validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors, mod.workers === true);
|
|
863
|
+
validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors, mod.workers === true, mod.lifetimeRegions === true);
|
|
858
864
|
}
|
|
859
865
|
return errors;
|
|
860
866
|
}
|
|
861
|
-
function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors, workers) {
|
|
867
|
+
function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors, workers, lifetimeRegions) {
|
|
862
868
|
const locals = new Map(fn.locals.map((l) => [l.id, l]));
|
|
863
869
|
const err = (message, loc) => errors.push({ message: `in ${fn.name}: ${message}`, loc });
|
|
864
870
|
const asyncCaches = [
|
|
@@ -1237,6 +1243,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1237
1243
|
case "unionKeyGet":
|
|
1238
1244
|
case "unionIsTag":
|
|
1239
1245
|
return checkUnionExpr(e);
|
|
1246
|
+
case "unionRetype":
|
|
1247
|
+
return checkUnionRetype(e);
|
|
1240
1248
|
case "intrinsic":
|
|
1241
1249
|
return checkIntrinsicExpr(e);
|
|
1242
1250
|
case "libCall":
|
|
@@ -1456,6 +1464,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1456
1464
|
allowed.add("return");
|
|
1457
1465
|
allowed.add("throw");
|
|
1458
1466
|
allowed.add("runtimeFence");
|
|
1467
|
+
allowed.add("tryCatch");
|
|
1459
1468
|
}
|
|
1460
1469
|
if (e.diverges) {
|
|
1461
1470
|
const last = e.stmts[e.stmts.length - 1];
|
|
@@ -1779,7 +1788,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1779
1788
|
if (want)
|
|
1780
1789
|
expectType(a, want, `regexIntrinsic ${e.method} arg ${i}`);
|
|
1781
1790
|
});
|
|
1782
|
-
if (e.method === "
|
|
1791
|
+
if ((e.method === "execGroups" || e.method === "execSpans" || e.method === "matchGroups") &&
|
|
1792
|
+
e.args.slice(1).some((mask) => mask.kind !== "numLit")) {
|
|
1793
|
+
err(`regexIntrinsic ${e.method} masks must be numeric literals`, e.loc);
|
|
1794
|
+
}
|
|
1795
|
+
if (e.method === "match" ||
|
|
1796
|
+
e.method === "exec" ||
|
|
1797
|
+
e.method === "execGroups" ||
|
|
1798
|
+
e.method === "execSpans" ||
|
|
1799
|
+
e.method === "matchGroups") {
|
|
1783
1800
|
// The `string[] | null` union (program-dependent id) — checked
|
|
1784
1801
|
// by arms, like the libCall case checks process.envGet.
|
|
1785
1802
|
const def = e.type.kind === "union" ? unions.get(e.type.unionId) : undefined;
|
|
@@ -2114,25 +2131,54 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2114
2131
|
: e.method === "shift"
|
|
2115
2132
|
? { argTypes: [], result: e.type } // union-checked below
|
|
2116
2133
|
: e.method === "sortValues"
|
|
2117
|
-
? {
|
|
2118
|
-
|
|
2134
|
+
? {
|
|
2135
|
+
argTypes: [F64, null, F64, null],
|
|
2136
|
+
result: VOID,
|
|
2137
|
+
}
|
|
2138
|
+
: e.method === "sortDense"
|
|
2139
|
+
? {
|
|
2140
|
+
argTypes: [null, BOOL, F64, null],
|
|
2141
|
+
result: BOOL,
|
|
2142
|
+
}
|
|
2143
|
+
: { argTypes: [], result: F64 }; // length
|
|
2119
2144
|
if ((e.method === "sortPrimitive" || e.method === "toSortedPrimitive") &&
|
|
2120
2145
|
elem.kind !== "string" &&
|
|
2121
2146
|
elem.kind !== "f64" &&
|
|
2122
2147
|
elem.kind !== "bool") {
|
|
2123
2148
|
err(`arrIntrinsic ${e.method} requires primitive elements, got ${elem.kind}`, e.loc);
|
|
2124
2149
|
}
|
|
2125
|
-
if (e.method === "sortValues") {
|
|
2150
|
+
if (e.method === "sortValues" || e.method === "sortDense") {
|
|
2126
2151
|
const arms = elem.kind === "union" ? unions.get(elem.unionId)?.arms : undefined;
|
|
2127
2152
|
if (!isSortValuesElement(elem, arms))
|
|
2128
|
-
err(`arrIntrinsic
|
|
2129
|
-
const cmp = e.args[1]?.type;
|
|
2153
|
+
err(`arrIntrinsic ${e.method} on ${elem.kind} elements`, e.loc);
|
|
2154
|
+
const cmp = e.args[e.method === "sortValues" ? 1 : 0]?.type;
|
|
2130
2155
|
if (!cmp ||
|
|
2131
2156
|
cmp.kind !== "func" ||
|
|
2132
2157
|
cmp.params.length > 2 ||
|
|
2133
2158
|
!cmp.params.every((param) => typeEquals(param, elem)) ||
|
|
2134
2159
|
cmp.ret.kind !== "f64")
|
|
2135
|
-
err(
|
|
2160
|
+
err(`arrIntrinsic ${e.method} comparator must be (elem, elem) => number`, e.loc);
|
|
2161
|
+
if (e.method === "sortDense" && e.args[1]?.kind !== "boolLit")
|
|
2162
|
+
err("arrIntrinsic sortDense owned flag must be a boolean literal", e.loc);
|
|
2163
|
+
// A recognized comparator's key order: [order] for numbers,
|
|
2164
|
+
// [order, key reader] for record and class elements.
|
|
2165
|
+
const order = e.args[2];
|
|
2166
|
+
if (order) {
|
|
2167
|
+
if (order.kind !== "numLit" || (order.value !== 1 && order.value !== -1))
|
|
2168
|
+
err(`arrIntrinsic ${e.method} key order must be the literal 1 or -1`, e.loc);
|
|
2169
|
+
const key = e.args[3]?.type;
|
|
2170
|
+
if (elem.kind === "f64"
|
|
2171
|
+
? key !== undefined
|
|
2172
|
+
: elem.kind !== "record" && elem.kind !== "object")
|
|
2173
|
+
err(`arrIntrinsic ${e.method} key order on ${elem.kind} elements`, e.loc);
|
|
2174
|
+
if (elem.kind !== "f64" &&
|
|
2175
|
+
(!key ||
|
|
2176
|
+
key.kind !== "func" ||
|
|
2177
|
+
key.params.length !== 1 ||
|
|
2178
|
+
!typeEquals(key.params[0], elem) ||
|
|
2179
|
+
key.ret.kind !== "f64"))
|
|
2180
|
+
err(`arrIntrinsic ${e.method} key reader must be (elem) => number`, e.loc);
|
|
2181
|
+
}
|
|
2136
2182
|
}
|
|
2137
2183
|
if (e.method === "getNumber" && elem.kind !== "f64") {
|
|
2138
2184
|
err(`arrIntrinsic getNumber requires f64 elements, got ${elem.kind}`, e.loc);
|
|
@@ -2179,7 +2225,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2179
2225
|
// slice's indices and splice's count are optional (omitted args
|
|
2180
2226
|
// omitted from the IR — backends fill the defaults); everything
|
|
2181
2227
|
// else is exact.
|
|
2182
|
-
const minArgs = e.method === "slice"
|
|
2228
|
+
const minArgs = e.method === "slice"
|
|
2229
|
+
? 0
|
|
2230
|
+
: e.method === "splice"
|
|
2231
|
+
? 1
|
|
2232
|
+
: e.method === "sortValues" || e.method === "sortDense"
|
|
2233
|
+
? 2
|
|
2234
|
+
: sig.argTypes.length;
|
|
2183
2235
|
if (e.args.length < minArgs || e.args.length > sig.argTypes.length) {
|
|
2184
2236
|
err(`arrIntrinsic ${e.method}: ${e.args.length} args, expected ${sig.argTypes.length}`, e.loc);
|
|
2185
2237
|
}
|
|
@@ -2778,25 +2830,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2778
2830
|
const want = recordValidation.get(shape.id).initializationFields;
|
|
2779
2831
|
const seen = new Set();
|
|
2780
2832
|
for (const f of e.fields) {
|
|
2781
|
-
if (f.
|
|
2833
|
+
if (f.overflow)
|
|
2782
2834
|
checkExpr(f.value);
|
|
2783
2835
|
else
|
|
2784
2836
|
checkSlotValue(f.value);
|
|
2785
2837
|
if (seen.has(f.name))
|
|
2786
2838
|
err(`recordLit initializes field "${f.name}" twice`, e.loc);
|
|
2787
2839
|
seen.add(f.name);
|
|
2788
|
-
if (f.drop) {
|
|
2789
|
-
// A mapping-dropped field (the PromiseSettledResult honest
|
|
2790
|
-
// subset): evaluated, never stored — it must NOT name a
|
|
2791
|
-
// declared field (that would silently drop a real store),
|
|
2792
|
-
// and its value may be any type, void included.
|
|
2793
|
-
if (f.overflow)
|
|
2794
|
-
err(`recordLit drop entry "${f.name}" flagged overflow too`, e.loc);
|
|
2795
|
-
if (want.has(f.name)) {
|
|
2796
|
-
err(`recordLit drop entry "${f.name}" shadows a declared field of shape ${shape.id}`, e.loc);
|
|
2797
|
-
}
|
|
2798
|
-
continue;
|
|
2799
|
-
}
|
|
2800
2840
|
if (f.overflow) {
|
|
2801
2841
|
// Overflow entries exist only on index-signature shapes, name
|
|
2802
2842
|
// no declared field, and carry the index-value type exactly
|
|
@@ -2818,7 +2858,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2818
2858
|
else
|
|
2819
2859
|
expectType(f.value, ft, `recordLit field "${f.name}"`);
|
|
2820
2860
|
}
|
|
2821
|
-
if (e.fields.filter((f) => !f.overflow
|
|
2861
|
+
if (e.fields.filter((f) => !f.overflow).length !== shape.fields.length) {
|
|
2822
2862
|
err(`recordLit does not initialize every field of shape ${shape.id}`, e.loc);
|
|
2823
2863
|
}
|
|
2824
2864
|
break;
|
|
@@ -3211,6 +3251,26 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3211
3251
|
}
|
|
3212
3252
|
}
|
|
3213
3253
|
}
|
|
3254
|
+
function checkUnionRetype(e) {
|
|
3255
|
+
checkExpr(e.value);
|
|
3256
|
+
const from = unions.get(e.fromId);
|
|
3257
|
+
const to = unions.get(e.unionId);
|
|
3258
|
+
if (!from || !to) {
|
|
3259
|
+
err(`unionRetype between undeclared unions "${e.fromId}" and "${e.unionId}"`, e.loc);
|
|
3260
|
+
return;
|
|
3261
|
+
}
|
|
3262
|
+
expectType(e.value, { kind: "union", unionId: e.fromId }, "unionRetype operand");
|
|
3263
|
+
if (!typeEquals(e.type, { kind: "union", unionId: e.unionId }))
|
|
3264
|
+
err(`unionRetype type ${e.type.kind} != union ${e.unionId}`, e.loc);
|
|
3265
|
+
if (e.tags.length === 0)
|
|
3266
|
+
err(`unionRetype with no tags`, e.loc);
|
|
3267
|
+
for (const tag of e.tags) {
|
|
3268
|
+
const arm = from.arms[tag];
|
|
3269
|
+
const target = to.arms[tag];
|
|
3270
|
+
if (!Number.isInteger(tag) || !arm || !target || !typeEquals(arm, target))
|
|
3271
|
+
err(`unionRetype tag ${tag} is not the same arm in ${e.fromId} and ${e.unionId}`, e.loc);
|
|
3272
|
+
}
|
|
3273
|
+
}
|
|
3214
3274
|
function checkUnionExpr(e) {
|
|
3215
3275
|
switch (e.kind) {
|
|
3216
3276
|
case "unionNarrow": {
|
|
@@ -3368,6 +3428,24 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3368
3428
|
err("module.tdzCheck must be void", e.loc);
|
|
3369
3429
|
return;
|
|
3370
3430
|
}
|
|
3431
|
+
if (e.name === "region.create" ||
|
|
3432
|
+
e.name === "region.enter" ||
|
|
3433
|
+
e.name === "region.leave" ||
|
|
3434
|
+
e.name === "region.release") {
|
|
3435
|
+
if (!lifetimeRegions)
|
|
3436
|
+
err(`${e.name} outside a lifetimeRegions module`, e.loc);
|
|
3437
|
+
const takesId = e.name === "region.enter" || e.name === "region.release";
|
|
3438
|
+
if (e.args.length !== (takesId ? 1 : 0))
|
|
3439
|
+
err(`${e.name} takes ${takesId ? "one region id" : "no arguments"}`, e.loc);
|
|
3440
|
+
for (const a of e.args) {
|
|
3441
|
+
checkExpr(a);
|
|
3442
|
+
if (a.type.kind !== "f64")
|
|
3443
|
+
err(`${e.name} id must be f64`, e.loc);
|
|
3444
|
+
}
|
|
3445
|
+
if (e.type.kind !== (e.name === "region.create" ? "f64" : "void"))
|
|
3446
|
+
err(`${e.name} has type ${e.name === "region.create" ? "f64" : "void"}`, e.loc);
|
|
3447
|
+
return;
|
|
3448
|
+
}
|
|
3371
3449
|
if (e.name === "threads.publish") {
|
|
3372
3450
|
if (e.args.length !== 1)
|
|
3373
3451
|
err("threads.publish takes exactly one argument", e.loc);
|
|
@@ -3411,6 +3489,26 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3411
3489
|
}
|
|
3412
3490
|
return;
|
|
3413
3491
|
}
|
|
3492
|
+
if (e.name === "promise.allSettled" || e.name === "promise.any") {
|
|
3493
|
+
if (e.args.length !== 1)
|
|
3494
|
+
err(`${e.name} takes exactly one argument`, e.loc);
|
|
3495
|
+
for (const a of e.args) {
|
|
3496
|
+
checkExpr(a);
|
|
3497
|
+
if (a.type.kind !== "array" || a.type.elem.kind !== "promise") {
|
|
3498
|
+
err(`${a.type.kind} argument to ${e.name} (needs an array of promises)`, a.loc);
|
|
3499
|
+
}
|
|
3500
|
+
else if (e.name === "promise.any" && !typeEquals(a.type.elem, e.type)) {
|
|
3501
|
+
err("promise.any result must be the entries' promise type", e.loc);
|
|
3502
|
+
}
|
|
3503
|
+
}
|
|
3504
|
+
if (e.type.kind !== "promise")
|
|
3505
|
+
err(`${e.name} must be promise-typed`, e.loc);
|
|
3506
|
+
else if (e.name === "promise.allSettled" &&
|
|
3507
|
+
(e.type.inner.kind !== "array" || e.type.inner.elem.kind !== "union")) {
|
|
3508
|
+
err("promise.allSettled result must be a promise of a settled-record union array", e.loc);
|
|
3509
|
+
}
|
|
3510
|
+
return;
|
|
3511
|
+
}
|
|
3414
3512
|
if (e.name === "promise.reject") {
|
|
3415
3513
|
// ONE argument: the %Error-rooted reason object (the rejection
|
|
3416
3514
|
// payload shares the thrown-Error representation — the
|
|
@@ -3602,6 +3700,23 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3602
3700
|
}
|
|
3603
3701
|
return true;
|
|
3604
3702
|
}
|
|
3703
|
+
if (e.fn === "dyn.objEntryPairs") {
|
|
3704
|
+
// Result: the native [string, any][] the backend assembles from the
|
|
3705
|
+
// runtime's owned pair snapshot.
|
|
3706
|
+
const shape = e.type.kind === "array" && e.type.elem.kind === "record"
|
|
3707
|
+
? records.get(e.type.elem.shapeId)
|
|
3708
|
+
: undefined;
|
|
3709
|
+
const field = (name) => shape?.fields.find((f) => f.name === name)?.type;
|
|
3710
|
+
const ok = shape !== undefined &&
|
|
3711
|
+
shape.tuple === true &&
|
|
3712
|
+
shape.indexValue === undefined &&
|
|
3713
|
+
shape.fields.length === 2 &&
|
|
3714
|
+
field("0")?.kind === "string" &&
|
|
3715
|
+
field("1")?.kind === "dyn";
|
|
3716
|
+
if (!ok)
|
|
3717
|
+
err(`libCall dyn.objEntryPairs must return a [string, any] tuple array`, e.loc);
|
|
3718
|
+
return true;
|
|
3719
|
+
}
|
|
3605
3720
|
if (e.fn === "fetch.streamFrom") {
|
|
3606
3721
|
const t = e.args[0]?.type;
|
|
3607
3722
|
const ok = t?.kind === "string" ||
|
|
@@ -4528,6 +4643,15 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4528
4643
|
}
|
|
4529
4644
|
return true;
|
|
4530
4645
|
}
|
|
4646
|
+
if (e.fn === "error.aggregateSetErrors" || e.fn === "error.aggregateErrors") {
|
|
4647
|
+
// Receiver: exactly %AggregateError (subclassing is fenced — the
|
|
4648
|
+
// hidden runtime slot admits no other layout).
|
|
4649
|
+
const recv = e.args[0];
|
|
4650
|
+
if (!recv || recv.type.kind !== "object" || recv.type.className !== "%AggregateError") {
|
|
4651
|
+
err(`libCall ${e.fn} receiver must be %AggregateError`, e.loc);
|
|
4652
|
+
}
|
|
4653
|
+
return true;
|
|
4654
|
+
}
|
|
4531
4655
|
if (e.fn === "error.newDom") {
|
|
4532
4656
|
if (e.type.kind !== "object" || e.type.className !== "%DOMException") {
|
|
4533
4657
|
err(`libCall error.newDom must return %DOMException, got ${e.type.kind}`, e.loc);
|
|
@@ -4763,6 +4887,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4763
4887
|
e.fn !== "emitter.setDefaultMax" &&
|
|
4764
4888
|
e.fn !== "emitter.setDefaultMaxChk" &&
|
|
4765
4889
|
e.fn !== "emitter.getDefaultMax" &&
|
|
4890
|
+
e.fn !== "emitter.errorMonitor" &&
|
|
4766
4891
|
e.fn !== "emitter.checkListener") {
|
|
4767
4892
|
// Receiver: an emitter-hierarchy object (the %EventEmitter class
|
|
4768
4893
|
// itself, or a class whose base chain reaches it). emitter.new
|
|
@@ -4931,6 +5056,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4931
5056
|
}
|
|
4932
5057
|
}
|
|
4933
5058
|
}
|
|
5059
|
+
// The yield a `delegate` genResume is checking as its argument.
|
|
5060
|
+
let delegatedYield = null;
|
|
4934
5061
|
function checkAsyncExpr(e) {
|
|
4935
5062
|
switch (e.kind) {
|
|
4936
5063
|
case "awaitExpr": {
|
|
@@ -4943,6 +5070,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4943
5070
|
}
|
|
4944
5071
|
if (!fn.async)
|
|
4945
5072
|
err("await outside an async function", e.loc);
|
|
5073
|
+
if (e.adopt === true && fn.generator !== undefined)
|
|
5074
|
+
err("returned-promise adoption inside a generator", e.loc);
|
|
4946
5075
|
break;
|
|
4947
5076
|
}
|
|
4948
5077
|
case "yieldExpr": {
|
|
@@ -4960,7 +5089,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4960
5089
|
}
|
|
4961
5090
|
// The undefined next-channel has no C value form: such yields are
|
|
4962
5091
|
// void-typed (statement position only — the frontend fences reads).
|
|
4963
|
-
if (e.
|
|
5092
|
+
if (e.delegated) {
|
|
5093
|
+
if (delegatedYield !== e)
|
|
5094
|
+
err("delegated yield outside a delegate resume", e.loc);
|
|
5095
|
+
if (e.type.kind !== "void" || e.captureCompletion)
|
|
5096
|
+
err("invalid delegated yield", e.loc);
|
|
5097
|
+
}
|
|
5098
|
+
else if (e.captureCompletion) {
|
|
4964
5099
|
if (fn.async ||
|
|
4965
5100
|
e.type.kind !== "dyn" ||
|
|
4966
5101
|
!typeEquals(e.captureCompletion.returnType, fn.returnType)) {
|
|
@@ -4983,8 +5118,49 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4983
5118
|
break;
|
|
4984
5119
|
}
|
|
4985
5120
|
const genT = e.gen.type;
|
|
5121
|
+
if (e.mode === "delegate") {
|
|
5122
|
+
if (e.arg !== null) {
|
|
5123
|
+
if (e.arg.kind === "yieldExpr" && e.arg.delegated)
|
|
5124
|
+
delegatedYield = e.arg;
|
|
5125
|
+
else
|
|
5126
|
+
err("genResume delegate argument is not a delegated yield", e.loc);
|
|
5127
|
+
checkExpr(e.arg);
|
|
5128
|
+
delegatedYield = null;
|
|
5129
|
+
}
|
|
5130
|
+
const outer = fn.generator;
|
|
5131
|
+
if (outer === undefined || fn.async || genT.async)
|
|
5132
|
+
err("genResume delegate outside a sync generator body", e.loc);
|
|
5133
|
+
else if (genT.nextT.kind !== "undefinedT" &&
|
|
5134
|
+
genT.nextT.kind !== "dyn" &&
|
|
5135
|
+
!typeEquals(genT.nextT, outer.nextT))
|
|
5136
|
+
err(`genResume delegate into a ${typeKey(genT.nextT)} next-channel from ${typeKey(outer.nextT)}`, e.loc);
|
|
5137
|
+
if (e.type.kind !== "bool" && e.type.kind !== "record")
|
|
5138
|
+
err(`genResume delegate result ${typeKey(e.type)}`, e.loc);
|
|
5139
|
+
break;
|
|
5140
|
+
}
|
|
4986
5141
|
if (e.arg !== null)
|
|
4987
5142
|
checkExpr(e.arg);
|
|
5143
|
+
if (e.mode === "step" || e.mode === "value" || e.mode === "close") {
|
|
5144
|
+
if (genT.async)
|
|
5145
|
+
err(`genResume ${e.mode} on an async generator`, e.loc);
|
|
5146
|
+
if (e.arg !== null)
|
|
5147
|
+
err(`genResume ${e.mode} with an argument`, e.loc);
|
|
5148
|
+
if (e.mode === "step") {
|
|
5149
|
+
if (genT.nextT.kind !== "undefinedT" && genT.nextT.kind !== "dyn")
|
|
5150
|
+
err(`genResume step on a ${typeKey(genT.nextT)} next-channel`, e.loc);
|
|
5151
|
+
if (e.type.kind !== "bool")
|
|
5152
|
+
err(`genResume step result ${typeKey(e.type)}`, e.loc);
|
|
5153
|
+
}
|
|
5154
|
+
else if (e.mode === "close") {
|
|
5155
|
+
if (e.type.kind !== "void")
|
|
5156
|
+
err(`genResume close result ${typeKey(e.type)}`, e.loc);
|
|
5157
|
+
}
|
|
5158
|
+
else if ((genT.yieldT.kind === "void" || !typeEquals(e.type, genT.yieldT)) &&
|
|
5159
|
+
(genT.retT.kind === "void" || !typeEquals(e.type, genT.retT))) {
|
|
5160
|
+
err(`genResume value ${typeKey(e.type)} != yield channel ${typeKey(genT.yieldT)}`, e.loc);
|
|
5161
|
+
}
|
|
5162
|
+
break;
|
|
5163
|
+
}
|
|
4988
5164
|
if (e.mode === "next") {
|
|
4989
5165
|
if (e.arg === null) {
|
|
4990
5166
|
if (genT.nextT.kind !== "undefinedT" && genT.nextT.kind !== "dyn") {
|