@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
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { generatorDrain } from "./iterator-adapters.js";
|
|
2
|
+
import { lowerEventStaticProperty } from "./builtins/numbers.js";
|
|
2
3
|
import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
|
|
3
4
|
import { isOptionalProcessStreamProperty } from "./builtins/process.js";
|
|
4
5
|
import { lowerWorkerMetadata } from "./builtins/workers.js";
|
|
5
6
|
import { threadsImportOf } from "../threads-import.js";
|
|
7
|
+
import { experimentalImportOf, lifetimeRegionMemberOf } from "../experimental-import.js";
|
|
6
8
|
import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../ir/build.js";
|
|
7
9
|
import { InternalCompilerError } from "../../errors.js";
|
|
8
10
|
import { SYMBOL_T } from "../../ir/ir.js";
|
|
@@ -31,7 +33,7 @@ import { ARRAY_METHODS, builtinConstLit, builtinFenceHintOf, builtinModuleConstO
|
|
|
31
33
|
import { UNSUPPORTED, blockedBindingUseDiag, unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
|
|
32
34
|
import { PoisonError, dynFallbackType, jsFuncNameOf, neverTaintedJsType, own } from "./lowerer.js";
|
|
33
35
|
import { lowerCollectionSpread } from "./containers/collection-methods.js";
|
|
34
|
-
import { arrayValueRead, arrayValueStore, arrayValueType, lowerSafeIndexRead, tryLowerIndexTruthiness, tryLowerNumericIndexRead, lowerSafeBytesRead, } from "./array-values.js";
|
|
36
|
+
import { arrayNumberRead, arrayValueRead, arrayValueStore, arrayValueType, lowerSafeIndexRead, tryLowerIndexTruthiness, tryLowerNumericIndexRead, tryLowerBytesReadNumberEquality, lowerSafeBytesRead, } from "./array-values.js";
|
|
35
37
|
import { strCharsCall } from "./containers/array-construction.js";
|
|
36
38
|
import { lowerOptionalStringIndex } from "./string-index.js";
|
|
37
39
|
import { tryLowerIndexedComparison } from "./indexed-comparison.js";
|
|
@@ -48,8 +50,8 @@ import { funcTypeFromParamShapes } from "./call-signatures.js";
|
|
|
48
50
|
import { implicitMonoFile, objLitGenericFnInfoOf, objLitGenericFnNodeOf, requireObjLitGenericReceiver, } from "./generic-functions.js";
|
|
49
51
|
import { lowerTaggedTemplate } from "./lower-calls.js";
|
|
50
52
|
import { mixinFnOfCallee } from "./lower-mixins.js";
|
|
51
|
-
import { isConstAssertionTypeNode, isGenericCallableMemberType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
|
|
52
|
-
import { lowerYield } from "./lower-generators.js";
|
|
53
|
+
import { isConstAssertionTypeNode, isGenericCallableMemberType, isOsConstantsType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
|
|
54
|
+
import { iteratorResultValueRead, lowerYield } from "./lower-generators.js";
|
|
53
55
|
import { errorPropertyRead, errorPropertyWrite, errorToStringCall } from "./error-methods.js";
|
|
54
56
|
import { lowerStreamProperty, lowerStreamStateProperty, streamSidesOf } from "./lower-stream.js";
|
|
55
57
|
import { unionWideningTags } from "../../ir/analysis.js";
|
|
@@ -731,7 +733,9 @@ function lowerExprInner(lowerer, expr) {
|
|
|
731
733
|
lowerer.unions.get(g.type.unionId)?.arms.length === 2 &&
|
|
732
734
|
lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "f64") &&
|
|
733
735
|
lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "string");
|
|
736
|
+
const symbol = lowerer.resolveValueSymbol(expr);
|
|
734
737
|
if (!arithmeticUnion &&
|
|
738
|
+
!(symbol !== null && lowerer.earlyReadVars.has(symbol)) &&
|
|
735
739
|
g.type.kind === "union" &&
|
|
736
740
|
narrowed &&
|
|
737
741
|
narrowed.kind !== "union" &&
|
|
@@ -849,6 +853,8 @@ function lowerExprInner(lowerer, expr) {
|
|
|
849
853
|
return { kind: "boolLit", value: true, type: BOOL, loc };
|
|
850
854
|
if (member === "publish")
|
|
851
855
|
lowerer.noLowering("publish (@scriptc/threads) as a value", expr, "call publish(value) directly");
|
|
856
|
+
if (experimentalImportOf(lowerer.program, expr) === "LifetimeRegion")
|
|
857
|
+
lowerer.noLowering("LifetimeRegion (@scriptc/experimental) as a value", expr, "construct regions with new LifetimeRegion()");
|
|
852
858
|
}
|
|
853
859
|
{
|
|
854
860
|
const bi = lowerer.builtinImportOf(expr);
|
|
@@ -872,6 +878,9 @@ function lowerExprInner(lowerer, expr) {
|
|
|
872
878
|
if (bi.module === "http" && bi.member === "STATUS_CODES") {
|
|
873
879
|
return { kind: "libCall", fn: "http.statusCodes", args: [], type: DYN, loc };
|
|
874
880
|
}
|
|
881
|
+
if (bi.module === "os" && bi.member === "constants") {
|
|
882
|
+
return { kind: "libCall", fn: "os.constants", args: [], type: DYN, loc };
|
|
883
|
+
}
|
|
875
884
|
// tls.rootCertificates: a runtime-valued module constant (the
|
|
876
885
|
// cached bundled-CA array) — the one member read that lowers
|
|
877
886
|
// to a libCall instead of a baked literal.
|
|
@@ -1413,6 +1422,11 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1413
1422
|
if (ts.isConditionalExpression(expr))
|
|
1414
1423
|
return lowerTernary(lowerer, expr);
|
|
1415
1424
|
if (ts.isPropertyAccessExpression(expr)) {
|
|
1425
|
+
{
|
|
1426
|
+
const member = lifetimeRegionMemberOf(lowerer.program, expr, lowerer.experimentalFiles);
|
|
1427
|
+
if (member !== null)
|
|
1428
|
+
lowerer.noLowering(`LifetimeRegion.${member} (@scriptc/experimental) as a value`, expr, `call region.${member}(${member === "run" ? "fn" : ""}) directly`);
|
|
1429
|
+
}
|
|
1416
1430
|
// Expando statics may still be absent even when JS inference sees
|
|
1417
1431
|
// the eventual assignment's scalar type. Preserve the checked value.
|
|
1418
1432
|
const staticField = lowerStaticFieldRead(lowerer, expr);
|
|
@@ -1809,6 +1823,7 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1809
1823
|
lowerer.lowerJsonProperty(expr) ??
|
|
1810
1824
|
lowerer.lowerErrorCodeProperty(expr) ??
|
|
1811
1825
|
lowerer.lowerNumberStaticProperty(expr) ??
|
|
1826
|
+
lowerEventStaticProperty(lowerer, expr) ??
|
|
1812
1827
|
lowerer.lowerMathProperty(expr) ??
|
|
1813
1828
|
lowerer.lowerIntrinsicProperty(expr) ??
|
|
1814
1829
|
// The _readableState/_writableState scalar READS (the suite's
|
|
@@ -1831,7 +1846,7 @@ function lowerExprInner(lowerer, expr) {
|
|
|
1831
1846
|
// arm is real (`obj.n = bytes[i]; obj.n` is undefined in Node).
|
|
1832
1847
|
if (runtimeOptionalClassField(lowerer, handled, expr))
|
|
1833
1848
|
return handled;
|
|
1834
|
-
return lowerer.maybeNarrow(handled, expr);
|
|
1849
|
+
return iteratorResultValueRead(lowerer, handled, expr) ?? lowerer.maybeNarrow(handled, expr);
|
|
1835
1850
|
}
|
|
1836
1851
|
// `globalThis.<name>` that no lowering above claimed
|
|
1837
1852
|
// (globalThis.crypto, globalThis.SubtleCrypto, globalThis.localStorage
|
|
@@ -2021,14 +2036,15 @@ function lowerExprInner(lowerer, expr) {
|
|
|
2021
2036
|
const shape = lowerer.shapes.get(recv.type.shapeId);
|
|
2022
2037
|
const field = shape?.fields.find((f) => f.name === expr.name.text);
|
|
2023
2038
|
if (field) {
|
|
2024
|
-
|
|
2039
|
+
const read = {
|
|
2025
2040
|
kind: "recordGet",
|
|
2026
2041
|
obj: recv,
|
|
2027
2042
|
shapeId: recv.type.shapeId,
|
|
2028
2043
|
field: field.name,
|
|
2029
2044
|
type: field.type,
|
|
2030
2045
|
loc,
|
|
2031
|
-
}
|
|
2046
|
+
};
|
|
2047
|
+
return iteratorResultValueRead(lowerer, read, expr) ?? lowerer.maybeNarrow(read, expr);
|
|
2032
2048
|
}
|
|
2033
2049
|
}
|
|
2034
2050
|
}
|
|
@@ -2055,9 +2071,14 @@ function lowerExprInner(lowerer, expr) {
|
|
|
2055
2071
|
const segmentDataProperty = segmentDataSymbol?.name === "SegmentData" &&
|
|
2056
2072
|
lowerer.isStdlibSymbol(segmentDataSymbol) &&
|
|
2057
2073
|
["segment", "index", "input", "isWordLike"].includes(expr.name.text);
|
|
2074
|
+
// os.constants members vary by platform (the declared groups list
|
|
2075
|
+
// every platform's names): a number member reads as `number |
|
|
2076
|
+
// undefined`, like an array element, and a group stays checked.
|
|
2077
|
+
const osConstants = isOsConstantsType(lowerer.typeOf(expr.expression), lowerer);
|
|
2058
2078
|
if (isParseArgsDynProperty(lowerer, expr) ||
|
|
2059
2079
|
isStatFsDynProperty(lowerer, expr) ||
|
|
2060
|
-
segmentDataProperty
|
|
2080
|
+
segmentDataProperty ||
|
|
2081
|
+
osConstants) {
|
|
2061
2082
|
const recv = lowerer.lowerExpr(expr.expression);
|
|
2062
2083
|
if (recv.type.kind === "dyn") {
|
|
2063
2084
|
const key = {
|
|
@@ -2067,14 +2088,20 @@ function lowerExprInner(lowerer, expr) {
|
|
|
2067
2088
|
loc: locOf(expr.name),
|
|
2068
2089
|
};
|
|
2069
2090
|
const opt = hasOptionalChainGuard(expr.expression);
|
|
2070
|
-
|
|
2091
|
+
const read = {
|
|
2071
2092
|
kind: "dynKeyGet",
|
|
2072
2093
|
key,
|
|
2073
2094
|
...(opt ? { optional: true } : {}),
|
|
2074
2095
|
value: recv,
|
|
2075
2096
|
type: DYN,
|
|
2076
2097
|
loc,
|
|
2077
|
-
}
|
|
2098
|
+
};
|
|
2099
|
+
if (osConstants) {
|
|
2100
|
+
return lowerer.mapTypeOf(lowerer.typeOf(expr))?.kind === "f64"
|
|
2101
|
+
? lowerer.coerceToExpected(read, lowerer.withUndefinedArm(F64))
|
|
2102
|
+
: read;
|
|
2103
|
+
}
|
|
2104
|
+
return lowerer.maybeNarrow(read, expr);
|
|
2078
2105
|
}
|
|
2079
2106
|
}
|
|
2080
2107
|
// A member read through a NULLISH generic binding (`const i: I<A &
|
|
@@ -2772,6 +2799,9 @@ export function maybeNarrow(lowerer, expr, node) {
|
|
|
2772
2799
|
if (symbol && lowerer.unstableSwitchBindings.has(symbol))
|
|
2773
2800
|
return expr;
|
|
2774
2801
|
}
|
|
2802
|
+
if (ts.isPropertyAccessExpression(node) &&
|
|
2803
|
+
getterResultHoldsUndeclaredUndefined(lowerer, node, expr))
|
|
2804
|
+
return expr;
|
|
2775
2805
|
const narrowedTs = lowerer.typeOf(node);
|
|
2776
2806
|
const narrowed = lowerer.mapTypeOf(narrowedTs);
|
|
2777
2807
|
// `Array.isArray(u)` on a union with one readonly array/tuple arm: the
|
|
@@ -2880,6 +2910,27 @@ export function maybeNarrow(lowerer, expr, node) {
|
|
|
2880
2910
|
loc: expr.loc,
|
|
2881
2911
|
};
|
|
2882
2912
|
}
|
|
2913
|
+
/** A getter read whose runtime result can be undefined (an unchecked
|
|
2914
|
+
* element read in its body, or in another member of its override family)
|
|
2915
|
+
* although its declared type cannot. The checker's type for the read is
|
|
2916
|
+
* then no narrowing proof, so the read keeps the getter's result. */
|
|
2917
|
+
function getterResultHoldsUndeclaredUndefined(lowerer, node, expr) {
|
|
2918
|
+
if (expr.type.kind !== "union" || lowerer.armTag(expr.type.unionId, UNDEFINED_T) < 0)
|
|
2919
|
+
return false;
|
|
2920
|
+
const getter = (expr.kind === "virtualCall" && expr.method.startsWith("get:")) ||
|
|
2921
|
+
(expr.kind === "call" && expr.callee.includes(".get:"));
|
|
2922
|
+
if (!getter)
|
|
2923
|
+
return false;
|
|
2924
|
+
const symbol = lowerer.checker.getSymbolAtLocation(node.name);
|
|
2925
|
+
if (!symbol || (symbol.flags & ts.SymbolFlags.GetAccessor) === 0)
|
|
2926
|
+
return false;
|
|
2927
|
+
const declared = lowerer.checker.getTypeOfSymbol(symbol);
|
|
2928
|
+
const holdsUndefined = (type) => (type.flags &
|
|
2929
|
+
(ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !==
|
|
2930
|
+
0;
|
|
2931
|
+
return !(holdsUndefined(declared) ||
|
|
2932
|
+
(declared.isUnionType() && ts.constituentTypes(declared).some(holdsUndefined)));
|
|
2933
|
+
}
|
|
2883
2934
|
/** The checked form of maybeNarrow's arm extraction for a narrowing the
|
|
2884
2935
|
* checker may hold past code that replaced the value (a call clearing the
|
|
2885
2936
|
* property; see NarrowingStability). Every other arm throws the TypeError
|
|
@@ -6330,7 +6381,13 @@ export function lowerElementCompound(lowerer, expr, op) {
|
|
|
6330
6381
|
const receiverRef = () => varRef(receiverLocal.id, receiver.type, loc);
|
|
6331
6382
|
const indexRef = () => varRef(indexLocal.id, F64, loc);
|
|
6332
6383
|
const oldValue = receiver.type.kind === "array"
|
|
6333
|
-
?
|
|
6384
|
+
? receiver.type.elem.kind === "f64"
|
|
6385
|
+
? // Every numeric operator applies ToNumber to the old value, so a
|
|
6386
|
+
// missing element is NaN without materializing `number | undefined`.
|
|
6387
|
+
arrayNumberRead(receiverRef(), indexRef(), locOf(target))
|
|
6388
|
+
: receiver.type.elem.kind === "string" && op === "+"
|
|
6389
|
+
? arrayStringOperand(receiverRef(), indexRef(), locOf(target))
|
|
6390
|
+
: arrayValueRead(lowerer, receiverRef(), indexRef(), receiver.type.elem, locOf(target))
|
|
6334
6391
|
: {
|
|
6335
6392
|
// An invalid index reads undefined in Node, which every numeric
|
|
6336
6393
|
// compound operator turns into NaN; the write is then ignored.
|
|
@@ -6407,6 +6464,25 @@ export function lowerElementCompound(lowerer, expr, op) {
|
|
|
6407
6464
|
loc,
|
|
6408
6465
|
};
|
|
6409
6466
|
}
|
|
6467
|
+
/** ToString of one stabilized `string[]` element read for `+=`: a missing
|
|
6468
|
+
* element concatenates as "undefined". */
|
|
6469
|
+
function arrayStringOperand(arr, index, loc) {
|
|
6470
|
+
return {
|
|
6471
|
+
kind: "ternary",
|
|
6472
|
+
cond: {
|
|
6473
|
+
kind: "bin",
|
|
6474
|
+
op: "===",
|
|
6475
|
+
left: { kind: "arrayState", arr, index, type: F64, loc },
|
|
6476
|
+
right: { kind: "numLit", value: 1, type: F64, loc },
|
|
6477
|
+
type: BOOL,
|
|
6478
|
+
loc,
|
|
6479
|
+
},
|
|
6480
|
+
then: { kind: "arrayGet", arr, index, type: STRING, loc },
|
|
6481
|
+
else_: strLit("undefined", loc),
|
|
6482
|
+
type: STRING,
|
|
6483
|
+
loc,
|
|
6484
|
+
};
|
|
6485
|
+
}
|
|
6410
6486
|
/** Checked member assignment evaluates the reference before its RHS and
|
|
6411
6487
|
* yields the original assigned value, including in a chained assignment. */
|
|
6412
6488
|
function lowerDynMemberAssignment(lowerer, expr, recv) {
|
|
@@ -7443,6 +7519,13 @@ export function lowerIncDec(lowerer, expr, prefix) {
|
|
|
7443
7519
|
return varRef(local.id, value.type, loc);
|
|
7444
7520
|
};
|
|
7445
7521
|
const finish = (read, write) => {
|
|
7522
|
+
if (read.type.kind === "bigint") {
|
|
7523
|
+
const old = save(read, "%incrementOld");
|
|
7524
|
+
const next = save(bigintStep(op, old, loc), "%incrementNext");
|
|
7525
|
+
stmts.push(write(next));
|
|
7526
|
+
const result = prefix ? next : old;
|
|
7527
|
+
return { kind: "seqExpr", stmts, result, type: result.type, loc };
|
|
7528
|
+
}
|
|
7446
7529
|
const old = save(read.type.kind === "f64"
|
|
7447
7530
|
? read
|
|
7448
7531
|
: {
|
|
@@ -7486,7 +7569,9 @@ export function lowerIncDec(lowerer, expr, prefix) {
|
|
|
7486
7569
|
lowerer.unsupported("SC1090", access, "incrementing non-number array keys");
|
|
7487
7570
|
const type = raw.type;
|
|
7488
7571
|
const read = type.kind === "array"
|
|
7489
|
-
?
|
|
7572
|
+
? type.elem.kind === "f64"
|
|
7573
|
+
? arrayNumberRead(receiver, index, loc)
|
|
7574
|
+
: arrayValueRead(lowerer, receiver, index, type.elem, loc)
|
|
7490
7575
|
: {
|
|
7491
7576
|
kind: "bytesIntrinsic",
|
|
7492
7577
|
method: "get",
|
|
@@ -7633,6 +7718,26 @@ export function lowerIncDecTarget(lowerer, expr, target, prefix) {
|
|
|
7633
7718
|
};
|
|
7634
7719
|
}
|
|
7635
7720
|
}
|
|
7721
|
+
if (target.type.kind === "bigint") {
|
|
7722
|
+
const old = lowerer.declareHiddenLocal("%bigintOld", BIGINT_T);
|
|
7723
|
+
const next = lowerer.declareHiddenLocal("%bigintNext", BIGINT_T);
|
|
7724
|
+
return {
|
|
7725
|
+
kind: "seqExpr",
|
|
7726
|
+
stmts: [
|
|
7727
|
+
{ kind: "varDecl", localId: old.id, init: varRef(target.id, BIGINT_T, loc), loc },
|
|
7728
|
+
{
|
|
7729
|
+
kind: "varDecl",
|
|
7730
|
+
localId: next.id,
|
|
7731
|
+
init: bigintStep(op, varRef(old.id, BIGINT_T, loc), loc),
|
|
7732
|
+
loc,
|
|
7733
|
+
},
|
|
7734
|
+
{ kind: "assign", localId: target.id, value: varRef(next.id, BIGINT_T, loc), loc },
|
|
7735
|
+
],
|
|
7736
|
+
result: varRef(prefix ? next.id : old.id, BIGINT_T, loc),
|
|
7737
|
+
type: BIGINT_T,
|
|
7738
|
+
loc,
|
|
7739
|
+
};
|
|
7740
|
+
}
|
|
7636
7741
|
if (target.type.kind !== "f64")
|
|
7637
7742
|
lowerer.unsupported("SC1043", expr);
|
|
7638
7743
|
return { kind: "incDec", op, prefix, localId: target.id, type: F64, loc };
|
|
@@ -7663,6 +7768,43 @@ function seqExprSafeStmt(s) {
|
|
|
7663
7768
|
return false;
|
|
7664
7769
|
}
|
|
7665
7770
|
}
|
|
7771
|
+
const BIGINT_COMPOUND = {
|
|
7772
|
+
"+": "bigint.add",
|
|
7773
|
+
"-": "bigint.sub",
|
|
7774
|
+
"*": "bigint.mul",
|
|
7775
|
+
"/": "bigint.div",
|
|
7776
|
+
"%": "bigint.mod",
|
|
7777
|
+
"**": "bigint.pow",
|
|
7778
|
+
"&": "bigint.and",
|
|
7779
|
+
"|": "bigint.or",
|
|
7780
|
+
"^": "bigint.xor",
|
|
7781
|
+
"<<": "bigint.shl",
|
|
7782
|
+
">>": "bigint.shr",
|
|
7783
|
+
};
|
|
7784
|
+
/** `old op= rhs` over two bigints: the binary operator's libCall. Null
|
|
7785
|
+
* for other operand types (and `>>>`, which BigInt does not have). */
|
|
7786
|
+
function bigintCompoundValue(op, left, right, loc) {
|
|
7787
|
+
if (left.type.kind !== "bigint" || right.type.kind !== "bigint" || op === ">>>")
|
|
7788
|
+
return null;
|
|
7789
|
+
return { kind: "libCall", fn: BIGINT_COMPOUND[op], args: [left, right], type: BIGINT_T, loc };
|
|
7790
|
+
}
|
|
7791
|
+
/** `++`/`--` on a bigint value: old ± 1n. */
|
|
7792
|
+
function bigintStep(op, old, loc) {
|
|
7793
|
+
const one = {
|
|
7794
|
+
kind: "libCall",
|
|
7795
|
+
fn: "bigint.parse",
|
|
7796
|
+
args: [{ kind: "strLit", value: "1", type: STRING, loc }],
|
|
7797
|
+
type: BIGINT_T,
|
|
7798
|
+
loc,
|
|
7799
|
+
};
|
|
7800
|
+
return {
|
|
7801
|
+
kind: "libCall",
|
|
7802
|
+
fn: op === "+" ? "bigint.add" : "bigint.sub",
|
|
7803
|
+
args: [old, one],
|
|
7804
|
+
type: BIGINT_T,
|
|
7805
|
+
loc,
|
|
7806
|
+
};
|
|
7807
|
+
}
|
|
7666
7808
|
export function lowerCompoundValueToTarget(lowerer, expr, compound, target) {
|
|
7667
7809
|
const loc = locOf(expr);
|
|
7668
7810
|
const read = {
|
|
@@ -7706,6 +7848,9 @@ export function lowerCompoundValueToTarget(lowerer, expr, compound, target) {
|
|
|
7706
7848
|
};
|
|
7707
7849
|
return lowerer.coerceInto(expr, computed, target.type);
|
|
7708
7850
|
}
|
|
7851
|
+
const bigint = bigintCompoundValue(compound, read, rhs, loc);
|
|
7852
|
+
if (bigint)
|
|
7853
|
+
return bigint;
|
|
7709
7854
|
lowerer.unsupported("SC1043", expr);
|
|
7710
7855
|
}
|
|
7711
7856
|
/** Equality of two NaN-coded values (nan-coded-reads.ts), each of which may
|
|
@@ -8075,6 +8220,16 @@ export function lowerBinary(lowerer, expr) {
|
|
|
8075
8220
|
left = storedLeft;
|
|
8076
8221
|
if (storedRight !== null && left.type.kind !== "union")
|
|
8077
8222
|
right = storedRight;
|
|
8223
|
+
// A typed-array read compared with a plain number needs no
|
|
8224
|
+
// `number | undefined` box.
|
|
8225
|
+
const fusedLeft = tryLowerBytesReadNumberEquality(lowerer, left, right, expr.right);
|
|
8226
|
+
if (fusedLeft)
|
|
8227
|
+
left = fusedLeft;
|
|
8228
|
+
else {
|
|
8229
|
+
const fusedRight = tryLowerBytesReadNumberEquality(lowerer, right, left, expr.left);
|
|
8230
|
+
if (fusedRight)
|
|
8231
|
+
right = fusedRight;
|
|
8232
|
+
}
|
|
8078
8233
|
}
|
|
8079
8234
|
if (strictEquality && (left.type.kind === "caught" || right.type.kind === "caught")) {
|
|
8080
8235
|
if (left.type.kind === "caught")
|
|
@@ -10012,6 +10167,14 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10012
10167
|
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
10013
10168
|
return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
|
|
10014
10169
|
}
|
|
10170
|
+
{
|
|
10171
|
+
const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
|
|
10172
|
+
if (eventKind >= 0) {
|
|
10173
|
+
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
10174
|
+
const kind = { kind: "numLit", value: eventKind, type: F64, loc };
|
|
10175
|
+
return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
|
|
10176
|
+
}
|
|
10177
|
+
}
|
|
10015
10178
|
if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
|
|
10016
10179
|
const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
|
|
10017
10180
|
return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
|
|
@@ -10211,7 +10374,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10211
10374
|
lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
|
|
10212
10375
|
if (left.kind === "varRef" &&
|
|
10213
10376
|
(ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
|
|
10214
|
-
return
|
|
10377
|
+
return readsClassAfter(lowerer, targetInfo, expr.right, [], {
|
|
10378
|
+
kind: "boolLit",
|
|
10379
|
+
value,
|
|
10380
|
+
type: BOOL,
|
|
10381
|
+
loc,
|
|
10382
|
+
});
|
|
10215
10383
|
}
|
|
10216
10384
|
lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
|
|
10217
10385
|
}
|
|
@@ -10361,13 +10529,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10361
10529
|
}
|
|
10362
10530
|
}
|
|
10363
10531
|
if (left.type.kind !== "object") {
|
|
10364
|
-
return {
|
|
10365
|
-
kind: "
|
|
10366
|
-
|
|
10367
|
-
result: { kind: "boolLit", value: false, type: BOOL, loc },
|
|
10532
|
+
return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
|
|
10533
|
+
kind: "boolLit",
|
|
10534
|
+
value: false,
|
|
10368
10535
|
type: BOOL,
|
|
10369
10536
|
loc,
|
|
10370
|
-
};
|
|
10537
|
+
});
|
|
10371
10538
|
}
|
|
10372
10539
|
const lhsInfo = lowerer.classes.get(left.type.className);
|
|
10373
10540
|
if (!lhsInfo)
|
|
@@ -10378,10 +10545,33 @@ export function lowerInstanceOf(lowerer, expr, loc) {
|
|
|
10378
10545
|
const value = left.type.className === target.def.name ||
|
|
10379
10546
|
lowerer.isSubclassOf(left.type.className, target.def.name);
|
|
10380
10547
|
if (left.kind === "varRef") {
|
|
10381
|
-
return
|
|
10548
|
+
return readsClassAfter(lowerer, target, expr.right, [], {
|
|
10549
|
+
kind: "boolLit",
|
|
10550
|
+
value,
|
|
10551
|
+
type: BOOL,
|
|
10552
|
+
loc,
|
|
10553
|
+
});
|
|
10382
10554
|
}
|
|
10383
10555
|
lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
|
|
10384
10556
|
}
|
|
10557
|
+
/** A statically decided `instanceof` still reads its class after the left
|
|
10558
|
+
* operand: a class with an initialization flag throws there before its
|
|
10559
|
+
* declaration ran. */
|
|
10560
|
+
function readsClassAfter(lowerer, target, right, stmts, result) {
|
|
10561
|
+
if (!lowerer.classInitFlags.has(target.def.name)) {
|
|
10562
|
+
if (stmts.length === 0)
|
|
10563
|
+
return result;
|
|
10564
|
+
return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
|
|
10565
|
+
}
|
|
10566
|
+
const read = lowerer.lowerExpr(right);
|
|
10567
|
+
return {
|
|
10568
|
+
kind: "seqExpr",
|
|
10569
|
+
stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
|
|
10570
|
+
result,
|
|
10571
|
+
type: result.type,
|
|
10572
|
+
loc: result.loc,
|
|
10573
|
+
};
|
|
10574
|
+
}
|
|
10385
10575
|
/** `#name in obj` — the ergonomic brand check. In this closed world a
|
|
10386
10576
|
* brand is held by exactly the instances of the declaring class
|
|
10387
10577
|
* (subclasses included — construction always runs the declaring class's
|
|
@@ -10535,11 +10725,27 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
|
|
|
10535
10725
|
return { kind: "boolLit", value, type: BOOL, loc };
|
|
10536
10726
|
lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
|
|
10537
10727
|
}
|
|
10728
|
+
/** The string keys every record inherits from Object.prototype. */
|
|
10729
|
+
const OBJECT_PROTOTYPE_KEYS = new Set([
|
|
10730
|
+
"constructor",
|
|
10731
|
+
"__defineGetter__",
|
|
10732
|
+
"__defineSetter__",
|
|
10733
|
+
"hasOwnProperty",
|
|
10734
|
+
"__lookupGetter__",
|
|
10735
|
+
"__lookupSetter__",
|
|
10736
|
+
"isPrototypeOf",
|
|
10737
|
+
"propertyIsEnumerable",
|
|
10738
|
+
"toString",
|
|
10739
|
+
"valueOf",
|
|
10740
|
+
"__proto__",
|
|
10741
|
+
"toLocaleString",
|
|
10742
|
+
]);
|
|
10538
10743
|
/** `"key" in v` — the key-presence test. Three lowered receivers:
|
|
10539
10744
|
* process.env (getenv(3) presence — Node-exact, an empty value still
|
|
10540
10745
|
* counts as present), and monomorphic record shapes, where the answer is
|
|
10541
10746
|
* type-directed: a declared non-optional field is a compile-time `true`,
|
|
10542
|
-
* a missing field (no index signature) a compile-time `false`
|
|
10747
|
+
* a missing field (no index signature) a compile-time `false` unless
|
|
10748
|
+
* Object.prototype has it — both
|
|
10543
10749
|
* folds limited to side-effect-free receivers, the lowerInstanceOf rule —
|
|
10544
10750
|
* and an OPTIONAL field (undefined-armed union) is a runtime presence
|
|
10545
10751
|
* test on the slot: an omitted or deleted property is absent, while a
|
|
@@ -10789,7 +10995,11 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10789
10995
|
break;
|
|
10790
10996
|
}
|
|
10791
10997
|
const f = shape.fields.find((x) => x.name === key);
|
|
10792
|
-
|
|
10998
|
+
const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
|
|
10999
|
+
if (f &&
|
|
11000
|
+
!inherited &&
|
|
11001
|
+
f.type.kind === "union" &&
|
|
11002
|
+
lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
|
|
10793
11003
|
staticAnswers = false; // an optional slot: presence is per-value
|
|
10794
11004
|
break;
|
|
10795
11005
|
}
|
|
@@ -10797,7 +11007,7 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10797
11007
|
// true without invoking the getter) — either slot present makes
|
|
10798
11008
|
// the name a member.
|
|
10799
11009
|
const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
|
|
10800
|
-
answers.push({ tag, has: f !== undefined || acc });
|
|
11010
|
+
answers.push({ tag, has: f !== undefined || acc || inherited });
|
|
10801
11011
|
}
|
|
10802
11012
|
if (staticAnswers) {
|
|
10803
11013
|
const pureRecv = recv.kind === "varRef" ||
|
|
@@ -10865,7 +11075,9 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10865
11075
|
throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
|
|
10866
11076
|
const field = shape.fields.find((f) => f.name === key);
|
|
10867
11077
|
if (field) {
|
|
10868
|
-
if (
|
|
11078
|
+
if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
|
|
11079
|
+
field.type.kind === "union" &&
|
|
11080
|
+
lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
|
|
10869
11081
|
// Optional slot: the key is present unless the field is absent
|
|
10870
11082
|
// (omitted or deleted); an explicit undefined is present.
|
|
10871
11083
|
return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
|
|
@@ -10893,14 +11105,16 @@ function lowerInExpression(lowerer, expr, loc) {
|
|
|
10893
11105
|
}
|
|
10894
11106
|
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
10895
11107
|
}
|
|
10896
|
-
|
|
11108
|
+
// Records are ordinary objects: Object.prototype's members are in them.
|
|
11109
|
+
const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
|
|
11110
|
+
if (shape.indexValue && !inherited) {
|
|
10897
11111
|
lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
|
|
10898
11112
|
}
|
|
10899
11113
|
if (recv.kind === "varRef" ||
|
|
10900
11114
|
recv.kind === "recordGet" ||
|
|
10901
11115
|
recv.kind === "fieldGet" ||
|
|
10902
11116
|
pureRecvNode) {
|
|
10903
|
-
return { kind: "boolLit", value:
|
|
11117
|
+
return { kind: "boolLit", value: inherited, type: BOOL, loc };
|
|
10904
11118
|
}
|
|
10905
11119
|
lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
|
|
10906
11120
|
}
|
|
@@ -10953,7 +11167,36 @@ function lowerRuntimeKeyIn(lowerer, expr, loc) {
|
|
|
10953
11167
|
// Overflow keys answer through the map's hashed presence probe (a
|
|
10954
11168
|
// stored undefined value is still present), not a scan over a fresh
|
|
10955
11169
|
// key snapshot, which made `k in dict` loops quadratic.
|
|
10956
|
-
|
|
11170
|
+
const ovfHas = {
|
|
11171
|
+
kind: "recordOvfHas",
|
|
11172
|
+
obj: r,
|
|
11173
|
+
shapeId: recvT.shapeId,
|
|
11174
|
+
key: k,
|
|
11175
|
+
type: BOOL,
|
|
11176
|
+
loc,
|
|
11177
|
+
};
|
|
11178
|
+
// A miss in the record's own keys still finds Object.prototype's.
|
|
11179
|
+
let inherited = ovfHas;
|
|
11180
|
+
for (const name of OBJECT_PROTOTYPE_KEYS) {
|
|
11181
|
+
if (shape.fields.some((f) => f.name === name))
|
|
11182
|
+
continue;
|
|
11183
|
+
inherited = {
|
|
11184
|
+
kind: "logical",
|
|
11185
|
+
op: "||",
|
|
11186
|
+
left: inherited,
|
|
11187
|
+
right: {
|
|
11188
|
+
kind: "strEq",
|
|
11189
|
+
negated: false,
|
|
11190
|
+
left: k,
|
|
11191
|
+
right: { kind: "strLit", value: name, type: STRING, loc },
|
|
11192
|
+
type: BOOL,
|
|
11193
|
+
loc,
|
|
11194
|
+
},
|
|
11195
|
+
type: BOOL,
|
|
11196
|
+
loc,
|
|
11197
|
+
};
|
|
11198
|
+
}
|
|
11199
|
+
body.push(ret(inherited));
|
|
10957
11200
|
lowerer.liftedFns.push({
|
|
10958
11201
|
name: helper,
|
|
10959
11202
|
params: [
|
|
@@ -12866,6 +13109,7 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
|
|
|
12866
13109
|
: lowerOptionalNumber(lowerer, rhs, loc);
|
|
12867
13110
|
let value;
|
|
12868
13111
|
const numericRead = lowerOptionalNumber(lowerer, read, loc, access);
|
|
13112
|
+
const bigintValue = rhsNode ? bigintCompoundValue(op, read, rhs, loc) : null;
|
|
12869
13113
|
if (op === "+" && read.type.kind === "string") {
|
|
12870
13114
|
value = {
|
|
12871
13115
|
kind: "strConcat",
|
|
@@ -12878,6 +13122,9 @@ function lowerFieldCompoundValue(lowerer, access, op, rhsNode, loc) {
|
|
|
12878
13122
|
else if (numericRead.type.kind === "f64" && numericRhs.type.kind === "f64") {
|
|
12879
13123
|
value = { kind: "bin", op, left: numericRead, right: numericRhs, type: F64, loc };
|
|
12880
13124
|
}
|
|
13125
|
+
else if (bigintValue) {
|
|
13126
|
+
value = bigintValue;
|
|
13127
|
+
}
|
|
12881
13128
|
else if (target.fieldType.kind === "dyn" && isJsSourceFile(access.getSourceFile())) {
|
|
12882
13129
|
const numeric = ["-", "*", "/", "%", "**"].includes(op);
|
|
12883
13130
|
const left = lowerer.coerceToExpected(read, DYN);
|