@scriptc/compiler 0.2.5 → 0.2.7
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 +62 -48
- 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/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +4 -1
- package/dist/backend/link-plan-core.js +16 -3
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +3 -1
- package/dist/backend/link-plan.js +3 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +40 -0
- package/dist/backend/llvm/alloc.js +205 -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/byte-numbers.js +32 -4
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/byte-windows.d.ts +31 -0
- package/dist/backend/llvm/byte-windows.js +334 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -0
- package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
- package/dist/backend/llvm/byte-windows.test.js +244 -0
- package/dist/backend/llvm/byte-windows.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +17 -5
- package/dist/backend/llvm/call-lifetimes.js +58 -24
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +170 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +18 -2
- package/dist/backend/llvm/classes.js +115 -41
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.d.ts +1 -0
- package/dist/backend/llvm/classes.test.js +132 -0
- package/dist/backend/llvm/classes.test.js.map +1 -0
- 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 +27 -0
- package/dist/backend/llvm/constant-callbacks.js +450 -0
- package/dist/backend/llvm/constant-callbacks.js.map +1 -0
- package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
- package/dist/backend/llvm/constant-callbacks.test.js +261 -0
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
- 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 +149 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +35 -1
- package/dist/backend/llvm/dyn.js +196 -35
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +143 -4
- package/dist/backend/llvm/emitter.js +882 -136
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +82 -14
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +58 -4
- 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.js +11 -0
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +151 -25
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +37 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +92 -2
- 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 +210 -28
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +58 -23
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.js +3 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +59 -2
- 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/integer-remainder.d.ts +18 -0
- package/dist/backend/llvm/integer-remainder.js +117 -0
- package/dist/backend/llvm/integer-remainder.js.map +1 -0
- package/dist/backend/llvm/layouts.d.ts +2 -1
- package/dist/backend/llvm/layouts.js +4 -3
- 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 +7 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +7 -22
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +3 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +15 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +13 -3
- package/dist/backend/llvm/local-array-reads.js +159 -77
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +105 -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 +48 -6
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +91 -4
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
- package/dist/backend/llvm/loop-array-borrows.js +70 -0
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
- package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
- package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
- package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
- package/dist/backend/llvm/map-read-lifetimes.js +20 -5
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +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/reference-effects.d.ts +2 -1
- package/dist/backend/llvm/reference-effects.js +7 -0
- package/dist/backend/llvm/reference-effects.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 +73 -3
- package/dist/backend/llvm/shapes.js +281 -34
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +114 -5
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.d.ts +48 -0
- package/dist/backend/llvm/split-loops.js +183 -0
- package/dist/backend/llvm/split-loops.js.map +1 -0
- package/dist/backend/llvm/split.js +0 -7
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +66 -2
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
- package/dist/backend/llvm/stack-callbacks.js +72 -0
- package/dist/backend/llvm/stack-callbacks.js.map +1 -0
- package/dist/backend/llvm/stack-captures.d.ts +27 -0
- package/dist/backend/llvm/stack-captures.js +152 -0
- package/dist/backend/llvm/stack-captures.js.map +1 -0
- package/dist/backend/llvm/stack-unions.test.js +38 -1
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-key-hash.d.ts +8 -0
- package/dist/backend/llvm/string-key-hash.js +59 -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 +34 -0
- package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +48 -7
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +20 -0
- package/dist/backend/llvm/string-slices.js +87 -0
- package/dist/backend/llvm/string-slices.js.map +1 -0
- package/dist/backend/llvm/string-slices.test.d.ts +1 -0
- package/dist/backend/llvm/string-slices.test.js +98 -0
- package/dist/backend/llvm/string-slices.test.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 +2 -2
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +4 -14
- package/dist/backend/llvm/walkers.js +53 -311
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +4 -1
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +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 +5 -2
- package/dist/backend/native/contracts.js.map +1 -1
- package/dist/backend/native/executable.js +12 -4
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +3 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +7 -0
- package/dist/backend/native-codegen-core.js +21 -0
- 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 +38 -18
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +70 -2
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -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 +6 -2
- package/dist/backend/native-tools.js +6 -5
- 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/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +16 -4
- package/dist/backend/runtime-pack-core.js +31 -13
- 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 +41 -4
- package/dist/backend/runtime-pack-targets.test.js.map +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 +125 -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 +5 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +2 -1
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +5 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +5 -2
- package/dist/diagnostics/diagnostic.js +10 -8
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -2
- package/dist/executable/executable-cache.js +8 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +35 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/fork-target.d.ts +5 -0
- package/dist/frontend/fork-target.js +40 -8
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.d.ts +1 -0
- package/dist/frontend/fork-target.test.js +59 -0
- package/dist/frontend/fork-target.test.js.map +1 -0
- 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 +23 -0
- package/dist/frontend/lowering/array-values.js +129 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.d.ts +2 -11
- package/dist/frontend/lowering/builtins/atomics.js +64 -28
- package/dist/frontend/lowering/builtins/atomics.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/filesystem-calls.d.ts +3 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +51 -4
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +6 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +6 -17
- package/dist/frontend/lowering/builtins/process.js +56 -29
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
- package/dist/frontend/lowering/builtins/workers.js +65 -0
- package/dist/frontend/lowering/builtins/workers.js.map +1 -0
- 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 +11 -0
- package/dist/frontend/lowering/class-assertions.js +104 -0
- package/dist/frontend/lowering/class-assertions.js.map +1 -0
- 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 +4 -1
- 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-protocols.d.ts +17 -0
- package/dist/frontend/lowering/class-protocols.js +126 -0
- package/dist/frontend/lowering/class-protocols.js.map +1 -0
- 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/structural.js +9 -6
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- 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/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 +8 -12
- package/dist/frontend/lowering/containers/array-callbacks.js +415 -136
- 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 +95 -3
- 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 +43 -132
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +12 -34
- package/dist/frontend/lowering/containers/bytes.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 +22 -3
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
- package/dist/frontend/lowering/cycle-initialization.js +277 -0
- package/dist/frontend/lowering/cycle-initialization.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 +140 -38
- 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/generic-functions.d.ts +2 -5
- package/dist/frontend/lowering/generic-functions.js +13 -10
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
- package/dist/frontend/lowering/instantiation-path.js +10 -0
- package/dist/frontend/lowering/instantiation-path.js.map +1 -0
- package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
- package/dist/frontend/lowering/instantiation-path.test.js +23 -0
- package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
- 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 +12 -7
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +3 -3
- package/dist/frontend/lowering/lower-calls.js +198 -124
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +7 -0
- package/dist/frontend/lowering/lower-classes.js +166 -96
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
- package/dist/frontend/lowering/lower-exprs.js +421 -167
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +1 -1
- package/dist/frontend/lowering/lower-functions.js +33 -20
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +26 -2
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +1 -1
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.js +54 -11
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +59 -69
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +1 -1
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +50 -1
- package/dist/frontend/lowering/lowerer.js +333 -26
- 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-provenance.d.ts +15 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js +40 -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/split-consumers.d.ts +7 -0
- package/dist/frontend/lowering/split-consumers.js +64 -0
- package/dist/frontend/lowering/split-consumers.js.map +1 -0
- 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/surfaces.d.ts +3 -4
- package/dist/frontend/lowering/surfaces.js +38 -7
- 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/module-source-candidates.d.ts +10 -0
- package/dist/frontend/module-source-candidates.js +40 -0
- package/dist/frontend/module-source-candidates.js.map +1 -0
- package/dist/frontend/module-source-candidates.test.d.ts +1 -0
- package/dist/frontend/module-source-candidates.test.js +53 -0
- package/dist/frontend/module-source-candidates.test.js.map +1 -0
- package/dist/frontend/pipeline.js +2 -2
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +2 -0
- package/dist/frontend/program-analysis.js +2 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +38 -2
- package/dist/frontend/program.js +457 -88
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +59 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/ts7/ast-node.js +6 -8
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +42 -1
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -0
- package/dist/frontend/ts7/ast-wire.js +28 -0
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +2 -1
- package/dist/frontend/ts7/ast.js +8 -4
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +8 -2
- package/dist/frontend/ts7/checker.js +41 -5
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +42 -0
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +26 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +29 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +4 -1
- package/dist/frontend/type-mapper.js +133 -16
- 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 +6 -0
- package/dist/frontend/worker-target.js +108 -0
- package/dist/frontend/worker-target.js.map +1 -0
- package/dist/frontend/worker-target.test.d.ts +1 -0
- package/dist/frontend/worker-target.test.js +71 -0
- package/dist/frontend/worker-target.test.js.map +1 -0
- package/dist/index.js +47 -14
- 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/builtin-effects.js +12 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +15 -15
- 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/ir.d.ts +85 -23
- package/dist/ir/ir.js +20 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/numeric-call-specialization.d.ts +8 -0
- package/dist/ir/numeric-call-specialization.js +198 -0
- package/dist/ir/numeric-call-specialization.js.map +1 -0
- package/dist/ir/runtime-features.js +4 -3
- package/dist/ir/runtime-features.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 +207 -43
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +356 -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/ir-policy.js +2 -0
- package/dist/library/ir-policy.js.map +1 -1
- 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/compiler.js +24 -11
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +7 -3
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/library.d.ts +2 -1
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +29 -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/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +37 -3
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { BOOL, F64, VOID, funcOf, } from "../../ir/ir.js";
|
|
3
|
+
import { analyzeCallLifetimes } from "./call-lifetimes.js";
|
|
4
|
+
import { AmbientReceiverReaders, callbackIgnoresReceiver, findConstantCallbacks, } from "./constant-callbacks.js";
|
|
5
|
+
const loc = { file: "callbacks.ts", start: 0, end: 0 };
|
|
6
|
+
const callback = funcOf([F64], BOOL);
|
|
7
|
+
const ref = (localId, type = callback) => ({ kind: "varRef", localId, type, loc });
|
|
8
|
+
const closure = (fnName) => ({
|
|
9
|
+
kind: "closure",
|
|
10
|
+
fnName,
|
|
11
|
+
captures: [],
|
|
12
|
+
type: callback,
|
|
13
|
+
loc,
|
|
14
|
+
});
|
|
15
|
+
function fixture() {
|
|
16
|
+
const predicate = {
|
|
17
|
+
name: "predicate",
|
|
18
|
+
params: [{ localId: "n", name: "n", type: F64 }],
|
|
19
|
+
locals: [{ id: "n", name: "n", type: F64, mutable: true }],
|
|
20
|
+
returnType: BOOL,
|
|
21
|
+
body: [{ kind: "return", value: { kind: "boolLit", value: true, type: BOOL, loc }, loc }],
|
|
22
|
+
loc,
|
|
23
|
+
};
|
|
24
|
+
const consumer = {
|
|
25
|
+
name: "consume",
|
|
26
|
+
ownsPrototype: true,
|
|
27
|
+
params: [{ localId: "test", name: "test", type: callback }],
|
|
28
|
+
locals: [{ id: "test", name: "test", type: callback, mutable: true }],
|
|
29
|
+
returnType: BOOL,
|
|
30
|
+
body: [
|
|
31
|
+
{
|
|
32
|
+
kind: "return",
|
|
33
|
+
value: {
|
|
34
|
+
kind: "callValue",
|
|
35
|
+
callee: ref("test"),
|
|
36
|
+
args: [{ kind: "numLit", value: 1, type: F64, loc }],
|
|
37
|
+
type: BOOL,
|
|
38
|
+
loc,
|
|
39
|
+
},
|
|
40
|
+
loc,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
loc,
|
|
44
|
+
};
|
|
45
|
+
const entry = {
|
|
46
|
+
name: "main",
|
|
47
|
+
params: [],
|
|
48
|
+
locals: [],
|
|
49
|
+
returnType: VOID,
|
|
50
|
+
body: [
|
|
51
|
+
{
|
|
52
|
+
kind: "exprStmt",
|
|
53
|
+
expr: { kind: "call", callee: "consume", args: [closure("predicate")], type: BOOL, loc },
|
|
54
|
+
loc,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
loc,
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
irVersion: 15,
|
|
61
|
+
sourceFile: loc.file,
|
|
62
|
+
entry: "main",
|
|
63
|
+
functions: [predicate, consumer, entry],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function facts(mod) {
|
|
67
|
+
return findConstantCallbacks(mod, analyzeCallLifetimes(new Map(mod.functions.map((fn) => [fn.name, fn]))));
|
|
68
|
+
}
|
|
69
|
+
test("a closed consumer with one target specializes its callback parameter", () => {
|
|
70
|
+
expect(facts(fixture()).get("consume")?.get("test")).toBe("predicate");
|
|
71
|
+
});
|
|
72
|
+
test.each(["multiple", "escape", "write", "metadata", "suspend", "synthetic"])("%s prevents incoming-call specialization", (reason) => {
|
|
73
|
+
const mod = fixture();
|
|
74
|
+
const consumer = mod.functions[1];
|
|
75
|
+
const entry = mod.functions[2];
|
|
76
|
+
if (reason === "multiple") {
|
|
77
|
+
mod.functions.push({ ...mod.functions[0], name: "other" });
|
|
78
|
+
entry.body.push({
|
|
79
|
+
kind: "exprStmt",
|
|
80
|
+
expr: { kind: "call", callee: "consume", args: [closure("other")], type: BOOL, loc },
|
|
81
|
+
loc,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (reason === "escape")
|
|
85
|
+
entry.body.push({
|
|
86
|
+
kind: "exprStmt",
|
|
87
|
+
expr: { ...closure("consume"), type: funcOf([callback], BOOL) },
|
|
88
|
+
loc,
|
|
89
|
+
});
|
|
90
|
+
if (reason === "write")
|
|
91
|
+
consumer.body.unshift({ kind: "assign", localId: "test", value: closure("predicate"), loc });
|
|
92
|
+
if (reason === "metadata")
|
|
93
|
+
mod.classes = [{ name: "Cell", fields: [], prototypeDataHelper: "consume", loc }];
|
|
94
|
+
if (reason === "suspend")
|
|
95
|
+
consumer.async = true;
|
|
96
|
+
if (reason === "synthetic")
|
|
97
|
+
delete consumer.ownsPrototype;
|
|
98
|
+
expect(facts(mod).get("consume")?.has("test")).not.toBe(true);
|
|
99
|
+
});
|
|
100
|
+
test("global closure aliases resolve without borrowing the caller's local namespace", () => {
|
|
101
|
+
const mod = fixture();
|
|
102
|
+
const entry = mod.functions[2];
|
|
103
|
+
mod.globals = [{ id: "%g.callback", name: "callback", type: callback, mutable: false }];
|
|
104
|
+
entry.locals = [{ id: "local", name: "local", type: callback, mutable: false }];
|
|
105
|
+
entry.body.unshift({ kind: "varDecl", localId: "local", init: closure("predicate"), loc }, { kind: "assign", localId: "%g.callback", value: ref("local"), loc });
|
|
106
|
+
const call = entry.body[2];
|
|
107
|
+
if (call.kind === "exprStmt" && call.expr.kind === "call")
|
|
108
|
+
call.expr.args = [ref("%g.callback")];
|
|
109
|
+
expect(facts(mod).get("consume")?.has("test")).not.toBe(true);
|
|
110
|
+
entry.body[1] = { kind: "assign", localId: "%g.callback", value: closure("predicate"), loc };
|
|
111
|
+
expect(facts(mod).get("consume")?.get("test")).toBe("predicate");
|
|
112
|
+
entry.body.push({ kind: "assign", localId: "%g.callback", value: closure("predicate"), loc });
|
|
113
|
+
expect(facts(mod).get("consume")?.has("test")).not.toBe(true);
|
|
114
|
+
});
|
|
115
|
+
test("receiver elision admits only synchronous receiver-free work", () => {
|
|
116
|
+
const fn = fixture().functions[0];
|
|
117
|
+
expect(callbackIgnoresReceiver(fn)).toBe(true);
|
|
118
|
+
// A fixed compile-fence throw cannot observe the receiver.
|
|
119
|
+
fn.body.unshift({ kind: "runtimeFence", code: "SC2020", message: "refused", loc });
|
|
120
|
+
expect(callbackIgnoresReceiver(fn)).toBe(true);
|
|
121
|
+
fn.body[0] = {
|
|
122
|
+
kind: "exprStmt",
|
|
123
|
+
expr: { kind: "libCall", fn: "dyn.this", args: [], type: { kind: "dyn" }, loc },
|
|
124
|
+
loc,
|
|
125
|
+
};
|
|
126
|
+
expect(callbackIgnoresReceiver(fn)).toBe(false);
|
|
127
|
+
fn.body.shift();
|
|
128
|
+
fn.async = true;
|
|
129
|
+
expect(callbackIgnoresReceiver(fn)).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
function callsOf(name, callee, extra = []) {
|
|
132
|
+
return {
|
|
133
|
+
name,
|
|
134
|
+
params: [],
|
|
135
|
+
locals: [],
|
|
136
|
+
returnType: VOID,
|
|
137
|
+
body: [
|
|
138
|
+
...extra,
|
|
139
|
+
{ kind: "exprStmt", expr: { kind: "call", callee, args: [], type: VOID, loc }, loc },
|
|
140
|
+
],
|
|
141
|
+
loc,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const thisRead = {
|
|
145
|
+
kind: "exprStmt",
|
|
146
|
+
expr: { kind: "libCall", fn: "dyn.this", args: [], type: { kind: "dyn" }, loc },
|
|
147
|
+
loc,
|
|
148
|
+
};
|
|
149
|
+
test("receiver readers propagate backwards through direct calls and recursion", () => {
|
|
150
|
+
const leaf = callsOf("leaf", "middle");
|
|
151
|
+
const middle = callsOf("middle", "leaf");
|
|
152
|
+
const functions = new Map([leaf, middle].map((fn) => [fn.name, fn]));
|
|
153
|
+
// A cycle with no reader is receiver-free.
|
|
154
|
+
expect(new AmbientReceiverReaders(functions).ignores(leaf)).toBe(true);
|
|
155
|
+
middle.body.unshift(thisRead);
|
|
156
|
+
const readers = new AmbientReceiverReaders(functions);
|
|
157
|
+
expect(readers.ignores(leaf)).toBe(false);
|
|
158
|
+
expect(readers.ignores(middle)).toBe(false);
|
|
159
|
+
// Unknown callees and async callees count as readers.
|
|
160
|
+
const unknown = callsOf("unknown", "missing");
|
|
161
|
+
expect(callbackIgnoresReceiver(unknown)).toBe(false);
|
|
162
|
+
const spawn = callsOf("spawn", "task");
|
|
163
|
+
const task = { ...callsOf("task", "spawn"), body: [], async: true };
|
|
164
|
+
expect(new AmbientReceiverReaders(new Map([spawn, task].map((fn) => [fn.name, fn]))).ignores(spawn)).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
test("virtual calls admit every same-named method", () => {
|
|
167
|
+
const call = {
|
|
168
|
+
kind: "exprStmt",
|
|
169
|
+
expr: { kind: "virtualCall", className: "%A", method: "run", args: [], type: VOID, loc },
|
|
170
|
+
loc,
|
|
171
|
+
};
|
|
172
|
+
const caller = { ...callsOf("caller", "x"), body: [call] };
|
|
173
|
+
const a = { ...callsOf("%A.run", "x"), body: [] };
|
|
174
|
+
const b = { ...callsOf("%B.run", "x"), body: [] };
|
|
175
|
+
const functions = new Map([caller, a, b].map((fn) => [fn.name, fn]));
|
|
176
|
+
expect(new AmbientReceiverReaders(functions).ignores(caller)).toBe(true);
|
|
177
|
+
b.body = [thisRead];
|
|
178
|
+
expect(new AmbientReceiverReaders(functions).ignores(caller)).toBe(false);
|
|
179
|
+
});
|
|
180
|
+
test("synthetic array HOF helpers are constant-callback consumers", () => {
|
|
181
|
+
const mod = fixture();
|
|
182
|
+
const consumer = mod.functions[1];
|
|
183
|
+
const entry = mod.functions[2];
|
|
184
|
+
delete consumer.ownsPrototype;
|
|
185
|
+
consumer.name = "%arr.some.0";
|
|
186
|
+
const call = entry.body[0];
|
|
187
|
+
if (call.kind === "exprStmt" && call.expr.kind === "call")
|
|
188
|
+
call.expr.callee = "%arr.some.0";
|
|
189
|
+
expect(facts(mod).get("%arr.some.0")?.get("test")).toBe("predicate");
|
|
190
|
+
});
|
|
191
|
+
function factory(name, returns) {
|
|
192
|
+
return {
|
|
193
|
+
name,
|
|
194
|
+
params: [],
|
|
195
|
+
locals: [],
|
|
196
|
+
returnType: callback,
|
|
197
|
+
body: returns.map((value) => ({
|
|
198
|
+
kind: "if",
|
|
199
|
+
cond: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
200
|
+
then: [{ kind: "return", value, loc }],
|
|
201
|
+
else_: null,
|
|
202
|
+
loc,
|
|
203
|
+
})),
|
|
204
|
+
loc,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
test("a factory returning one function resolves through its call", () => {
|
|
208
|
+
const mod = fixture();
|
|
209
|
+
const entry = mod.functions[2];
|
|
210
|
+
mod.functions.push(factory("make", [closure("predicate")]));
|
|
211
|
+
const call = entry.body[0];
|
|
212
|
+
if (call.kind === "exprStmt" && call.expr.kind === "call")
|
|
213
|
+
call.expr.args = [{ kind: "call", callee: "make", args: [], type: callback, loc }];
|
|
214
|
+
expect(facts(mod).get("consume")?.get("test")).toBe("predicate");
|
|
215
|
+
mod.functions.push({ ...mod.functions[0], name: "other" });
|
|
216
|
+
mod.functions[3] = factory("make", [closure("predicate"), closure("other")]);
|
|
217
|
+
expect(facts(mod).get("consume")?.has("test")).not.toBe(true);
|
|
218
|
+
});
|
|
219
|
+
test("an immutable capture resolves at its closure creation site", () => {
|
|
220
|
+
const mod = fixture();
|
|
221
|
+
const entry = mod.functions[2];
|
|
222
|
+
const lambda = {
|
|
223
|
+
name: "%lambda",
|
|
224
|
+
params: [],
|
|
225
|
+
captures: [{ localId: "cb", name: "cb", type: callback }],
|
|
226
|
+
locals: [{ id: "cb", name: "cb", type: callback, mutable: false, boxed: true }],
|
|
227
|
+
returnType: BOOL,
|
|
228
|
+
body: [
|
|
229
|
+
{
|
|
230
|
+
kind: "return",
|
|
231
|
+
value: {
|
|
232
|
+
kind: "callValue",
|
|
233
|
+
callee: ref("cb"),
|
|
234
|
+
args: [{ kind: "numLit", value: 1, type: F64, loc }],
|
|
235
|
+
type: BOOL,
|
|
236
|
+
loc,
|
|
237
|
+
},
|
|
238
|
+
loc,
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
loc,
|
|
242
|
+
};
|
|
243
|
+
mod.functions.push(lambda);
|
|
244
|
+
entry.locals = [{ id: "cb", name: "cb", type: callback, mutable: false, boxed: true }];
|
|
245
|
+
entry.body.push({ kind: "varDecl", localId: "cb", init: closure("predicate"), loc }, {
|
|
246
|
+
kind: "exprStmt",
|
|
247
|
+
expr: {
|
|
248
|
+
kind: "closure",
|
|
249
|
+
fnName: "%lambda",
|
|
250
|
+
captures: ["cb"],
|
|
251
|
+
type: funcOf([], BOOL),
|
|
252
|
+
loc,
|
|
253
|
+
},
|
|
254
|
+
loc,
|
|
255
|
+
});
|
|
256
|
+
expect(facts(mod).get("%lambda")?.get("cb")).toBe("predicate");
|
|
257
|
+
entry.locals[0].mutable = true;
|
|
258
|
+
lambda.locals[0].mutable = true;
|
|
259
|
+
expect(facts(mod).get("%lambda")?.has("cb")).not.toBe(true);
|
|
260
|
+
});
|
|
261
|
+
//# sourceMappingURL=constant-callbacks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant-callbacks.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/constant-callbacks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type IrExpr, type IrType } from "../../ir/ir.js";
|
|
2
|
+
import type { LlValue, LlvmEmitterContext } from "./expr-context.js";
|
|
3
|
+
export type ArrayAccess = "f64" | "bool" | "ref";
|
|
4
|
+
/** Strict element read with the runtime getter's result contract: a
|
|
5
|
+
* double, an i1, or a pointer that is +1 (`retain`) or borrowed. The
|
|
6
|
+
* runtime getter keeps the trap for holes, present undefined, and missing
|
|
7
|
+
* properties; it also answers sparse indices. Null reference slots take
|
|
8
|
+
* the runtime path, which returns them without a retain. */
|
|
9
|
+
export declare function emitDenseArrayGet(host: LlvmEmitterContext, array: string, index: LlValue, indexExpr: IrExpr | undefined, acc: ArrayAccess, element: IrType, getter: string, retain: boolean): string;
|
|
10
|
+
/** `scr_arr_get_number`: a numeric element, or NaN for every missing,
|
|
11
|
+
* hole, or present-undefined slot (answered by the runtime). */
|
|
12
|
+
export declare function emitDenseArrayNumber(host: LlvmEmitterContext, array: string, index: LlValue, indexExpr: IrExpr | undefined): string;
|
|
13
|
+
/** `scr_arr_state` (as a double) or `scr_arr_has` (as an i1). Dense
|
|
14
|
+
* in-range indices answer from the state byte; everything else keeps the
|
|
15
|
+
* runtime query, including canonical indices at or past the length. */
|
|
16
|
+
export declare function emitDenseArrayState(host: LlvmEmitterContext, array: string, index: LlValue, indexExpr: IrExpr | undefined, kind: "state" | "has"): string;
|
|
17
|
+
/** Element write with `scr_arr_set_*` semantics: the array takes the
|
|
18
|
+
* value's reference. A dense index stores the slot, marks it present, and
|
|
19
|
+
* extends the length when it lands at or past it; a replaced present
|
|
20
|
+
* reference is released after the new edge is published (a release can
|
|
21
|
+
* collect cycles). Every other index takes the unchanged runtime call. */
|
|
22
|
+
export declare function emitDenseArraySet(host: LlvmEmitterContext, array: string, index: LlValue, indexExpr: IrExpr | undefined, acc: ArrayAccess, element: IrType, value: string): void;
|
|
23
|
+
/** `scr_arr_push_*` (the array takes the value's reference) returning the
|
|
24
|
+
* new length as a double. When `len < cap` the runtime's append is exactly
|
|
25
|
+
* a dense store at `len` plus `len + 1`: no sparse entry can exist past the
|
|
26
|
+
* length, nothing is released, and the dense capacity never exceeds the
|
|
27
|
+
* maximum index. A full array takes the unchanged (cold) runtime call,
|
|
28
|
+
* which grows storage. */
|
|
29
|
+
export declare function emitDenseArrayPush(host: LlvmEmitterContext, array: string, acc: ArrayAccess, value: string): string;
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/* Inline dense-storage fast paths for ordinary array element access.
|
|
2
|
+
*
|
|
3
|
+
* Every strict and optional element operation keeps its runtime entry as
|
|
4
|
+
* the authority: the inline path only answers the case the runtime itself
|
|
5
|
+
* answers from dense storage without side effects — a canonical integer
|
|
6
|
+
* index below both the array length and the dense capacity (and, for
|
|
7
|
+
* strict reads, a slot whose state is a present value). Holes, present
|
|
8
|
+
* `undefined`, sparse indices, noncanonical numeric properties (negative,
|
|
9
|
+
* fractional, NaN, infinite, 2^32-1), and out-of-range reads branch to the
|
|
10
|
+
* unchanged runtime call, which is marked cold. The ScrArr field indices
|
|
11
|
+
* match the C layout in scr_runtime.h: len 1, cap 2, data 7, present 8. */
|
|
12
|
+
import { isRefCounted } from "../../ir/ir.js";
|
|
13
|
+
import { exactInteger, widenInteger } from "./integer-values.js";
|
|
14
|
+
const SCR_ARR_VALUE = 1;
|
|
15
|
+
/** Call-site effects of the non-retaining read fallbacks: they only read
|
|
16
|
+
* module-visible memory, or trap without returning to the caller (the trap
|
|
17
|
+
* writes runtime-private stderr/TLS state). Declaring this lets LLVM keep
|
|
18
|
+
* array header loads out of loops whose only calls are these cold paths. */
|
|
19
|
+
const READ_FALLBACK = " cold memory(read, inaccessiblemem: readwrite)";
|
|
20
|
+
/** Branch to `slow` unless `index` names a canonical array index inside
|
|
21
|
+
* dense storage. Reads also require it below the length; writes may land
|
|
22
|
+
* at or past the length while still inside the dense capacity (the runtime
|
|
23
|
+
* then extends the length over hole states exactly the same way). */
|
|
24
|
+
function emitDenseGuard(host, array, index, indexExpr, slow, requireBelowLen) {
|
|
25
|
+
const B = host.B;
|
|
26
|
+
const size = host.sizeType;
|
|
27
|
+
const integer = exactInteger(host, index, indexExpr);
|
|
28
|
+
let wide;
|
|
29
|
+
let integral = null;
|
|
30
|
+
if (integer) {
|
|
31
|
+
// A proven integer needs no double round-trip. Negative signed values
|
|
32
|
+
// compare above any length or capacity as unsigned 64-bit integers.
|
|
33
|
+
wide = widenInteger(host, integer);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// freeze keeps NaN/out-of-range conversions from producing poison; the
|
|
37
|
+
// exact round-trip comparison then rejects every value that is not an
|
|
38
|
+
// integer, and -0 converts to index 0 exactly like the runtime's check.
|
|
39
|
+
// Any frozen value that passes the round-trip and the unsigned capacity
|
|
40
|
+
// comparison below is the exact index.
|
|
41
|
+
const raw = B.tmp(), back = B.tmp();
|
|
42
|
+
wide = B.tmp();
|
|
43
|
+
integral = B.tmp();
|
|
44
|
+
B.line(`${raw} = fptosi double ${index.name} to i64`);
|
|
45
|
+
B.line(`${wide} = freeze i64 ${raw}`);
|
|
46
|
+
B.line(`${back} = sitofp i64 ${wide} to double`);
|
|
47
|
+
B.line(`${integral} = fcmp oeq double ${back}, ${index.name}`);
|
|
48
|
+
}
|
|
49
|
+
const lenPtr = B.tmp(), len = B.tmp(), capPtr = B.tmp(), cap = B.tmp();
|
|
50
|
+
B.line(`${lenPtr} = getelementptr inbounds %ScrArr, ptr ${array}, i32 0, i32 1`);
|
|
51
|
+
host.markMemoryPointer(lenPtr, "array:header");
|
|
52
|
+
B.line(`${len} = load ${size}, ptr ${lenPtr}${host.fieldAliasAttachment(lenPtr)}`);
|
|
53
|
+
B.line(`${capPtr} = getelementptr inbounds %ScrArr, ptr ${array}, i32 0, i32 2`);
|
|
54
|
+
host.markMemoryPointer(capPtr, "array:header");
|
|
55
|
+
B.line(`${cap} = load ${size}, ptr ${capPtr}${host.fieldAliasAttachment(capPtr)}`);
|
|
56
|
+
// Load the storage bases before branching: the header of a live array is
|
|
57
|
+
// always readable, and unconditional loads let LLVM hoist them out of
|
|
58
|
+
// loops whose only calls are read-only fallbacks.
|
|
59
|
+
const dataPtr = B.tmp(), data = B.tmp(), statesPtr = B.tmp(), states = B.tmp();
|
|
60
|
+
B.line(`${dataPtr} = getelementptr inbounds %ScrArr, ptr ${array}, i32 0, i32 7`);
|
|
61
|
+
host.markMemoryPointer(dataPtr, "array:header");
|
|
62
|
+
B.line(`${data} = load ptr, ptr ${dataPtr}${host.fieldAliasAttachment(dataPtr)}`);
|
|
63
|
+
B.line(`${statesPtr} = getelementptr inbounds %ScrArr, ptr ${array}, i32 0, i32 8`);
|
|
64
|
+
host.markMemoryPointer(statesPtr, "array:header");
|
|
65
|
+
B.line(`${states} = load ptr, ptr ${statesPtr}${host.fieldAliasAttachment(statesPtr)}`);
|
|
66
|
+
const widen = (value) => {
|
|
67
|
+
if (size === "i64")
|
|
68
|
+
return value;
|
|
69
|
+
const t = B.tmp();
|
|
70
|
+
B.line(`${t} = zext i32 ${value} to i64`);
|
|
71
|
+
return t;
|
|
72
|
+
};
|
|
73
|
+
const conditions = [];
|
|
74
|
+
if (integral)
|
|
75
|
+
conditions.push(integral);
|
|
76
|
+
const belowCap = B.tmp();
|
|
77
|
+
B.line(`${belowCap} = icmp ult i64 ${wide}, ${widen(cap)}`);
|
|
78
|
+
conditions.push(belowCap);
|
|
79
|
+
if (requireBelowLen) {
|
|
80
|
+
const belowLen = B.tmp();
|
|
81
|
+
B.line(`${belowLen} = icmp ult i64 ${wide}, ${widen(len)}`);
|
|
82
|
+
conditions.push(belowLen);
|
|
83
|
+
}
|
|
84
|
+
let ok = conditions[0];
|
|
85
|
+
for (const c of conditions.slice(1)) {
|
|
86
|
+
const t = B.tmp();
|
|
87
|
+
B.line(`${t} = and i1 ${ok}, ${c}`);
|
|
88
|
+
ok = t;
|
|
89
|
+
}
|
|
90
|
+
const dense = B.newLabel("arr.dense");
|
|
91
|
+
B.condBr(ok, dense, slow);
|
|
92
|
+
B.startBlock(dense);
|
|
93
|
+
let offset = wide;
|
|
94
|
+
if (size !== "i64") {
|
|
95
|
+
offset = B.tmp();
|
|
96
|
+
B.line(`${offset} = trunc i64 ${wide} to i32`);
|
|
97
|
+
}
|
|
98
|
+
return { offset, len, data, states };
|
|
99
|
+
}
|
|
100
|
+
function statePointer(host, guard) {
|
|
101
|
+
const B = host.B;
|
|
102
|
+
const statePtr = B.tmp();
|
|
103
|
+
B.line(`${statePtr} = getelementptr inbounds i8, ptr ${guard.states}, ${host.sizeType} ${guard.offset}`);
|
|
104
|
+
host.markMemoryPointer(statePtr, "array:present");
|
|
105
|
+
return statePtr;
|
|
106
|
+
}
|
|
107
|
+
function valuePointer(host, guard) {
|
|
108
|
+
const B = host.B;
|
|
109
|
+
const valuePtr = B.tmp();
|
|
110
|
+
B.line(`${valuePtr} = getelementptr inbounds i64, ptr ${guard.data}, ${host.sizeType} ${guard.offset}`);
|
|
111
|
+
host.markMemoryPointer(valuePtr, "array:elements");
|
|
112
|
+
return valuePtr;
|
|
113
|
+
}
|
|
114
|
+
function loadState(host, guard) {
|
|
115
|
+
const ptr = statePointer(host, guard);
|
|
116
|
+
const state = host.B.tmp();
|
|
117
|
+
host.B.line(`${state} = load i8, ptr ${ptr}${host.fieldAliasAttachment(ptr)}`);
|
|
118
|
+
return state;
|
|
119
|
+
}
|
|
120
|
+
/** Strict element read with the runtime getter's result contract: a
|
|
121
|
+
* double, an i1, or a pointer that is +1 (`retain`) or borrowed. The
|
|
122
|
+
* runtime getter keeps the trap for holes, present undefined, and missing
|
|
123
|
+
* properties; it also answers sparse indices. Null reference slots take
|
|
124
|
+
* the runtime path, which returns them without a retain. */
|
|
125
|
+
export function emitDenseArrayGet(host, array, index, indexExpr, acc, element, getter, retain) {
|
|
126
|
+
const B = host.B;
|
|
127
|
+
const ty = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
|
|
128
|
+
const ret = acc === "bool" ? "zeroext i1" : ty;
|
|
129
|
+
host.declare(`declare ${ret} @${getter}(ptr, double)`);
|
|
130
|
+
if (acc === "ref" && retain && !isRefCounted(element)) {
|
|
131
|
+
const t = B.tmp();
|
|
132
|
+
B.line(`${t} = call ${ty} @${getter}(ptr ${array}, double ${index.name})`);
|
|
133
|
+
return t;
|
|
134
|
+
}
|
|
135
|
+
const slow = B.newLabel("arr.get.slow"), join = B.newLabel("arr.get.join");
|
|
136
|
+
const guard = emitDenseGuard(host, array, index, indexExpr, slow, true);
|
|
137
|
+
const state = loadState(host, guard);
|
|
138
|
+
const present = B.tmp();
|
|
139
|
+
B.line(`${present} = icmp eq i8 ${state}, ${SCR_ARR_VALUE}`);
|
|
140
|
+
const valueLabel = B.newLabel("arr.get.value");
|
|
141
|
+
B.condBr(present, valueLabel, slow);
|
|
142
|
+
B.startBlock(valueLabel);
|
|
143
|
+
const ptr = valuePointer(host, guard);
|
|
144
|
+
let fast;
|
|
145
|
+
let fastLabel = valueLabel;
|
|
146
|
+
if (acc === "f64") {
|
|
147
|
+
fast = B.tmp();
|
|
148
|
+
B.line(`${fast} = load double, ptr ${ptr}${host.fieldAliasAttachment(ptr)}`);
|
|
149
|
+
}
|
|
150
|
+
else if (acc === "bool") {
|
|
151
|
+
const raw = B.tmp();
|
|
152
|
+
fast = B.tmp();
|
|
153
|
+
B.line(`${raw} = load i64, ptr ${ptr}${host.fieldAliasAttachment(ptr)}`);
|
|
154
|
+
B.line(`${fast} = icmp ne i64 ${raw}, 0`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const raw = B.tmp(), nonnull = B.tmp();
|
|
158
|
+
B.line(`${raw} = load ptr, ptr ${ptr}${host.fieldAliasAttachment(ptr)}`);
|
|
159
|
+
B.line(`${nonnull} = icmp ne ptr ${raw}, null`);
|
|
160
|
+
fastLabel = B.newLabel("arr.get.ref");
|
|
161
|
+
B.condBr(nonnull, fastLabel, slow);
|
|
162
|
+
B.startBlock(fastLabel);
|
|
163
|
+
fast = retain ? host.retainValue(raw, element) : raw;
|
|
164
|
+
}
|
|
165
|
+
B.br(join);
|
|
166
|
+
B.startBlock(slow);
|
|
167
|
+
const slowValue = B.tmp();
|
|
168
|
+
const attrs = acc === "ref" && retain ? " cold" : READ_FALLBACK;
|
|
169
|
+
B.line(`${slowValue} = call ${ty} @${getter}(ptr ${array}, double ${index.name})${attrs}`);
|
|
170
|
+
B.br(join);
|
|
171
|
+
B.startBlock(join);
|
|
172
|
+
const result = B.tmp();
|
|
173
|
+
B.line(`${result} = phi ${ty} [ ${fast}, %${fastLabel} ], [ ${slowValue}, %${slow} ]`);
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
/** `scr_arr_get_number`: a numeric element, or NaN for every missing,
|
|
177
|
+
* hole, or present-undefined slot (answered by the runtime). */
|
|
178
|
+
export function emitDenseArrayNumber(host, array, index, indexExpr) {
|
|
179
|
+
return emitDenseArrayGet(host, array, index, indexExpr, "f64", { kind: "f64" }, "scr_arr_get_number", false);
|
|
180
|
+
}
|
|
181
|
+
/** `scr_arr_state` (as a double) or `scr_arr_has` (as an i1). Dense
|
|
182
|
+
* in-range indices answer from the state byte; everything else keeps the
|
|
183
|
+
* runtime query, including canonical indices at or past the length. */
|
|
184
|
+
export function emitDenseArrayState(host, array, index, indexExpr, kind) {
|
|
185
|
+
const B = host.B;
|
|
186
|
+
const fn = kind === "state" ? "scr_arr_state" : "scr_arr_has";
|
|
187
|
+
const ty = kind === "state" ? "double" : "i1";
|
|
188
|
+
host.declare(`declare ${kind === "state" ? "double" : "zeroext i1"} @${fn}(ptr, double)`);
|
|
189
|
+
const slow = B.newLabel("arr.state.slow"), join = B.newLabel("arr.state.join");
|
|
190
|
+
const guard = emitDenseGuard(host, array, index, indexExpr, slow, true);
|
|
191
|
+
const state = loadState(host, guard);
|
|
192
|
+
const fast = B.tmp();
|
|
193
|
+
if (kind === "state")
|
|
194
|
+
B.line(`${fast} = uitofp i8 ${state} to double`);
|
|
195
|
+
else
|
|
196
|
+
B.line(`${fast} = icmp ne i8 ${state}, 0`);
|
|
197
|
+
const fastLabel = B.newLabel("arr.state.fast");
|
|
198
|
+
B.br(fastLabel);
|
|
199
|
+
B.startBlock(fastLabel);
|
|
200
|
+
B.br(join);
|
|
201
|
+
B.startBlock(slow);
|
|
202
|
+
const slowValue = B.tmp();
|
|
203
|
+
B.line(`${slowValue} = call ${ty} @${fn}(ptr ${array}, double ${index.name})${READ_FALLBACK}`);
|
|
204
|
+
B.br(join);
|
|
205
|
+
B.startBlock(join);
|
|
206
|
+
const result = B.tmp();
|
|
207
|
+
B.line(`${result} = phi ${ty} [ ${fast}, %${fastLabel} ], [ ${slowValue}, %${slow} ]`);
|
|
208
|
+
return result;
|
|
209
|
+
}
|
|
210
|
+
/** Element write with `scr_arr_set_*` semantics: the array takes the
|
|
211
|
+
* value's reference. A dense index stores the slot, marks it present, and
|
|
212
|
+
* extends the length when it lands at or past it; a replaced present
|
|
213
|
+
* reference is released after the new edge is published (a release can
|
|
214
|
+
* collect cycles). Every other index takes the unchanged runtime call. */
|
|
215
|
+
export function emitDenseArraySet(host, array, index, indexExpr, acc, element, value) {
|
|
216
|
+
const B = host.B;
|
|
217
|
+
const ty = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
|
|
218
|
+
const setter = `scr_arr_set_${acc}`;
|
|
219
|
+
host.declare(`declare void @${setter}(ptr, double, ${acc === "bool" ? "i1 zeroext" : ty})`);
|
|
220
|
+
const call = (attrs) => B.line(`call void @${setter}(ptr ${array}, double ${index.name}, ${ty} ${value})${attrs}`);
|
|
221
|
+
if (acc === "ref" && !isRefCounted(element)) {
|
|
222
|
+
call("");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const slow = B.newLabel("arr.set.slow"), join = B.newLabel("arr.set.join");
|
|
226
|
+
const guard = emitDenseGuard(host, array, index, indexExpr, slow, false);
|
|
227
|
+
const { offset, len } = guard;
|
|
228
|
+
const statePtr = statePointer(host, guard);
|
|
229
|
+
const valuePtr = valuePointer(host, guard);
|
|
230
|
+
let oldState = null;
|
|
231
|
+
let old = null;
|
|
232
|
+
if (acc === "ref") {
|
|
233
|
+
oldState = B.tmp();
|
|
234
|
+
old = B.tmp();
|
|
235
|
+
B.line(`${oldState} = load i8, ptr ${statePtr}${host.fieldAliasAttachment(statePtr)}`);
|
|
236
|
+
B.line(`${old} = load ptr, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
237
|
+
}
|
|
238
|
+
if (acc === "f64") {
|
|
239
|
+
B.line(`store double ${value}, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
240
|
+
}
|
|
241
|
+
else if (acc === "bool") {
|
|
242
|
+
const bits = B.tmp();
|
|
243
|
+
B.line(`${bits} = zext i1 ${value} to i64`);
|
|
244
|
+
B.line(`store i64 ${bits}, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
B.line(`store ptr ${value}, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
248
|
+
}
|
|
249
|
+
B.line(`store i8 ${SCR_ARR_VALUE}, ptr ${statePtr}${host.fieldAliasAttachment(statePtr)}`);
|
|
250
|
+
// Writes at or past the length extend it over the (hole) gap, exactly
|
|
251
|
+
// like the runtime's dense store.
|
|
252
|
+
const grows = B.tmp();
|
|
253
|
+
B.line(`${grows} = icmp uge ${host.sizeType} ${offset}, ${len}`);
|
|
254
|
+
const growLabel = B.newLabel("arr.set.grow"), storedLabel = B.newLabel("arr.set.stored");
|
|
255
|
+
B.condBr(grows, growLabel, storedLabel);
|
|
256
|
+
B.startBlock(growLabel);
|
|
257
|
+
const nextLen = B.tmp(), lenPtr = B.tmp();
|
|
258
|
+
B.line(`${nextLen} = add ${host.sizeType} ${offset}, 1`);
|
|
259
|
+
B.line(`${lenPtr} = getelementptr inbounds %ScrArr, ptr ${array}, i32 0, i32 1`);
|
|
260
|
+
host.markMemoryPointer(lenPtr, "array:header");
|
|
261
|
+
B.line(`store ${host.sizeType} ${nextLen}, ptr ${lenPtr}${host.fieldAliasAttachment(lenPtr)}`);
|
|
262
|
+
B.br(storedLabel);
|
|
263
|
+
B.startBlock(storedLabel);
|
|
264
|
+
if (acc === "ref" && oldState && old) {
|
|
265
|
+
const hadValue = B.tmp();
|
|
266
|
+
B.line(`${hadValue} = icmp eq i8 ${oldState}, ${SCR_ARR_VALUE}`);
|
|
267
|
+
const releaseLabel = B.newLabel("arr.set.release");
|
|
268
|
+
B.condBr(hadValue, releaseLabel, join);
|
|
269
|
+
B.startBlock(releaseLabel);
|
|
270
|
+
host.releaseValue(old, element);
|
|
271
|
+
}
|
|
272
|
+
B.br(join);
|
|
273
|
+
B.startBlock(slow);
|
|
274
|
+
call(" cold");
|
|
275
|
+
B.br(join);
|
|
276
|
+
B.startBlock(join);
|
|
277
|
+
}
|
|
278
|
+
/** `scr_arr_push_*` (the array takes the value's reference) returning the
|
|
279
|
+
* new length as a double. When `len < cap` the runtime's append is exactly
|
|
280
|
+
* a dense store at `len` plus `len + 1`: no sparse entry can exist past the
|
|
281
|
+
* length, nothing is released, and the dense capacity never exceeds the
|
|
282
|
+
* maximum index. A full array takes the unchanged (cold) runtime call,
|
|
283
|
+
* which grows storage. */
|
|
284
|
+
export function emitDenseArrayPush(host, array, acc, value) {
|
|
285
|
+
const B = host.B;
|
|
286
|
+
const size = host.sizeType;
|
|
287
|
+
const ty = acc === "f64" ? "double" : acc === "bool" ? "i1" : "ptr";
|
|
288
|
+
const pusher = `scr_arr_push_${acc}`;
|
|
289
|
+
host.declare(`declare double @${pusher}(ptr, ${acc === "bool" ? "i1 zeroext" : ty})`);
|
|
290
|
+
const header = (field) => {
|
|
291
|
+
const ptr = B.tmp();
|
|
292
|
+
B.line(`${ptr} = getelementptr inbounds %ScrArr, ptr ${array}, i32 0, i32 ${field}`);
|
|
293
|
+
host.markMemoryPointer(ptr, "array:header");
|
|
294
|
+
return ptr;
|
|
295
|
+
};
|
|
296
|
+
const lenPtr = header(1), len = B.tmp(), cap = B.tmp(), room = B.tmp();
|
|
297
|
+
B.line(`${len} = load ${size}, ptr ${lenPtr}${host.fieldAliasAttachment(lenPtr)}`);
|
|
298
|
+
const capPtr = header(2);
|
|
299
|
+
B.line(`${cap} = load ${size}, ptr ${capPtr}${host.fieldAliasAttachment(capPtr)}`);
|
|
300
|
+
B.line(`${room} = icmp ult ${size} ${len}, ${cap}`);
|
|
301
|
+
const fast = B.newLabel("arr.push.dense"), slow = B.newLabel("arr.push.slow"), join = B.newLabel("arr.push.join");
|
|
302
|
+
B.condBr(room, fast, slow);
|
|
303
|
+
B.startBlock(fast);
|
|
304
|
+
const dataPtr = header(7), data = B.tmp(), statesPtr = header(8), states = B.tmp();
|
|
305
|
+
B.line(`${data} = load ptr, ptr ${dataPtr}${host.fieldAliasAttachment(dataPtr)}`);
|
|
306
|
+
B.line(`${states} = load ptr, ptr ${statesPtr}${host.fieldAliasAttachment(statesPtr)}`);
|
|
307
|
+
const statePtr = statePointer(host, { offset: len, len, data, states });
|
|
308
|
+
const valuePtr = valuePointer(host, { offset: len, len, data, states });
|
|
309
|
+
if (acc === "f64") {
|
|
310
|
+
B.line(`store double ${value}, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
311
|
+
}
|
|
312
|
+
else if (acc === "bool") {
|
|
313
|
+
const bits = B.tmp();
|
|
314
|
+
B.line(`${bits} = zext i1 ${value} to i64`);
|
|
315
|
+
B.line(`store i64 ${bits}, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
B.line(`store ptr ${value}, ptr ${valuePtr}${host.fieldAliasAttachment(valuePtr)}`);
|
|
319
|
+
}
|
|
320
|
+
B.line(`store i8 ${SCR_ARR_VALUE}, ptr ${statePtr}${host.fieldAliasAttachment(statePtr)}`);
|
|
321
|
+
const next = B.tmp(), fastValue = B.tmp();
|
|
322
|
+
B.line(`${next} = add nuw ${size} ${len}, 1`);
|
|
323
|
+
B.line(`store ${size} ${next}, ptr ${lenPtr}${host.fieldAliasAttachment(lenPtr)}`);
|
|
324
|
+
B.line(`${fastValue} = uitofp ${size} ${next} to double`);
|
|
325
|
+
B.br(join);
|
|
326
|
+
B.startBlock(slow);
|
|
327
|
+
const slowValue = B.tmp();
|
|
328
|
+
B.line(`${slowValue} = call double @${pusher}(ptr ${array}, ${ty} ${value}) cold`);
|
|
329
|
+
B.br(join);
|
|
330
|
+
B.startBlock(join);
|
|
331
|
+
const result = B.tmp();
|
|
332
|
+
B.line(`${result} = phi double [ ${fastValue}, %${fast} ], [ ${slowValue}, %${slow} ]`);
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=dense-array-access.js.map
|