@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,4 +1,5 @@
|
|
|
1
1
|
/** Ordered link inputs shared by synchronous native and asynchronous Node hosts. */
|
|
2
|
+
import type { NativeOptimization } from "./optimization.js";
|
|
2
3
|
import { type NativeTargetSpec, type WindowsSubsystem } from "./targets.js";
|
|
3
4
|
export interface ExecutableLinkInputs {
|
|
4
5
|
inputs: string[];
|
|
@@ -16,7 +17,7 @@ export declare function executableLinkInputs(options: {
|
|
|
16
17
|
runtimeObjects: readonly string[];
|
|
17
18
|
runtimeArchives: readonly string[];
|
|
18
19
|
runtimeSystemLibraries: readonly string[];
|
|
19
|
-
optimization:
|
|
20
|
+
optimization: NativeOptimization;
|
|
20
21
|
strip?: boolean;
|
|
21
22
|
windowsSubsystem?: WindowsSubsystem;
|
|
22
23
|
}): ExecutableLinkInputs;
|
|
@@ -1,15 +1,27 @@
|
|
|
1
|
-
/** Ordered link inputs shared by synchronous native and asynchronous Node hosts. */
|
|
2
1
|
import { executableOptimizationLinkerArgs, executableStripLinkerArgs, windowsSubsystemLinkerArgs, } from "./targets.js";
|
|
3
2
|
export function executableLinkInputs(options) {
|
|
4
3
|
if (options.ffiFrameworks.length !== 0 && options.target.platform !== "darwin")
|
|
5
4
|
throw new Error("FFI frameworks require a Darwin target");
|
|
6
5
|
return {
|
|
6
|
+
// Linkers lay out code in input order. The precompiled runtime and its
|
|
7
|
+
// archives go first so their addresses do not depend on the size of the
|
|
8
|
+
// program object: otherwise any program edit shifts every runtime
|
|
9
|
+
// function, and hot interpreter loops (the regex engine's especially)
|
|
10
|
+
// swing by double-digit percentages with incidental cache-line
|
|
11
|
+
// placement. Program code never references archive members directly,
|
|
12
|
+
// so single-pass archive resolution (GNU ld) still sees every runtime
|
|
13
|
+
// reference first. FFI libraries stay after the program that uses them;
|
|
14
|
+
// single-pass linkers get the archives once more after them in case a
|
|
15
|
+
// foreign library depends on a vendored one.
|
|
7
16
|
inputs: [
|
|
17
|
+
...options.runtimeObjects,
|
|
18
|
+
...options.runtimeArchives,
|
|
8
19
|
options.programObject,
|
|
9
20
|
...(options.programPartitions ?? []),
|
|
10
21
|
...options.ffiLibraries,
|
|
11
|
-
...options.
|
|
12
|
-
|
|
22
|
+
...(options.ffiLibraries.length !== 0 && options.target.platform !== "darwin"
|
|
23
|
+
? options.runtimeArchives
|
|
24
|
+
: []),
|
|
13
25
|
],
|
|
14
26
|
systemLibraries: [
|
|
15
27
|
...new Set([...options.ffiSystemLibraries, ...options.runtimeSystemLibraries]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-plan-core.js","sourceRoot":"","sources":["../../src/backend/link-plan-core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"link-plan-core.js","sourceRoot":"","sources":["../../src/backend/link-plan-core.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,0BAA0B,GAG3B,MAAM,cAAc,CAAC;AAQtB,MAAM,UAAU,oBAAoB,CAAC,OAcpC;IACC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAC5E,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,OAAO;QACL,uEAAuE;QACvE,wEAAwE;QACxE,kEAAkE;QAClE,sEAAsE;QACtE,+DAA+D;QAC/D,qEAAqE;QACrE,sEAAsE;QACtE,wEAAwE;QACxE,sEAAsE;QACtE,6CAA6C;QAC7C,MAAM,EAAE;YACN,GAAG,OAAO,CAAC,cAAc;YACzB,GAAG,OAAO,CAAC,eAAe;YAC1B,OAAO,CAAC,aAAa;YACrB,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;YACpC,GAAG,OAAO,CAAC,YAAY;YACvB,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBAC3E,CAAC,CAAC,OAAO,CAAC,eAAe;gBACzB,CAAC,CAAC,EAAE,CAAC;SACR;QACD,eAAe,EAAE;YACf,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;SAC/E;QACD,WAAW,EAAE;YACX,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YAChE,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC9D,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CACrF;YACD,GAAG,gCAAgC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC;YAClF,GAAG,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;YAC7E,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC;SACjF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* program, FFI inputs, runtime objects/archives, and system libraries meet
|
|
7
7
|
* the platform linker.
|
|
8
8
|
*/
|
|
9
|
+
import type { NativeOptimization } from "./optimization.js";
|
|
9
10
|
import type { FfiProfile } from "../ffi/ffi-manifest.js";
|
|
10
11
|
import type { NativeLinkFeatures } from "./native-link-info.js";
|
|
11
12
|
import type { NativeArtifactDependency } from "./native/contracts.js";
|
|
@@ -32,7 +33,7 @@ export declare function createNativeLinkPlan(options: {
|
|
|
32
33
|
outPath: string;
|
|
33
34
|
features: NativeLinkFeatures;
|
|
34
35
|
ffi: FfiProfile | null;
|
|
35
|
-
optimization:
|
|
36
|
+
optimization: NativeOptimization;
|
|
36
37
|
strip?: boolean;
|
|
37
38
|
windowsSubsystem?: WindowsSubsystem;
|
|
38
39
|
programObjectDependencies?: readonly NativeArtifactDependency[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-plan.js","sourceRoot":"","sources":["../../src/backend/link-plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"link-plan.js","sourceRoot":"","sources":["../../src/backend/link-plan.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAA6B,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAkB3D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAa1C;IACC,IAAI,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACzE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,kBAAkB,EAAE,uBAAuB,CACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,KAAK,CACd;QACD,UAAU,EAAE,OAAO,CAAC,OAAO;QAC3B,GAAG,oBAAoB,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;gBACzC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACrD,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE;YAC1C,kBAAkB,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,IAAI,EAAE;YACtD,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,IAAI,EAAE;YAC5C,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,eAAe,EAAE,WAAW,CAAC,QAAQ;YACrC,sBAAsB,EAAE,WAAW,CAAC,eAAe;YACnD,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;SACpD,CAAC;QACF,eAAe,EAAE,CAAC,GAAG,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;QACpF,yBAAyB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QACzE,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** The emitter surface this module needs (a subset of ShapeHost). */
|
|
2
|
+
export interface AllocHost {
|
|
3
|
+
declare(decl: string): void;
|
|
4
|
+
needOom(): void;
|
|
5
|
+
readonly sizeType: "i32" | "i64";
|
|
6
|
+
/** Inline the allocator fast paths (see the target rule above). */
|
|
7
|
+
readonly inlineAlloc?: boolean;
|
|
8
|
+
/** Emit the RC-audit object notes on the out-of-line paths (ShapeHost
|
|
9
|
+
* objectAudit: only --sanitize builds count them). Absent means emit. */
|
|
10
|
+
readonly objectAudit?: boolean;
|
|
11
|
+
/** The allocator state, live count and dispose hook are thread-local
|
|
12
|
+
* (worker executables). */
|
|
13
|
+
readonly threadLocalAlloc?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Whether a target can use the inline allocation paths. */
|
|
16
|
+
export declare function inlineAllocSupported(options: {
|
|
17
|
+
pointerBits?: 32 | 64 | undefined;
|
|
18
|
+
wasi?: boolean | undefined;
|
|
19
|
+
targetTriple?: string | undefined;
|
|
20
|
+
threadInstances?: boolean | undefined;
|
|
21
|
+
}): boolean;
|
|
22
|
+
/** A collector header to install: the object's trace and teardown. */
|
|
23
|
+
export interface CycHeader {
|
|
24
|
+
trace: string;
|
|
25
|
+
free: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Lines that leave a zeroed object of `size` bytes (an integer constant
|
|
29
|
+
* expression) in `%o`, aborting on OOM, with the RC-audit allocation note
|
|
30
|
+
* on the out-of-line path. With `cyc`, the object carries a collector
|
|
31
|
+
* header (scr_cyc_alloc's contract). `stored` is the number of leading
|
|
32
|
+
* object bytes the caller stores unconditionally right after (at least the
|
|
33
|
+
* refcount word), which a recycled block need not clear. Labels use the
|
|
34
|
+
* `sa.` prefix; the lines end in an open block.
|
|
35
|
+
*/
|
|
36
|
+
export declare function emitObjectAlloc(host: AllocHost, size: string, cyc: CycHeader | null, stored?: number): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Lines that free the object `%o` after its members were released: the
|
|
39
|
+
* RC-audit free note, the weak-collection dispose hook, and the block —
|
|
40
|
+
* `scr_cyc_free` for collector-headered objects, `scr_rt_free` otherwise.
|
|
41
|
+
* Labels use the `sf.` prefix; the lines end in an open block.
|
|
42
|
+
*/
|
|
43
|
+
export declare function emitObjectFree(host: AllocHost, cyc: boolean): string[];
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/* Emitted object allocation and deallocation for records and class
|
|
2
|
+
* instances.
|
|
3
|
+
*
|
|
4
|
+
* Every constructor allocates a constant-size block. The runtime's
|
|
5
|
+
* small-object allocator (scr_alloc.c, contract in scr_runtime.h) serves it
|
|
6
|
+
* from a per-size-class free list or bump pointer, but through an
|
|
7
|
+
* out-of-line call the size class, the zeroing length, and the
|
|
8
|
+
* collector-header setup are recomputed for every object. Here the fast
|
|
9
|
+
* paths are inlined into the emitted `new`/release helpers instead, so they
|
|
10
|
+
* fold to a constant class, a constant-length clear of only the bytes the
|
|
11
|
+
* helper does not store itself, and a handful of loads and stores.
|
|
12
|
+
*
|
|
13
|
+
* Soundness does not depend on which runtime the program links against.
|
|
14
|
+
* The runtime defines `scr_sa` in every build; where its allocator is
|
|
15
|
+
* compiled out (AddressSanitizer, the RC audit) the state stays all-zero,
|
|
16
|
+
* so the inline paths find no free block, no bump room and an empty span,
|
|
17
|
+
* and always take the slow path: the same out-of-line calls as before
|
|
18
|
+
* (scr_rt_calloc / scr_cyc_alloc, scr_rt_free) plus the RC-audit object
|
|
19
|
+
* notes. The fast paths skip those notes, which are no-ops whenever the
|
|
20
|
+
* allocator is live (SCR_RC_AUDIT forces it off; scr_runtime.h #errors
|
|
21
|
+
* otherwise). Blocks outside the reservation (system fallbacks) go back
|
|
22
|
+
* through scr_rt_free.
|
|
23
|
+
*
|
|
24
|
+
* Inlining is limited to the targets where the allocator can be live: 64-bit,
|
|
25
|
+
* not WASI, not Windows, and not thread-instanced libraries (whose
|
|
26
|
+
* allocator is compiled out). Worker programs inline too, against the
|
|
27
|
+
* thread-local allocator state, live count and dispose hook of the calling
|
|
28
|
+
* script thread (each thread owns an arena; see scr_runtime.h). Elsewhere
|
|
29
|
+
* the out-of-line calls remain. */
|
|
30
|
+
/** The state globals of the inline allocation paths and, in worker
|
|
31
|
+
* executables, their byte offsets inside the runtime's one thread-local
|
|
32
|
+
* ScrThreadHot block (layout asserted in scr_runtime.h). */
|
|
33
|
+
const STATE_GLOBALS = [
|
|
34
|
+
["@scr_sa", 0],
|
|
35
|
+
["@scr_cyc_live", 792],
|
|
36
|
+
["@scr_cyc_old_freed", 800],
|
|
37
|
+
["@scr_weak_dispose_hook", 808],
|
|
38
|
+
];
|
|
39
|
+
const THREAD_HOT_TYPE = "{ { i64, i64, i32, [32 x ptr], [32 x ptr], [32 x ptr] }, i64, i64, ptr }";
|
|
40
|
+
/** Worker executables: address the thread's ScrThreadHot block once through
|
|
41
|
+
* llvm.threadlocal.address (which LLVM can share across a function; on
|
|
42
|
+
* Darwin each distinct thread-local costs a call) and rewrite the lines to
|
|
43
|
+
* address the state globals at their offsets in it. */
|
|
44
|
+
function threadLocalState(host, prefix, lines) {
|
|
45
|
+
if (host.threadLocalAlloc !== true)
|
|
46
|
+
return lines;
|
|
47
|
+
const hot = `%${prefix}.tl.hot`;
|
|
48
|
+
const preamble = [];
|
|
49
|
+
let text = lines.join("\n");
|
|
50
|
+
for (const [global, offset] of STATE_GLOBALS) {
|
|
51
|
+
if (!text.includes(`ptr ${global}`))
|
|
52
|
+
continue;
|
|
53
|
+
if (preamble.length === 0) {
|
|
54
|
+
host.declare(`@scr_thread_hot = external thread_local global ${THREAD_HOT_TYPE}`);
|
|
55
|
+
host.declare(`declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)`);
|
|
56
|
+
preamble.push(` ${hot} = call ptr @llvm.threadlocal.address.p0(ptr @scr_thread_hot)`);
|
|
57
|
+
}
|
|
58
|
+
const local = `%${prefix}.tl.${global.slice(5)}`;
|
|
59
|
+
preamble.push(` ${local} = getelementptr inbounds i8, ptr ${hot}, i64 ${offset}`);
|
|
60
|
+
text = text
|
|
61
|
+
.replaceAll(`ptr ${global},`, `ptr ${local},`)
|
|
62
|
+
.replaceAll(`ptr ${global}`, `ptr ${local}`);
|
|
63
|
+
}
|
|
64
|
+
return [...preamble, ...text.split("\n")];
|
|
65
|
+
}
|
|
66
|
+
const ALLOC_NOTE = ` call void @scr_obj_alloc_note()`;
|
|
67
|
+
const FREE_NOTE = ` call void @scr_obj_free_note()`;
|
|
68
|
+
/** Whether a target can use the inline allocation paths. */
|
|
69
|
+
export function inlineAllocSupported(options) {
|
|
70
|
+
if (options.pointerBits === 32 || options.wasi === true || options.threadInstances === true) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// An omitted triple means the host ABI. That stays sound even on a host
|
|
74
|
+
// whose runtime compiles the allocator out: scr_sa is defined there too
|
|
75
|
+
// and stays zero, so only the slow paths run.
|
|
76
|
+
const triple = (options.targetTriple ?? "").toLowerCase();
|
|
77
|
+
return !/windows|mingw|msvc|cygwin|wasm/.test(triple);
|
|
78
|
+
}
|
|
79
|
+
/* ScrSaState layout on 64-bit targets (asserted in scr_runtime.h). */
|
|
80
|
+
const SA_TYPE = "{ i64, i64, i32, [32 x ptr], [32 x ptr], [32 x ptr] }";
|
|
81
|
+
const SA_SPAN = 8;
|
|
82
|
+
const SA_SHIFT = 16;
|
|
83
|
+
const SA_FREE = 24;
|
|
84
|
+
const SA_BUMP = 280;
|
|
85
|
+
const SA_LIM = 536;
|
|
86
|
+
const SA_STEP_SHIFT = 4; // 16-byte classes
|
|
87
|
+
const SA_MAX = 512;
|
|
88
|
+
/** sizeof(ScrCycHdr) on 64-bit targets; trace and free_fn are its first
|
|
89
|
+
* two words, and every other header word starts zero. */
|
|
90
|
+
const CYC_HDR = 32;
|
|
91
|
+
function declareState(host) {
|
|
92
|
+
if (host.threadLocalAlloc !== true)
|
|
93
|
+
host.declare(`@scr_sa = external global ${SA_TYPE}`);
|
|
94
|
+
host.declare(`declare i1 @llvm.expect.i1(i1, i1)`);
|
|
95
|
+
}
|
|
96
|
+
function declareGlobal(host, decl) {
|
|
97
|
+
if (host.threadLocalAlloc !== true)
|
|
98
|
+
host.declare(decl);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Lines that leave a zeroed object of `size` bytes (an integer constant
|
|
102
|
+
* expression) in `%o`, aborting on OOM, with the RC-audit allocation note
|
|
103
|
+
* on the out-of-line path. With `cyc`, the object carries a collector
|
|
104
|
+
* header (scr_cyc_alloc's contract). `stored` is the number of leading
|
|
105
|
+
* object bytes the caller stores unconditionally right after (at least the
|
|
106
|
+
* refcount word), which a recycled block need not clear. Labels use the
|
|
107
|
+
* `sa.` prefix; the lines end in an open block.
|
|
108
|
+
*/
|
|
109
|
+
export function emitObjectAlloc(host, size, cyc, stored = 8) {
|
|
110
|
+
const lines = threadLocalState(host, "sa", allocLines(host, size, cyc, stored));
|
|
111
|
+
if (host.objectAudit === false)
|
|
112
|
+
return lines.filter((line) => line !== ALLOC_NOTE);
|
|
113
|
+
host.declare(`declare void @scr_obj_alloc_note()`);
|
|
114
|
+
return lines;
|
|
115
|
+
}
|
|
116
|
+
function allocLines(host, size, cyc, stored) {
|
|
117
|
+
const S = host.sizeType;
|
|
118
|
+
if (host.inlineAlloc !== true) {
|
|
119
|
+
if (cyc) {
|
|
120
|
+
host.declare(`declare ptr @scr_cyc_alloc(${S}, ptr, ptr)`);
|
|
121
|
+
return [
|
|
122
|
+
` %o = call ptr @scr_cyc_alloc(${S} ${size}, ptr ${cyc.trace}, ptr ${cyc.free})`,
|
|
123
|
+
` call void @scr_obj_alloc_note()`,
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
host.declare(`declare ptr @scr_rt_calloc(${S})`);
|
|
127
|
+
host.needOom();
|
|
128
|
+
return [
|
|
129
|
+
` %o = call ptr @scr_rt_calloc(${S} ${size})`,
|
|
130
|
+
` %isnull = icmp eq ptr %o, null`,
|
|
131
|
+
` br i1 %isnull, label %oom, label %ok`,
|
|
132
|
+
`oom:`,
|
|
133
|
+
` call void @sc_oom()`,
|
|
134
|
+
` unreachable`,
|
|
135
|
+
`ok:`,
|
|
136
|
+
` call void @scr_obj_alloc_note()`,
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
declareState(host);
|
|
140
|
+
// Bytes of the block that the fast path itself stores after the clear:
|
|
141
|
+
// the header's trace/free_fn words, or the object's leading words.
|
|
142
|
+
const keep = cyc ? 16 : stored;
|
|
143
|
+
const lines = [
|
|
144
|
+
` %sa.n = add i64 ${size}, ${cyc ? CYC_HDR : 0}`,
|
|
145
|
+
` %sa.small = icmp ule i64 %sa.n, ${SA_MAX}`,
|
|
146
|
+
` br i1 %sa.small, label %sa.class, label %sa.slow`,
|
|
147
|
+
`sa.class:`,
|
|
148
|
+
` %sa.nm1 = sub i64 %sa.n, 1`,
|
|
149
|
+
` %sa.c = lshr i64 %sa.nm1, ${SA_STEP_SHIFT}`,
|
|
150
|
+
` %sa.c8 = shl i64 %sa.c, 3`,
|
|
151
|
+
` %sa.fo = add i64 %sa.c8, ${SA_FREE}`,
|
|
152
|
+
` %sa.fp = getelementptr inbounds i8, ptr @scr_sa, i64 %sa.fo`,
|
|
153
|
+
` %sa.b = load ptr, ptr %sa.fp`,
|
|
154
|
+
` %sa.hit = icmp ne ptr %sa.b, null`,
|
|
155
|
+
` %sa.hitx = call i1 @llvm.expect.i1(i1 %sa.hit, i1 true)`,
|
|
156
|
+
` br i1 %sa.hitx, label %sa.pop, label %sa.bump`,
|
|
157
|
+
`sa.pop: ; recycled blocks are dirty`,
|
|
158
|
+
` %sa.next = load ptr, ptr %sa.b`,
|
|
159
|
+
` store ptr %sa.next, ptr %sa.fp`,
|
|
160
|
+
` %sa.z = getelementptr inbounds i8, ptr %sa.b, i64 ${keep}`,
|
|
161
|
+
` %sa.zn = sub i64 %sa.n, ${keep}`,
|
|
162
|
+
` call void @llvm.memset.p0.i64(ptr align 8 %sa.z, i8 0, i64 %sa.zn, i1 false)`,
|
|
163
|
+
` br label %sa.fast`,
|
|
164
|
+
`sa.bump: ; fresh reservation memory is already zero`,
|
|
165
|
+
` %sa.c1 = add i64 %sa.c, 1`,
|
|
166
|
+
` %sa.sz = shl i64 %sa.c1, ${SA_STEP_SHIFT}`,
|
|
167
|
+
` %sa.bo = add i64 %sa.c8, ${SA_BUMP}`,
|
|
168
|
+
` %sa.bp = getelementptr inbounds i8, ptr @scr_sa, i64 %sa.bo`,
|
|
169
|
+
` %sa.lo = add i64 %sa.c8, ${SA_LIM}`,
|
|
170
|
+
` %sa.lp = getelementptr inbounds i8, ptr @scr_sa, i64 %sa.lo`,
|
|
171
|
+
` %sa.p = load ptr, ptr %sa.bp`,
|
|
172
|
+
` %sa.l = load ptr, ptr %sa.lp`,
|
|
173
|
+
` %sa.pi = ptrtoint ptr %sa.p to i64`,
|
|
174
|
+
` %sa.li = ptrtoint ptr %sa.l to i64`,
|
|
175
|
+
` %sa.room = sub i64 %sa.li, %sa.pi`,
|
|
176
|
+
` %sa.fits = icmp uge i64 %sa.room, %sa.sz`,
|
|
177
|
+
` %sa.fitsx = call i1 @llvm.expect.i1(i1 %sa.fits, i1 true)`,
|
|
178
|
+
` br i1 %sa.fitsx, label %sa.carve, label %sa.slow`,
|
|
179
|
+
`sa.carve:`,
|
|
180
|
+
` %sa.np = getelementptr inbounds i8, ptr %sa.p, i64 %sa.sz`,
|
|
181
|
+
` store ptr %sa.np, ptr %sa.bp`,
|
|
182
|
+
` br label %sa.fast`,
|
|
183
|
+
];
|
|
184
|
+
host.declare(`declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)`);
|
|
185
|
+
if (cyc) {
|
|
186
|
+
host.declare(`declare ptr @scr_cyc_alloc(${S}, ptr, ptr)`);
|
|
187
|
+
declareGlobal(host, `@scr_cyc_live = external global i64`);
|
|
188
|
+
lines.push(`sa.fast:`, ` %sa.blk = phi ptr [ %sa.b, %sa.pop ], [ %sa.p, %sa.carve ]`, ` store ptr ${cyc.trace}, ptr %sa.blk ; ScrCycHdr.trace`, ` %sa.ffp = getelementptr inbounds i8, ptr %sa.blk, i64 8`, ` store ptr ${cyc.free}, ptr %sa.ffp ; ScrCycHdr.free_fn`, ` %sa.live = load i64, ptr @scr_cyc_live`, ` %sa.live1 = add i64 %sa.live, 1`, ` store i64 %sa.live1, ptr @scr_cyc_live`, ` %sa.obj = getelementptr inbounds i8, ptr %sa.blk, i64 ${CYC_HDR}`, ` br label %sa.done`, `sa.slow:`, ` %sa.s = call ptr @scr_cyc_alloc(i64 ${size}, ptr ${cyc.trace}, ptr ${cyc.free})`, ` call void @scr_obj_alloc_note()`, ` br label %sa.done`, `sa.done:`, ` %o = phi ptr [ %sa.obj, %sa.fast ], [ %sa.s, %sa.slow ]`);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
host.declare(`declare ptr @scr_rt_calloc(${S})`);
|
|
192
|
+
host.needOom();
|
|
193
|
+
lines.push(`sa.fast:`, ` %sa.blk = phi ptr [ %sa.b, %sa.pop ], [ %sa.p, %sa.carve ]`, ` br label %sa.done`, `sa.slow:`, ` %sa.s = call ptr @scr_rt_calloc(i64 ${size})`, ` %sa.null = icmp eq ptr %sa.s, null`, ` br i1 %sa.null, label %oom, label %sa.noted`, `oom:`, ` call void @sc_oom()`, ` unreachable`, `sa.noted:`, ` call void @scr_obj_alloc_note()`, ` br label %sa.done`, `sa.done:`, ` %o = phi ptr [ %sa.blk, %sa.fast ], [ %sa.s, %sa.noted ]`);
|
|
194
|
+
}
|
|
195
|
+
return lines;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Lines that free the object `%o` after its members were released: the
|
|
199
|
+
* RC-audit free note, the weak-collection dispose hook, and the block —
|
|
200
|
+
* `scr_cyc_free` for collector-headered objects, `scr_rt_free` otherwise.
|
|
201
|
+
* Labels use the `sf.` prefix; the lines end in an open block.
|
|
202
|
+
*/
|
|
203
|
+
export function emitObjectFree(host, cyc) {
|
|
204
|
+
const lines = threadLocalState(host, "sf", freeLines(host, cyc));
|
|
205
|
+
if (host.objectAudit === false)
|
|
206
|
+
return lines.filter((line) => line !== FREE_NOTE);
|
|
207
|
+
host.declare(`declare void @scr_obj_free_note()`);
|
|
208
|
+
return lines;
|
|
209
|
+
}
|
|
210
|
+
function freeLines(host, cyc) {
|
|
211
|
+
if (host.inlineAlloc !== true) {
|
|
212
|
+
if (cyc) {
|
|
213
|
+
host.declare(`declare void @scr_cyc_free(ptr)`);
|
|
214
|
+
return [` call void @scr_obj_free_note()`, ` call void @scr_cyc_free(ptr %o)`];
|
|
215
|
+
}
|
|
216
|
+
host.declare(`declare void @scr_rt_free(ptr)`);
|
|
217
|
+
host.declare(`declare void @scr_weak_dispose(ptr)`);
|
|
218
|
+
return [
|
|
219
|
+
` call void @scr_obj_free_note()`,
|
|
220
|
+
` call void @scr_weak_dispose(ptr %o)`,
|
|
221
|
+
` call void @scr_rt_free(ptr %o)`,
|
|
222
|
+
];
|
|
223
|
+
}
|
|
224
|
+
declareState(host);
|
|
225
|
+
host.declare(`declare void @scr_rt_free(ptr)`);
|
|
226
|
+
declareGlobal(host, `@scr_weak_dispose_hook = external global ptr`);
|
|
227
|
+
const lines = [
|
|
228
|
+
` %sf.hook = load ptr, ptr @scr_weak_dispose_hook`,
|
|
229
|
+
` %sf.has = icmp ne ptr %sf.hook, null`,
|
|
230
|
+
` %sf.hasx = call i1 @llvm.expect.i1(i1 %sf.has, i1 false)`,
|
|
231
|
+
` br i1 %sf.hasx, label %sf.observe, label %sf.block`,
|
|
232
|
+
`sf.observe: ; weak collections observe the disposal`,
|
|
233
|
+
` call void %sf.hook(ptr %o)`,
|
|
234
|
+
` br label %sf.block`,
|
|
235
|
+
`sf.block:`,
|
|
236
|
+
];
|
|
237
|
+
if (cyc) {
|
|
238
|
+
declareGlobal(host, `@scr_cyc_live = external global i64`);
|
|
239
|
+
declareGlobal(host, `@scr_cyc_old_freed = external global i64`);
|
|
240
|
+
lines.push(` %sf.live = load i64, ptr @scr_cyc_live`, ` %sf.live1 = sub i64 %sf.live, 1`, ` store i64 %sf.live1, ptr @scr_cyc_live`, ` %sf.blk = getelementptr inbounds i8, ptr %o, i64 -${CYC_HDR}`, ` %sf.genp = getelementptr inbounds i8, ptr %sf.blk, i64 22`, ` %sf.gen = load i16, ptr %sf.genp`, ` %sf.old = icmp eq i16 %sf.gen, 2`, ` br i1 %sf.old, label %sf.oldcount, label %sf.accounted`, `sf.oldcount:`, ` %sf.freed = load i64, ptr @scr_cyc_old_freed`, ` %sf.freed1 = add i64 %sf.freed, 1`, ` store i64 %sf.freed1, ptr @scr_cyc_old_freed`, ` br label %sf.accounted`, `sf.accounted:`);
|
|
241
|
+
}
|
|
242
|
+
const blk = cyc ? "%sf.blk" : "%o";
|
|
243
|
+
lines.push(` %sf.base = load i64, ptr @scr_sa`, ` %sf.spanp = getelementptr inbounds i8, ptr @scr_sa, i64 ${SA_SPAN}`, ` %sf.span = load i64, ptr %sf.spanp`, ` %sf.bi = ptrtoint ptr ${blk} to i64`, ` %sf.off = sub i64 %sf.bi, %sf.base`, ` %sf.in = icmp ult i64 %sf.off, %sf.span`, ` %sf.inx = call i1 @llvm.expect.i1(i1 %sf.in, i1 true)`, ` br i1 %sf.inx, label %sf.push, label %sf.sys`, `sf.push:`, ` %sf.shp = getelementptr inbounds i8, ptr @scr_sa, i64 ${SA_SHIFT}`, ` %sf.sh32 = load i32, ptr %sf.shp`, ` %sf.sh = zext i32 %sf.sh32 to i64`, ` %sf.c = lshr i64 %sf.off, %sf.sh`, ` %sf.c8 = shl i64 %sf.c, 3`, ` %sf.fo = add i64 %sf.c8, ${SA_FREE}`, ` %sf.fp = getelementptr inbounds i8, ptr @scr_sa, i64 %sf.fo`, ` %sf.head = load ptr, ptr %sf.fp`, ` store ptr %sf.head, ptr ${blk}`, ` store ptr ${blk}, ptr %sf.fp`, ` br label %sf.done`, `sf.sys: ; outside the reservation, or the allocator is compiled out`, ` call void @scr_obj_free_note()`, ` call void @scr_rt_free(ptr ${blk})`, ` br label %sf.done`, `sf.done:`);
|
|
244
|
+
return lines;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=alloc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alloc.js","sourceRoot":"","sources":["../../../src/backend/llvm/alloc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { emitObjectAlloc, emitObjectFree, inlineAllocSupported } from "./alloc.js";
|
|
3
|
+
function host(inlineAlloc) {
|
|
4
|
+
const h = {
|
|
5
|
+
decls: new Set(),
|
|
6
|
+
oom: false,
|
|
7
|
+
sizeType: "i64",
|
|
8
|
+
inlineAlloc,
|
|
9
|
+
declare(decl) {
|
|
10
|
+
h.decls.add(decl);
|
|
11
|
+
},
|
|
12
|
+
needOom() {
|
|
13
|
+
h.oom = true;
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
return h;
|
|
17
|
+
}
|
|
18
|
+
/** Every SSA value and label is defined once (the lines are spliced into
|
|
19
|
+
* one function body). */
|
|
20
|
+
function expectSingleDefinitions(lines) {
|
|
21
|
+
const defs = lines.flatMap((l) => {
|
|
22
|
+
const value = /^\s*(%[\w.]+) = /.exec(l);
|
|
23
|
+
const label = /^([\w.]+):/.exec(l);
|
|
24
|
+
return value ? [value[1]] : label ? [`%${label[1]}`] : [];
|
|
25
|
+
});
|
|
26
|
+
expect(new Set(defs).size).toBe(defs.length);
|
|
27
|
+
}
|
|
28
|
+
describe("emitted object allocation", () => {
|
|
29
|
+
test("inlines only where the runtime allocator state is a 64-bit process global", () => {
|
|
30
|
+
expect(inlineAllocSupported({ pointerBits: 64, targetTriple: "" })).toBe(true);
|
|
31
|
+
expect(inlineAllocSupported({ targetTriple: "x86_64-unknown-linux-gnu" })).toBe(true);
|
|
32
|
+
expect(inlineAllocSupported({ targetTriple: "arm64-apple-macosx14.0.0" })).toBe(true);
|
|
33
|
+
expect(inlineAllocSupported({ pointerBits: 32 })).toBe(false);
|
|
34
|
+
expect(inlineAllocSupported({ wasi: true })).toBe(false);
|
|
35
|
+
expect(inlineAllocSupported({ targetTriple: "wasm32-unknown-wasip1" })).toBe(false);
|
|
36
|
+
expect(inlineAllocSupported({ targetTriple: "x86_64-pc-windows-msvc" })).toBe(false);
|
|
37
|
+
expect(inlineAllocSupported({ targetTriple: "x86_64-w64-windows-gnu" })).toBe(false);
|
|
38
|
+
expect(inlineAllocSupported({ threadInstances: true })).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
test("keeps the out-of-line calls when inlining is off", () => {
|
|
41
|
+
const h = host(false);
|
|
42
|
+
expect(emitObjectAlloc(h, "24", null)).toEqual([
|
|
43
|
+
" %o = call ptr @scr_rt_calloc(i64 24)",
|
|
44
|
+
" %isnull = icmp eq ptr %o, null",
|
|
45
|
+
" br i1 %isnull, label %oom, label %ok",
|
|
46
|
+
"oom:",
|
|
47
|
+
" call void @sc_oom()",
|
|
48
|
+
" unreachable",
|
|
49
|
+
"ok:",
|
|
50
|
+
" call void @scr_obj_alloc_note()",
|
|
51
|
+
]);
|
|
52
|
+
expect(emitObjectAlloc(h, "24", { trace: "@t", free: "@f" })).toEqual([
|
|
53
|
+
" %o = call ptr @scr_cyc_alloc(i64 24, ptr @t, ptr @f)",
|
|
54
|
+
" call void @scr_obj_alloc_note()",
|
|
55
|
+
]);
|
|
56
|
+
expect(emitObjectFree(h, true)).toEqual([
|
|
57
|
+
" call void @scr_obj_free_note()",
|
|
58
|
+
" call void @scr_cyc_free(ptr %o)",
|
|
59
|
+
]);
|
|
60
|
+
expect(emitObjectFree(h, false)).toEqual([
|
|
61
|
+
" call void @scr_obj_free_note()",
|
|
62
|
+
" call void @scr_weak_dispose(ptr %o)",
|
|
63
|
+
" call void @scr_rt_free(ptr %o)",
|
|
64
|
+
]);
|
|
65
|
+
expect([...h.decls].some((d) => d.includes("@scr_sa"))).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
test("inline allocation falls back to the audited out-of-line entry points", () => {
|
|
68
|
+
const h = host(true);
|
|
69
|
+
const plain = emitObjectAlloc(h, "40", null, 16);
|
|
70
|
+
expectSingleDefinitions(plain);
|
|
71
|
+
expect(h.oom).toBe(true);
|
|
72
|
+
// Recycled blocks clear everything past the bytes the caller stores.
|
|
73
|
+
expect(plain).toContain(" %sa.z = getelementptr inbounds i8, ptr %sa.b, i64 16");
|
|
74
|
+
// The slow path is the old sequence: allocate, OOM check, audit note.
|
|
75
|
+
const slow = plain.slice(plain.indexOf("sa.slow:"));
|
|
76
|
+
expect(slow).toContain(" %sa.s = call ptr @scr_rt_calloc(i64 40)");
|
|
77
|
+
expect(slow).toContain(" call void @scr_obj_alloc_note()");
|
|
78
|
+
expect(plain.filter((l) => l.includes("@scr_obj_alloc_note")).length).toBe(1);
|
|
79
|
+
expect(plain.at(-1)).toBe(" %o = phi ptr [ %sa.blk, %sa.fast ], [ %sa.s, %sa.noted ]");
|
|
80
|
+
const cyc = emitObjectAlloc(h, "40", { trace: "@t", free: "@f" });
|
|
81
|
+
expectSingleDefinitions(cyc);
|
|
82
|
+
expect(cyc).toContain(" %sa.n = add i64 40, 32");
|
|
83
|
+
expect(cyc).toContain(" %sa.s = call ptr @scr_cyc_alloc(i64 40, ptr @t, ptr @f)");
|
|
84
|
+
expect(cyc).toContain(" store i64 %sa.live1, ptr @scr_cyc_live");
|
|
85
|
+
expect(h.decls).toContain("@scr_sa = external global { i64, i64, i32, [32 x ptr], [32 x ptr], [32 x ptr] }");
|
|
86
|
+
});
|
|
87
|
+
test("inline frees route foreign blocks and the bypassed allocator to scr_rt_free", () => {
|
|
88
|
+
for (const cyc of [false, true]) {
|
|
89
|
+
const h = host(true);
|
|
90
|
+
const lines = emitObjectFree(h, cyc);
|
|
91
|
+
expectSingleDefinitions(lines);
|
|
92
|
+
const blk = cyc ? "%sf.blk" : "%o";
|
|
93
|
+
const sys = lines.slice(lines.indexOf(lines.find((l) => l.startsWith("sf.sys:"))));
|
|
94
|
+
expect(sys).toContain(" call void @scr_obj_free_note()");
|
|
95
|
+
expect(sys).toContain(` call void @scr_rt_free(ptr ${blk})`);
|
|
96
|
+
expect(lines).toContain(" call void %sf.hook(ptr %o)");
|
|
97
|
+
expect(lines.some((l) => l.includes("@scr_cyc_live"))).toBe(cyc);
|
|
98
|
+
expect(lines.at(-1)).toBe("sf.done:");
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=alloc.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alloc.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/alloc.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAkB,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEnG,SAAS,IAAI,CAAC,WAAoB;IAChC,MAAM,CAAC,GAAG;QACR,KAAK,EAAE,IAAI,GAAG,EAAU;QACxB,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,KAAc;QACxB,WAAW;QACX,OAAO,CAAC,IAAY;YAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO;YACL,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;KACF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;yBACyB;AACzB,SAAS,uBAAuB,CAAC,KAAe;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACrF,MAAM,CAAC,oBAAoB,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,oBAAoB,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpF,MAAM,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrF,MAAM,CAAC,oBAAoB,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrF,MAAM,CAAC,oBAAoB,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,wCAAwC;YACxC,kCAAkC;YAClC,wCAAwC;YACxC,MAAM;YACN,uBAAuB;YACvB,eAAe;YACf,KAAK;YACL,mCAAmC;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACpE,wDAAwD;YACxD,mCAAmC;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACtC,kCAAkC;YAClC,mCAAmC;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,kCAAkC;YAClC,uCAAuC;YACvC,kCAAkC;SACnC,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,qEAAqE;QACrE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;QAClF,sEAAsE;QACtE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAExF,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,2DAA2D,CAAC,CAAC;QACnF,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAClE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CACvB,iFAAiF,CAClF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACvF,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACrC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YACnC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAE,CAAC,CAAC,CAAC;YACpF,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gCAAgC,GAAG,GAAG,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -8,8 +8,17 @@ export declare class BlockBuilder {
|
|
|
8
8
|
private tempCounter;
|
|
9
9
|
private labelCounter;
|
|
10
10
|
debugLocation: string | null;
|
|
11
|
+
/** The body is a synchronous IR function: the active exception cell is one
|
|
12
|
+
* value from entry to every pending check. Other builders (adapters,
|
|
13
|
+
* runtime helpers) keep loading it at each check. */
|
|
14
|
+
excCellInvariant: boolean;
|
|
15
|
+
/** The entry-block load of the active exception cell, once requested. */
|
|
16
|
+
excCell: string | null;
|
|
11
17
|
/** Function epilogue shared by normal and exceptional returns. */
|
|
12
18
|
returnEpilogue: string | null;
|
|
19
|
+
/** Temps known to hold immortal values (temp names are only unique
|
|
20
|
+
* within one builder). */
|
|
21
|
+
readonly immortalTemps: Set<string>;
|
|
13
22
|
constructor();
|
|
14
23
|
newLabel(hint: string): string;
|
|
15
24
|
startBlock(label: string): void;
|
|
@@ -19,8 +19,17 @@ export class BlockBuilder {
|
|
|
19
19
|
tempCounter = 0;
|
|
20
20
|
labelCounter = 0;
|
|
21
21
|
debugLocation = null;
|
|
22
|
+
/** The body is a synchronous IR function: the active exception cell is one
|
|
23
|
+
* value from entry to every pending check. Other builders (adapters,
|
|
24
|
+
* runtime helpers) keep loading it at each check. */
|
|
25
|
+
excCellInvariant = false;
|
|
26
|
+
/** The entry-block load of the active exception cell, once requested. */
|
|
27
|
+
excCell = null;
|
|
22
28
|
/** Function epilogue shared by normal and exceptional returns. */
|
|
23
29
|
returnEpilogue = null;
|
|
30
|
+
/** Temps known to hold immortal values (temp names are only unique
|
|
31
|
+
* within one builder). */
|
|
32
|
+
immortalTemps = new Set();
|
|
24
33
|
constructor() {
|
|
25
34
|
this.cur = { label: "entry", lines: [], term: null };
|
|
26
35
|
this.blocks.push(this.cur);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../src/backend/llvm/blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;6CAU6C;AAE7C,MAAM,OAAO,YAAY;IACN,MAAM,GAA8D,EAAE,CAAC;IAChF,GAAG,CAA0D;IACrE;;2CAEuC;IAC9B,YAAY,GAAa,EAAE,CAAC;IAC7B,WAAW,GAAG,CAAC,CAAC;IAChB,YAAY,GAAG,CAAC,CAAC;IACzB,aAAa,GAAkB,IAAI,CAAC;IACpC,kEAAkE;IAClE,cAAc,GAAkB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../src/backend/llvm/blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { type IrExpr } from "../../ir/ir.js";
|
|
2
2
|
import type { LlvmEmitterContext, LlValue } from "./expr-context.js";
|
|
3
|
+
/** The value of a sequence whose statements are only throwing guards over
|
|
4
|
+
* scalar conditions: `if (cond) throw` with no else, where the throw is the
|
|
5
|
+
* runtime's coded Node error (a derived constructor's `this` before super()
|
|
6
|
+
* lowers to exactly this). Such guards read no reference and replace no
|
|
7
|
+
* owner, so the sequence can be read wherever its result can: the guards
|
|
8
|
+
* still run in place, and only the result is borrowed. Null otherwise. */
|
|
9
|
+
export declare function guardedValue(e: IrExpr): IrExpr | null;
|
|
3
10
|
/** The lowering of a scalar compound field assignment snapshots a receiver,
|
|
4
11
|
* the old field, the RHS and the result. Borrow that receiver only when the
|
|
5
12
|
* entire sequence cannot invalidate its owner. Preserve all snapshots and
|
|
@@ -1,10 +1,49 @@
|
|
|
1
1
|
import { isStableReceiverOperand } from "../../ir/analysis.js";
|
|
2
2
|
import { isRefCounted } from "../../ir/ir.js";
|
|
3
|
+
/** The value of a sequence whose statements are only throwing guards over
|
|
4
|
+
* scalar conditions: `if (cond) throw` with no else, where the throw is the
|
|
5
|
+
* runtime's coded Node error (a derived constructor's `this` before super()
|
|
6
|
+
* lowers to exactly this). Such guards read no reference and replace no
|
|
7
|
+
* owner, so the sequence can be read wherever its result can: the guards
|
|
8
|
+
* still run in place, and only the result is borrowed. Null otherwise. */
|
|
9
|
+
export function guardedValue(e) {
|
|
10
|
+
if (e.kind !== "seqExpr")
|
|
11
|
+
return null;
|
|
12
|
+
for (const s of e.stmts) {
|
|
13
|
+
if (s.kind !== "if" ||
|
|
14
|
+
s.else_ !== null ||
|
|
15
|
+
isRefCounted(s.cond.type) ||
|
|
16
|
+
!scalarGuardCondition(s.cond) ||
|
|
17
|
+
s.then.length !== 1)
|
|
18
|
+
return null;
|
|
19
|
+
const only = s.then[0];
|
|
20
|
+
if (only.kind !== "exprStmt" ||
|
|
21
|
+
only.expr.kind !== "libCall" ||
|
|
22
|
+
only.expr.fn !== "error.nodeThrow" ||
|
|
23
|
+
!only.expr.args.every((arg) => arg.kind === "numLit" || arg.kind === "strLit"))
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return e.result;
|
|
27
|
+
}
|
|
28
|
+
function scalarGuardCondition(e) {
|
|
29
|
+
switch (e.kind) {
|
|
30
|
+
case "boolLit":
|
|
31
|
+
case "varRef":
|
|
32
|
+
return !isRefCounted(e.type);
|
|
33
|
+
case "unary":
|
|
34
|
+
return scalarGuardCondition(e.operand);
|
|
35
|
+
default:
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
3
39
|
function stableProjection(host, e) {
|
|
4
40
|
switch (e.kind) {
|
|
5
41
|
case "varRef":
|
|
42
|
+
case "seqExpr":
|
|
6
43
|
return host.canBorrowReceiver(e);
|
|
7
44
|
case "unionNarrow":
|
|
45
|
+
case "downcast":
|
|
46
|
+
case "upcast":
|
|
8
47
|
return stableProjection(host, e.value);
|
|
9
48
|
case "fieldGet":
|
|
10
49
|
case "recordGet":
|