@scriptc/compiler 0.2.6 → 0.2.8
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 +7 -18
- package/dist/backend/cycle-analysis.d.ts +21 -9
- package/dist/backend/cycle-analysis.js +139 -67
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +283 -3
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +39 -0
- package/dist/backend/cycle-mutability.js +205 -0
- package/dist/backend/cycle-mutability.js.map +1 -0
- package/dist/backend/link-plan-core.d.ts +2 -1
- package/dist/backend/link-plan-core.js +15 -3
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +2 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +43 -0
- package/dist/backend/llvm/alloc.js +246 -0
- package/dist/backend/llvm/alloc.js.map +1 -0
- package/dist/backend/llvm/alloc.test.d.ts +1 -0
- package/dist/backend/llvm/alloc.test.js +102 -0
- package/dist/backend/llvm/alloc.test.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +9 -0
- package/dist/backend/llvm/blocks.js +9 -0
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/borrowed-receivers.d.ts +7 -0
- package/dist/backend/llvm/borrowed-receivers.js +39 -0
- package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +18 -3
- package/dist/backend/llvm/call-lifetimes.js +54 -19
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +178 -3
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.d.ts +24 -0
- package/dist/backend/llvm/checked-narrows.js +108 -0
- package/dist/backend/llvm/checked-narrows.js.map +1 -0
- package/dist/backend/llvm/checked-narrows.test.d.ts +1 -0
- package/dist/backend/llvm/checked-narrows.test.js +208 -0
- package/dist/backend/llvm/checked-narrows.test.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +16 -1
- package/dist/backend/llvm/classes.js +60 -49
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +68 -6
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +13 -0
- package/dist/backend/llvm/common.js +30 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +19 -3
- package/dist/backend/llvm/constant-callbacks.js +289 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +140 -3
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +6 -2
- package/dist/backend/llvm/debug-info.js +11 -1
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +29 -0
- package/dist/backend/llvm/dense-array-access.js +335 -0
- package/dist/backend/llvm/dense-array-access.js.map +1 -0
- package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-access.test.js +238 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +38 -0
- package/dist/backend/llvm/dyn.js +213 -14
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +308 -15
- package/dist/backend/llvm/emitter.js +1788 -206
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +89 -7
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +62 -8
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.d.ts +1 -0
- package/dist/backend/llvm/expr-async.test.js +62 -0
- package/dist/backend/llvm/expr-async.test.js.map +1 -0
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +85 -8
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +29 -21
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +5 -0
- package/dist/backend/llvm/expr-calls.js +118 -15
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +7 -1
- package/dist/backend/llvm/expr-containers.js +246 -32
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +113 -8
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +244 -44
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.js +3 -8
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +93 -36
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +51 -3
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +31 -17
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +96 -29
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +6 -3
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-remainder.d.ts +11 -0
- package/dist/backend/llvm/integer-remainder.js +91 -0
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +3 -1
- package/dist/backend/llvm/layouts.js +3 -2
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +16 -0
- package/dist/backend/llvm/lazy-captures.js +96 -0
- package/dist/backend/llvm/lazy-captures.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
- package/dist/backend/llvm/lazy-captures.test.js +78 -0
- package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
- package/dist/backend/llvm/lib-abi.js +10 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +10 -15
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +8 -8
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +1 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +5 -1
- package/dist/backend/llvm/local-array-reads.js +147 -26
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +85 -4
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +5 -1
- package/dist/backend/llvm/local-union-storage.js +54 -8
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +94 -6
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +18 -0
- package/dist/backend/llvm/map-number-lookup.js +62 -0
- package/dist/backend/llvm/map-number-lookup.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -0
- package/dist/backend/llvm/map-read-lifetimes.js +24 -3
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +39 -20
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/nullable-fields.d.ts +28 -0
- package/dist/backend/llvm/nullable-fields.js +45 -0
- package/dist/backend/llvm/nullable-fields.js.map +1 -0
- package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-fields.test.js +48 -0
- package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
- package/dist/backend/llvm/nullable-unions.d.ts +68 -0
- package/dist/backend/llvm/nullable-unions.js +132 -0
- package/dist/backend/llvm/nullable-unions.js.map +1 -0
- package/dist/backend/llvm/publish.d.ts +58 -0
- package/dist/backend/llvm/publish.js +286 -0
- package/dist/backend/llvm/publish.js.map +1 -0
- package/dist/backend/llvm/rebound-parameters.d.ts +12 -0
- package/dist/backend/llvm/rebound-parameters.js +72 -0
- package/dist/backend/llvm/rebound-parameters.js.map +1 -0
- package/dist/backend/llvm/rebound-parameters.test.d.ts +1 -0
- package/dist/backend/llvm/rebound-parameters.test.js +67 -0
- package/dist/backend/llvm/rebound-parameters.test.js.map +1 -0
- package/dist/backend/llvm/reference-effects.d.ts +18 -2
- package/dist/backend/llvm/reference-effects.js +106 -16
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-effects.test.js +52 -1
- package/dist/backend/llvm/reference-effects.test.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +104 -9
- package/dist/backend/llvm/shapes.js +356 -46
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +139 -5
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/stack-callbacks.js +2 -3
- package/dist/backend/llvm/stack-callbacks.js.map +1 -1
- package/dist/backend/llvm/stack-captures.d.ts +3 -1
- package/dist/backend/llvm/stack-captures.js +5 -3
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +43 -3
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.d.ts +10 -0
- package/dist/backend/llvm/string-construction.js +42 -0
- package/dist/backend/llvm/string-construction.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-key-hash.d.ts +15 -0
- package/dist/backend/llvm/string-key-hash.js +76 -0
- package/dist/backend/llvm/string-key-hash.js.map +1 -0
- package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
- package/dist/backend/llvm/string-key-hash.test.js +45 -0
- package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +65 -15
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +7 -0
- package/dist/backend/llvm/string-reads.js +76 -0
- package/dist/backend/llvm/string-reads.js.map +1 -0
- package/dist/backend/llvm/switch-dispatch.js +1 -1
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +3 -3
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/test-boxed-unions.d.ts +5 -0
- package/dist/backend/llvm/test-boxed-unions.js +13 -0
- package/dist/backend/llvm/test-boxed-unions.js.map +1 -0
- package/dist/backend/llvm/union-repr.d.ts +15 -0
- package/dist/backend/llvm/union-repr.js +89 -0
- package/dist/backend/llvm/union-repr.js.map +1 -0
- package/dist/backend/llvm/virtual-borrows.d.ts +31 -0
- package/dist/backend/llvm/virtual-borrows.js +82 -0
- package/dist/backend/llvm/virtual-borrows.js.map +1 -0
- package/dist/backend/llvm/walk-borrows.d.ts +43 -0
- package/dist/backend/llvm/walk-borrows.js +150 -0
- package/dist/backend/llvm/walk-borrows.js.map +1 -0
- package/dist/backend/llvm/walk-borrows.test.d.ts +1 -0
- package/dist/backend/llvm/walk-borrows.test.js +119 -0
- package/dist/backend/llvm/walk-borrows.test.js.map +1 -0
- package/dist/backend/llvm/walkers.d.ts +5 -1
- package/dist/backend/llvm/walkers.js +24 -21
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.d.ts +29 -1
- package/dist/backend/may-throw.js +349 -3
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +114 -2
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native/cache-warm.d.ts +2 -1
- package/dist/backend/native/cache-warm.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +3 -2
- package/dist/backend/native/contracts.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-codegen-core.d.ts +7 -4
- package/dist/backend/native-codegen-core.js +14 -9
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +9 -0
- package/dist/backend/native-codegen.js +53 -2
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +64 -10
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +3 -2
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.d.ts +2 -1
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +2 -2
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +5 -1
- package/dist/backend/native-tools.js +3 -1
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/optimization.d.ts +25 -0
- package/dist/backend/optimization.js +21 -0
- package/dist/backend/optimization.js.map +1 -0
- package/dist/backend/optimization.test.d.ts +1 -0
- package/dist/backend/optimization.test.js +24 -0
- package/dist/backend/optimization.test.js.map +1 -0
- package/dist/backend/publication.d.ts +28 -0
- package/dist/backend/publication.js +155 -0
- package/dist/backend/publication.js.map +1 -0
- package/dist/backend/publication.test.d.ts +1 -0
- package/dist/backend/publication.test.js +72 -0
- package/dist/backend/publication.test.js.map +1 -0
- 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 +15 -4
- package/dist/backend/runtime-pack-core.js +23 -12
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +7 -3
- package/dist/backend/runtime-pack-native.js +0 -3
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.d.ts +20 -2
- package/dist/backend/runtime-pack.js +23 -0
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +115 -2
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/targets.d.ts +2 -1
- package/dist/backend/targets.js +1 -1
- package/dist/backend/targets.js.map +1 -1
- package/dist/cli/command.js +75 -11
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +2 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +13 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +17 -5
- package/dist/coverage/report.d.ts +25 -2
- package/dist/coverage/report.js +161 -33
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +63 -0
- package/dist/coverage/verdict-cache.js +193 -0
- package/dist/coverage/verdict-cache.js.map +1 -0
- package/dist/coverage/verdict-cache.test.d.ts +1 -0
- package/dist/coverage/verdict-cache.test.js +52 -0
- package/dist/coverage/verdict-cache.test.js.map +1 -0
- package/dist/coverage/verdict-semantic.d.ts +2 -0
- package/dist/coverage/verdict-semantic.js +24 -0
- package/dist/coverage/verdict-semantic.js.map +1 -0
- package/dist/coverage/verdict-startup.d.ts +15 -0
- package/dist/coverage/verdict-startup.js +66 -0
- package/dist/coverage/verdict-startup.js.map +1 -0
- package/dist/diagnostics/diagnostic.d.ts +29 -1
- package/dist/diagnostics/diagnostic.js +84 -12
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +130 -0
- package/dist/diagnostics/envelope.js +257 -0
- package/dist/diagnostics/envelope.js.map +1 -0
- package/dist/diagnostics/envelope.test.d.ts +1 -0
- package/dist/diagnostics/envelope.test.js +91 -0
- package/dist/diagnostics/envelope.test.js.map +1 -0
- package/dist/diagnostics/render.d.ts +3 -0
- package/dist/diagnostics/render.js +13 -2
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -2
- package/dist/executable/executable-cache.js +7 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +20 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +4 -0
- package/dist/executable/prepare.js +7 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +5 -49
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +30 -0
- package/dist/frontend/lowering/array-values.js +246 -1
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +17 -2
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +29 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +10 -17
- package/dist/frontend/lowering/builtins/process.js +66 -29
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.js +4 -2
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
- package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-assertions.d.ts +12 -0
- package/dist/frontend/lowering/class-assertions.js +229 -5
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
- package/dist/frontend/lowering/class-callbacks.js +18 -5
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +12 -6
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
- package/dist/frontend/lowering/class-method-mutations.js +472 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.js +25 -5
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +8 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-unions.d.ts +16 -0
- package/dist/frontend/lowering/class-unions.js +127 -0
- package/dist/frontend/lowering/class-unions.js.map +1 -0
- package/dist/frontend/lowering/coercions/builders.js +8 -1
- package/dist/frontend/lowering/coercions/builders.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
- package/dist/frontend/lowering/coercions/identity.js +26 -0
- package/dist/frontend/lowering/coercions/identity.js.map +1 -0
- package/dist/frontend/lowering/coercions/state.d.ts +6 -0
- package/dist/frontend/lowering/coercions/state.js +2 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +9 -6
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +8 -0
- package/dist/frontend/lowering/coercions/unions.js +67 -2
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collation-repertoire.d.ts +1 -0
- package/dist/frontend/lowering/collation-repertoire.js +19 -0
- package/dist/frontend/lowering/collation-repertoire.js.map +1 -0
- package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
- package/dist/frontend/lowering/collection-narrowing.js +31 -0
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
- package/dist/frontend/lowering/construction-escapes.d.ts +38 -0
- package/dist/frontend/lowering/construction-escapes.js +146 -0
- package/dist/frontend/lowering/construction-escapes.js.map +1 -0
- package/dist/frontend/lowering/construction-escapes.test.d.ts +1 -0
- package/dist/frontend/lowering/construction-escapes.test.js +150 -0
- package/dist/frontend/lowering/construction-escapes.test.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +416 -65
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-concat.js +130 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
- package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
- package/dist/frontend/lowering/containers/array-construction.js +110 -5
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
- package/dist/frontend/lowering/containers/array-methods.js +274 -144
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +43 -1
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +10 -1
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +7 -63
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +46 -0
- package/dist/frontend/lowering/cycle-initialization.js +303 -0
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
- package/dist/frontend/lowering/divergences.d.ts +9 -0
- package/dist/frontend/lowering/divergences.js +630 -0
- package/dist/frontend/lowering/divergences.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +178 -34
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
- package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
- package/dist/frontend/lowering/iterator-adapters.js +605 -0
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-array-sort.js +44 -5
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +7 -0
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +1 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +8 -3
- package/dist/frontend/lowering/lower-calls.js +388 -278
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +6 -0
- package/dist/frontend/lowering/lower-classes.js +117 -65
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +22 -2
- package/dist/frontend/lowering/lower-exprs.js +811 -254
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +32 -19
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +19 -13
- package/dist/frontend/lowering/lower-generators.js +67 -44
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +29 -4
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +1 -1
- package/dist/frontend/lowering/lower-island.js +24 -7
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +100 -3
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +82 -64
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +115 -2
- package/dist/frontend/lowering/lowerer.js +1266 -88
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +3 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-bounds.d.ts +19 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js +354 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.js +66 -0
- package/dist/frontend/lowering/runtime-optional-bounds.test.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +117 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +738 -0
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-guards.d.ts +36 -0
- package/dist/frontend/lowering/runtime-optional-guards.js +375 -0
- package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-guards.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-guards.test.js +92 -0
- package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-ownership.d.ts +63 -0
- package/dist/frontend/lowering/runtime-optional-ownership.js +382 -0
- package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +16 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js +41 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/strict-equality.d.ts +9 -0
- package/dist/frontend/lowering/strict-equality.js +116 -0
- package/dist/frontend/lowering/strict-equality.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.d.ts +36 -0
- package/dist/frontend/lowering/string-index-bounds.js +537 -0
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.test.d.ts +1 -0
- package/dist/frontend/lowering/string-index-bounds.test.js +223 -0
- package/dist/frontend/lowering/string-index-bounds.test.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +3 -0
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-comparison.d.ts +5 -0
- package/dist/frontend/lowering/union-comparison.js +47 -0
- package/dist/frontend/lowering/union-comparison.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.d.ts +2 -0
- package/dist/frontend/lowering/union-narrow.js +10 -6
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +10 -0
- package/dist/frontend/program-analysis.js +7 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +63 -2
- package/dist/frontend/program.js +1038 -61
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +122 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.d.ts +6 -0
- package/dist/frontend/resolve.js +14 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/threads-import.d.ts +5 -0
- package/dist/frontend/threads-import.js +21 -0
- package/dist/frontend/threads-import.js.map +1 -0
- package/dist/frontend/type-mapper.d.ts +4 -1
- package/dist/frontend/type-mapper.js +161 -20
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +15 -3
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/worker-target.d.ts +4 -0
- package/dist/frontend/worker-target.js +8 -1
- package/dist/frontend/worker-target.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +70 -16
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +3 -1
- package/dist/ir/analysis.js +4 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/build.d.ts +5 -0
- package/dist/ir/build.js +7 -0
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +5 -3
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/int32-slots.d.ts +72 -0
- package/dist/ir/int32-slots.js +837 -0
- package/dist/ir/int32-slots.js.map +1 -0
- package/dist/ir/int32-slots.test.d.ts +1 -0
- package/dist/ir/int32-slots.test.js +222 -0
- package/dist/ir/int32-slots.test.js.map +1 -0
- package/dist/ir/integer-ranges.d.ts +19 -3
- package/dist/ir/integer-ranges.js +168 -23
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +74 -2
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +101 -20
- package/dist/ir/ir.js +20 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +3 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +8 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +139 -22
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +308 -8
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +2 -1
- package/dist/library/library-profile.js +4 -3
- package/dist/library/library-profile.js.map +1 -1
- package/dist/native/cache.d.ts +3 -0
- package/dist/native/cache.js +49 -1
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +21 -1
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +1 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.d.ts +5 -0
- package/dist/native/compiler.js +51 -4
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/library.d.ts +2 -1
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.d.ts +4 -0
- package/dist/native/prepare.js +28 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.d.ts +3 -2
- package/dist/native/sanitizer.js +3 -13
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/startup-cache.d.ts +2 -0
- package/dist/startup-cache.js +2 -0
- package/dist/startup-cache.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +8 -2
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { lowerArrayIteratorValue } from "../iterator-adapters.js";
|
|
2
|
+
import { identityPreservingWidening } from "../coercions/identity.js";
|
|
3
|
+
import { arrayConcatHelper } from "./array-concat.js";
|
|
1
4
|
import { boolLit, countedFor, numLit, strLit, varRef } from "../../../ir/build.js";
|
|
2
5
|
import { InternalCompilerError } from "../../../errors.js";
|
|
3
6
|
import * as ts from "../../ts7/adapter.js";
|
|
4
7
|
import { BOOL, DYN, F64, JSVAL, STRING, UNDEFINED_T, arrayOf, isRefCounted, isUnitType, typeEquals, } from "../../../ir/ir.js";
|
|
5
8
|
import { ARRAY_METHODS } from "../surfaces.js";
|
|
6
9
|
import { tryLowerExpression } from "../expressions/try-lower-expression.js";
|
|
10
|
+
import { isSafeToRepeat } from "../expressions/evaluation-safety.js";
|
|
7
11
|
import { isJsSourceFile, locOf } from "../../program.js";
|
|
8
12
|
import { islandPrimitiveExit, lowerDynDispatchMethodCall } from "../lower-calls.js";
|
|
9
13
|
import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, } from "../array-values.js";
|
|
@@ -11,9 +15,124 @@ import { typeKey } from "../../type-mapper.js";
|
|
|
11
15
|
import { defaultAfterUndefined, lowerPositionArgument, lowerStaticallyUndefinedArgument, positionNumber, } from "../optional-arguments.js";
|
|
12
16
|
import { lowerArrayCopyWithin, lowerArrayFill } from "../array-indexed-mutation.js";
|
|
13
17
|
import { lowerArrayUnionHofCall, lowerArraySortCall, lowerArrayHofCall, lowerArrayFindLikeCall, lowerArrayFlatMapCall, lowerArrayReduceCall, } from "./array-callbacks.js";
|
|
14
|
-
import { lowerArraySpreadItems, lowerArrayValueItems } from "./array-construction.js";
|
|
18
|
+
import { lowerArraySpreadItems, lowerArrayValueItems, widenArraySpread, } from "./array-construction.js";
|
|
15
19
|
import { arrayLengthDeclaration } from "./array-iteration.js";
|
|
16
20
|
import { lowerArrayCallback, callbackArrayElement, requireProducedArrayElement, } from "./callback-arguments.js";
|
|
21
|
+
/** `a.push(v, ...)` where some argument is a runtime-optional read of the
|
|
22
|
+
* element type (an unchecked array read or a hole-observing iteration
|
|
23
|
+
* binding). Every argument evaluates before the first append; a present
|
|
24
|
+
* value takes the ordinary push (and its inline dense fast path), while a
|
|
25
|
+
* missing one appends a present-undefined slot at the current length,
|
|
26
|
+
* exactly what Node stores. The result is the final length. Pure
|
|
27
|
+
* receivers and arguments are repeated instead of copied into temporaries:
|
|
28
|
+
* appends run no user code, so repeated reads observe the same values. */
|
|
29
|
+
function lowerOptionalArrayPush(lowerer, receiver, values, elem, loc) {
|
|
30
|
+
const stmts = [];
|
|
31
|
+
const pure = isSafeToRepeat(receiver) && values.every(isSafeToRepeat);
|
|
32
|
+
const stable = (value, name) => {
|
|
33
|
+
if (pure)
|
|
34
|
+
return value;
|
|
35
|
+
const temp = lowerer.declareHiddenLocal(name, value.type);
|
|
36
|
+
stmts.push({ kind: "varDecl", localId: temp.id, init: value, loc });
|
|
37
|
+
return varRef(temp.id, value.type, loc);
|
|
38
|
+
};
|
|
39
|
+
const target = stable(receiver, "%pushTarget");
|
|
40
|
+
const args = values.map((value) => stable(value, "%pushValue"));
|
|
41
|
+
const length = () => ({
|
|
42
|
+
kind: "arrIntrinsic",
|
|
43
|
+
method: "length",
|
|
44
|
+
receiver: target,
|
|
45
|
+
args: [],
|
|
46
|
+
type: F64,
|
|
47
|
+
loc,
|
|
48
|
+
});
|
|
49
|
+
const push = (value) => ({
|
|
50
|
+
kind: "exprStmt",
|
|
51
|
+
expr: { kind: "arrIntrinsic", method: "push", receiver: target, args: [value], type: F64, loc },
|
|
52
|
+
loc,
|
|
53
|
+
});
|
|
54
|
+
for (const value of args) {
|
|
55
|
+
if (value.type.kind === "union" && lowerer.runtimeOptionalWidening(value.type, elem) !== null) {
|
|
56
|
+
const unionId = value.type.unionId;
|
|
57
|
+
stmts.push({
|
|
58
|
+
kind: "if",
|
|
59
|
+
cond: {
|
|
60
|
+
kind: "unionIsTag",
|
|
61
|
+
unionId,
|
|
62
|
+
tag: lowerer.armTag(unionId, UNDEFINED_T),
|
|
63
|
+
negated: false,
|
|
64
|
+
value,
|
|
65
|
+
type: BOOL,
|
|
66
|
+
loc,
|
|
67
|
+
},
|
|
68
|
+
then: [{ kind: "arraySetUndefined", arr: target, index: length(), loc }],
|
|
69
|
+
else_: [push(lowerer.coerceToExpected(value, elem))],
|
|
70
|
+
loc,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
stmts.push(push(lowerer.coerceToExpected(value, elem)));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { kind: "seqExpr", stmts, result: length(), type: F64, loc };
|
|
78
|
+
}
|
|
79
|
+
/** `a.splice(start, count, v)` where v may hold undefined at run time.
|
|
80
|
+
* Receiver, start, count, and v evaluate once, in order; a present v is
|
|
81
|
+
* inserted as a plain element literal (which a statement-position splice
|
|
82
|
+
* then inserts without any temporary array), a missing one through the
|
|
83
|
+
* present-undefined item array. Both arms return the removed elements. */
|
|
84
|
+
function lowerOptionalSpliceItem(lowerer, receiver, positions, value, elem, arrType, loc) {
|
|
85
|
+
const stmts = [];
|
|
86
|
+
const repeatable = (e) => e.kind === "numLit" || isSafeToRepeat(e);
|
|
87
|
+
const pure = repeatable(receiver) && positions.every(repeatable) && repeatable(value);
|
|
88
|
+
const stable = (e, name) => {
|
|
89
|
+
if (pure)
|
|
90
|
+
return e;
|
|
91
|
+
const temp = lowerer.declareHiddenLocal(name, e.type);
|
|
92
|
+
stmts.push({ kind: "varDecl", localId: temp.id, init: e, loc });
|
|
93
|
+
return varRef(temp.id, e.type, loc);
|
|
94
|
+
};
|
|
95
|
+
const target = stable(receiver, "%spliceTarget");
|
|
96
|
+
const bounds = positions.map((position) => stable(position, "%splicePosition"));
|
|
97
|
+
const item = stable(value, "%spliceValue");
|
|
98
|
+
if (item.type.kind !== "union")
|
|
99
|
+
throw new InternalCompilerError("runtime-optional splice item is not a union");
|
|
100
|
+
const splice = (items) => ({
|
|
101
|
+
kind: "arrIntrinsic",
|
|
102
|
+
method: "spliceInsert",
|
|
103
|
+
receiver: target,
|
|
104
|
+
args: [...bounds, items],
|
|
105
|
+
type: arrType,
|
|
106
|
+
loc,
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
kind: "seqExpr",
|
|
110
|
+
stmts,
|
|
111
|
+
result: {
|
|
112
|
+
kind: "ternary",
|
|
113
|
+
cond: {
|
|
114
|
+
kind: "unionIsTag",
|
|
115
|
+
unionId: item.type.unionId,
|
|
116
|
+
tag: lowerer.armTag(item.type.unionId, UNDEFINED_T),
|
|
117
|
+
negated: false,
|
|
118
|
+
value: item,
|
|
119
|
+
type: BOOL,
|
|
120
|
+
loc,
|
|
121
|
+
},
|
|
122
|
+
then: splice(lowerArrayValueItems(lowerer, [item], elem, arrType, loc)),
|
|
123
|
+
else_: splice({
|
|
124
|
+
kind: "arrayLit",
|
|
125
|
+
elems: [lowerer.coerceToExpected(item, elem)],
|
|
126
|
+
type: arrType,
|
|
127
|
+
loc,
|
|
128
|
+
}),
|
|
129
|
+
type: arrType,
|
|
130
|
+
loc,
|
|
131
|
+
},
|
|
132
|
+
type: arrType,
|
|
133
|
+
loc,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
17
136
|
function primitivePositionType(lowerer, type) {
|
|
18
137
|
if (type.kind === "union") {
|
|
19
138
|
return (lowerer.unions.get(type.unionId)?.arms.every((arm) => primitivePositionType(lowerer, arm)) ??
|
|
@@ -100,7 +219,12 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
100
219
|
if (lowerer.chainBlocked(access, call))
|
|
101
220
|
return null;
|
|
102
221
|
const name = access.name.text;
|
|
103
|
-
|
|
222
|
+
const iteratorMethod = (name === "values" || name === "keys" || name === "entries") && call.arguments.length === 0;
|
|
223
|
+
if (!ARRAY_METHODS.has(name) &&
|
|
224
|
+
name !== "sort" &&
|
|
225
|
+
name !== "shift" &&
|
|
226
|
+
name !== "splice" &&
|
|
227
|
+
!iteratorMethod)
|
|
104
228
|
return null;
|
|
105
229
|
let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
|
|
106
230
|
const checkerReceiver = lowerer.checker.getTypeAtLocation(access.expression);
|
|
@@ -144,6 +268,19 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
144
268
|
return null;
|
|
145
269
|
let elem = receiverIr.elem;
|
|
146
270
|
const loc = locOf(call);
|
|
271
|
+
if (iteratorMethod) {
|
|
272
|
+
const type = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
273
|
+
const receiver = lowerer.lowerExpr(access.expression);
|
|
274
|
+
// Only a static array resolves to a generator here; other lowered
|
|
275
|
+
// receivers (island arrays, narrowed unions, checked dynamic values)
|
|
276
|
+
// continue to their dedicated handling below.
|
|
277
|
+
if (receiver.type.kind === "array") {
|
|
278
|
+
const value = type ? lowerArrayIteratorValue(lowerer, receiver, name, type, loc) : null;
|
|
279
|
+
if (value)
|
|
280
|
+
return value;
|
|
281
|
+
lowerer.unsupported("SC1090", call, `'${name}()' iterators over this array element type`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
147
284
|
// An island handle behind an array-typed .d.ts surface
|
|
148
285
|
// (`parts().join("-")` — arrays never exit eagerly, so the value
|
|
149
286
|
// stays jsval): the ENGINE's own Array.prototype method runs on the
|
|
@@ -436,9 +573,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
436
573
|
: null;
|
|
437
574
|
if ((name === "push" || name === "unshift") && spreadArg && ts.isSpreadElement(spreadArg)) {
|
|
438
575
|
let src = lowerer.lowerExpr(spreadArg.expression);
|
|
439
|
-
// `a.push(...someSet)` / `a.unshift(...someSet)`: a
|
|
576
|
+
// `a.push(...someSet)` / `a.unshift(...someSet)`: a compatible Set drains first
|
|
440
577
|
// (setIntrinsic toArray — insertion order), then appends.
|
|
441
|
-
if (src.type.kind === "set" &&
|
|
578
|
+
if (src.type.kind === "set" && identityPreservingWidening(lowerer, src.type.elem, elem)) {
|
|
442
579
|
src = {
|
|
443
580
|
kind: "setIntrinsic",
|
|
444
581
|
method: "toArray",
|
|
@@ -448,6 +585,19 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
448
585
|
loc,
|
|
449
586
|
};
|
|
450
587
|
}
|
|
588
|
+
if (src.type.kind === "array" &&
|
|
589
|
+
!typeEquals(src.type, receiverIr) &&
|
|
590
|
+
identityPreservingWidening(lowerer, src.type.elem, elem)) {
|
|
591
|
+
const items = widenArraySpread(lowerer, src, elem, loc);
|
|
592
|
+
return {
|
|
593
|
+
kind: "arrIntrinsic",
|
|
594
|
+
method: name === "push" ? "pushSpread" : "unshiftSpread",
|
|
595
|
+
receiver,
|
|
596
|
+
args: [items],
|
|
597
|
+
type: F64,
|
|
598
|
+
loc,
|
|
599
|
+
};
|
|
600
|
+
}
|
|
451
601
|
if (!typeEquals(src.type, receiverIr)) {
|
|
452
602
|
lowerer.unsupported("SC1090", spreadArg, `${name === "push" ? "pushing" : "unshifting"} a spread of '${lowerer.fmt(src.type)}' onto a '${lowerer.fmt(receiverIr)}' array (only a same-element-type array spreads)`);
|
|
453
603
|
}
|
|
@@ -476,10 +626,13 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
476
626
|
}
|
|
477
627
|
const valueProbes = call.arguments.map((arg) => tryLowerExpression(lowerer, arg));
|
|
478
628
|
if (valueProbes.some((probe) => probe !== null && lowerer.runtimeOptionalWidening(probe.type, elem) !== null)) {
|
|
629
|
+
if (name === "push") {
|
|
630
|
+
return lowerOptionalArrayPush(lowerer, receiver, call.arguments.map((arg) => lowerer.lowerExpr(arg)), elem, loc);
|
|
631
|
+
}
|
|
479
632
|
const items = lowerArrayValueItems(lowerer, call.arguments.map((arg) => lowerer.lowerExpr(arg)), elem, receiverIr, loc);
|
|
480
633
|
return {
|
|
481
634
|
kind: "arrIntrinsic",
|
|
482
|
-
method:
|
|
635
|
+
method: "unshiftSpread",
|
|
483
636
|
receiver,
|
|
484
637
|
args: [items],
|
|
485
638
|
type: F64,
|
|
@@ -502,6 +655,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
502
655
|
};
|
|
503
656
|
}
|
|
504
657
|
if (name === "pop") {
|
|
658
|
+
// An unused result needs no value at all: drop the last slot.
|
|
659
|
+
if (resultDiscarded(call))
|
|
660
|
+
return lowerDiscardedPop(lowerer, access.expression, loc);
|
|
505
661
|
// Widen a union payload through the normal array-read machinery
|
|
506
662
|
// before removing it. Reinterpreting the stored union's tag as the
|
|
507
663
|
// result union would confuse arms when undefined changes their order.
|
|
@@ -540,7 +696,7 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
540
696
|
const argIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
|
|
541
697
|
const probedArg = probedUntyped ? tryLowerExpression(lowerer, argNode) : null;
|
|
542
698
|
const argArrayType = probedArg?.type.kind === "array" ? probedArg.type : argIr?.kind === "array" ? argIr : null;
|
|
543
|
-
if (argArrayType !== null
|
|
699
|
+
if (argArrayType !== null) {
|
|
544
700
|
if (elem.kind === "array" && typeEquals(argArrayType, elem)) {
|
|
545
701
|
// number[][].concat(inner: number[]) — TS says element, JS's
|
|
546
702
|
// IsArray says spread; no honest static answer exists.
|
|
@@ -554,7 +710,7 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
554
710
|
arg = lowerer.coerceInto(argNode, arg, argArrayType);
|
|
555
711
|
if (arg.type.kind !== "array")
|
|
556
712
|
lowerer.badType(argNode, lowerer.typeOf(argNode));
|
|
557
|
-
shape.push(
|
|
713
|
+
shape.push(arg.type.elem);
|
|
558
714
|
args.push(arg);
|
|
559
715
|
continue;
|
|
560
716
|
}
|
|
@@ -567,16 +723,16 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
567
723
|
if (elem.kind === "jsval") {
|
|
568
724
|
const arg = lowerer.lowerExpr(argNode);
|
|
569
725
|
if (arg.type.kind === "array" && arg.type.elem.kind === "jsval") {
|
|
570
|
-
shape.push(
|
|
726
|
+
shape.push(arg.type.elem);
|
|
571
727
|
args.push(arg);
|
|
572
728
|
continue;
|
|
573
729
|
}
|
|
574
730
|
}
|
|
575
731
|
// An element value — union elements wrap exactly like a push.
|
|
576
|
-
shape.push(
|
|
732
|
+
shape.push(null);
|
|
577
733
|
args.push(lowerer.lowerExprExpecting(argNode, elem));
|
|
578
734
|
}
|
|
579
|
-
const helper = arrayConcatHelper(lowerer, elem, shape, loc);
|
|
735
|
+
const helper = arrayConcatHelper(lowerer, elem, shape, call, loc);
|
|
580
736
|
return { kind: "call", callee: helper, args: [receiver, ...args], type: receiverIr, loc };
|
|
581
737
|
}
|
|
582
738
|
if (name === "slice") {
|
|
@@ -600,6 +756,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
600
756
|
const hasSpread = itemNodes.some(ts.isSpreadElement);
|
|
601
757
|
const itemProbes = hasSpread ? [] : itemNodes.map((arg) => tryLowerExpression(lowerer, arg));
|
|
602
758
|
const statefulItems = itemProbes.some((probe) => probe !== null && lowerer.runtimeOptionalWidening(probe.type, elem) !== null);
|
|
759
|
+
if (statefulItems && itemNodes.length === 1) {
|
|
760
|
+
return lowerOptionalSpliceItem(lowerer, receiver, args, lowerer.lowerExpr(itemNodes[0]), elem, receiverIr, loc);
|
|
761
|
+
}
|
|
603
762
|
const items = hasSpread
|
|
604
763
|
? lowerArraySpreadItems(lowerer, itemNodes, elem, receiverIr, loc)
|
|
605
764
|
: statefulItems
|
|
@@ -688,7 +847,80 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
688
847
|
// reduce / reduceRight
|
|
689
848
|
return lowerArrayReduceCall(lowerer, call, access, name, elem);
|
|
690
849
|
}
|
|
691
|
-
/**
|
|
850
|
+
/** The call's value is never read: an expression statement, a `void`
|
|
851
|
+
* operand, the left of a comma, or a for-loop initializer or update. */
|
|
852
|
+
function resultDiscarded(call) {
|
|
853
|
+
let child = call;
|
|
854
|
+
let parent = call.parent;
|
|
855
|
+
while (parent && ts.isParenthesizedExpression(parent)) {
|
|
856
|
+
child = parent;
|
|
857
|
+
parent = parent.parent;
|
|
858
|
+
}
|
|
859
|
+
if (!parent)
|
|
860
|
+
return false;
|
|
861
|
+
if (ts.isExpressionStatement(parent) || ts.isVoidExpression(parent))
|
|
862
|
+
return true;
|
|
863
|
+
if (ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.CommaToken)
|
|
864
|
+
return parent.left === child || resultDiscarded(parent);
|
|
865
|
+
return (ts.isForStatement(parent) && (parent.initializer === child || parent.incrementor === child));
|
|
866
|
+
}
|
|
867
|
+
/** `xs.pop()` whose result is unused: truncate a non-empty array by one
|
|
868
|
+
* slot. Truncation releases the removed element and leaves the length of
|
|
869
|
+
* an empty array at zero, as pop does (pop's own `length = 0` store, a
|
|
870
|
+
* no-op unless the array is frozen). */
|
|
871
|
+
function lowerDiscardedPop(lowerer, source, loc) {
|
|
872
|
+
const receiver = lowerer.lowerExpr(source);
|
|
873
|
+
const arr = lowerer.declareHiddenLocal("%popArray", receiver.type);
|
|
874
|
+
const arrRef = varRef(arr.id, arr.type, loc);
|
|
875
|
+
const length = lowerer.declareHiddenLocal("%popLength", F64);
|
|
876
|
+
const lengthRef = varRef(length.id, F64, loc);
|
|
877
|
+
return {
|
|
878
|
+
kind: "seqExpr",
|
|
879
|
+
stmts: [
|
|
880
|
+
{ kind: "varDecl", localId: arr.id, init: receiver, loc },
|
|
881
|
+
{
|
|
882
|
+
kind: "varDecl",
|
|
883
|
+
localId: length.id,
|
|
884
|
+
init: {
|
|
885
|
+
kind: "arrIntrinsic",
|
|
886
|
+
method: "length",
|
|
887
|
+
receiver: arrRef,
|
|
888
|
+
args: [],
|
|
889
|
+
type: F64,
|
|
890
|
+
loc,
|
|
891
|
+
},
|
|
892
|
+
loc,
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
kind: "if",
|
|
896
|
+
cond: { kind: "bin", op: ">", left: lengthRef, right: numLit(0, loc), type: BOOL, loc },
|
|
897
|
+
then: [
|
|
898
|
+
{
|
|
899
|
+
kind: "arraySetLength",
|
|
900
|
+
arr: arrRef,
|
|
901
|
+
length: {
|
|
902
|
+
kind: "bin",
|
|
903
|
+
op: "-",
|
|
904
|
+
left: lengthRef,
|
|
905
|
+
right: numLit(1, loc),
|
|
906
|
+
type: F64,
|
|
907
|
+
loc,
|
|
908
|
+
},
|
|
909
|
+
loc,
|
|
910
|
+
pop: true,
|
|
911
|
+
},
|
|
912
|
+
],
|
|
913
|
+
else_: [{ kind: "arraySetLength", arr: arrRef, length: numLit(0, loc), loc, pop: true }],
|
|
914
|
+
loc,
|
|
915
|
+
},
|
|
916
|
+
],
|
|
917
|
+
// The value is never read; any placeholder scalar keeps it unboxed.
|
|
918
|
+
result: numLit(0, loc),
|
|
919
|
+
type: F64,
|
|
920
|
+
loc,
|
|
921
|
+
};
|
|
922
|
+
}
|
|
923
|
+
/** Read before removal so it cannot destroy the result's owned payload.
|
|
692
924
|
* The source is evaluated once and empty/sparse arrays yield undefined using
|
|
693
925
|
* the same slot-state checks as an indexed read. */
|
|
694
926
|
function lowerUnionArrayRemoval(lowerer, source, elem, first, loc) {
|
|
@@ -726,18 +958,39 @@ function lowerUnionArrayRemoval(lowerer, source, elem, first, loc) {
|
|
|
726
958
|
loc,
|
|
727
959
|
},
|
|
728
960
|
{ kind: "varDecl", localId: result.id, init: value, loc },
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
961
|
+
first
|
|
962
|
+
? {
|
|
963
|
+
kind: "exprStmt",
|
|
964
|
+
expr: {
|
|
965
|
+
kind: "arrIntrinsic",
|
|
966
|
+
method: "splice",
|
|
967
|
+
receiver: arrRef,
|
|
968
|
+
args: [indexRef, numLit(1, loc)],
|
|
969
|
+
type: arr.type,
|
|
970
|
+
loc,
|
|
971
|
+
},
|
|
972
|
+
loc,
|
|
973
|
+
}
|
|
974
|
+
: {
|
|
975
|
+
// Removing the last slot is a truncation: no removed-element
|
|
976
|
+
// array, and an empty array keeps length zero.
|
|
977
|
+
kind: "if",
|
|
978
|
+
cond: {
|
|
979
|
+
kind: "bin",
|
|
980
|
+
op: ">=",
|
|
981
|
+
left: indexRef,
|
|
982
|
+
right: numLit(0, loc),
|
|
983
|
+
type: BOOL,
|
|
984
|
+
loc,
|
|
985
|
+
},
|
|
986
|
+
then: [{ kind: "arraySetLength", arr: arrRef, length: indexRef, loc, pop: true }],
|
|
987
|
+
// Pop's `length = 0` store on an empty array (a no-op unless the
|
|
988
|
+
// array is frozen).
|
|
989
|
+
else_: [
|
|
990
|
+
{ kind: "arraySetLength", arr: arrRef, length: numLit(0, loc), loc, pop: true },
|
|
991
|
+
],
|
|
737
992
|
loc,
|
|
738
993
|
},
|
|
739
|
-
loc,
|
|
740
|
-
},
|
|
741
994
|
],
|
|
742
995
|
result: varRef(result.id, result.type, loc),
|
|
743
996
|
type: result.type,
|
|
@@ -1576,129 +1829,6 @@ export function lowerTupleReadMethodCall(lowerer, call, access, tupleReceiver) {
|
|
|
1576
1829
|
}
|
|
1577
1830
|
return { kind: "call", callee: helper, args: [receiver, fnArg], type: outType, loc };
|
|
1578
1831
|
}
|
|
1579
|
-
/** An ordinary indexed read: values retain their element type, while
|
|
1580
|
-
* holes, missing properties, and present undefined yield undefined. */
|
|
1581
|
-
export function lowerSafeIndexRead(lowerer, arr, index, loc) {
|
|
1582
|
-
if (arr.type.kind !== "array")
|
|
1583
|
-
throw new InternalCompilerError("indexed read requires an array");
|
|
1584
|
-
const elem = arr.type.elem;
|
|
1585
|
-
if (elem.kind === "void")
|
|
1586
|
-
return null;
|
|
1587
|
-
const resultT = arrayValueType(lowerer, elem);
|
|
1588
|
-
const key = `idxOr:${typeKey(elem)}`;
|
|
1589
|
-
let name = lowerer.arrHofHelpers.get(key);
|
|
1590
|
-
if (!name) {
|
|
1591
|
-
name = `%arr.idxOr.${lowerer.arrHofHelpers.size}`;
|
|
1592
|
-
lowerer.arrHofHelpers.set(key, name);
|
|
1593
|
-
const arrT = arr.type;
|
|
1594
|
-
lowerer.liftedFns.push({
|
|
1595
|
-
name,
|
|
1596
|
-
params: [
|
|
1597
|
-
{ localId: "a.0", name: "a", type: arrT },
|
|
1598
|
-
{ localId: "i.0", name: "i", type: F64 },
|
|
1599
|
-
],
|
|
1600
|
-
returnType: resultT,
|
|
1601
|
-
locals: [
|
|
1602
|
-
{ id: "a.0", name: "a", type: arrT, mutable: false },
|
|
1603
|
-
{ id: "i.0", name: "i", type: F64, mutable: false },
|
|
1604
|
-
],
|
|
1605
|
-
body: [
|
|
1606
|
-
{
|
|
1607
|
-
kind: "return",
|
|
1608
|
-
value: arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc),
|
|
1609
|
-
loc,
|
|
1610
|
-
},
|
|
1611
|
-
],
|
|
1612
|
-
loc,
|
|
1613
|
-
});
|
|
1614
|
-
}
|
|
1615
|
-
return { kind: "call", callee: name, args: [arr, index], type: resultT, loc };
|
|
1616
|
-
}
|
|
1617
|
-
/** Fuse only our own f64-array read helper with immediate ToNumber.
|
|
1618
|
-
* Reuse its arguments verbatim so the receiver and index still evaluate
|
|
1619
|
-
* exactly once, in order, before the read. Do not specialize user calls,
|
|
1620
|
-
* union-element arrays, or optional values stored in locals. */
|
|
1621
|
-
export function tryLowerNumericIndexRead(lowerer, operand, loc) {
|
|
1622
|
-
if (operand.kind !== "call" ||
|
|
1623
|
-
operand.callee !== lowerer.arrHofHelpers.get(`idxOr:${typeKey(F64)}`))
|
|
1624
|
-
return null;
|
|
1625
|
-
const [arr, index] = operand.args;
|
|
1626
|
-
if (operand.args.length !== 2 ||
|
|
1627
|
-
arr?.type.kind !== "array" ||
|
|
1628
|
-
arr.type.elem.kind !== "f64" ||
|
|
1629
|
-
index?.type.kind !== "f64")
|
|
1630
|
-
return null;
|
|
1631
|
-
// The intrinsic owns the evaluated receiver through index evaluation,
|
|
1632
|
-
// then borrows it for one slot lookup. No extra helper parameter or
|
|
1633
|
-
// separate state/getter expressions need to retain the array again.
|
|
1634
|
-
return {
|
|
1635
|
-
kind: "arrIntrinsic",
|
|
1636
|
-
method: "getNumber",
|
|
1637
|
-
receiver: arr,
|
|
1638
|
-
args: [index],
|
|
1639
|
-
type: F64,
|
|
1640
|
-
loc,
|
|
1641
|
-
};
|
|
1642
|
-
}
|
|
1643
|
-
/** Backward-compatible name for the npm-static probe path. */
|
|
1644
|
-
export const lowerNpmStaticSafeIndexRead = lowerSafeIndexRead;
|
|
1645
|
-
/** Interned synthetic function for one (elem, argument-shape) concat —
|
|
1646
|
-
* `%arr.concat.<n>(a, x0, x1, ...)`: a fresh array takes a's elements
|
|
1647
|
-
* (pushSpread), then each argument pushes (element) or spreads (array)
|
|
1648
|
-
* in order; the receiver and array arguments are only READ. Rides
|
|
1649
|
-
* liftedFns like the HOF helpers (a plain function — no captures). */
|
|
1650
|
-
function arrayConcatHelper(lowerer, elem, shape, loc) {
|
|
1651
|
-
const key = `concat:${typeKey(elem)}:${shape.join("")}`;
|
|
1652
|
-
const existing = lowerer.arrHofHelpers.get(key);
|
|
1653
|
-
if (existing)
|
|
1654
|
-
return existing;
|
|
1655
|
-
const name = `%arr.concat.${lowerer.arrHofHelpers.size}`;
|
|
1656
|
-
lowerer.arrHofHelpers.set(key, name);
|
|
1657
|
-
const arrT = arrayOf(elem);
|
|
1658
|
-
const locals = [
|
|
1659
|
-
{ id: "a.0", name: "a", type: arrT, mutable: false },
|
|
1660
|
-
...shape.map((s, i) => ({
|
|
1661
|
-
id: `x.${i}`,
|
|
1662
|
-
name: `x${i}`,
|
|
1663
|
-
type: s === "a" ? arrT : elem,
|
|
1664
|
-
mutable: false,
|
|
1665
|
-
})),
|
|
1666
|
-
{ id: "out.0", name: "out", type: arrT, mutable: false },
|
|
1667
|
-
];
|
|
1668
|
-
const params = [
|
|
1669
|
-
{ localId: "a.0", name: "a", type: arrT },
|
|
1670
|
-
...shape.map((s, i) => ({
|
|
1671
|
-
localId: `x.${i}`,
|
|
1672
|
-
name: `x${i}`,
|
|
1673
|
-
type: s === "a" ? arrT : elem,
|
|
1674
|
-
})),
|
|
1675
|
-
];
|
|
1676
|
-
const append = (s, src) => ({
|
|
1677
|
-
kind: "exprStmt",
|
|
1678
|
-
expr: {
|
|
1679
|
-
kind: "arrIntrinsic",
|
|
1680
|
-
method: s === "a" ? "concatSpread" : "push",
|
|
1681
|
-
receiver: varRef("out.0", arrT, loc),
|
|
1682
|
-
args: [src],
|
|
1683
|
-
type: F64,
|
|
1684
|
-
loc,
|
|
1685
|
-
},
|
|
1686
|
-
loc,
|
|
1687
|
-
});
|
|
1688
|
-
const body = [
|
|
1689
|
-
{
|
|
1690
|
-
kind: "varDecl",
|
|
1691
|
-
localId: "out.0",
|
|
1692
|
-
init: { kind: "arrayLit", elems: [], type: arrT, loc },
|
|
1693
|
-
loc,
|
|
1694
|
-
},
|
|
1695
|
-
append("a", varRef("a.0", arrT, loc)),
|
|
1696
|
-
...shape.map((s, i) => append(s, varRef(`x.${i}`, s === "a" ? arrT : elem, loc))),
|
|
1697
|
-
{ kind: "return", value: varRef("out.0", arrT, loc), loc },
|
|
1698
|
-
];
|
|
1699
|
-
lowerer.liftedFns.push({ name, params, returnType: arrT, locals, body, loc });
|
|
1700
|
-
return name;
|
|
1701
|
-
}
|
|
1702
1832
|
/** `a.at(i)` — the es2022 relative-index read. Desugars to an interned
|
|
1703
1833
|
* helper over existing IR nodes, ToIntegerOrInfinity-exact: the index
|
|
1704
1834
|
* truncates toward zero (floor for non-negatives, mirrored floor for
|