@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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BlockBuilder } from "./blocks.js";
|
|
2
|
+
import { type NullableUnion } from "./nullable-unions.js";
|
|
3
|
+
/** The i32 tag of a union value. */
|
|
4
|
+
export declare function emitUnionTag(B: BlockBuilder, nullable: NullableUnion | null, u: string): string;
|
|
5
|
+
/** i1: a nullable union value holds its reference arm (neither NULL nor
|
|
6
|
+
* the `null` sentinel). */
|
|
7
|
+
export declare function emitNullablePresent(B: BlockBuilder, nullable: NullableUnion, u: string): string;
|
|
8
|
+
/** i1: a nullable union value holds the arm `tag` (`negated`: does not). */
|
|
9
|
+
export declare function emitNullableIsTag(B: BlockBuilder, nullable: NullableUnion, u: string, tag: number, negated: boolean): string;
|
|
10
|
+
/** The BORROWED payload pointer of a reference arm. */
|
|
11
|
+
export declare function emitUnionPeek(B: BlockBuilder, nullable: NullableUnion | null, u: string): string;
|
|
12
|
+
/** Text-template forms for helpers written as raw LLVM lines: `%out`
|
|
13
|
+
* receives the tag / payload of `u`. */
|
|
14
|
+
export declare function unionTagLines(nullable: NullableUnion | null, u: string, out: string): string[];
|
|
15
|
+
export declare function unionPeekLines(nullable: NullableUnion | null, u: string, out: string): string[];
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { NULLABLE_NULL } from "./nullable-unions.js";
|
|
2
|
+
/** The i32 tag of a union value. */
|
|
3
|
+
export function emitUnionTag(B, nullable, u) {
|
|
4
|
+
const t = B.tmp();
|
|
5
|
+
if (nullable) {
|
|
6
|
+
const isNull = B.tmp();
|
|
7
|
+
B.line(`${isNull} = icmp eq ptr ${u}, null`);
|
|
8
|
+
if (nullable.nullTag < 0) {
|
|
9
|
+
B.line(`${t} = select i1 ${isNull}, i32 ${nullable.unitTag}, i32 ${nullable.refTag}`);
|
|
10
|
+
return t;
|
|
11
|
+
}
|
|
12
|
+
const isNullArm = B.tmp(), present = B.tmp();
|
|
13
|
+
B.line(`${isNullArm} = icmp eq ptr ${u}, ${NULLABLE_NULL}`);
|
|
14
|
+
B.line(`${present} = select i1 ${isNullArm}, i32 ${nullable.nullTag}, i32 ${nullable.refTag}`);
|
|
15
|
+
B.line(`${t} = select i1 ${isNull}, i32 ${nullable.unitTag}, i32 ${present}`);
|
|
16
|
+
return t;
|
|
17
|
+
}
|
|
18
|
+
const p = B.tmp();
|
|
19
|
+
B.line(`${p} = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 1`);
|
|
20
|
+
B.line(`${t} = load i32, ptr ${p}`);
|
|
21
|
+
return t;
|
|
22
|
+
}
|
|
23
|
+
/** i1: a nullable union value holds its reference arm (neither NULL nor
|
|
24
|
+
* the `null` sentinel). */
|
|
25
|
+
export function emitNullablePresent(B, nullable, u) {
|
|
26
|
+
const present = B.tmp();
|
|
27
|
+
B.line(`${present} = icmp ne ptr ${u}, null`);
|
|
28
|
+
if (nullable.nullTag < 0)
|
|
29
|
+
return present;
|
|
30
|
+
const notNullArm = B.tmp(), both = B.tmp();
|
|
31
|
+
B.line(`${notNullArm} = icmp ne ptr ${u}, ${NULLABLE_NULL}`);
|
|
32
|
+
B.line(`${both} = and i1 ${present}, ${notNullArm}`);
|
|
33
|
+
return both;
|
|
34
|
+
}
|
|
35
|
+
/** i1: a nullable union value holds the arm `tag` (`negated`: does not). */
|
|
36
|
+
export function emitNullableIsTag(B, nullable, u, tag, negated) {
|
|
37
|
+
if (tag === nullable.refTag) {
|
|
38
|
+
const present = emitNullablePresent(B, nullable, u);
|
|
39
|
+
if (!negated)
|
|
40
|
+
return present;
|
|
41
|
+
const t = B.tmp();
|
|
42
|
+
B.line(`${t} = xor i1 ${present}, true`);
|
|
43
|
+
return t;
|
|
44
|
+
}
|
|
45
|
+
const t = B.tmp();
|
|
46
|
+
const target = tag === nullable.nullTag ? NULLABLE_NULL : "null";
|
|
47
|
+
B.line(`${t} = icmp ${negated ? "ne" : "eq"} ptr ${u}, ${target}`);
|
|
48
|
+
return t;
|
|
49
|
+
}
|
|
50
|
+
/** The BORROWED payload pointer of a reference arm. */
|
|
51
|
+
export function emitUnionPeek(B, nullable, u) {
|
|
52
|
+
if (nullable)
|
|
53
|
+
return u;
|
|
54
|
+
const p = B.tmp();
|
|
55
|
+
const t = B.tmp();
|
|
56
|
+
B.line(`${p} = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 5`);
|
|
57
|
+
B.line(`${t} = load ptr, ptr ${p}`);
|
|
58
|
+
return t;
|
|
59
|
+
}
|
|
60
|
+
/** Text-template forms for helpers written as raw LLVM lines: `%out`
|
|
61
|
+
* receives the tag / payload of `u`. */
|
|
62
|
+
export function unionTagLines(nullable, u, out) {
|
|
63
|
+
if (nullable && nullable.nullTag < 0)
|
|
64
|
+
return [
|
|
65
|
+
` ${out}.isnull = icmp eq ptr ${u}, null`,
|
|
66
|
+
` ${out} = select i1 ${out}.isnull, i32 ${nullable.unitTag}, i32 ${nullable.refTag}`,
|
|
67
|
+
];
|
|
68
|
+
if (nullable)
|
|
69
|
+
return [
|
|
70
|
+
` ${out}.isnull = icmp eq ptr ${u}, null`,
|
|
71
|
+
` ${out}.isnullarm = icmp eq ptr ${u}, ${NULLABLE_NULL}`,
|
|
72
|
+
` ${out}.present = select i1 ${out}.isnullarm, i32 ${nullable.nullTag}, i32 ${nullable.refTag}`,
|
|
73
|
+
` ${out} = select i1 ${out}.isnull, i32 ${nullable.unitTag}, i32 ${out}.present`,
|
|
74
|
+
];
|
|
75
|
+
return [
|
|
76
|
+
` ${out}.p = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 1`,
|
|
77
|
+
` ${out} = load i32, ptr ${out}.p`,
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
export function unionPeekLines(nullable, u, out) {
|
|
81
|
+
// A plain copy of the pointer (NULL included) under the template's name.
|
|
82
|
+
if (nullable)
|
|
83
|
+
return [` ${out} = getelementptr i8, ptr ${u}, i64 0`];
|
|
84
|
+
return [
|
|
85
|
+
` ${out}.p = getelementptr inbounds %ScrUnion, ptr ${u}, i64 0, i32 5`,
|
|
86
|
+
` ${out} = load ptr, ptr ${out}.p`,
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=union-repr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"union-repr.js","sourceRoot":"","sources":["../../../src/backend/llvm/union-repr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IrFunction, IrModule } from "../../ir/ir.js";
|
|
2
|
+
import { type LlClassMeta } from "./classes.js";
|
|
3
|
+
/** Virtual dispatch normally keeps the owned ABI: the caller passes +1 and
|
|
4
|
+
* the method's owned entry releases what its body borrows. When every
|
|
5
|
+
* implementation of a slot has a borrowing body for the same parameter
|
|
6
|
+
* (call-lifetimes proves this per function, independent of the caller), the
|
|
7
|
+
* slot borrows that parameter instead: call sites pass it like a direct call
|
|
8
|
+
* to a borrowing body, so a receiver that survives the call is neither
|
|
9
|
+
* retained nor released (and, being cycle-capable, not buffered as a
|
|
10
|
+
* candidate either). Implementations that borrow more parameters than the
|
|
11
|
+
* slot get an adapter that releases the difference.
|
|
12
|
+
*
|
|
13
|
+
* Shared by the emitter and the self-hosted layout stage, so both store the
|
|
14
|
+
* same vtable entries. */
|
|
15
|
+
export declare class VirtualBorrows {
|
|
16
|
+
private readonly functions;
|
|
17
|
+
private readonly borrowed;
|
|
18
|
+
/** Parameters every implementation of a vtable slot borrows, keyed by
|
|
19
|
+
* `root\0slot index`, and each implementation's slot key. */
|
|
20
|
+
private readonly slotBorrowed;
|
|
21
|
+
private readonly implSlot;
|
|
22
|
+
constructor(mod: IrModule, classMeta: ReadonlyMap<string, LlClassMeta>, functions: ReadonlyMap<string, IrFunction>, borrowed: ReadonlyMap<string, ReadonlySet<number>>);
|
|
23
|
+
/** The borrowed parameters of a hierarchy's vtable slot (empty: owned). */
|
|
24
|
+
slot(rootName: string, slotIndex: number): ReadonlySet<number>;
|
|
25
|
+
/** The borrowed parameters of the slot an implementation fills. */
|
|
26
|
+
implSlotBorrowed(implFn: string): ReadonlySet<number>;
|
|
27
|
+
/** The vtable entry for one implementation: its owned entry for an owned
|
|
28
|
+
* slot, its borrowing body when that borrows exactly the slot's
|
|
29
|
+
* parameters, otherwise its virtual adapter (emitOwnedCallAdapter). */
|
|
30
|
+
entry(implFn: string): string;
|
|
31
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { mangleBorrowedFunction, mangleFunction } from "../mangle.js";
|
|
2
|
+
import { vtEntriesFor } from "./classes.js";
|
|
3
|
+
const NO_BORROWED = new Set();
|
|
4
|
+
/** Virtual dispatch normally keeps the owned ABI: the caller passes +1 and
|
|
5
|
+
* the method's owned entry releases what its body borrows. When every
|
|
6
|
+
* implementation of a slot has a borrowing body for the same parameter
|
|
7
|
+
* (call-lifetimes proves this per function, independent of the caller), the
|
|
8
|
+
* slot borrows that parameter instead: call sites pass it like a direct call
|
|
9
|
+
* to a borrowing body, so a receiver that survives the call is neither
|
|
10
|
+
* retained nor released (and, being cycle-capable, not buffered as a
|
|
11
|
+
* candidate either). Implementations that borrow more parameters than the
|
|
12
|
+
* slot get an adapter that releases the difference.
|
|
13
|
+
*
|
|
14
|
+
* Shared by the emitter and the self-hosted layout stage, so both store the
|
|
15
|
+
* same vtable entries. */
|
|
16
|
+
export class VirtualBorrows {
|
|
17
|
+
functions;
|
|
18
|
+
borrowed;
|
|
19
|
+
/** Parameters every implementation of a vtable slot borrows, keyed by
|
|
20
|
+
* `root\0slot index`, and each implementation's slot key. */
|
|
21
|
+
slotBorrowed = new Map();
|
|
22
|
+
implSlot = new Map();
|
|
23
|
+
constructor(mod, classMeta, functions, borrowed) {
|
|
24
|
+
this.functions = functions;
|
|
25
|
+
this.borrowed = borrowed;
|
|
26
|
+
const impls = new Map();
|
|
27
|
+
const emitted = new Set((mod.classes ?? []).filter((c) => !c.runtime).map((c) => c.name));
|
|
28
|
+
for (const meta of classMeta.values()) {
|
|
29
|
+
if (!meta.hierarchy || !emitted.has(meta.def.name))
|
|
30
|
+
continue;
|
|
31
|
+
vtEntriesFor(meta).forEach(({ slot, impl }, index) => {
|
|
32
|
+
if (impl === null)
|
|
33
|
+
return;
|
|
34
|
+
const key = `${meta.root.def.name}\0${index}`;
|
|
35
|
+
const name = `%${impl.def.name}.${slot.method}`;
|
|
36
|
+
let set = impls.get(key);
|
|
37
|
+
if (!set)
|
|
38
|
+
impls.set(key, (set = new Set()));
|
|
39
|
+
set.add(name);
|
|
40
|
+
this.implSlot.set(name, key);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
for (const [key, names] of impls) {
|
|
44
|
+
let common = null;
|
|
45
|
+
for (const name of names) {
|
|
46
|
+
const fn = this.functions.get(name);
|
|
47
|
+
const own = this.borrowed.get(name);
|
|
48
|
+
if (!fn || !own || fn.captures !== undefined || fn.async || fn.generator) {
|
|
49
|
+
common = [];
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
common = (common ?? [...own]).filter((index) => own.has(index));
|
|
53
|
+
}
|
|
54
|
+
if (common !== null && common.length > 0)
|
|
55
|
+
this.slotBorrowed.set(key, new Set(common));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** The borrowed parameters of a hierarchy's vtable slot (empty: owned). */
|
|
59
|
+
slot(rootName, slotIndex) {
|
|
60
|
+
return this.slotBorrowed.get(`${rootName}\0${slotIndex}`) ?? NO_BORROWED;
|
|
61
|
+
}
|
|
62
|
+
/** The borrowed parameters of the slot an implementation fills. */
|
|
63
|
+
implSlotBorrowed(implFn) {
|
|
64
|
+
const key = this.implSlot.get(implFn);
|
|
65
|
+
if (key === undefined)
|
|
66
|
+
return NO_BORROWED;
|
|
67
|
+
return this.slotBorrowed.get(key) ?? NO_BORROWED;
|
|
68
|
+
}
|
|
69
|
+
/** The vtable entry for one implementation: its owned entry for an owned
|
|
70
|
+
* slot, its borrowing body when that borrows exactly the slot's
|
|
71
|
+
* parameters, otherwise its virtual adapter (emitOwnedCallAdapter). */
|
|
72
|
+
entry(implFn) {
|
|
73
|
+
const slot = this.implSlotBorrowed(implFn);
|
|
74
|
+
if (slot.size === 0)
|
|
75
|
+
return mangleFunction(implFn);
|
|
76
|
+
const own = this.borrowed.get(implFn);
|
|
77
|
+
return own.size === slot.size
|
|
78
|
+
? mangleBorrowedFunction(implFn)
|
|
79
|
+
: `${mangleBorrowedFunction(implFn)}.virtual`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=virtual-borrows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-borrows.js","sourceRoot":"","sources":["../../../src/backend/llvm/virtual-borrows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type IrExpr, type IrFunction, type IrLocal } from "../../ir/ir.js";
|
|
2
|
+
/** What the emitter knows about a projection's storage. */
|
|
3
|
+
export interface WalkBorrowHost {
|
|
4
|
+
/** The local holds one plain reference pointer (instances, records,
|
|
5
|
+
* arrays, strings, nullable-pointer unions). Tagged union boxes, closures
|
|
6
|
+
* and dynamic values keep ownership. */
|
|
7
|
+
pointerLocal(local: IrLocal): boolean;
|
|
8
|
+
/** emitReadReceiver yields this expression's pointer without acquiring a
|
|
9
|
+
* reference (class casts, nullable wraps, plain field reads, checked
|
|
10
|
+
* ternaries). */
|
|
11
|
+
borrowsWithoutOwning(e: IrExpr): boolean;
|
|
12
|
+
/** The callee returns a borrowed walk of its arguments (findWalkBorrows'
|
|
13
|
+
* returnsWalk); a call to it with walk arguments is itself a walk. */
|
|
14
|
+
borrowedReturn?(callee: string): boolean;
|
|
15
|
+
/** Parameters that may become candidates; once calling conventions are
|
|
16
|
+
* fixed, only borrowed parameters qualify. Defaults to every parameter. */
|
|
17
|
+
parameterAllowed?(localId: string): boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface WalkFacts {
|
|
20
|
+
locals: ReadonlySet<string>;
|
|
21
|
+
/** Every return yields a walk (or a throw), so the body can return its
|
|
22
|
+
* pointer without a reference: no try statement, at least one return. */
|
|
23
|
+
returnsWalk: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Locals (including rebound parameters) that may hold borrowed pointers
|
|
26
|
+
* for their whole lifetime: every definition (declaration or statement
|
|
27
|
+
* assignment) is a projection of an unwritten parameter or of another such
|
|
28
|
+
* local, for example the parent walk `let p = node.parent; while (p.parent)
|
|
29
|
+
* p = p.parent;`. A rebound parameter in the result keeps the borrowed
|
|
30
|
+
* calling convention.
|
|
31
|
+
*
|
|
32
|
+
* Soundness rests on the whole body preserving heap edges (the caller
|
|
33
|
+
* passes only functions in ReferenceEffects.functions): neither the body
|
|
34
|
+
* nor anything it calls removes a field, element or global reference, so
|
|
35
|
+
* every object reachable from a parameter at entry stays reachable (and
|
|
36
|
+
* alive) until the function returns. Such a local therefore needs no
|
|
37
|
+
* retain on definition, no release on rebinding and none at scope exit.
|
|
38
|
+
* Whole-value uses (returns, stores, owned arguments) still retain their
|
|
39
|
+
* own copies when they read the binding. Other locals may be rebound
|
|
40
|
+
* freely: they never root a walk, so releasing their old values cannot free
|
|
41
|
+
* an object the walk reaches. */
|
|
42
|
+
export declare function findWalkBorrows(fn: IrFunction, host: WalkBorrowHost): ReadonlySet<string>;
|
|
43
|
+
export declare function analyzeWalks(fn: IrFunction, host: WalkBorrowHost): WalkFacts;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { isRefCounted } from "../../ir/ir.js";
|
|
2
|
+
import { everyStmtList } from "../../ir/traverse.js";
|
|
3
|
+
/** Locals (including rebound parameters) that may hold borrowed pointers
|
|
4
|
+
* for their whole lifetime: every definition (declaration or statement
|
|
5
|
+
* assignment) is a projection of an unwritten parameter or of another such
|
|
6
|
+
* local, for example the parent walk `let p = node.parent; while (p.parent)
|
|
7
|
+
* p = p.parent;`. A rebound parameter in the result keeps the borrowed
|
|
8
|
+
* calling convention.
|
|
9
|
+
*
|
|
10
|
+
* Soundness rests on the whole body preserving heap edges (the caller
|
|
11
|
+
* passes only functions in ReferenceEffects.functions): neither the body
|
|
12
|
+
* nor anything it calls removes a field, element or global reference, so
|
|
13
|
+
* every object reachable from a parameter at entry stays reachable (and
|
|
14
|
+
* alive) until the function returns. Such a local therefore needs no
|
|
15
|
+
* retain on definition, no release on rebinding and none at scope exit.
|
|
16
|
+
* Whole-value uses (returns, stores, owned arguments) still retain their
|
|
17
|
+
* own copies when they read the binding. Other locals may be rebound
|
|
18
|
+
* freely: they never root a walk, so releasing their old values cannot free
|
|
19
|
+
* an object the walk reaches. */
|
|
20
|
+
export function findWalkBorrows(fn, host) {
|
|
21
|
+
return analyzeWalks(fn, host).locals;
|
|
22
|
+
}
|
|
23
|
+
export function analyzeWalks(fn, host) {
|
|
24
|
+
const result = new Set();
|
|
25
|
+
if (fn.async || fn.generator || fn.captures || fn.classCaptures)
|
|
26
|
+
return { locals: result, returnsWalk: false };
|
|
27
|
+
const returns = [];
|
|
28
|
+
let guarded = false;
|
|
29
|
+
const params = new Set(fn.params.map((param) => param.localId));
|
|
30
|
+
const locals = new Map(fn.locals.map((local) => [local.id, local]));
|
|
31
|
+
const definitions = new Map();
|
|
32
|
+
// Locals written in any other way (expression assignments, loop and catch
|
|
33
|
+
// bindings, captures) keep the ordinary owned representation.
|
|
34
|
+
const excluded = new Set();
|
|
35
|
+
const define = (id, value) => {
|
|
36
|
+
let list = definitions.get(id);
|
|
37
|
+
if (!list)
|
|
38
|
+
definitions.set(id, (list = []));
|
|
39
|
+
list.push(value);
|
|
40
|
+
};
|
|
41
|
+
everyStmtList(fn.body, {
|
|
42
|
+
stmt: (s) => {
|
|
43
|
+
switch (s.kind) {
|
|
44
|
+
case "varDecl":
|
|
45
|
+
define(s.localId, s.init);
|
|
46
|
+
break;
|
|
47
|
+
case "assign":
|
|
48
|
+
define(s.localId, s.value);
|
|
49
|
+
break;
|
|
50
|
+
case "forOf":
|
|
51
|
+
excluded.add(s.localId);
|
|
52
|
+
break;
|
|
53
|
+
case "rethrow":
|
|
54
|
+
excluded.add(s.localId);
|
|
55
|
+
break;
|
|
56
|
+
case "tryCatch":
|
|
57
|
+
guarded = true;
|
|
58
|
+
if (s.catchLocalId !== null)
|
|
59
|
+
excluded.add(s.catchLocalId);
|
|
60
|
+
break;
|
|
61
|
+
case "return":
|
|
62
|
+
returns.push(s.value);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
},
|
|
67
|
+
expr: (e) => {
|
|
68
|
+
switch (e.kind) {
|
|
69
|
+
case "assignExpr":
|
|
70
|
+
case "incDec":
|
|
71
|
+
excluded.add(e.localId);
|
|
72
|
+
break;
|
|
73
|
+
case "closure":
|
|
74
|
+
case "classRef":
|
|
75
|
+
for (const id of e.captures ?? [])
|
|
76
|
+
excluded.add(id);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
const plain = (id) => {
|
|
83
|
+
const local = locals.get(id);
|
|
84
|
+
return (!!local &&
|
|
85
|
+
!local.boxed &&
|
|
86
|
+
!local.tdz &&
|
|
87
|
+
!excluded.has(id) &&
|
|
88
|
+
host.pointerLocal(local) &&
|
|
89
|
+
(!params.has(id) || host.parameterAllowed?.(id) !== false));
|
|
90
|
+
};
|
|
91
|
+
// Parameters are roots only while no definition rebinds them. A
|
|
92
|
+
// parameter rebound by statement assignments alone (`t = t.regular`) is a
|
|
93
|
+
// candidate like any local: its incoming value is the caller's borrow.
|
|
94
|
+
const roots = new Set([...params].filter((id) => !definitions.has(id) && plain(id)));
|
|
95
|
+
const candidates = new Set();
|
|
96
|
+
for (const [id, values] of definitions) {
|
|
97
|
+
if (!plain(id))
|
|
98
|
+
continue;
|
|
99
|
+
if (params.has(id) && values.some((value) => value === null))
|
|
100
|
+
continue;
|
|
101
|
+
candidates.add(id);
|
|
102
|
+
}
|
|
103
|
+
// A walk projects roots or candidates through reads that never acquire a
|
|
104
|
+
// reference. Drop candidates until every definition is such a walk.
|
|
105
|
+
const walk = (e) => {
|
|
106
|
+
switch (e.kind) {
|
|
107
|
+
case "varRef":
|
|
108
|
+
return roots.has(e.localId) || candidates.has(e.localId);
|
|
109
|
+
case "fieldGet":
|
|
110
|
+
case "recordGet":
|
|
111
|
+
return host.borrowsWithoutOwning(e) && walk(e.obj);
|
|
112
|
+
case "unionNarrow":
|
|
113
|
+
case "downcast":
|
|
114
|
+
case "upcast":
|
|
115
|
+
return host.borrowsWithoutOwning(e) && walk(e.value);
|
|
116
|
+
case "unionWrap":
|
|
117
|
+
if (!host.borrowsWithoutOwning(e))
|
|
118
|
+
return false;
|
|
119
|
+
return e.value.kind === "unitLit" || walk(e.value);
|
|
120
|
+
// Each arm is itself a walk (or a throw), which emitReadReceiver reads
|
|
121
|
+
// without owning.
|
|
122
|
+
case "ternary":
|
|
123
|
+
return host.borrowsWithoutOwning(e) && walkOrThrow(e.then) && walkOrThrow(e.else_);
|
|
124
|
+
// A borrowed result is reachable from walk arguments.
|
|
125
|
+
case "call":
|
|
126
|
+
return (host.borrowedReturn?.(e.callee) === true &&
|
|
127
|
+
host.borrowsWithoutOwning(e) &&
|
|
128
|
+
e.args.every((arg) => !isRefCounted(arg.type) || walk(arg)));
|
|
129
|
+
default:
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const walkOrThrow = (e) => (e.kind === "libCall" && e.fn === "error.nodeThrow") || walk(e);
|
|
134
|
+
for (let changed = true; changed;) {
|
|
135
|
+
changed = false;
|
|
136
|
+
for (const id of candidates) {
|
|
137
|
+
if (definitions.get(id).every((value) => value === null || walk(value)))
|
|
138
|
+
continue;
|
|
139
|
+
candidates.delete(id);
|
|
140
|
+
changed = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
for (const id of candidates)
|
|
144
|
+
result.add(id);
|
|
145
|
+
const returnsWalk = !guarded &&
|
|
146
|
+
returns.length > 0 &&
|
|
147
|
+
returns.every((value) => value !== null && walkOrThrow(value));
|
|
148
|
+
return { locals: result, returnsWalk };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=walk-borrows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-borrows.js","sourceRoot":"","sources":["../../../src/backend/llvm/walk-borrows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { F64, VOID } from "../../ir/ir.js";
|
|
3
|
+
import { analyzeWalks, findWalkBorrows } from "./walk-borrows.js";
|
|
4
|
+
const loc = { file: "walk.ts", start: 0, end: 0 };
|
|
5
|
+
const NODE = { kind: "object", className: "Node" };
|
|
6
|
+
const ref = (localId) => ({ kind: "varRef", localId, type: NODE, loc });
|
|
7
|
+
const parent = (obj) => ({
|
|
8
|
+
kind: "fieldGet",
|
|
9
|
+
obj,
|
|
10
|
+
className: "Node",
|
|
11
|
+
field: "parent",
|
|
12
|
+
type: NODE,
|
|
13
|
+
loc,
|
|
14
|
+
});
|
|
15
|
+
const decl = (localId, init) => ({
|
|
16
|
+
kind: "varDecl",
|
|
17
|
+
localId,
|
|
18
|
+
init,
|
|
19
|
+
loc,
|
|
20
|
+
});
|
|
21
|
+
const assign = (localId, value) => ({
|
|
22
|
+
kind: "assign",
|
|
23
|
+
localId,
|
|
24
|
+
value,
|
|
25
|
+
loc,
|
|
26
|
+
});
|
|
27
|
+
const local = (id, mutable = true) => ({ id, name: id, type: NODE, mutable });
|
|
28
|
+
function fn(body, locals, params = ["node"]) {
|
|
29
|
+
return {
|
|
30
|
+
name: "walk",
|
|
31
|
+
params: params.map((id) => ({ localId: id, name: id, type: NODE })),
|
|
32
|
+
locals: [...params, ...locals].map((id) => local(id)),
|
|
33
|
+
body,
|
|
34
|
+
returnType: VOID,
|
|
35
|
+
loc,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const host = {
|
|
39
|
+
pointerLocal: (l) => l.type.kind === "object",
|
|
40
|
+
borrowsWithoutOwning: () => true,
|
|
41
|
+
};
|
|
42
|
+
test("parent walks rooted at unwritten parameters borrow", () => {
|
|
43
|
+
const body = [
|
|
44
|
+
decl("p", parent(ref("node"))),
|
|
45
|
+
decl("next", parent(ref("p"))),
|
|
46
|
+
assign("p", ref("next")),
|
|
47
|
+
decl("unset", null),
|
|
48
|
+
assign("unset", parent(parent(ref("p")))),
|
|
49
|
+
];
|
|
50
|
+
expect(findWalkBorrows(fn(body, ["p", "next", "unset"]), host)).toEqual(new Set(["p", "next", "unset"]));
|
|
51
|
+
});
|
|
52
|
+
const call = { kind: "call", callee: "make", args: [], type: NODE, loc };
|
|
53
|
+
test("parameters rebound only to walks keep borrowing", () => {
|
|
54
|
+
const body = [assign("node", parent(ref("node"))), decl("up", parent(ref("node")))];
|
|
55
|
+
expect(findWalkBorrows(fn(body, ["up"]), host)).toEqual(new Set(["node", "up"]));
|
|
56
|
+
// A parameter re-declared without an initializer is left alone.
|
|
57
|
+
expect(findWalkBorrows(fn([decl("node", null)], []), host).size).toBe(0);
|
|
58
|
+
});
|
|
59
|
+
test("rebound parameters, owned sources and other writers keep ownership", () => {
|
|
60
|
+
const body = [
|
|
61
|
+
// A parameter rebound to an owned value is no root, and neither is its walk.
|
|
62
|
+
assign("node", call),
|
|
63
|
+
decl("fromParam", parent(ref("node"))),
|
|
64
|
+
// A call result is owned, and the failure propagates transitively.
|
|
65
|
+
decl("owned", call),
|
|
66
|
+
decl("viaOwned", parent(ref("owned"))),
|
|
67
|
+
decl("viaViaOwned", ref("viaOwned")),
|
|
68
|
+
// An expression-position write excludes the local.
|
|
69
|
+
decl("written", parent(ref("other"))),
|
|
70
|
+
{
|
|
71
|
+
kind: "exprStmt",
|
|
72
|
+
expr: { kind: "assignExpr", localId: "written", value: ref("other"), type: NODE, loc },
|
|
73
|
+
loc,
|
|
74
|
+
},
|
|
75
|
+
decl("kept", parent(ref("other"))),
|
|
76
|
+
];
|
|
77
|
+
const result = findWalkBorrows(fn(body, ["fromParam", "owned", "viaOwned", "viaViaOwned", "written", "kept"], ["node", "other"]), host);
|
|
78
|
+
expect(result).toEqual(new Set(["kept"]));
|
|
79
|
+
});
|
|
80
|
+
test("scalar locals, owning projections and suspending bodies are never walks", () => {
|
|
81
|
+
const scalar = fn([decl("p", parent(ref("node")))], ["p"]);
|
|
82
|
+
scalar.locals[1] = { id: "p", name: "p", type: F64, mutable: true };
|
|
83
|
+
expect(findWalkBorrows(scalar, host).size).toBe(0);
|
|
84
|
+
const owning = fn([decl("p", parent(ref("node")))], ["p"]);
|
|
85
|
+
expect(findWalkBorrows(owning, { ...host, borrowsWithoutOwning: () => false }).size).toBe(0);
|
|
86
|
+
const suspending = { ...fn([decl("p", parent(ref("node")))], ["p"]), async: true };
|
|
87
|
+
expect(findWalkBorrows(suspending, host).size).toBe(0);
|
|
88
|
+
});
|
|
89
|
+
test("returns of walks, including calls to borrowed-return callees, return borrowed", () => {
|
|
90
|
+
const ret = (value) => ({ kind: "return", value, loc });
|
|
91
|
+
const accessor = { kind: "call", callee: "fileOf", args: [ref("node")], type: NODE, loc };
|
|
92
|
+
const borrowedHost = { ...host, borrowedReturn: (callee) => callee === "fileOf" };
|
|
93
|
+
const walking = fn([decl("p", accessor), ret(parent(ref("p")))], ["p"]);
|
|
94
|
+
expect(analyzeWalks(walking, borrowedHost)).toEqual({
|
|
95
|
+
locals: new Set(["p"]),
|
|
96
|
+
returnsWalk: true,
|
|
97
|
+
});
|
|
98
|
+
// Without the callee fact the call result is owned.
|
|
99
|
+
expect(analyzeWalks(walking, host)).toEqual({ locals: new Set(), returnsWalk: false });
|
|
100
|
+
// Every return must walk, a try statement disqualifies, and parameters
|
|
101
|
+
// outside the borrowing convention are no roots.
|
|
102
|
+
const mixed = fn([ret(parent(ref("node"))), ret(call)], []);
|
|
103
|
+
expect(analyzeWalks(mixed, borrowedHost).returnsWalk).toBe(false);
|
|
104
|
+
const guarded = fn([
|
|
105
|
+
{
|
|
106
|
+
kind: "tryCatch",
|
|
107
|
+
tryBody: [ret(ref("node"))],
|
|
108
|
+
catchBody: null,
|
|
109
|
+
catchLocalId: null,
|
|
110
|
+
finallyBody: [],
|
|
111
|
+
loc,
|
|
112
|
+
},
|
|
113
|
+
], []);
|
|
114
|
+
expect(analyzeWalks(guarded, borrowedHost).returnsWalk).toBe(false);
|
|
115
|
+
const owned = fn([ret(parent(ref("node")))], []);
|
|
116
|
+
expect(analyzeWalks(owned, { ...borrowedHost, parameterAllowed: () => false }).returnsWalk).toBe(false);
|
|
117
|
+
expect(analyzeWalks(owned, borrowedHost).returnsWalk).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=walk-borrows.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-borrows.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/walk-borrows.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IrType, IrUnionDef } from "../../ir/ir.js";
|
|
2
|
+
import { BlockBuilder } from "./blocks.js";
|
|
2
3
|
import { type ShapeHost } from "./shapes.js";
|
|
3
4
|
/** What the walkers need from the emitter beyond the shape tables: union
|
|
4
5
|
* defs, the undefined-arm probe, interned ScrStr literals (unit-arm
|
|
@@ -12,6 +13,9 @@ export interface WalkerHost extends ShapeHost {
|
|
|
12
13
|
cstr(text: string): string;
|
|
13
14
|
/** Request the shared invalid-union-tag abort helper (@sc_bad_tag). */
|
|
14
15
|
needBadTag(): void;
|
|
16
|
+
/** i1: a value loaded from an undefined-armed record field slot is the
|
|
17
|
+
* slot's ABSENT state. */
|
|
18
|
+
fieldAbsentTestIn(B: BlockBuilder, value: string, unionId: string): string;
|
|
15
19
|
}
|
|
16
20
|
export declare class LlWalkers {
|
|
17
21
|
private readonly host;
|
|
@@ -28,7 +32,7 @@ export declare class LlWalkers {
|
|
|
28
32
|
private puts;
|
|
29
33
|
/** Appends a borrowed string, including embedded NUL bytes, in one write. */
|
|
30
34
|
private putScrStr;
|
|
31
|
-
/**
|
|
35
|
+
/** A union value's tag (representation-aware: union-repr.ts). */
|
|
32
36
|
private unionTag;
|
|
33
37
|
private unionPeek;
|
|
34
38
|
/** Emits the enter call + early return; caller pairs it with jbLeave. */
|