@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,48 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { NullableRefFields } from "./nullable-fields.js";
|
|
3
|
+
const loc = { file: "nullable.ts", start: 0, end: 0 };
|
|
4
|
+
const node = { kind: "object", className: "Node" };
|
|
5
|
+
const union = (id) => ({ kind: "union", unionId: id });
|
|
6
|
+
const unions = new Map([
|
|
7
|
+
["orNull", [{ kind: "nullT" }, node]],
|
|
8
|
+
["orUndefined", [node, { kind: "undefinedT" }]],
|
|
9
|
+
["both", [{ kind: "nullT" }, { kind: "undefinedT" }, node]],
|
|
10
|
+
["orNumber", [node, { kind: "f64" }]],
|
|
11
|
+
["runtimeArm", [{ kind: "nullT" }, { kind: "object", className: "%Error" }]],
|
|
12
|
+
["recordArm", [{ kind: "nullT" }, { kind: "record", shapeId: "r" }]],
|
|
13
|
+
].map(([id, arms]) => [id, { id, arms }]));
|
|
14
|
+
const cls = (name, fields, runtime = false) => ({
|
|
15
|
+
name,
|
|
16
|
+
loc,
|
|
17
|
+
fields: fields.map(([fieldName, type]) => ({ name: fieldName, type })),
|
|
18
|
+
...(runtime ? { runtime: true } : {}),
|
|
19
|
+
});
|
|
20
|
+
test("only one unit arm plus one emitted class arm uses pointer storage", () => {
|
|
21
|
+
const fields = new NullableRefFields([
|
|
22
|
+
cls("Node", [
|
|
23
|
+
["next", union("orNull")],
|
|
24
|
+
["prev", union("orUndefined")],
|
|
25
|
+
["both", union("both")],
|
|
26
|
+
["num", union("orNumber")],
|
|
27
|
+
["err", union("runtimeArm")],
|
|
28
|
+
["rec", union("recordArm")],
|
|
29
|
+
["plain", node],
|
|
30
|
+
["%hidden", union("orNull")],
|
|
31
|
+
]),
|
|
32
|
+
cls("%Error", [["next", union("orNull")]], true),
|
|
33
|
+
], unions);
|
|
34
|
+
expect(fields.get("Node", "next")).toEqual({
|
|
35
|
+
unionId: "orNull",
|
|
36
|
+
refTag: 1,
|
|
37
|
+
unitTag: 0,
|
|
38
|
+
arm: node,
|
|
39
|
+
});
|
|
40
|
+
expect(fields.get("Node", "prev")).toMatchObject({ refTag: 0, unitTag: 1 });
|
|
41
|
+
for (const field of ["both", "num", "err", "rec", "plain", "%hidden", "missing"])
|
|
42
|
+
expect(fields.get("Node", field)).toBeNull();
|
|
43
|
+
// Runtime classes keep their C layouts.
|
|
44
|
+
expect(fields.get("%Error", "next")).toBeNull();
|
|
45
|
+
expect(fields.storageType("Node", "next", union("orNull"))).toEqual(node);
|
|
46
|
+
expect(fields.storageType("Node", "num", union("orNumber"))).toEqual(union("orNumber"));
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=nullable-fields.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullable-fields.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/nullable-fields.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type IrClassDef, type IrModule, type IrType, type IrUnionDef } from "../../ir/ir.js";
|
|
2
|
+
/** A union of exactly one reference arm and one or two unit arms
|
|
3
|
+
* (`C | undefined`, `C | null`, `C | null | undefined`) whose VALUES are
|
|
4
|
+
* the reference pointer itself: NULL is the unit arm (`undefined` when both
|
|
5
|
+
* unit arms exist, where the module's immortal NULLABLE_NULL sentinel is
|
|
6
|
+
* `null`), anything else is the reference arm's instance. No union box
|
|
7
|
+
* ever exists for such a type: wraps move the payload, narrowing borrows
|
|
8
|
+
* it, retain/release/trace are the arm's NULL-tolerant entry points, and
|
|
9
|
+
* every container, field, capture, parameter, and return slot holds the
|
|
10
|
+
* plain pointer. Every other union keeps the tagged `%ScrUnion` box. */
|
|
11
|
+
export interface NullableUnion {
|
|
12
|
+
unionId: string;
|
|
13
|
+
refTag: number;
|
|
14
|
+
/** The unit arm NULL encodes. */
|
|
15
|
+
unitTag: number;
|
|
16
|
+
/** The `null` arm of a two-unit-arm union, encoded by NULLABLE_NULL;
|
|
17
|
+
* -1 when the union has one unit arm. */
|
|
18
|
+
nullTag: number;
|
|
19
|
+
arm: NullableRefArm;
|
|
20
|
+
}
|
|
21
|
+
/** The module-scope immortal sentinel standing for `null` in a
|
|
22
|
+
* `C | null | undefined` union (NULL is `undefined` there). */
|
|
23
|
+
export declare const NULLABLE_NULL = "@sc_nullable_null";
|
|
24
|
+
/** The module-scope immortal sentinel standing for the ABSENT state of a
|
|
25
|
+
* nullable union's record field slot (an omitted optional property). */
|
|
26
|
+
export declare const NULLABLE_ABSENT = "@sc_nullable_absent";
|
|
27
|
+
/** The reference arms whose instances are never NULL. Class and record
|
|
28
|
+
* entry points all tolerate NULL; strings, arrays, maps and sets retain
|
|
29
|
+
* through a NULL-skipping wrapper (shapes.ts). Object arms are always truthy and compare by
|
|
30
|
+
* identity; string arms are truthy when non-empty and compare bytes. */
|
|
31
|
+
export type NullableRefArm = {
|
|
32
|
+
kind: "object";
|
|
33
|
+
className: string;
|
|
34
|
+
} | {
|
|
35
|
+
kind: "record";
|
|
36
|
+
shapeId: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: "string";
|
|
39
|
+
} | (IrType & {
|
|
40
|
+
kind: "array" | "map" | "set";
|
|
41
|
+
});
|
|
42
|
+
/** The arm is a JS object: always truthy, compared by identity. */
|
|
43
|
+
export declare function isObjectArm(nullable: NullableUnion): boolean;
|
|
44
|
+
/** The representation decision for every union of one module. It is a
|
|
45
|
+
* pure function of the module, so serialized-IR and in-memory emission
|
|
46
|
+
* agree. */
|
|
47
|
+
export declare class NullableUnions {
|
|
48
|
+
private readonly byId;
|
|
49
|
+
/** NULL-skipping retain wrappers requested so far: symbol → inner retain
|
|
50
|
+
* call target. The emitter defines each once. */
|
|
51
|
+
readonly retainWrappers: Map<string, string>;
|
|
52
|
+
/** Some nullable union encodes `null` with NULLABLE_NULL. */
|
|
53
|
+
readonly usesNullSentinel: boolean;
|
|
54
|
+
constructor(mod: IrModule);
|
|
55
|
+
get(unionId: string): NullableUnion | null;
|
|
56
|
+
of(type: IrType): NullableUnion | null;
|
|
57
|
+
has(unionId: string): boolean;
|
|
58
|
+
get size(): number;
|
|
59
|
+
/** The reference arm of every nullable union, by union id. */
|
|
60
|
+
armTypes(): Map<string, IrType>;
|
|
61
|
+
/** The union table restricted to tagged-box unions: the stack-box
|
|
62
|
+
* optimizations (stack wraps, stack map/array reads, local union storage)
|
|
63
|
+
* only apply to boxes. */
|
|
64
|
+
boxedUnions(unions: ReadonlyMap<string, IrUnionDef>): Map<string, IrUnionDef>;
|
|
65
|
+
}
|
|
66
|
+
/** Emitted classes keyed by name, for callers that only hold the class
|
|
67
|
+
* list (nullable class fields). */
|
|
68
|
+
export declare function emittedClassNames(classes: readonly IrClassDef[]): Set<string>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { isUnitType, } from "../../ir/ir.js";
|
|
2
|
+
import { everyModuleNode } from "../../ir/traverse.js";
|
|
3
|
+
/** The module-scope immortal sentinel standing for `null` in a
|
|
4
|
+
* `C | null | undefined` union (NULL is `undefined` there). */
|
|
5
|
+
export const NULLABLE_NULL = "@sc_nullable_null";
|
|
6
|
+
/** The module-scope immortal sentinel standing for the ABSENT state of a
|
|
7
|
+
* nullable union's record field slot (an omitted optional property). */
|
|
8
|
+
export const NULLABLE_ABSENT = "@sc_nullable_absent";
|
|
9
|
+
/** The arm is a JS object: always truthy, compared by identity. */
|
|
10
|
+
export function isObjectArm(nullable) {
|
|
11
|
+
return nullable.arm.kind !== "string";
|
|
12
|
+
}
|
|
13
|
+
/** The representation decision for every union of one module. It is a
|
|
14
|
+
* pure function of the module, so serialized-IR and in-memory emission
|
|
15
|
+
* agree. */
|
|
16
|
+
export class NullableUnions {
|
|
17
|
+
byId = new Map();
|
|
18
|
+
/** NULL-skipping retain wrappers requested so far: symbol → inner retain
|
|
19
|
+
* call target. The emitter defines each once. */
|
|
20
|
+
retainWrappers = new Map();
|
|
21
|
+
/** Some nullable union encodes `null` with NULLABLE_NULL. */
|
|
22
|
+
usesNullSentinel = false;
|
|
23
|
+
constructor(mod) {
|
|
24
|
+
const emitted = new Set();
|
|
25
|
+
for (const cls of mod.classes ?? [])
|
|
26
|
+
if (!cls.runtime)
|
|
27
|
+
emitted.add(cls.name);
|
|
28
|
+
const records = new Set();
|
|
29
|
+
for (const shape of mod.records ?? [])
|
|
30
|
+
records.add(shape.id);
|
|
31
|
+
const boxed = boxedUnionIds(mod);
|
|
32
|
+
for (const def of mod.unions ?? []) {
|
|
33
|
+
if (boxed.has(def.id))
|
|
34
|
+
continue;
|
|
35
|
+
const nullable = nullableShape(def, emitted, records);
|
|
36
|
+
if (!nullable)
|
|
37
|
+
continue;
|
|
38
|
+
this.byId.set(def.id, nullable);
|
|
39
|
+
if (nullable.nullTag >= 0)
|
|
40
|
+
this.usesNullSentinel = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
get(unionId) {
|
|
44
|
+
return this.byId.get(unionId) ?? null;
|
|
45
|
+
}
|
|
46
|
+
of(type) {
|
|
47
|
+
return type.kind === "union" ? this.get(type.unionId) : null;
|
|
48
|
+
}
|
|
49
|
+
has(unionId) {
|
|
50
|
+
return this.byId.has(unionId);
|
|
51
|
+
}
|
|
52
|
+
get size() {
|
|
53
|
+
return this.byId.size;
|
|
54
|
+
}
|
|
55
|
+
/** The reference arm of every nullable union, by union id. */
|
|
56
|
+
armTypes() {
|
|
57
|
+
const result = new Map();
|
|
58
|
+
for (const [id, nullable] of this.byId)
|
|
59
|
+
result.set(id, nullable.arm);
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/** The union table restricted to tagged-box unions: the stack-box
|
|
63
|
+
* optimizations (stack wraps, stack map/array reads, local union storage)
|
|
64
|
+
* only apply to boxes. */
|
|
65
|
+
boxedUnions(unions) {
|
|
66
|
+
const result = new Map();
|
|
67
|
+
for (const [id, def] of unions)
|
|
68
|
+
if (!this.byId.has(id))
|
|
69
|
+
result.set(id, def);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function nullableShape(def, emittedClasses, records) {
|
|
74
|
+
const units = def.arms.filter(isUnitType).length;
|
|
75
|
+
if (units < 1 || units > 2 || def.arms.length !== units + 1)
|
|
76
|
+
return null;
|
|
77
|
+
const refTag = def.arms.findIndex((arm) => !isUnitType(arm));
|
|
78
|
+
let unitTag, nullTag;
|
|
79
|
+
if (units === 1) {
|
|
80
|
+
unitTag = def.arms.findIndex(isUnitType);
|
|
81
|
+
nullTag = -1;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
unitTag = def.arms.findIndex((arm) => arm.kind === "undefinedT");
|
|
85
|
+
nullTag = def.arms.findIndex((arm) => arm.kind === "nullT");
|
|
86
|
+
if (unitTag < 0 || nullTag < 0)
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const arm = def.arms[refTag];
|
|
90
|
+
const base = { unionId: def.id, refTag, unitTag, nullTag };
|
|
91
|
+
if (arm.kind === "object" && emittedClasses.has(arm.className))
|
|
92
|
+
return { ...base, arm: { kind: "object", className: arm.className } };
|
|
93
|
+
if (arm.kind === "record" && records.has(arm.shapeId))
|
|
94
|
+
return { ...base, arm: { kind: "record", shapeId: arm.shapeId } };
|
|
95
|
+
if (arm.kind === "string")
|
|
96
|
+
return { ...base, arm: { kind: "string" } };
|
|
97
|
+
if (arm.kind === "array" || arm.kind === "map" || arm.kind === "set")
|
|
98
|
+
return { ...base, arm };
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
/** Unions the runtime itself inspects as tagged boxes keep that
|
|
102
|
+
* representation: Map keys and Set elements hash and compare union keys by
|
|
103
|
+
* tag and payload inside the C map. */
|
|
104
|
+
function boxedUnionIds(mod) {
|
|
105
|
+
const boxed = new Set();
|
|
106
|
+
const mark = (t) => {
|
|
107
|
+
if (t.kind === "union")
|
|
108
|
+
boxed.add(t.unionId);
|
|
109
|
+
};
|
|
110
|
+
everyModuleNode(mod, {
|
|
111
|
+
expr: () => true,
|
|
112
|
+
stmt: () => true,
|
|
113
|
+
type: (t) => {
|
|
114
|
+
if (t.kind === "map")
|
|
115
|
+
mark(t.key);
|
|
116
|
+
else if (t.kind === "set")
|
|
117
|
+
mark(t.elem);
|
|
118
|
+
return true;
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
return boxed;
|
|
122
|
+
}
|
|
123
|
+
/** Emitted classes keyed by name, for callers that only hold the class
|
|
124
|
+
* list (nullable class fields). */
|
|
125
|
+
export function emittedClassNames(classes) {
|
|
126
|
+
const names = new Set();
|
|
127
|
+
for (const cls of classes)
|
|
128
|
+
if (!cls.runtime)
|
|
129
|
+
names.add(cls.name);
|
|
130
|
+
return names;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=nullable-unions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullable-unions.js","sourceRoot":"","sources":["../../../src/backend/llvm/nullable-unions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { IrClassDef, IrRecordShape, IrType, IrUnionDef, SrcLoc } from "../../ir/ir.js";
|
|
2
|
+
export interface PublishHost {
|
|
3
|
+
declare(decl: string): void;
|
|
4
|
+
/** An interned NUL-terminated constant. */
|
|
5
|
+
cstr(text: string): string;
|
|
6
|
+
readonly sizeType: "i32" | "i64";
|
|
7
|
+
readonly tracedShapes: ReadonlySet<string>;
|
|
8
|
+
readonly unionsById: ReadonlyMap<string, IrUnionDef>;
|
|
9
|
+
readonly recordsById: ReadonlyMap<string, IrRecordShape>;
|
|
10
|
+
/** The nullable-pointer representation of a union, when it has one. */
|
|
11
|
+
nullableArm(t: IrType): IrType | null;
|
|
12
|
+
/** Class layout: hierarchy membership, preorder interval, field slots
|
|
13
|
+
* (with their storage types), runtime roots. */
|
|
14
|
+
classInfo(className: string): PublishClassInfo;
|
|
15
|
+
/** Every class whose preorder number lies in [pre, post]. */
|
|
16
|
+
classesInInterval(pre: number, post: number): string[];
|
|
17
|
+
}
|
|
18
|
+
export interface PublishClassInfo {
|
|
19
|
+
def: IrClassDef;
|
|
20
|
+
hierarchy: boolean;
|
|
21
|
+
pre: number;
|
|
22
|
+
post: number;
|
|
23
|
+
/** A runtime-provided root class (errors, emitters, streams). */
|
|
24
|
+
runtimeRooted: boolean;
|
|
25
|
+
/** The class's own and inherited fields: GEP index and storage type. */
|
|
26
|
+
fields: {
|
|
27
|
+
name: string;
|
|
28
|
+
index: number;
|
|
29
|
+
type: IrType;
|
|
30
|
+
}[];
|
|
31
|
+
}
|
|
32
|
+
export declare class PublishWalkers {
|
|
33
|
+
private readonly host;
|
|
34
|
+
private readonly walkers;
|
|
35
|
+
private readonly defsOut;
|
|
36
|
+
private counter;
|
|
37
|
+
constructor(host: PublishHost);
|
|
38
|
+
/** The definitions emitted so far (module-level LLVM text). */
|
|
39
|
+
defs(): string[];
|
|
40
|
+
/** Lines publishing the value `v` (an LLVM ptr of static type `t`), or
|
|
41
|
+
* none for types that hold no references. */
|
|
42
|
+
emitPublish(v: string, t: IrType, loc: SrcLoc): string[];
|
|
43
|
+
/** The walker symbol for values of type `t` (null: nothing to walk). */
|
|
44
|
+
walker(t: IrType, path: string, loc: SrcLoc): string | null;
|
|
45
|
+
private readonly refusals;
|
|
46
|
+
/** A walker that refuses the publish when a value is actually present:
|
|
47
|
+
* the Node.js implementation's TypeError, plus the static path for
|
|
48
|
+
* SCRIPTC_PUBLISH_TRACE. */
|
|
49
|
+
private refusal;
|
|
50
|
+
private declareRuntime;
|
|
51
|
+
/** `define` lines for the walker `sym` of `t`. */
|
|
52
|
+
private body;
|
|
53
|
+
/** A class walker: the class itself, or a dispatch over every class of
|
|
54
|
+
* its subtree when it belongs to a hierarchy. */
|
|
55
|
+
private classBody;
|
|
56
|
+
private concreteClassBody;
|
|
57
|
+
private objectBody;
|
|
58
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { mapOf, STRING, typeKey } from "../../ir/ir.js";
|
|
2
|
+
import { mangleClassStruct, mangleRecordStruct } from "../mangle.js";
|
|
3
|
+
import { FN_ATTRS } from "./shapes.js";
|
|
4
|
+
import { LlvmUnsupportedError } from "./unsupported.js";
|
|
5
|
+
/** scr_pub_mark's object kinds (SCR_PUB_KIND_* in scr_runtime.h), for the RC audit. */
|
|
6
|
+
const PUB_KIND_OBJECT = 4;
|
|
7
|
+
const PUB_KIND_UNION = 5;
|
|
8
|
+
const RUNTIME_WALKERS = {
|
|
9
|
+
string: "@scr_pub_str_fn",
|
|
10
|
+
bigint: "@scr_pub_leaf_fn",
|
|
11
|
+
dyn: "@scr_pub_dyn_fn",
|
|
12
|
+
};
|
|
13
|
+
export class PublishWalkers {
|
|
14
|
+
host;
|
|
15
|
+
walkers = new Map();
|
|
16
|
+
defsOut = [];
|
|
17
|
+
counter = 0;
|
|
18
|
+
constructor(host) {
|
|
19
|
+
this.host = host;
|
|
20
|
+
}
|
|
21
|
+
/** The definitions emitted so far (module-level LLVM text). */
|
|
22
|
+
defs() {
|
|
23
|
+
return this.defsOut;
|
|
24
|
+
}
|
|
25
|
+
/** Lines publishing the value `v` (an LLVM ptr of static type `t`), or
|
|
26
|
+
* none for types that hold no references. */
|
|
27
|
+
emitPublish(v, t, loc) {
|
|
28
|
+
const root = this.host.nullableArm(t) ?? t;
|
|
29
|
+
if (scalarRefusal(root)) {
|
|
30
|
+
// A Date (or process stream) is a scalar here, but Node.js refuses it.
|
|
31
|
+
this.host.declare(`declare void @scr_publish_refuse(ptr)`);
|
|
32
|
+
return [` call void @scr_publish_refuse(ptr ${this.host.cstr(refusalMessage(root))})`];
|
|
33
|
+
}
|
|
34
|
+
const fn = this.walker(t, "the published value", loc);
|
|
35
|
+
if (fn === null)
|
|
36
|
+
return [];
|
|
37
|
+
this.host.declare(`declare void @scr_publish(ptr, ptr)`);
|
|
38
|
+
return [` call void @scr_publish(ptr ${v}, ptr ${fn})`];
|
|
39
|
+
}
|
|
40
|
+
/** The walker symbol for values of type `t` (null: nothing to walk). */
|
|
41
|
+
walker(t, path, loc) {
|
|
42
|
+
const arm = this.host.nullableArm(t);
|
|
43
|
+
if (arm !== null)
|
|
44
|
+
return this.walker(arm, path, loc);
|
|
45
|
+
switch (t.kind) {
|
|
46
|
+
case "f64":
|
|
47
|
+
case "bool":
|
|
48
|
+
case "undefinedT":
|
|
49
|
+
case "nullT":
|
|
50
|
+
case "void":
|
|
51
|
+
return null;
|
|
52
|
+
case "string":
|
|
53
|
+
case "bigint":
|
|
54
|
+
case "dyn": {
|
|
55
|
+
const sym = RUNTIME_WALKERS[t.kind];
|
|
56
|
+
this.host.declare(`declare void ${sym}(ptr, ptr)`);
|
|
57
|
+
return sym;
|
|
58
|
+
}
|
|
59
|
+
case "object":
|
|
60
|
+
case "record":
|
|
61
|
+
case "array":
|
|
62
|
+
case "map":
|
|
63
|
+
case "set":
|
|
64
|
+
case "union":
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
return this.refusal(refusalMessage(t), `${typeKey(t)} at ${path}`);
|
|
68
|
+
}
|
|
69
|
+
const key = typeKey(t);
|
|
70
|
+
const known = this.walkers.get(key);
|
|
71
|
+
if (known !== undefined)
|
|
72
|
+
return known;
|
|
73
|
+
const sym = `@sc_pub_${this.counter++}`;
|
|
74
|
+
this.walkers.set(key, sym);
|
|
75
|
+
const body = this.body(t, sym, path, loc);
|
|
76
|
+
this.defsOut.push(...body, ``);
|
|
77
|
+
return sym;
|
|
78
|
+
}
|
|
79
|
+
refusals = new Map();
|
|
80
|
+
/** A walker that refuses the publish when a value is actually present:
|
|
81
|
+
* the Node.js implementation's TypeError, plus the static path for
|
|
82
|
+
* SCRIPTC_PUBLISH_TRACE. */
|
|
83
|
+
refusal(message, detail) {
|
|
84
|
+
const key = `${message}\0${detail}`;
|
|
85
|
+
const known = this.refusals.get(key);
|
|
86
|
+
if (known !== undefined)
|
|
87
|
+
return known;
|
|
88
|
+
const sym = `@sc_pub_${this.counter++}`;
|
|
89
|
+
this.refusals.set(key, sym);
|
|
90
|
+
this.host.declare(`declare void @scr_pub_refuse_at(ptr, ptr, ptr)`);
|
|
91
|
+
this.defsOut.push(`define internal void ${sym}(ptr %o, ptr %ctx) ${FN_ATTRS} { ; refuse ${llvmComment(detail)}`, `entry:`, ` call void @scr_pub_refuse_at(ptr %ctx, ptr ${this.host.cstr(message)}, ptr ${this.host.cstr(detail)})`, ` ret void`, `}`, ``);
|
|
92
|
+
return sym;
|
|
93
|
+
}
|
|
94
|
+
declareRuntime() {
|
|
95
|
+
this.host.declare(`declare zeroext i1 @scr_pub_mark(ptr, ptr, i1 zeroext, i32)`);
|
|
96
|
+
this.host.declare(`declare void @scr_pub_push(ptr, ptr, ptr)`);
|
|
97
|
+
}
|
|
98
|
+
/** `define` lines for the walker `sym` of `t`. */
|
|
99
|
+
body(t, sym, path, loc) {
|
|
100
|
+
this.declareRuntime();
|
|
101
|
+
const head = `define internal void ${sym}(ptr %o, ptr %ctx) ${FN_ATTRS} { ; publish ${llvmComment(typeKey(t))}`;
|
|
102
|
+
switch (t.kind) {
|
|
103
|
+
case "array": {
|
|
104
|
+
const elem = this.walker(t.elem, `${path}[element]`, loc);
|
|
105
|
+
if (scalarRefusal(t.elem))
|
|
106
|
+
throw new LlvmUnsupportedError(`publish of ${typeKey(t)}`, loc);
|
|
107
|
+
this.host.declare(`declare void @scr_pub_arr(ptr, ptr, ptr)`);
|
|
108
|
+
return [
|
|
109
|
+
head,
|
|
110
|
+
`entry:`,
|
|
111
|
+
` call void @scr_pub_arr(ptr %o, ptr %ctx, ptr ${elem ?? "null"})`,
|
|
112
|
+
` ret void`,
|
|
113
|
+
`}`,
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
case "map":
|
|
117
|
+
case "set": {
|
|
118
|
+
const keyType = t.kind === "map" ? t.key : t.elem;
|
|
119
|
+
const k = this.walker(keyType, `${path}[key]`, loc);
|
|
120
|
+
const v = t.kind === "map" ? this.walker(t.value, `${path}[value]`, loc) : null;
|
|
121
|
+
if (scalarRefusal(keyType) || (t.kind === "map" && scalarRefusal(t.value)))
|
|
122
|
+
throw new LlvmUnsupportedError(`publish of ${typeKey(t)}`, loc);
|
|
123
|
+
this.host.declare(`declare void @scr_pub_map(ptr, ptr, ptr, ptr)`);
|
|
124
|
+
return [
|
|
125
|
+
head,
|
|
126
|
+
`entry:`,
|
|
127
|
+
` call void @scr_pub_map(ptr %o, ptr %ctx, ptr ${k ?? "null"}, ptr ${v ?? "null"})`,
|
|
128
|
+
` ret void`,
|
|
129
|
+
`}`,
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
case "union": {
|
|
133
|
+
const def = this.host.unionsById.get(t.unionId);
|
|
134
|
+
if (!def)
|
|
135
|
+
throw new LlvmUnsupportedError(`publish of an unknown union ${t.unionId}`, loc);
|
|
136
|
+
const arms = def.arms.map((arm, tag) => ({
|
|
137
|
+
tag,
|
|
138
|
+
fn: this.walker(arm, `${path} (as ${typeKey(arm)})`, loc),
|
|
139
|
+
}));
|
|
140
|
+
// Union arms are boxed pointers or plain scalars; a date arm would
|
|
141
|
+
// hold time-value bits that no walker may push.
|
|
142
|
+
if (def.arms.some((arm) => scalarRefusal(arm)))
|
|
143
|
+
throw new LlvmUnsupportedError(`publish of ${typeKey(t)}`, loc);
|
|
144
|
+
const live = arms.filter((a) => a.fn !== null);
|
|
145
|
+
const lines = [
|
|
146
|
+
head,
|
|
147
|
+
`entry:`,
|
|
148
|
+
// Union boxes always carry a collector header (scr_union_release).
|
|
149
|
+
` %m = call zeroext i1 @scr_pub_mark(ptr %ctx, ptr %o, i1 true, i32 ${PUB_KIND_UNION})`,
|
|
150
|
+
` br i1 %m, label %walk, label %done`,
|
|
151
|
+
`walk:`,
|
|
152
|
+
];
|
|
153
|
+
if (live.length === 0)
|
|
154
|
+
lines.push(` br label %done`);
|
|
155
|
+
else {
|
|
156
|
+
lines.push(` %tagp = getelementptr inbounds %ScrUnion, ptr %o, i64 0, i32 1`, ` %tag = load i32, ptr %tagp`, ` %slotp = getelementptr inbounds %ScrUnion, ptr %o, i64 0, i32 5`, ` %slot = load ptr, ptr %slotp`, ` switch i32 %tag, label %done [ ${live.map((a) => `i32 ${a.tag}, label %arm${a.tag}`).join(" ")} ]`);
|
|
157
|
+
for (const a of live)
|
|
158
|
+
lines.push(`arm${a.tag}:`, ` call void @scr_pub_push(ptr %ctx, ptr %slot, ptr ${a.fn})`, ` br label %done`);
|
|
159
|
+
}
|
|
160
|
+
lines.push(`done:`, ` ret void`, `}`);
|
|
161
|
+
return lines;
|
|
162
|
+
}
|
|
163
|
+
case "record": {
|
|
164
|
+
const shape = this.host.recordsById.get(t.shapeId);
|
|
165
|
+
if (!shape)
|
|
166
|
+
throw new LlvmUnsupportedError(`publish of an unknown record ${t.shapeId}`, loc);
|
|
167
|
+
const members = [
|
|
168
|
+
...shape.fields.map((f, i) => ({ name: f.name, index: i + 1, type: f.type })),
|
|
169
|
+
...(shape.indexValue
|
|
170
|
+
? [
|
|
171
|
+
{
|
|
172
|
+
name: "[key: string]",
|
|
173
|
+
index: shape.fields.length + 1,
|
|
174
|
+
type: mapOf(STRING, shape.indexValue),
|
|
175
|
+
},
|
|
176
|
+
]
|
|
177
|
+
: []),
|
|
178
|
+
];
|
|
179
|
+
return this.objectBody(head, mangleRecordStruct(shape.id), this.host.tracedShapes.has(`record:${shape.id}`), members, path, loc);
|
|
180
|
+
}
|
|
181
|
+
case "object":
|
|
182
|
+
return this.classBody(t.className, head, path, loc);
|
|
183
|
+
default:
|
|
184
|
+
throw new LlvmUnsupportedError(`publish of ${typeKey(t)}`, loc);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** A class walker: the class itself, or a dispatch over every class of
|
|
188
|
+
* its subtree when it belongs to a hierarchy. */
|
|
189
|
+
classBody(className, head, path, loc) {
|
|
190
|
+
const info = this.host.classInfo(className);
|
|
191
|
+
if (!info.hierarchy)
|
|
192
|
+
return this.concreteClassBody(info, head, path, loc);
|
|
193
|
+
const members = this.host.classesInInterval(info.pre, info.post);
|
|
194
|
+
const cases = members.map((name) => {
|
|
195
|
+
const sub = this.host.classInfo(name);
|
|
196
|
+
const sym = `@sc_pub_${this.counter++}`;
|
|
197
|
+
const subHead = `define internal void ${sym}(ptr %o, ptr %ctx) ${FN_ATTRS} { ; publish class ${llvmComment(name)}`;
|
|
198
|
+
this.defsOut.push(...this.concreteClassBody(sub, subHead, `${path} (a ${name})`, loc), ``);
|
|
199
|
+
return { pre: sub.pre, sym, name };
|
|
200
|
+
});
|
|
201
|
+
const lines = [
|
|
202
|
+
head,
|
|
203
|
+
`entry:`,
|
|
204
|
+
` %vtp = getelementptr inbounds ptr, ptr %o, i64 1`,
|
|
205
|
+
` %vt = load ptr, ptr %vtp`,
|
|
206
|
+
` %pre = load ${this.host.sizeType}, ptr %vt`,
|
|
207
|
+
` switch ${this.host.sizeType} %pre, label %other [ ${cases.map((c) => `${this.host.sizeType} ${c.pre}, label %c${c.pre}`).join(" ")} ]`,
|
|
208
|
+
];
|
|
209
|
+
for (const c of cases)
|
|
210
|
+
lines.push(`c${c.pre}: ; ${llvmComment(c.name)}`, ` call void ${c.sym}(ptr %o, ptr %ctx)`, ` ret void`);
|
|
211
|
+
lines.push(`other:`, ` unreachable`, `}`);
|
|
212
|
+
return lines;
|
|
213
|
+
}
|
|
214
|
+
concreteClassBody(info, head, path, loc) {
|
|
215
|
+
if (info.runtimeRooted) {
|
|
216
|
+
const refuse = this.refusal(info.def.name === "%Error" || info.def.base !== undefined
|
|
217
|
+
? "Cannot publish a Error object"
|
|
218
|
+
: "Cannot publish this value", `${info.def.name} at ${path}`);
|
|
219
|
+
return [head, `entry:`, ` call void ${refuse}(ptr %o, ptr %ctx)`, ` ret void`, `}`];
|
|
220
|
+
}
|
|
221
|
+
return this.objectBody(head, mangleClassStruct(info.def.name), this.host.tracedShapes.has(`object:${info.def.name}`), info.fields, path, loc);
|
|
222
|
+
}
|
|
223
|
+
objectBody(head, struct, traced, members, path, loc) {
|
|
224
|
+
const lines = [
|
|
225
|
+
head,
|
|
226
|
+
`entry:`,
|
|
227
|
+
` %m = call zeroext i1 @scr_pub_mark(ptr %ctx, ptr %o, i1 ${traced ? "true" : "false"}, i32 ${PUB_KIND_OBJECT})`,
|
|
228
|
+
` br i1 %m, label %walk, label %done`,
|
|
229
|
+
`walk:`,
|
|
230
|
+
];
|
|
231
|
+
let n = 0;
|
|
232
|
+
for (const member of members) {
|
|
233
|
+
const fn = this.walker(member.type, `${path}.${member.name}`, loc);
|
|
234
|
+
if (fn === null)
|
|
235
|
+
continue;
|
|
236
|
+
if (scalarRefusal(member.type)) {
|
|
237
|
+
// A scalar field (a date) always holds a value: refuse.
|
|
238
|
+
lines.push(` call void ${fn}(ptr null, ptr %ctx) ; ${llvmComment(member.name)}`);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
lines.push(` %f${n} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${member.index}`, ` %v${n} = load ptr, ptr %f${n}`, ` call void @scr_pub_push(ptr %ctx, ptr %v${n}, ptr ${fn}) ; ${llvmComment(member.name)}`);
|
|
242
|
+
n++;
|
|
243
|
+
}
|
|
244
|
+
lines.push(` br label %done`, `done:`, ` ret void`, `}`);
|
|
245
|
+
return lines;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/** Unpublishable types stored as scalars (dates are time values, process
|
|
249
|
+
* streams file descriptors): no pointer to push, and always a value. */
|
|
250
|
+
function scalarRefusal(t) {
|
|
251
|
+
return t.kind === "date" || t.kind === "procStream";
|
|
252
|
+
}
|
|
253
|
+
/** The Node.js implementation's refusal for a value of type `t`. */
|
|
254
|
+
function refusalMessage(t) {
|
|
255
|
+
switch (t.kind) {
|
|
256
|
+
case "func":
|
|
257
|
+
return "Cannot publish a function";
|
|
258
|
+
case "symbol":
|
|
259
|
+
return "Cannot publish a symbol";
|
|
260
|
+
case "regex":
|
|
261
|
+
return "Cannot publish a RegExp object";
|
|
262
|
+
case "date":
|
|
263
|
+
return "Cannot publish a Date object";
|
|
264
|
+
case "promise":
|
|
265
|
+
return "Cannot publish a Promise object";
|
|
266
|
+
case "bytes":
|
|
267
|
+
return `Cannot publish a ${BYTES_NAMES[t.elem] ?? "Uint8Array"} object`;
|
|
268
|
+
default:
|
|
269
|
+
return "Cannot publish this value";
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const BYTES_NAMES = {
|
|
273
|
+
u8: "Uint8Array",
|
|
274
|
+
u8c: "Uint8ClampedArray",
|
|
275
|
+
i8: "Int8Array",
|
|
276
|
+
u16: "Uint16Array",
|
|
277
|
+
i16: "Int16Array",
|
|
278
|
+
u32: "Uint32Array",
|
|
279
|
+
i32: "Int32Array",
|
|
280
|
+
f32: "Float32Array",
|
|
281
|
+
f64: "Float64Array",
|
|
282
|
+
};
|
|
283
|
+
function llvmComment(text) {
|
|
284
|
+
return text.replace(/[\r\n]/g, " ");
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/backend/llvm/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IrFunction, IrType } from "../../ir/ir.js";
|
|
2
|
+
/** Parameters that keep the borrowed calling convention although the body
|
|
3
|
+
* rebinds them (`source = (source as LiteralType).regularType`). The
|
|
4
|
+
* incoming value stays the caller's borrow; every value the body assigns is
|
|
5
|
+
* owned through a separate owner slot, which each rebinding releases and
|
|
6
|
+
* replaces and which the function scope releases on every exit. Reads see
|
|
7
|
+
* the parameter slot, so whole-value uses retain as for any binding.
|
|
8
|
+
*
|
|
9
|
+
* Only plain statement assignments qualify: expression-position writes,
|
|
10
|
+
* loop and catch bindings, declarations and captures keep the ordinary
|
|
11
|
+
* owned parameter. Suspending bodies and environments use the owned ABI. */
|
|
12
|
+
export declare function findReboundParameters(fn: IrFunction, plainReference: (type: IrType) => boolean, excluded: ReadonlySet<string>): ReadonlySet<string>;
|