@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,12 +1,14 @@
|
|
|
1
1
|
import { classMembershipIntervals } from "./classes.js";
|
|
2
|
-
import { emitBorrowedInput, emitBorrowedInputs } from "./borrowed-inputs.js";
|
|
2
|
+
import { borrowableInputs, emitBorrowedInput, emitBorrowedInputs } from "./borrowed-inputs.js";
|
|
3
3
|
import { preservesDynTest } from "./checked-value-lifetimes.js";
|
|
4
4
|
import { typedRefConstructor } from "./shapes.js";
|
|
5
5
|
/* Focused LLVM expression emission extracted from emitter.ts. */
|
|
6
6
|
import { InternalCompilerError } from "../../errors.js";
|
|
7
|
+
import { emitNullableIsTag, emitNullablePresent } from "./union-repr.js";
|
|
8
|
+
import { isObjectArm } from "./nullable-unions.js";
|
|
7
9
|
import { streamTypedRefEligible } from "../../ir/analysis.js";
|
|
8
10
|
import { DYN, isDynTypedRefType, isRefCounted, isUnitType, typeEquals, typeKey, } from "../../ir/ir.js";
|
|
9
|
-
import { BYTES_ELEM_NUM } from "./common.js";
|
|
11
|
+
import { BYTES_ELEM_NUM, closureIdentityEqual } from "./common.js";
|
|
10
12
|
import { DYN_KIND } from "./dyn.js";
|
|
11
13
|
import { elemAccess, vAdapters } from "./shapes.js";
|
|
12
14
|
import { LlvmUnsupportedError } from "./unsupported.js";
|
|
@@ -248,24 +250,24 @@ export function emitDynamicExpr(host, e) {
|
|
|
248
250
|
const v = host.emitExpr(e.value);
|
|
249
251
|
if (isRefCounted(arm))
|
|
250
252
|
host.moveTemp(v);
|
|
251
|
-
return host.own({ name: host.unionNewOwned(e.tag, v), type: e.type });
|
|
253
|
+
return host.own({ name: host.unionNewOwned(e.unionId, e.tag, v), type: e.type });
|
|
252
254
|
}
|
|
253
255
|
case "unionNarrow": {
|
|
254
256
|
// Tag-UNCHECKED payload extraction: the frontend emits this only
|
|
255
257
|
// where tsc's control-flow narrowing proved the tag. Ref payloads
|
|
256
258
|
// come out +1. The receiver is consumed before any later expression.
|
|
257
|
-
const u = host.
|
|
259
|
+
const u = host.emitUnionProjection(e.value);
|
|
258
260
|
const arm = e.type;
|
|
259
261
|
if (isUnitType(arm))
|
|
260
262
|
throw new InternalCompilerError(`llvm emitter bug: unionNarrow to unit arm ${arm.kind}`);
|
|
261
|
-
const v = host.unionExtract(u.name, arm);
|
|
263
|
+
const v = host.unionExtract(u.name, e.unionId, arm);
|
|
262
264
|
return host.own({ name: v, type: arm });
|
|
263
265
|
}
|
|
264
266
|
case "unionDisc": {
|
|
265
267
|
// Shared-field read `r.kind`: switch on the runtime tag and read
|
|
266
268
|
// the (same-typed) field from the concretely-typed payload.
|
|
267
269
|
// Ref-counted results come out retained (+1), owned by this frame.
|
|
268
|
-
const u = host.
|
|
270
|
+
const u = host.emitUnionProjection(e.value);
|
|
269
271
|
const def = host.unionsById.get(e.unionId);
|
|
270
272
|
if (!def)
|
|
271
273
|
throw new InternalCompilerError(`llvm emitter bug: unionDisc of unknown union ${e.unionId}`);
|
|
@@ -277,12 +279,21 @@ export function emitDynamicExpr(host, e) {
|
|
|
277
279
|
if (arm.kind !== "record" && arm.kind !== "object") {
|
|
278
280
|
throw new LlvmUnsupportedError(`unionDisc:${arm.kind}`, e.loc);
|
|
279
281
|
}
|
|
280
|
-
const payload = host.unionPeek(u.name);
|
|
282
|
+
const payload = host.unionPeek(u.name, def.id);
|
|
281
283
|
const { ptr, type } = arm.kind === "object"
|
|
282
284
|
? host.classFieldPtr(payload, arm.className, e.field)
|
|
283
285
|
: host.recordFieldPtr(payload, arm.shapeId, e.field);
|
|
284
|
-
const
|
|
285
|
-
const
|
|
286
|
+
const nullable = arm.kind === "object" ? host.nullableFields.get(arm.className, e.field) : null;
|
|
287
|
+
const v = arm.kind === "object"
|
|
288
|
+
? host.int32Slots.isField(arm.className, e.field)
|
|
289
|
+
? host.loadInt32Field(ptr, e.type).name
|
|
290
|
+
: host.loadField(ptr, type)
|
|
291
|
+
: host.loadRecordField(ptr, type);
|
|
292
|
+
const value = nullable
|
|
293
|
+
? host.nullableToOwnedUnion(v, nullable)
|
|
294
|
+
: isRefCounted(e.type)
|
|
295
|
+
? host.retainValue(v, e.type)
|
|
296
|
+
: v;
|
|
286
297
|
B.line(`store ${ty} ${value}, ptr ${slot}`);
|
|
287
298
|
B.br(join);
|
|
288
299
|
}, host.unionFieldGroups(def, e.field));
|
|
@@ -337,7 +348,7 @@ export function emitDynamicExpr(host, e) {
|
|
|
337
348
|
// runtime getter answers owned (+1 for ref elements); invalid
|
|
338
349
|
// indices trap. The result wraps into the join when unit arms
|
|
339
350
|
// widened it.
|
|
340
|
-
const payload = host.unionPeek(u.name);
|
|
351
|
+
const payload = host.unionPeek(u.name, def.id);
|
|
341
352
|
const acc = elemAccess(arm.elem);
|
|
342
353
|
const accTy = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
|
|
343
354
|
host.declare(`declare ${acc === "bool" ? "zeroext i1" : accTy} @scr_arr_get_${acc}(ptr, double)`);
|
|
@@ -360,18 +371,18 @@ export function emitDynamicExpr(host, e) {
|
|
|
360
371
|
}
|
|
361
372
|
// The element read is already owned (+1) — ownership MOVES
|
|
362
373
|
// into the union box, no extra retain.
|
|
363
|
-
B.line(`store ptr ${host.unionNewOwned(tag, { name: v, type: arm.elem })}, ptr ${slot}`);
|
|
374
|
+
B.line(`store ptr ${host.unionNewOwned(e.type.unionId, tag, { name: v, type: arm.elem })}, ptr ${slot}`);
|
|
364
375
|
B.br(join);
|
|
365
376
|
return;
|
|
366
377
|
}
|
|
367
378
|
if (arm.kind !== "record")
|
|
368
379
|
throw new LlvmUnsupportedError(`unionKeyGet:${arm.kind}`, e.loc);
|
|
369
380
|
const shape = host.recordShape(arm.shapeId);
|
|
370
|
-
const payload = host.unionPeek(u.name);
|
|
381
|
+
const payload = host.unionPeek(u.name, def.id);
|
|
371
382
|
const declared = literal !== null ? shape.fields.find((f) => f.name === literal) : undefined;
|
|
372
383
|
if (declared) {
|
|
373
384
|
const { ptr, type: ft } = host.recordFieldPtr(payload, arm.shapeId, declared.name);
|
|
374
|
-
const v = host.
|
|
385
|
+
const v = host.loadRecordField(ptr, ft);
|
|
375
386
|
if (typeEquals(ft, e.type)) {
|
|
376
387
|
B.line(`store ${ty} ${isRefCounted(ft) ? host.retainValue(v, ft) : v}, ptr ${slot}`);
|
|
377
388
|
B.br(join);
|
|
@@ -388,8 +399,11 @@ export function emitDynamicExpr(host, e) {
|
|
|
388
399
|
throw new InternalCompilerError(`llvm emitter bug: unionKeyGet arm answer ${ft.kind} outside the join`);
|
|
389
400
|
}
|
|
390
401
|
const wrapped = ft.kind === "f64" || ft.kind === "bool"
|
|
391
|
-
? host.unionNewOwned(tag, { name: v, type: ft })
|
|
392
|
-
: host.unionNewOwned(
|
|
402
|
+
? host.unionNewOwned(e.type.unionId, tag, { name: v, type: ft })
|
|
403
|
+
: host.unionNewOwned(e.type.unionId, tag, {
|
|
404
|
+
name: host.retainValue(v, ft),
|
|
405
|
+
type: ft,
|
|
406
|
+
});
|
|
393
407
|
B.line(`store ptr ${wrapped}, ptr ${slot}`);
|
|
394
408
|
B.br(join);
|
|
395
409
|
return;
|
|
@@ -406,9 +420,12 @@ export function emitDynamicExpr(host, e) {
|
|
|
406
420
|
}
|
|
407
421
|
case "unionIsTag": {
|
|
408
422
|
// A pure tag compare — the box is borrowed, no payload is touched.
|
|
409
|
-
const u = host.
|
|
410
|
-
const
|
|
423
|
+
const u = host.emitUnionProjection(e.value);
|
|
424
|
+
const nullable = host.nullableUnions.get(e.unionId);
|
|
411
425
|
const t = B.tmp();
|
|
426
|
+
if (nullable)
|
|
427
|
+
return { name: emitNullableIsTag(B, nullable, u.name, e.tag, e.negated), type: e.type };
|
|
428
|
+
const tag = host.unionTag(u.name, e.unionId);
|
|
412
429
|
B.line(`${t} = icmp ${e.negated ? "ne" : "eq"} i32 ${tag}, ${e.tag}`);
|
|
413
430
|
return { name: t, type: e.type };
|
|
414
431
|
}
|
|
@@ -477,7 +494,7 @@ export function emitDynamicExpr(host, e) {
|
|
|
477
494
|
B.line(`${pv} = getelementptr inbounds i8, ptr ${d.name}, i64 16 ; ->v.str`);
|
|
478
495
|
const sv = B.tmp();
|
|
479
496
|
B.line(`${sv} = load ptr, ptr ${pv}`);
|
|
480
|
-
B.line(`${eq} = call zeroext i1 @
|
|
497
|
+
B.line(`${eq} = call zeroext i1 @sc_str_eq(ptr ${sv}, ptr ${s.name})`);
|
|
481
498
|
}
|
|
482
499
|
else if (st.kind === "f64") {
|
|
483
500
|
B.line(`${pv} = getelementptr inbounds i8, ptr ${d.name}, i64 16 ; ->v.num`);
|
|
@@ -650,19 +667,74 @@ export function emitDynamicExpr(host, e) {
|
|
|
650
667
|
return { name: neg, type: e.type };
|
|
651
668
|
}
|
|
652
669
|
case "unionEq": {
|
|
670
|
+
const direct = emitUnionEqWrappedScalar(host, e);
|
|
671
|
+
if (direct)
|
|
672
|
+
return direct;
|
|
653
673
|
// Strict equality of the ARM values (tag compare + per-arm payload
|
|
654
674
|
// compare — the C per-union helper, inlined). Both boxes borrowed.
|
|
655
|
-
|
|
675
|
+
// Stack-representable operands (wrapped literals, optional array
|
|
676
|
+
// reads, Map.get results) and stack-boxed locals never allocate: the
|
|
677
|
+
// compare only reads tags and payloads, and each payload has its own
|
|
678
|
+
// owner, so later operands cannot invalidate an earlier stack box.
|
|
679
|
+
// A borrowed nullable-pointer field read projects its pointer the
|
|
680
|
+
// same way; borrowableInputs already proved later operands cannot
|
|
681
|
+
// replace the field.
|
|
682
|
+
const operands = [e.left, e.right];
|
|
683
|
+
const borrowed = borrowableInputs(host, operands);
|
|
684
|
+
const inputs = operands.map((value, index) => borrowed[index] ||
|
|
685
|
+
host.isStackUnionSource(value) ||
|
|
686
|
+
(value.kind === "varRef" && host.isStackUnionLocal(value.localId))
|
|
687
|
+
? host.emitUnionProjection(value)
|
|
688
|
+
: host.emitExpr(value));
|
|
656
689
|
const l = inputs[0], r = inputs[1];
|
|
657
690
|
const def = host.unionsById.get(e.unionId);
|
|
658
691
|
if (!def)
|
|
659
692
|
throw new InternalCompilerError(`llvm emitter bug: equality of unknown union ${e.unionId}`);
|
|
693
|
+
const nullable = host.nullableUnions.get(def.id);
|
|
694
|
+
if (nullable && isObjectArm(nullable)) {
|
|
695
|
+
// Object identity, and NULL === NULL for the unit arm: one compare.
|
|
696
|
+
const eq = B.tmp();
|
|
697
|
+
B.line(`${eq} = icmp ${e.negated ? "ne" : "eq"} ptr ${l.name}, ${r.name}`);
|
|
698
|
+
return { name: eq, type: e.type };
|
|
699
|
+
}
|
|
700
|
+
if (nullable) {
|
|
701
|
+
// String arm: identical pointers are equal (the same string or the
|
|
702
|
+
// same unit encoding); otherwise equal only when both hold strings
|
|
703
|
+
// with the same bytes.
|
|
704
|
+
const slot = B.slot();
|
|
705
|
+
B.entryAllocas.push(`${slot} = alloca i1`);
|
|
706
|
+
const same = B.tmp(), present = B.tmp();
|
|
707
|
+
B.line(`${same} = icmp eq ptr ${l.name}, ${r.name}`);
|
|
708
|
+
const lPresent = emitNullablePresent(B, nullable, l.name);
|
|
709
|
+
const rPresent = emitNullablePresent(B, nullable, r.name);
|
|
710
|
+
B.line(`${present} = and i1 ${lPresent}, ${rPresent}`);
|
|
711
|
+
B.line(`store i1 ${same}, ptr ${slot}`);
|
|
712
|
+
const bytes = B.newLabel("ues.b"), join = B.newLabel("ues.j");
|
|
713
|
+
const notSame = B.tmp(), go = B.tmp();
|
|
714
|
+
B.line(`${notSame} = xor i1 ${same}, true`);
|
|
715
|
+
B.line(`${go} = and i1 ${notSame}, ${present}`);
|
|
716
|
+
B.condBr(go, bytes, join);
|
|
717
|
+
B.startBlock(bytes);
|
|
718
|
+
host.declare(`declare zeroext i1 @scr_str_eq(ptr, ptr)`);
|
|
719
|
+
const eqBytes = B.tmp();
|
|
720
|
+
B.line(`${eqBytes} = call zeroext i1 @sc_str_eq(ptr ${l.name}, ptr ${r.name})`);
|
|
721
|
+
B.line(`store i1 ${eqBytes}, ptr ${slot}`);
|
|
722
|
+
B.br(join);
|
|
723
|
+
B.startBlock(join);
|
|
724
|
+
const eq = B.tmp();
|
|
725
|
+
B.line(`${eq} = load i1, ptr ${slot}`);
|
|
726
|
+
if (!e.negated)
|
|
727
|
+
return { name: eq, type: e.type };
|
|
728
|
+
const ne = B.tmp();
|
|
729
|
+
B.line(`${ne} = xor i1 ${eq}, true`);
|
|
730
|
+
return { name: ne, type: e.type };
|
|
731
|
+
}
|
|
660
732
|
const slot = B.slot();
|
|
661
733
|
B.entryAllocas.push(`${slot} = alloca i1`);
|
|
662
734
|
const join = B.newLabel("ue.j");
|
|
663
735
|
const same = B.newLabel("ue.s");
|
|
664
|
-
const ltag = host.unionTag(l.name);
|
|
665
|
-
const rtag = host.unionTag(r.name);
|
|
736
|
+
const ltag = host.unionTag(l.name, def.id);
|
|
737
|
+
const rtag = host.unionTag(r.name, def.id);
|
|
666
738
|
const tagEq = B.tmp();
|
|
667
739
|
B.line(`${tagEq} = icmp eq i32 ${ltag}, ${rtag}`);
|
|
668
740
|
B.line(`store i1 false, ptr ${slot}`);
|
|
@@ -675,12 +747,9 @@ export function emitDynamicExpr(host, e) {
|
|
|
675
747
|
B.line(`store i1 true, ptr ${slot}`);
|
|
676
748
|
break;
|
|
677
749
|
case "f64": {
|
|
678
|
-
host.
|
|
679
|
-
const
|
|
680
|
-
const b = B.tmp();
|
|
750
|
+
const a = host.unionGetF64(l.name);
|
|
751
|
+
const b = host.unionGetF64(r.name);
|
|
681
752
|
const t = B.tmp();
|
|
682
|
-
B.line(`${a} = call double @scr_union_get_f64(ptr ${l.name})`);
|
|
683
|
-
B.line(`${b} = call double @scr_union_get_f64(ptr ${r.name})`);
|
|
684
753
|
if (e.sameValue) {
|
|
685
754
|
// Object.is's f64 compare: NaN equals NaN, +0 differs
|
|
686
755
|
// from -0 — the runtime SameValue.
|
|
@@ -694,29 +763,26 @@ export function emitDynamicExpr(host, e) {
|
|
|
694
763
|
break;
|
|
695
764
|
}
|
|
696
765
|
case "bool": {
|
|
697
|
-
|
|
698
|
-
const
|
|
699
|
-
const b = B.tmp();
|
|
766
|
+
const a = host.unionGetBool(l.name);
|
|
767
|
+
const b = host.unionGetBool(r.name);
|
|
700
768
|
const t = B.tmp();
|
|
701
|
-
B.line(`${a} = call zeroext i1 @scr_union_get_bool(ptr ${l.name})`);
|
|
702
|
-
B.line(`${b} = call zeroext i1 @scr_union_get_bool(ptr ${r.name})`);
|
|
703
769
|
B.line(`${t} = icmp eq i1 ${a}, ${b}`);
|
|
704
770
|
B.line(`store i1 ${t}, ptr ${slot}`);
|
|
705
771
|
break;
|
|
706
772
|
}
|
|
707
773
|
case "string": {
|
|
708
774
|
host.declare(`declare zeroext i1 @scr_str_eq(ptr, ptr)`);
|
|
709
|
-
const a = host.unionPeek(l.name);
|
|
710
|
-
const b = host.unionPeek(r.name);
|
|
775
|
+
const a = host.unionPeek(l.name, def.id);
|
|
776
|
+
const b = host.unionPeek(r.name, def.id);
|
|
711
777
|
const t = B.tmp();
|
|
712
|
-
B.line(`${t} = call zeroext i1 @
|
|
778
|
+
B.line(`${t} = call zeroext i1 @sc_str_eq(ptr ${a}, ptr ${b})`);
|
|
713
779
|
B.line(`store i1 ${t}, ptr ${slot}`);
|
|
714
780
|
break;
|
|
715
781
|
}
|
|
716
782
|
case "bigint": {
|
|
717
783
|
host.declare(`declare zeroext i1 @scr_bigint_eq(ptr, ptr)`);
|
|
718
|
-
const a = host.unionPeek(l.name);
|
|
719
|
-
const b = host.unionPeek(r.name);
|
|
784
|
+
const a = host.unionPeek(l.name, def.id);
|
|
785
|
+
const b = host.unionPeek(r.name, def.id);
|
|
720
786
|
const t = B.tmp();
|
|
721
787
|
B.line(`${t} = call zeroext i1 @scr_bigint_eq(ptr ${a}, ptr ${b})`);
|
|
722
788
|
B.line(`store i1 ${t}, ptr ${slot}`);
|
|
@@ -724,10 +790,14 @@ export function emitDynamicExpr(host, e) {
|
|
|
724
790
|
}
|
|
725
791
|
default: {
|
|
726
792
|
// Ref arms: pointer identity, exactly JS object equality.
|
|
727
|
-
|
|
728
|
-
const
|
|
793
|
+
// Function arms compare identity roots (adapters included).
|
|
794
|
+
const a = host.unionPeek(l.name, def.id);
|
|
795
|
+
const b = host.unionPeek(r.name, def.id);
|
|
729
796
|
const t = B.tmp();
|
|
730
|
-
|
|
797
|
+
if (arm.kind === "func")
|
|
798
|
+
B.line(`${t} = ${closureIdentityEqual(host, a, b)}`);
|
|
799
|
+
else
|
|
800
|
+
B.line(`${t} = icmp eq ptr ${a}, ${b} ; ${arm.kind}`);
|
|
731
801
|
B.line(`store i1 ${t}, ptr ${slot}`);
|
|
732
802
|
break;
|
|
733
803
|
}
|
|
@@ -746,14 +816,26 @@ export function emitDynamicExpr(host, e) {
|
|
|
746
816
|
case "unionFuncEq": {
|
|
747
817
|
const inputs = emitBorrowedInputs(host, [e.union, e.func]);
|
|
748
818
|
const u = inputs[0], f = inputs[1];
|
|
749
|
-
const tag = host.unionTag(u.name);
|
|
819
|
+
const tag = host.unionTag(u.name, e.unionId);
|
|
750
820
|
const tagMatch = B.tmp();
|
|
751
821
|
B.line(`${tagMatch} = icmp eq i32 ${tag}, ${e.tag}`);
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
822
|
+
// The payload is a closure only under the function tag; another
|
|
823
|
+
// arm's payload must never be read as one.
|
|
824
|
+
const slot = B.slot();
|
|
825
|
+
B.entryAllocas.push(`${slot} = alloca i1`);
|
|
826
|
+
B.line(`store i1 false, ptr ${slot}`);
|
|
827
|
+
const check = B.newLabel("ufe.c");
|
|
828
|
+
const join = B.newLabel("ufe.j");
|
|
829
|
+
B.condBr(tagMatch, check, join);
|
|
830
|
+
B.startBlock(check);
|
|
831
|
+
const payload = host.unionPeek(u.name, e.unionId);
|
|
832
|
+
const identical = B.tmp();
|
|
833
|
+
B.line(`${identical} = ${closureIdentityEqual(host, payload, f.name)}`);
|
|
834
|
+
B.line(`store i1 ${identical}, ptr ${slot}`);
|
|
835
|
+
B.br(join);
|
|
836
|
+
B.startBlock(join);
|
|
755
837
|
const result = B.tmp();
|
|
756
|
-
B.line(`${result} =
|
|
838
|
+
B.line(`${result} = load i1, ptr ${slot}`);
|
|
757
839
|
if (!e.negated)
|
|
758
840
|
return host.own({ name: result, type: e.type });
|
|
759
841
|
const negated = B.tmp();
|
|
@@ -768,6 +850,38 @@ export function emitDynamicExpr(host, e) {
|
|
|
768
850
|
const c = host.emitReadReceiver(e.value);
|
|
769
851
|
if (e.test === "instanceof") {
|
|
770
852
|
const target = host.classMetaOf(e.className);
|
|
853
|
+
if (!target.hierarchy) {
|
|
854
|
+
// Standalone class payloads have no vtable word. Their retain
|
|
855
|
+
// adapter identifies the exact native layout in the snapshot.
|
|
856
|
+
const adapterSlot = B.tmp();
|
|
857
|
+
const adapter = B.tmp();
|
|
858
|
+
B.line(`${adapterSlot} = getelementptr inbounds %ScrCaught, ptr ${c.name}, i64 0, i32 5`);
|
|
859
|
+
B.line(`${adapter} = load ptr, ptr ${adapterSlot}`);
|
|
860
|
+
let result;
|
|
861
|
+
const intervals = classMembershipIntervals(host.classMeta, target.def.name);
|
|
862
|
+
for (const candidate of host.classMeta.values()) {
|
|
863
|
+
if (candidate.hierarchy ||
|
|
864
|
+
!intervals.some((range) => range.pre <= candidate.pre && candidate.pre <= range.post))
|
|
865
|
+
continue;
|
|
866
|
+
const rc = vAdapters(host.shapeHost, { kind: "object", className: candidate.def.name });
|
|
867
|
+
const matches = B.tmp();
|
|
868
|
+
B.line(`${matches} = icmp eq ptr ${adapter}, ${rc.retain}`);
|
|
869
|
+
if (result === undefined)
|
|
870
|
+
result = matches;
|
|
871
|
+
else {
|
|
872
|
+
const joined = B.tmp();
|
|
873
|
+
B.line(`${joined} = or i1 ${result}, ${matches}`);
|
|
874
|
+
result = joined;
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
if (result === undefined)
|
|
878
|
+
throw new InternalCompilerError("empty standalone class membership");
|
|
879
|
+
if (e.negated !== true)
|
|
880
|
+
return { name: result, type: e.type };
|
|
881
|
+
const negated = B.tmp();
|
|
882
|
+
B.line(`${negated} = xor i1 ${result}, true`);
|
|
883
|
+
return { name: negated, type: e.type };
|
|
884
|
+
}
|
|
771
885
|
host.declare(`declare zeroext i1 @scr_caught_instanceof(ptr, ${host.sizeType}, ${host.sizeType})`);
|
|
772
886
|
let t;
|
|
773
887
|
for (const interval of classMembershipIntervals(host.classMeta, target.def.name)) {
|
|
@@ -901,4 +1015,90 @@ export function emitDynamicExpr(host, e) {
|
|
|
901
1015
|
}
|
|
902
1016
|
}
|
|
903
1017
|
}
|
|
1018
|
+
/** `u === v` where one side wraps a unit, bool, or number arm value
|
|
1019
|
+
* (`o.flag === true`, `o.n === undefined`): compare the other union's tag
|
|
1020
|
+
* and payload directly instead of boxing the plain side. Operands keep
|
|
1021
|
+
* their left-to-right evaluation; the union stays borrowed. Null when
|
|
1022
|
+
* neither side is such a wrap. */
|
|
1023
|
+
function emitUnionEqWrappedScalar(host, e) {
|
|
1024
|
+
const B = host.B;
|
|
1025
|
+
const def = host.unionsById.get(e.unionId);
|
|
1026
|
+
if (!def)
|
|
1027
|
+
return null;
|
|
1028
|
+
const scalarWrap = (x) => {
|
|
1029
|
+
if (x.kind !== "unionWrap" || x.unionId !== e.unionId)
|
|
1030
|
+
return null;
|
|
1031
|
+
const arm = def.arms[x.tag];
|
|
1032
|
+
if (!arm)
|
|
1033
|
+
return null;
|
|
1034
|
+
if (isUnitType(arm))
|
|
1035
|
+
return x;
|
|
1036
|
+
// The plain value must not run code that could release the borrowed
|
|
1037
|
+
// union: literals and local reads only.
|
|
1038
|
+
const v = x.value;
|
|
1039
|
+
const pure = v.kind === "boolLit" || v.kind === "numLit" || v.kind === "varRef";
|
|
1040
|
+
return pure && (arm.kind === "f64" || arm.kind === "bool") ? x : null;
|
|
1041
|
+
};
|
|
1042
|
+
const rightWrap = scalarWrap(e.right);
|
|
1043
|
+
const leftWrap = rightWrap ? null : scalarWrap(e.left);
|
|
1044
|
+
const wrap = rightWrap ?? leftWrap;
|
|
1045
|
+
if (!wrap)
|
|
1046
|
+
return null;
|
|
1047
|
+
const arm = def.arms[wrap.tag];
|
|
1048
|
+
let union;
|
|
1049
|
+
let plain = null;
|
|
1050
|
+
const unionInput = (value) => host.canStackReceiver(value) ? host.emitReadReceiver(value) : emitBorrowedInput(host, value);
|
|
1051
|
+
if (rightWrap) {
|
|
1052
|
+
union = unionInput(e.left);
|
|
1053
|
+
if (!isUnitType(arm))
|
|
1054
|
+
plain = host.emitExpr(wrap.value);
|
|
1055
|
+
}
|
|
1056
|
+
else {
|
|
1057
|
+
if (!isUnitType(arm))
|
|
1058
|
+
plain = host.emitExpr(wrap.value);
|
|
1059
|
+
union = unionInput(e.right);
|
|
1060
|
+
}
|
|
1061
|
+
const tag = host.unionTag(union.name, e.unionId);
|
|
1062
|
+
const tagMatch = B.tmp();
|
|
1063
|
+
B.line(`${tagMatch} = icmp eq i32 ${tag}, ${wrap.tag}`);
|
|
1064
|
+
let result = tagMatch;
|
|
1065
|
+
if (plain) {
|
|
1066
|
+
const slot = B.slot();
|
|
1067
|
+
B.entryAllocas.push(`${slot} = alloca i1`);
|
|
1068
|
+
B.line(`store i1 false, ptr ${slot}`);
|
|
1069
|
+
const same = B.newLabel("ueq.s");
|
|
1070
|
+
const join = B.newLabel("ueq.j");
|
|
1071
|
+
B.condBr(tagMatch, same, join);
|
|
1072
|
+
B.startBlock(same);
|
|
1073
|
+
const eq = B.tmp();
|
|
1074
|
+
if (arm.kind === "f64") {
|
|
1075
|
+
host.declare(`declare double @scr_union_get_f64(ptr)`);
|
|
1076
|
+
const v = B.tmp();
|
|
1077
|
+
B.line(`${v} = call double @scr_union_get_f64(ptr ${union.name})`);
|
|
1078
|
+
if (e.sameValue) {
|
|
1079
|
+
host.declare(`declare zeroext i1 @scr_num_same_value(double, double)`);
|
|
1080
|
+
B.line(`${eq} = call zeroext i1 @scr_num_same_value(double ${v}, double ${plain.name})`);
|
|
1081
|
+
}
|
|
1082
|
+
else {
|
|
1083
|
+
B.line(`${eq} = fcmp oeq double ${v}, ${plain.name}`);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
else {
|
|
1087
|
+
host.declare(`declare zeroext i1 @scr_union_get_bool(ptr)`);
|
|
1088
|
+
const v = B.tmp();
|
|
1089
|
+
B.line(`${v} = call zeroext i1 @scr_union_get_bool(ptr ${union.name})`);
|
|
1090
|
+
B.line(`${eq} = icmp eq i1 ${v}, ${plain.name}`);
|
|
1091
|
+
}
|
|
1092
|
+
B.line(`store i1 ${eq}, ptr ${slot}`);
|
|
1093
|
+
B.br(join);
|
|
1094
|
+
B.startBlock(join);
|
|
1095
|
+
result = B.tmp();
|
|
1096
|
+
B.line(`${result} = load i1, ptr ${slot}`);
|
|
1097
|
+
}
|
|
1098
|
+
if (!e.negated)
|
|
1099
|
+
return { name: result, type: e.type };
|
|
1100
|
+
const negated = B.tmp();
|
|
1101
|
+
B.line(`${negated} = xor i1 ${result}, true`);
|
|
1102
|
+
return { name: negated, type: e.type };
|
|
1103
|
+
}
|
|
904
1104
|
//# sourceMappingURL=expr-dynamic.js.map
|