@scriptc/compiler 0.4.2 → 0.4.4
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 +470 -66
- package/dist/backend/cycle-analysis.d.ts +4 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +7 -0
- package/dist/backend/cycle-mutability.js +19 -1
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +2 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +6 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +16 -1
- package/dist/backend/llvm/alloc.js +54 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +21 -9
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
- package/dist/backend/llvm/bytes-loop-versions.js +479 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +7 -5
- package/dist/backend/llvm/classes.js +44 -20
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +167 -7
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +9 -3
- package/dist/backend/llvm/common.js +9 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +83 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +7 -0
- package/dist/backend/llvm/counted-loops.js +18 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -5
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
- package/dist/backend/llvm/dense-array-loops.js +194 -5
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +90 -1
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +30 -0
- package/dist/backend/llvm/dyn.js +373 -70
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +13 -28
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +211 -33
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -4
- package/dist/backend/llvm/emit-statements.js +268 -84
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +186 -37
- package/dist/backend/llvm/emitter.js +733 -90
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +65 -7
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +48 -20
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +28 -14
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +143 -37
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-dynamic.js +18 -11
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +119 -38
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +210 -69
- 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-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +25 -1
- package/dist/backend/llvm/integer-values.js +95 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +213 -5
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +4 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +4 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +37 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +94 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +35 -5
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +115 -19
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +10 -0
- package/dist/backend/llvm/publish.js +15 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/receivers.js +6 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +89 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +71 -15
- package/dist/backend/llvm/shapes.js +224 -40
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +12 -0
- package/dist/backend/llvm/string-reads.js +44 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +101 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +7 -0
- 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 +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.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 +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- package/dist/backend/target-diagnostics.js +5 -3
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +20 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +10 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.js +4 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.js +12 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -0
- package/dist/diagnostics/envelope.js +1 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +5 -0
- package/dist/executable/executable-cache.js +5 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +949 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +100 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +87 -10
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.js +4 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
- package/dist/frontend/lowering/builtins/promises.js +236 -139
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +35 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +24 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +0 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +307 -4
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +4 -1
- package/dist/frontend/lowering/class-construction.js +17 -3
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +83 -24
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +31 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +91 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +10 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +5 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +26 -3
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +455 -46
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +7 -2
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +43 -19
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +11 -0
- package/dist/frontend/lowering/date-values.js +207 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.js +15 -1
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +47 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +53 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +100 -28
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +169 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +64 -5
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +95 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +138 -51
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +168 -10
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +212 -33
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +6 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +39 -3
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +64 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +7 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +186 -1
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
- package/dist/frontend/lowering/key-order-witness.js +974 -48
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +530 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +15 -3
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +4 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +7 -0
- package/dist/frontend/lowering/lower-calls.js +462 -44
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +324 -69
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +215 -3
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +83 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +42 -32
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +53 -17
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +53 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +5 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +2 -2
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +30 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +553 -81
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +1483 -156
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +107 -8
- package/dist/frontend/lowering/lowerer.js +381 -36
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +73 -8
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +29 -13
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.js +4 -20
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +19 -11
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +5 -1
- package/dist/frontend/program-analysis.js +5 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +21 -6
- package/dist/frontend/program.js +681 -83
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +43 -3
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +22 -0
- package/dist/frontend/ts7/ast-node.js +1048 -103
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +24 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -3
- package/dist/frontend/ts7/ast-wire.js +34 -24
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +4 -0
- package/dist/frontend/ts7/checker.js +7 -0
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +25 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +5 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +22 -0
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +229 -20
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +19 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +24 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +60 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +6 -4
- package/dist/ir/builtin-signatures.js +222 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +14 -16
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +3 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +24 -2
- package/dist/ir/int32-slots.js +266 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +33 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +28 -10
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +10 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +30 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +83 -10
- package/dist/ir/ir.js +77 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +23 -2
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +4 -0
- package/dist/ir/js-ic.js +17 -1
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +46 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +34 -13
- package/dist/ir/runtime-features.js +177 -39
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +18 -6
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +167 -40
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +21 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +4 -2
- package/dist/native/prepare.js +130 -32
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +96 -20
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +2 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/surface-manifest.json +27 -7
package/dist/backend/llvm/dyn.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { emitPerKeyOrder } from "./key-orders.js";
|
|
1
2
|
import { typedRefConstructor } from "./shapes.js";
|
|
2
3
|
import { bindLiveArrayOps } from "./expr-stream-bridges.js";
|
|
3
|
-
import { BYTES_ELEM_NUM, SCR_ARR_FIELD, f64Lit, sizeToDouble } from "./common.js";
|
|
4
|
+
import { BYTES_ELEM_NUM, SCR_ARR_FIELD, SCR_ARR_STATES, f64Lit, sizeToDouble } from "./common.js";
|
|
4
5
|
import { emitUnionPeek, emitUnionTag } from "./union-repr.js";
|
|
5
6
|
import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, storeInlineUnion, unionBoxBits, } from "./inline-unions.js";
|
|
6
7
|
import { InternalCompilerError } from "../../errors.js";
|
|
7
|
-
import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, isDynTypedRefType, isRefCounted, isUnitType, typeKey, } from "../../ir/ir.js";
|
|
8
|
+
import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordTextCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
|
|
8
9
|
import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
|
|
9
10
|
import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
|
|
10
11
|
import { BlockBuilder } from "./blocks.js";
|
|
@@ -39,6 +40,15 @@ export const DYN_HANDLE_TAG_NUM = {
|
|
|
39
40
|
cryptoHash: 52,
|
|
40
41
|
cryptoHmac: 53,
|
|
41
42
|
};
|
|
43
|
+
/** The handle tags of TextEncoder and TextDecoder records boxed as dyn
|
|
44
|
+
* (scr_dyn.h; scr_text_codec_dyn.c boxes and unboxes them). */
|
|
45
|
+
export const TEXT_CODEC_TAG_NUM = {
|
|
46
|
+
TextDecoder: 76,
|
|
47
|
+
TextEncoder: 77,
|
|
48
|
+
};
|
|
49
|
+
/** The decoder record fields scr_text_decoder_to_dyn reads, in its
|
|
50
|
+
* parameter order. */
|
|
51
|
+
const TEXT_DECODER_FIELDS = ["%TextDecoder", "%fatal", "%ignoreBOM", "%state"];
|
|
42
52
|
/** Handle kinds whose runtime unit boxes them through its own function,
|
|
43
53
|
* which installs the tag's ops on first use (scr_crypto.h). Programs that
|
|
44
54
|
* never box one of these values do not link its dynamic members. */
|
|
@@ -114,6 +124,54 @@ export class LlDyn {
|
|
|
114
124
|
constructor(host) {
|
|
115
125
|
this.host = host;
|
|
116
126
|
}
|
|
127
|
+
/** Journal replay (emit-journal.ts): builds or finds the helper a chunk
|
|
128
|
+
* emitter recorded, and answers its name. */
|
|
129
|
+
replayHelper(op, args) {
|
|
130
|
+
switch (op) {
|
|
131
|
+
case "dyn.collectionDynOps":
|
|
132
|
+
return this.collectionDynOps(args[0]);
|
|
133
|
+
case "dyn.dynMatchHelper":
|
|
134
|
+
return this.dynMatchHelper(args[0], args[1]);
|
|
135
|
+
case "dyn.jsonSchema":
|
|
136
|
+
return this.jsonSchema(args[0]);
|
|
137
|
+
case "dyn.recordNameTable": {
|
|
138
|
+
const shapeId = args[0];
|
|
139
|
+
return this.recordNameTable(shapeId, this.host.recordsById.get(shapeId)).names;
|
|
140
|
+
}
|
|
141
|
+
case "dyn.jsonParseHelper":
|
|
142
|
+
return this.jsonParseHelper(args[0]);
|
|
143
|
+
case "dyn.dynCheckHelper":
|
|
144
|
+
return this.dynCheckHelper(args[0], args[1]);
|
|
145
|
+
case "dyn.toDynHelper":
|
|
146
|
+
return this.toDynHelper(args[0]);
|
|
147
|
+
case "dyn.promiseDynAdapterHelper":
|
|
148
|
+
return this.promiseDynAdapterHelper(args[0]);
|
|
149
|
+
case "dyn.dynFuncThunkHelper":
|
|
150
|
+
return this.dynFuncThunkHelper(args[0]);
|
|
151
|
+
case "dyn.dynFuncBoxHelper":
|
|
152
|
+
return this.dynFuncBoxHelper(args[0]);
|
|
153
|
+
case "dyn.dynFuncAdapterHelper":
|
|
154
|
+
return this.dynFuncAdapterHelper(args[0]);
|
|
155
|
+
case "dyn.dynToStrHelper":
|
|
156
|
+
return this.dynToStrHelper();
|
|
157
|
+
case "dyn.dynIterNHelper":
|
|
158
|
+
return this.dynIterNHelper();
|
|
159
|
+
case "dyn.dynDestrCheckHelper":
|
|
160
|
+
return this.dynDestrCheckHelper();
|
|
161
|
+
case "dyn.dynKeyGetHelper":
|
|
162
|
+
return this.dynKeyGetHelper();
|
|
163
|
+
case "dyn.dynComputedKeyGetHelper":
|
|
164
|
+
return this.dynComputedKeyGetHelper();
|
|
165
|
+
case "dyn.caughtToDynHelper":
|
|
166
|
+
return this.caughtToDynHelper();
|
|
167
|
+
case "dyn.messageListenerHelper":
|
|
168
|
+
return this.messageListenerHelper(args[0]) ?? "";
|
|
169
|
+
case "dyn.messageReaderHelper":
|
|
170
|
+
return this.messageReaderHelper(args[0]);
|
|
171
|
+
default:
|
|
172
|
+
throw new InternalCompilerError(`llvm emitter bug: no dyn helper replay ${op}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
117
175
|
/** The types a dyn matcher or builder for `t` checks structurally: record
|
|
118
176
|
* fields and index values, array elements and union arms. */
|
|
119
177
|
structuralChildren(t) {
|
|
@@ -218,6 +276,34 @@ export class LlDyn {
|
|
|
218
276
|
this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
|
|
219
277
|
B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
|
|
220
278
|
}
|
|
279
|
+
/** The order a dyn value tries a union's arms in: the canonical order,
|
|
280
|
+
* except that among the record arms, those with more required fields go
|
|
281
|
+
* first, then those with more fields. Records are width-tolerant, so an
|
|
282
|
+
* arm with fewer fields (`{}`, or one whose fields are all optional,
|
|
283
|
+
* matches every object) would otherwise take an object that a wider arm
|
|
284
|
+
* also matches and drop the fields only the wider arm has. */
|
|
285
|
+
unionArmOrder(def) {
|
|
286
|
+
const width = (i) => {
|
|
287
|
+
const arm = def.arms[i];
|
|
288
|
+
if (arm.kind !== "record")
|
|
289
|
+
return null;
|
|
290
|
+
const shape = this.host.recordsById.get(arm.shapeId);
|
|
291
|
+
if (!shape || shape.tuple)
|
|
292
|
+
return null;
|
|
293
|
+
const required = shape.fields.filter((field) => field.type.kind !== "union" ||
|
|
294
|
+
!this.host.unionsById.get(field.type.unionId)?.arms.some((x) => x.kind === "undefinedT")).length;
|
|
295
|
+
return [required, shape.fields.length];
|
|
296
|
+
};
|
|
297
|
+
const order = def.arms.map((_, i) => i);
|
|
298
|
+
const records = order.filter((i) => width(i) !== null);
|
|
299
|
+
const widest = [...records].sort((x, y) => {
|
|
300
|
+
const [rx, fx] = width(x);
|
|
301
|
+
const [ry, fy] = width(y);
|
|
302
|
+
return ry - rx || fy - fx || x - y;
|
|
303
|
+
});
|
|
304
|
+
records.forEach((slot, k) => (order[slot] = widest[k]));
|
|
305
|
+
return order;
|
|
306
|
+
}
|
|
221
307
|
/** Branch to a variant only after its literal discriminator and complete
|
|
222
308
|
* structure match. Use the same path for predicates and builders. */
|
|
223
309
|
unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
|
|
@@ -258,7 +344,7 @@ export class LlDyn {
|
|
|
258
344
|
}
|
|
259
345
|
/** The value LLVM type of a dynCheck result / toDyn operand for `t`. */
|
|
260
346
|
valTy(t) {
|
|
261
|
-
return t.kind === "f64" || t.kind === "
|
|
347
|
+
return t.kind === "f64" || t.kind === "procStream"
|
|
262
348
|
? "double"
|
|
263
349
|
: t.kind === "bool"
|
|
264
350
|
? "i1"
|
|
@@ -271,6 +357,7 @@ export class LlDyn {
|
|
|
271
357
|
return prior;
|
|
272
358
|
const name = `sc_map_dyn_${this.mapDynOps.size}`;
|
|
273
359
|
this.mapDynOps.set(key, name);
|
|
360
|
+
this.host.journalAllocated?.(name, "dyn.collectionDynOps", [t]);
|
|
274
361
|
const keyType = t.kind === "map" ? t.key : t.elem;
|
|
275
362
|
const valueType = t.kind === "map" ? t.value : { kind: "f64" };
|
|
276
363
|
const emitSlot = (type, role) => {
|
|
@@ -311,6 +398,7 @@ export class LlDyn {
|
|
|
311
398
|
emitSlot(keyType, "key");
|
|
312
399
|
emitSlot(valueType, "value");
|
|
313
400
|
this.defs.push(`@${name} = internal constant { ptr, ptr, ptr, ptr, ptr, ptr } { ptr ${this.host.cstr(key)}, ptr @${name}_key_box, ptr @${name}_key_unbox, ptr @${this.dynMatchHelper(keyType)}, ptr @${name}_value_box, ptr @${name}_value_unbox }`, "");
|
|
401
|
+
this.host.journalBuilt?.();
|
|
314
402
|
return name;
|
|
315
403
|
}
|
|
316
404
|
/* ── dyn node plumbing ─────────────────────────────────────────────── */
|
|
@@ -651,6 +739,17 @@ export class LlDyn {
|
|
|
651
739
|
return existing;
|
|
652
740
|
const name = `sc_dm_${this.dynMatchers.size}`;
|
|
653
741
|
this.dynMatchers.set(matcherKey, name);
|
|
742
|
+
this.host.journalAllocated?.(name, "dyn.dynMatchHelper", [t, preserveRefs]);
|
|
743
|
+
const codec = textCodecRecordClass(t, (id) => this.host.recordsById.get(id));
|
|
744
|
+
if (codec !== null) {
|
|
745
|
+
// A codec matches only its own handle box.
|
|
746
|
+
const B = new BlockBuilder();
|
|
747
|
+
const matched = this.handleTagMatches(B, TEXT_CODEC_TAG_NUM[codec]);
|
|
748
|
+
B.terminate(`ret i1 ${matched}`);
|
|
749
|
+
this.defs.push(`define internal zeroext i1 @${name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
|
|
750
|
+
this.host.journalBuilt?.();
|
|
751
|
+
return name;
|
|
752
|
+
}
|
|
654
753
|
const recursive = this.isRecursiveShape(t);
|
|
655
754
|
const wrapped = recursive || this.holdsRecursiveShape(t);
|
|
656
755
|
const B = new BlockBuilder();
|
|
@@ -675,7 +774,10 @@ export class LlDyn {
|
|
|
675
774
|
const lPlain = B.newLabel("dm.tr.plain");
|
|
676
775
|
B.condBr(capsule, lCapsule, lPlain);
|
|
677
776
|
B.startBlock(lCapsule);
|
|
678
|
-
|
|
777
|
+
// A class target matches only capsules of that class (tested above):
|
|
778
|
+
// a materialized view is a plain object, which never carries a class
|
|
779
|
+
// brand, so materializing one cannot change the answer.
|
|
780
|
+
if (preserveRefs || (t.kind === "object" && t.className !== "%Error")) {
|
|
679
781
|
B.terminate(`ret i1 false`);
|
|
680
782
|
}
|
|
681
783
|
else {
|
|
@@ -856,9 +958,10 @@ export class LlDyn {
|
|
|
856
958
|
}
|
|
857
959
|
B.condBr(readable, l0, fail);
|
|
858
960
|
B.startBlock(l0);
|
|
859
|
-
// dyn ('unknown') fields match ANY value, present or missing.
|
|
961
|
+
// dyn ('unknown') fields match ANY value, present or missing. The
|
|
962
|
+
// order index is no key.
|
|
860
963
|
for (const f of shape.fields) {
|
|
861
|
-
if (f.type.kind === "dyn")
|
|
964
|
+
if (f.type.kind === "dyn" || f.name === KEY_ORDER_FIELD)
|
|
862
965
|
continue;
|
|
863
966
|
const { value: m, release } = this.memberRead(B, f.name, f.type);
|
|
864
967
|
const lNext = B.newLabel("dm.n");
|
|
@@ -986,6 +1089,7 @@ export class LlDyn {
|
|
|
986
1089
|
this.defs.push(`define internal zeroext i1 @${wrapped ? `${name}_body` : name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
|
|
987
1090
|
if (wrapped)
|
|
988
1091
|
this.emitVisitWrapper(name, t, recursive ? "match" : "visit");
|
|
1092
|
+
this.host.journalBuilt?.();
|
|
989
1093
|
return name;
|
|
990
1094
|
}
|
|
991
1095
|
/* ── schema-directed JSON.parse ───────────────────────────────── */
|
|
@@ -1022,9 +1126,10 @@ export class LlDyn {
|
|
|
1022
1126
|
if (shape.fields.length > 64 || (shape.fields.length === 0 && !index))
|
|
1023
1127
|
return false;
|
|
1024
1128
|
visiting.add(t.shapeId);
|
|
1025
|
-
return (shape.fields.every((f) =>
|
|
1026
|
-
f.name
|
|
1027
|
-
|
|
1129
|
+
return (shape.fields.every((f) => f.name === KEY_ORDER_FIELD ||
|
|
1130
|
+
(!f.name.startsWith("%") &&
|
|
1131
|
+
f.name !== "__proto__" &&
|
|
1132
|
+
this.jsonSchemaSupported(f.type, visiting, true))) &&
|
|
1028
1133
|
(!index || this.jsonSchemaSupported(index, visiting)));
|
|
1029
1134
|
}
|
|
1030
1135
|
case "union":
|
|
@@ -1073,6 +1178,7 @@ export class LlDyn {
|
|
|
1073
1178
|
const S = host.sizeType;
|
|
1074
1179
|
const name = `sc_jsch_${this.jsonSchemas.size}`;
|
|
1075
1180
|
this.jsonSchemas.set(key, name);
|
|
1181
|
+
this.host.journalAllocated?.(name, "dyn.jsonSchema", [t]);
|
|
1076
1182
|
let body;
|
|
1077
1183
|
switch (t.kind) {
|
|
1078
1184
|
case "f64":
|
|
@@ -1097,7 +1203,9 @@ export class LlDyn {
|
|
|
1097
1203
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
1098
1204
|
const index = new Map(shape.fields.map((f, i) => [f.name, i + base]));
|
|
1099
1205
|
// The runtime names kept-source keys by this index (record-sources.ts).
|
|
1100
|
-
|
|
1206
|
+
// The order index is no key: parsed values keep the table's order
|
|
1207
|
+
// and their source's own order.
|
|
1208
|
+
const order = recordSourceFieldOrder(shape).filter((name) => name !== KEY_ORDER_FIELD);
|
|
1101
1209
|
if (recordMayKeepSource(shape))
|
|
1102
1210
|
this.keepsRecordSources = true;
|
|
1103
1211
|
const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
|
|
@@ -1130,6 +1238,7 @@ export class LlDyn {
|
|
|
1130
1238
|
throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
|
|
1131
1239
|
}
|
|
1132
1240
|
this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr, ptr, ${S} } { ${body} }`, ``);
|
|
1241
|
+
this.host.journalBuilt?.();
|
|
1133
1242
|
return name;
|
|
1134
1243
|
}
|
|
1135
1244
|
/** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
|
|
@@ -1187,6 +1296,16 @@ export class LlDyn {
|
|
|
1187
1296
|
this.defs.push(`@${descriptor} = internal constant { ${S}, [7 x ${S}], [7 x ptr], ptr, ptr, ptr } { ${S} ${repr}, [7 x ${S}] [${tags.map((tag) => `${S} ${tag}`).join(", ")}], [7 x ptr] [${arms.join(", ")}], ptr ${nullValue}, ptr ${absentValue}, ptr ${box} }`, ``);
|
|
1188
1297
|
return descriptor;
|
|
1189
1298
|
}
|
|
1299
|
+
/** `record.sourceSpread(built, value)`: the built record keeps value's
|
|
1300
|
+
* kept-source order over its own declared names. */
|
|
1301
|
+
emitRecordSourceSpread(B, built, value, shapeId) {
|
|
1302
|
+
const host = this.host;
|
|
1303
|
+
const shape = host.recordsById.get(shapeId);
|
|
1304
|
+
this.keepsRecordSources = true;
|
|
1305
|
+
const names = this.recordNameTable(shapeId, shape);
|
|
1306
|
+
host.declare(`declare void @scr_record_source_spread(ptr, ptr, ptr, ptr, ${host.sizeType})`);
|
|
1307
|
+
B.line(`call void @scr_record_source_spread(ptr ${built}, ptr ${value}, ptr ${names.names}, ptr ${names.lens}, ${host.sizeType} ${shape.fields.length})`);
|
|
1308
|
+
}
|
|
1190
1309
|
/** The declared-name tables scr_record_source_note scans: parallel
|
|
1191
1310
|
* constant arrays of field-name bytes and byte lengths in declaration
|
|
1192
1311
|
* order (the order the record serializes), interned per shape. Internal
|
|
@@ -1200,9 +1319,11 @@ export class LlDyn {
|
|
|
1200
1319
|
const base = `sc_rnames_${this.recordNameTables.size}`;
|
|
1201
1320
|
const table = { names: `@${base}`, lens: `@${base}_lens` };
|
|
1202
1321
|
this.recordNameTables.set(shapeId, table);
|
|
1322
|
+
this.host.journalAllocated?.(base, "dyn.recordNameTable", [shapeId]);
|
|
1203
1323
|
const n = shape.fields.length;
|
|
1204
1324
|
const names = recordSourceFieldOrder(shape);
|
|
1205
1325
|
this.defs.push(`@${base} = internal constant [${n} x ptr] [${names.map((name) => `ptr ${host.cstr(name)}`).join(", ")}]`, `@${base}_lens = internal constant [${n} x ${S}] [${names.map((name) => `${S} ${Buffer.byteLength(name, "utf8")}`).join(", ")}]`, ``);
|
|
1326
|
+
this.host.journalBuilt?.();
|
|
1206
1327
|
return table;
|
|
1207
1328
|
}
|
|
1208
1329
|
/** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
|
|
@@ -1223,12 +1344,14 @@ export class LlDyn {
|
|
|
1223
1344
|
const host = this.host;
|
|
1224
1345
|
const name = `sc_jp_${this.jsonParsers.size}`;
|
|
1225
1346
|
this.jsonParsers.set(key, name);
|
|
1347
|
+
this.host.journalAllocated?.(name, "dyn.jsonParseHelper", [t]);
|
|
1226
1348
|
const schema = this.jsonSchema(t);
|
|
1227
1349
|
const check = this.dynCheckHelper(t);
|
|
1228
1350
|
host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
|
|
1229
1351
|
host.declare(`declare ptr @scr_json_parse(ptr)`);
|
|
1230
1352
|
host.declare(`declare void @scr_dyn_release(ptr)`);
|
|
1231
1353
|
this.defs.push(`define internal ptr @${name}(ptr %text) ${FN_ATTRS} { ; JSON.parse as ${llvmCommentText(key)}`, `entry:`, ` %fast = call ptr @scr_json_parse_schema(ptr %text, ptr @${schema})`, ` %hit = icmp ne ptr %fast, null`, ` br i1 %hit, label %done, label %slow`, `done:`, ` ret ptr %fast`, `slow:`, ` %d = call ptr @scr_json_parse(ptr %text)`, ` %bad = icmp eq ptr %d, null`, ` br i1 %bad, label %fail, label %check`, `fail:`, ` ret ptr null`, `check:`, ` %v = call ptr @${check}(ptr %d, ptr null)`, ` call void @scr_dyn_release(ptr %d)`, ` ret ptr %v`, `}`, ``);
|
|
1354
|
+
this.host.journalBuilt?.();
|
|
1232
1355
|
return name;
|
|
1233
1356
|
}
|
|
1234
1357
|
/* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
|
|
@@ -1243,6 +1366,7 @@ export class LlDyn {
|
|
|
1243
1366
|
return existing;
|
|
1244
1367
|
const name = `sc_dc_${this.dynBuilders.size}`;
|
|
1245
1368
|
this.dynBuilders.set(builderKey, name);
|
|
1369
|
+
this.host.journalAllocated?.(name, "dyn.dynCheckHelper", [t, preserveRefs]);
|
|
1246
1370
|
const recursive = this.isRecursiveShape(t);
|
|
1247
1371
|
const memo = !recursive && this.holdsRecursiveShape(t) && this.valTy(t) === "ptr";
|
|
1248
1372
|
const host = this.host;
|
|
@@ -1257,6 +1381,18 @@ export class LlDyn {
|
|
|
1257
1381
|
B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
|
|
1258
1382
|
B.terminate(`ret ptr ${checked}`);
|
|
1259
1383
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
|
|
1384
|
+
this.host.journalBuilt?.();
|
|
1385
|
+
return name;
|
|
1386
|
+
}
|
|
1387
|
+
const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
|
|
1388
|
+
if (codec !== null) {
|
|
1389
|
+
// The record the codec's handle box holds (+1), or the path TypeError.
|
|
1390
|
+
host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
|
|
1391
|
+
const checked = B.tmp();
|
|
1392
|
+
B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
|
|
1393
|
+
B.terminate(`ret ptr ${checked}`);
|
|
1394
|
+
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
|
|
1395
|
+
this.host.journalBuilt?.();
|
|
1260
1396
|
return name;
|
|
1261
1397
|
}
|
|
1262
1398
|
if (isRefCounted(t) && t.kind !== "dyn") {
|
|
@@ -1416,6 +1552,26 @@ export class LlDyn {
|
|
|
1416
1552
|
B.line(`store ${member.type} ${oldValue}, ptr ${checkedPtr}`);
|
|
1417
1553
|
});
|
|
1418
1554
|
if (t.kind !== "record") {
|
|
1555
|
+
// Whether the dense slots carry states (SCR_ARR_STATES in
|
|
1556
|
+
// `spare`) moves with them; the rest of `spare` stays.
|
|
1557
|
+
const cachedSpare = B.tmp(), checkedSpare = B.tmp();
|
|
1558
|
+
const sparePtr = (array) => {
|
|
1559
|
+
const ptr = B.tmp();
|
|
1560
|
+
B.line(`${ptr} = getelementptr inbounds %ScrArr, ptr ${array}, i64 0, i32 ${SCR_ARR_FIELD.spare}`);
|
|
1561
|
+
return ptr;
|
|
1562
|
+
};
|
|
1563
|
+
const cachedSparePtr = sparePtr(cached), checkedSparePtr = sparePtr(checked);
|
|
1564
|
+
B.line(`${cachedSpare} = load i16, ptr ${cachedSparePtr}`);
|
|
1565
|
+
B.line(`${checkedSpare} = load i16, ptr ${checkedSparePtr}`);
|
|
1566
|
+
const exchange = (own, other, ptr) => {
|
|
1567
|
+
const kept = B.tmp(), moved = B.tmp(), next = B.tmp();
|
|
1568
|
+
B.line(`${kept} = and i16 ${own}, ${~SCR_ARR_STATES}`);
|
|
1569
|
+
B.line(`${moved} = and i16 ${other}, ${SCR_ARR_STATES}`);
|
|
1570
|
+
B.line(`${next} = or i16 ${kept}, ${moved}`);
|
|
1571
|
+
B.line(`store i16 ${next}, ptr ${ptr}`);
|
|
1572
|
+
};
|
|
1573
|
+
exchange(cachedSpare, checkedSpare, cachedSparePtr);
|
|
1574
|
+
exchange(checkedSpare, cachedSpare, checkedSparePtr);
|
|
1419
1575
|
// Sparse slots and numeric properties live out of line; each
|
|
1420
1576
|
// array keeps its own match metadata.
|
|
1421
1577
|
host.declare("declare void @scr_arr_swap_indexed_ext(ptr, ptr)");
|
|
@@ -1461,10 +1617,10 @@ export class LlDyn {
|
|
|
1461
1617
|
};
|
|
1462
1618
|
switch (t.kind) {
|
|
1463
1619
|
case "date": {
|
|
1464
|
-
host.declare(`declare
|
|
1620
|
+
host.declare(`declare ptr @scr_dyn_native_date_check(ptr, ptr)`);
|
|
1465
1621
|
const r = B.tmp();
|
|
1466
|
-
B.line(`${r} = call
|
|
1467
|
-
B.terminate(`ret
|
|
1622
|
+
B.line(`${r} = call ptr @scr_dyn_native_date_check(ptr %d, ptr %path)`);
|
|
1623
|
+
B.terminate(`ret ptr ${r}`);
|
|
1468
1624
|
break;
|
|
1469
1625
|
}
|
|
1470
1626
|
case "url":
|
|
@@ -1746,7 +1902,11 @@ export class LlDyn {
|
|
|
1746
1902
|
B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
|
|
1747
1903
|
if (recursive)
|
|
1748
1904
|
this.recordBuilt(B, name, "%r0");
|
|
1905
|
+
// The order index stays 0: the source's own order is kept below
|
|
1906
|
+
// when it differs from the table.
|
|
1749
1907
|
for (const f of shape.fields) {
|
|
1908
|
+
if (f.name === KEY_ORDER_FIELD)
|
|
1909
|
+
continue;
|
|
1750
1910
|
const { value: m, release } = this.memberRead(B, f.name, f.type);
|
|
1751
1911
|
this.pendingBail(B, "dcr.read", () => {
|
|
1752
1912
|
B.line(`call void @${release}(ptr ${m})`);
|
|
@@ -1914,9 +2074,10 @@ export class LlDyn {
|
|
|
1914
2074
|
const def = host.unionsById.get(t.unionId);
|
|
1915
2075
|
if (!def)
|
|
1916
2076
|
throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
|
|
1917
|
-
// Arms in
|
|
1918
|
-
//
|
|
1919
|
-
|
|
2077
|
+
// Arms in unionArmOrder, first FULL match wins. The matched arm's
|
|
2078
|
+
// builder can no longer fail.
|
|
2079
|
+
for (const i of this.unionArmOrder(def)) {
|
|
2080
|
+
const arm = def.arms[i];
|
|
1920
2081
|
const lHit = B.newLabel("dcu.h");
|
|
1921
2082
|
const lNext = B.newLabel("dcu.n");
|
|
1922
2083
|
this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
|
|
@@ -1958,7 +2119,7 @@ export class LlDyn {
|
|
|
1958
2119
|
B.terminate(`ret ptr ${u}`);
|
|
1959
2120
|
}
|
|
1960
2121
|
B.startBlock(lNext);
|
|
1961
|
-
}
|
|
2122
|
+
}
|
|
1962
2123
|
if (preserveRefs) {
|
|
1963
2124
|
B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
|
|
1964
2125
|
B.terminate(`ret ptr null`);
|
|
@@ -2157,8 +2318,64 @@ export class LlDyn {
|
|
|
2157
2318
|
this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${recursive || memo ? `${name}_body` : name}(ptr %d, ptr %path) ${FN_ATTRS} { ; check ${key}`, B.render(), `}`, ``);
|
|
2158
2319
|
if (recursive || memo)
|
|
2159
2320
|
this.emitVisitWrapper(name, t, recursive ? "build" : "memo");
|
|
2321
|
+
this.host.journalBuilt?.();
|
|
2160
2322
|
return name;
|
|
2161
2323
|
}
|
|
2324
|
+
/** `i1`: %d is a handle box with tag `tag`. */
|
|
2325
|
+
handleTagMatches(B, tag) {
|
|
2326
|
+
const kd = this.kindOf(B, "%d");
|
|
2327
|
+
const isHandle = B.tmp();
|
|
2328
|
+
B.line(`${isHandle} = icmp eq i32 ${kd}, ${DYN_KIND.HANDLE}`);
|
|
2329
|
+
const lHandle = B.newLabel("dm.handle");
|
|
2330
|
+
const lDone = B.newLabel("dm.handle.done");
|
|
2331
|
+
const entry = B.currentLabel();
|
|
2332
|
+
B.condBr(isHandle, lHandle, lDone);
|
|
2333
|
+
B.startBlock(lHandle);
|
|
2334
|
+
const tagPtr = B.tmp();
|
|
2335
|
+
const loaded = B.tmp();
|
|
2336
|
+
B.line(`${tagPtr} = getelementptr inbounds i8, ptr %d, i64 ${this.abiOffset(24, 20)} ; ->v.handle.tag`);
|
|
2337
|
+
B.line(`${loaded} = load i32, ptr ${tagPtr}`);
|
|
2338
|
+
const same = B.tmp();
|
|
2339
|
+
B.line(`${same} = icmp eq i32 ${loaded}, ${tag}`);
|
|
2340
|
+
B.br(lDone);
|
|
2341
|
+
B.startBlock(lDone);
|
|
2342
|
+
const matched = B.tmp();
|
|
2343
|
+
B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
|
|
2344
|
+
return matched;
|
|
2345
|
+
}
|
|
2346
|
+
/** A TextEncoder or TextDecoder record boxes as its handle (+1), which
|
|
2347
|
+
* holds the record by reference. A decoder passes the byte offsets of the
|
|
2348
|
+
* fields its boxed decode reads. */
|
|
2349
|
+
textCodecToDyn(B, t, shape, codec) {
|
|
2350
|
+
const host = this.host;
|
|
2351
|
+
const rc = vAdapters(host, t);
|
|
2352
|
+
const r = B.tmp();
|
|
2353
|
+
if (codec === "TextEncoder") {
|
|
2354
|
+
host.declare(`declare ptr @scr_text_encoder_to_dyn(ptr, ptr, ptr)`);
|
|
2355
|
+
B.line(`${r} = call ptr @scr_text_encoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release})`);
|
|
2356
|
+
}
|
|
2357
|
+
else {
|
|
2358
|
+
const struct = mangleRecordStruct(t.shapeId);
|
|
2359
|
+
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
2360
|
+
const start = B.tmp();
|
|
2361
|
+
B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
|
|
2362
|
+
const offsets = TEXT_DECODER_FIELDS.map((field) => {
|
|
2363
|
+
const index = shape.fields.findIndex((f) => f.name === field);
|
|
2364
|
+
if (index < 0)
|
|
2365
|
+
throw new InternalCompilerError(`llvm emitter bug: TextDecoder record lacks ${field}`);
|
|
2366
|
+
const p = B.tmp();
|
|
2367
|
+
const at = B.tmp();
|
|
2368
|
+
const offset = B.tmp();
|
|
2369
|
+
B.line(`${p} = getelementptr inbounds %${struct}, ptr %v, i64 0, i32 ${index + base} ; .${llvmCommentText(field)}`);
|
|
2370
|
+
B.line(`${at} = ptrtoint ptr ${p} to ${this.S}`);
|
|
2371
|
+
B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
|
|
2372
|
+
return `${this.S} ${offset}`;
|
|
2373
|
+
});
|
|
2374
|
+
host.declare(`declare ptr @scr_text_decoder_to_dyn(ptr, ptr, ptr, ${this.S}, ${this.S}, ${this.S}, ${this.S})`);
|
|
2375
|
+
B.line(`${r} = call ptr @scr_text_decoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
|
|
2376
|
+
}
|
|
2377
|
+
B.terminate(`ret ptr ${r}`);
|
|
2378
|
+
}
|
|
2162
2379
|
/* ── toDynHelper (walkers.ts, ported) ─────────────────────────── */
|
|
2163
2380
|
/** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn value from a
|
|
2164
2381
|
* static one (+1), DEEP-COPYING composites. Borrows the operand.
|
|
@@ -2170,16 +2387,16 @@ export class LlDyn {
|
|
|
2170
2387
|
return existing;
|
|
2171
2388
|
const name = `sc_td_${this.toDynFns.size}`;
|
|
2172
2389
|
this.toDynFns.set(key, name);
|
|
2390
|
+
this.host.journalAllocated?.(name, "dyn.toDynHelper", [t]);
|
|
2173
2391
|
const host = this.host;
|
|
2174
2392
|
const B = new BlockBuilder();
|
|
2175
2393
|
let sourceAccessor = null;
|
|
2176
2394
|
switch (t.kind) {
|
|
2177
2395
|
case "date": {
|
|
2178
|
-
// A Date handle holding the same
|
|
2179
|
-
|
|
2180
|
-
host.declare(`declare ptr @scr_dyn_native_date_from_ms(double)`);
|
|
2396
|
+
// A Date handle holding the same Date object.
|
|
2397
|
+
host.declare(`declare ptr @scr_dyn_native_date(ptr)`);
|
|
2181
2398
|
const r = B.tmp();
|
|
2182
|
-
B.line(`${r} = call ptr @
|
|
2399
|
+
B.line(`${r} = call ptr @scr_dyn_native_date(ptr %v)`);
|
|
2183
2400
|
B.terminate(`ret ptr ${r}`);
|
|
2184
2401
|
break;
|
|
2185
2402
|
}
|
|
@@ -2319,6 +2536,11 @@ export class LlDyn {
|
|
|
2319
2536
|
const shape = host.recordsById.get(t.shapeId);
|
|
2320
2537
|
if (!shape)
|
|
2321
2538
|
throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
|
|
2539
|
+
const codec = recordTextCodecClass(shape);
|
|
2540
|
+
if (codec !== null) {
|
|
2541
|
+
this.textCodecToDyn(B, t, shape, codec);
|
|
2542
|
+
break;
|
|
2543
|
+
}
|
|
2322
2544
|
const struct = mangleRecordStruct(t.shapeId);
|
|
2323
2545
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
2324
2546
|
const fieldIndex = new Map(shape.fields.map((f, i) => [f.name, i + base]));
|
|
@@ -2401,58 +2623,68 @@ export class LlDyn {
|
|
|
2401
2623
|
host.declare(`declare ptr @scr_dyn_new_obj()`);
|
|
2402
2624
|
B.line(`${d} = call ptr @scr_dyn_new_obj()`);
|
|
2403
2625
|
}
|
|
2404
|
-
// Keys insert in DECLARED order (JS insertion order)
|
|
2405
|
-
// '
|
|
2626
|
+
// Keys insert in DECLARED order (JS insertion order), or in the
|
|
2627
|
+
// value's own order for a shape with orderVariants; internal
|
|
2628
|
+
// '%'-fields follow so a record→dyn→record round trip keeps them
|
|
2629
|
+
// (all but the order index, which is no key).
|
|
2406
2630
|
const byName = new Map(shape.fields.map((f) => [f.name, f]));
|
|
2407
2631
|
// An accessor property is one key whose getter and setter are the
|
|
2408
2632
|
// slot closures (see accessorSlotProp), in accessorOrder's place.
|
|
2409
|
-
const
|
|
2410
|
-
const
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
B.
|
|
2453
|
-
B.
|
|
2633
|
+
const orders = shape.accessorOrder !== undefined ? [shape.accessorOrder] : shapeKeyOrders(shape);
|
|
2634
|
+
const perOrder = (order) => {
|
|
2635
|
+
const inOrder = new Set(order);
|
|
2636
|
+
const accessors = new Set(shape.accessorOrder === undefined
|
|
2637
|
+
? []
|
|
2638
|
+
: shape.fields.flatMap((f) => {
|
|
2639
|
+
const slot = accessorSlotProp(f.name);
|
|
2640
|
+
return slot === null ? [] : [slot.prop];
|
|
2641
|
+
}));
|
|
2642
|
+
const dynFields = [
|
|
2643
|
+
...order.flatMap((n) => {
|
|
2644
|
+
if (accessors.has(n))
|
|
2645
|
+
return [{ accessor: n }];
|
|
2646
|
+
const f = byName.get(n);
|
|
2647
|
+
return f === undefined ? [] : [f];
|
|
2648
|
+
}),
|
|
2649
|
+
...shape.fields.filter((f) => !inOrder.has(f.name) &&
|
|
2650
|
+
f.name !== KEY_ORDER_FIELD &&
|
|
2651
|
+
!(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
|
|
2652
|
+
];
|
|
2653
|
+
for (const entry of dynFields) {
|
|
2654
|
+
if ("accessor" in entry) {
|
|
2655
|
+
host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
|
|
2656
|
+
const boxed = (kind) => {
|
|
2657
|
+
const slot = byName.get(`%${kind}:${entry.accessor}`);
|
|
2658
|
+
if (slot === undefined)
|
|
2659
|
+
return "null";
|
|
2660
|
+
const fv = loadFieldOf(slot.name, slot.type);
|
|
2661
|
+
const conv = B.tmp();
|
|
2662
|
+
B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
|
|
2663
|
+
return conv;
|
|
2664
|
+
};
|
|
2665
|
+
const getter = boxed("get");
|
|
2666
|
+
const setter = boxed("set");
|
|
2667
|
+
B.line(`call void @scr_dyn_obj_set_accessor(ptr ${d}, ptr ${host.cstr(entry.accessor)}, ${host.sizeType} ${Buffer.byteLength(entry.accessor, "utf8")}, ptr ${getter}, ptr ${setter}) ; ${llvmCommentText(entry.accessor)}`);
|
|
2668
|
+
continue;
|
|
2669
|
+
}
|
|
2670
|
+
const f = entry;
|
|
2671
|
+
const klen = Buffer.byteLength(f.name, "utf8");
|
|
2672
|
+
const fv = loadFieldOf(f.name, f.type);
|
|
2673
|
+
// An ABSENT optional field contributes no key.
|
|
2674
|
+
const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
|
|
2675
|
+
const conv = B.tmp();
|
|
2676
|
+
B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
|
|
2677
|
+
B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
|
|
2678
|
+
if (lSkip !== null) {
|
|
2679
|
+
B.br(lSkip);
|
|
2680
|
+
B.startBlock(lSkip);
|
|
2681
|
+
}
|
|
2454
2682
|
}
|
|
2455
|
-
}
|
|
2683
|
+
};
|
|
2684
|
+
if (orders.length === 1)
|
|
2685
|
+
perOrder(orders[0]);
|
|
2686
|
+
else
|
|
2687
|
+
emitPerKeyOrder(B, shape, base, "%v", perOrder);
|
|
2456
2688
|
// A Dirent row takes Node's Dirent prototype (the type probes) and
|
|
2457
2689
|
// its Symbol(type) key; %dtype stays readable but non-enumerable.
|
|
2458
2690
|
if (isDirentShape(shape)) {
|
|
@@ -2724,6 +2956,7 @@ export class LlDyn {
|
|
|
2724
2956
|
if (sourceAccessor) {
|
|
2725
2957
|
this.defs.push(`define internal ptr @${sourceAccessor.name}(ptr %v, i1 %materialize) ${FN_ATTRS} { ; record source ${key}`, `entry:`, ` br i1 %materialize, label %snapshot, label %release`, `snapshot:`, ` %d = call ptr @${name}(ptr %v)`, ` ret ptr %d`, `release:`, ` call void ${sourceAccessor.release}(ptr %v)`, ` ret ptr null`, `}`, ``);
|
|
2726
2958
|
}
|
|
2959
|
+
this.host.journalBuilt?.();
|
|
2727
2960
|
return name;
|
|
2728
2961
|
}
|
|
2729
2962
|
/** The checked-dynamic tree-promise settle adapter for one fulfillment payload type —
|
|
@@ -2740,6 +2973,7 @@ export class LlDyn {
|
|
|
2740
2973
|
return existing;
|
|
2741
2974
|
const name = `sc_pda_${this.promiseDynAdapters.size}`;
|
|
2742
2975
|
this.promiseDynAdapters.set(key, name);
|
|
2976
|
+
this.host.journalAllocated?.(name, "dyn.promiseDynAdapterHelper", [inner]);
|
|
2743
2977
|
const host = this.host;
|
|
2744
2978
|
const B = new BlockBuilder();
|
|
2745
2979
|
host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
|
|
@@ -2811,6 +3045,7 @@ export class LlDyn {
|
|
|
2811
3045
|
}
|
|
2812
3046
|
B.terminate(`ret void`);
|
|
2813
3047
|
this.defs.push(`define internal void @${name}(ptr %dst, ptr %src) ${FN_ATTRS} { ; dyn-box settle adapter for promise<${key}>`, B.render(), `}`, ``);
|
|
3048
|
+
this.host.journalBuilt?.();
|
|
2814
3049
|
return name;
|
|
2815
3050
|
}
|
|
2816
3051
|
/* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
|
|
@@ -2822,6 +3057,7 @@ export class LlDyn {
|
|
|
2822
3057
|
return this.dynToStrFn;
|
|
2823
3058
|
const name = "sc_ds";
|
|
2824
3059
|
this.dynToStrFn = name;
|
|
3060
|
+
this.host.journalAllocated?.(name, "dyn.dynToStrHelper", []);
|
|
2825
3061
|
const host = this.host;
|
|
2826
3062
|
host.declare(`declare void @scr_jb_init(ptr)`);
|
|
2827
3063
|
host.declare(`declare ptr @scr_jb_finish(ptr)`);
|
|
@@ -3112,6 +3348,7 @@ export class LlDyn {
|
|
|
3112
3348
|
B.terminate(`ret ptr ${out}`);
|
|
3113
3349
|
this.defs.push(`define internal ptr @${name}(ptr %d) ${FN_ATTRS} { ; String(unknown) -> owned (+1)`, B.render(), `}`, ``);
|
|
3114
3350
|
}
|
|
3351
|
+
this.host.journalBuilt?.();
|
|
3115
3352
|
return name;
|
|
3116
3353
|
}
|
|
3117
3354
|
/* ── caughtToDyn (walkers.ts, ported) ─────────────────────────── */
|
|
@@ -3122,6 +3359,7 @@ export class LlDyn {
|
|
|
3122
3359
|
return this.caughtToDynFn;
|
|
3123
3360
|
const name = "sc_cd";
|
|
3124
3361
|
this.caughtToDynFn = name;
|
|
3362
|
+
this.host.journalAllocated?.(name, "dyn.caughtToDynHelper", []);
|
|
3125
3363
|
const host = this.host;
|
|
3126
3364
|
const B = new BlockBuilder();
|
|
3127
3365
|
const kp = B.tmp();
|
|
@@ -3220,6 +3458,7 @@ export class LlDyn {
|
|
|
3220
3458
|
B.terminate(`ret ptr ${e}`);
|
|
3221
3459
|
}
|
|
3222
3460
|
this.defs.push(`define internal ptr @${name}(ptr %c) ${FN_ATTRS} { ; caught -> unknown (+1, fresh tree)`, B.render(), `}`, ``);
|
|
3461
|
+
this.host.journalBuilt?.();
|
|
3223
3462
|
return name;
|
|
3224
3463
|
}
|
|
3225
3464
|
/* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
|
|
@@ -3232,6 +3471,7 @@ export class LlDyn {
|
|
|
3232
3471
|
this.helperMemo.set(name, name);
|
|
3233
3472
|
const B = new BlockBuilder();
|
|
3234
3473
|
const host = this.host;
|
|
3474
|
+
this.host.journalAllocated?.(name, "dyn.dynComputedKeyGetHelper", []);
|
|
3235
3475
|
const stringHelper = this.dynKeyGetHelper();
|
|
3236
3476
|
host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
|
|
3237
3477
|
host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
|
|
@@ -3264,6 +3504,7 @@ export class LlDyn {
|
|
|
3264
3504
|
B.line(`call void @scr_dyn_release(ptr ${key})`);
|
|
3265
3505
|
B.terminate(`ret ptr ${value}`);
|
|
3266
3506
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
|
|
3507
|
+
this.host.journalBuilt?.();
|
|
3267
3508
|
return name;
|
|
3268
3509
|
}
|
|
3269
3510
|
dynKeyGetHelper() {
|
|
@@ -3273,6 +3514,7 @@ export class LlDyn {
|
|
|
3273
3514
|
return existing;
|
|
3274
3515
|
const name = "sc_dyn_key_get";
|
|
3275
3516
|
this.dynBuilders.set(memoKey, name);
|
|
3517
|
+
this.host.journalAllocated?.(name, "dyn.dynKeyGetHelper", []);
|
|
3276
3518
|
const host = this.host;
|
|
3277
3519
|
const B = new BlockBuilder();
|
|
3278
3520
|
const kd = this.kindOf(B, "%d");
|
|
@@ -3651,6 +3893,7 @@ export class LlDyn {
|
|
|
3651
3893
|
}
|
|
3652
3894
|
retainUndef();
|
|
3653
3895
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %k, i1 zeroext %opt) ${FN_ATTRS} { ; d[k] on dyn`, B.render(), `}`, ``);
|
|
3896
|
+
this.host.journalBuilt?.();
|
|
3654
3897
|
return name;
|
|
3655
3898
|
}
|
|
3656
3899
|
/* ── destructuring RequireObjectCoercible (ported) ─────────────────── */
|
|
@@ -3661,6 +3904,7 @@ export class LlDyn {
|
|
|
3661
3904
|
return existing;
|
|
3662
3905
|
const name = "sc_dyn_destr_check";
|
|
3663
3906
|
this.dynBuilders.set(memoKey, name);
|
|
3907
|
+
this.host.journalAllocated?.(name, "dyn.dynDestrCheckHelper", []);
|
|
3664
3908
|
const host = this.host;
|
|
3665
3909
|
host.declare(`declare void @scr_jb_init(ptr)`);
|
|
3666
3910
|
host.declare(`declare ptr @scr_jb_finish(ptr)`);
|
|
@@ -3710,6 +3954,7 @@ export class LlDyn {
|
|
|
3710
3954
|
B.line(`call void @scr_throw_error(i32 1, ptr ${msg}) ; SCR_ERR_TYPE`);
|
|
3711
3955
|
B.terminate(`ret void`);
|
|
3712
3956
|
this.defs.push(`define internal void @${name}(ptr %d, ptr %spell, ptr %firstProp) ${FN_ATTRS} { ; destructuring RequireObjectCoercible`, B.render(), `}`, ``);
|
|
3957
|
+
this.host.journalBuilt?.();
|
|
3713
3958
|
return name;
|
|
3714
3959
|
}
|
|
3715
3960
|
/* ── GetIterator + first-N steps (dynIterNHelper, ported) ──────────── */
|
|
@@ -3720,6 +3965,7 @@ export class LlDyn {
|
|
|
3720
3965
|
return existing;
|
|
3721
3966
|
const name = "sc_dyn_iter_n";
|
|
3722
3967
|
this.dynBuilders.set(memoKey, name);
|
|
3968
|
+
this.host.journalAllocated?.(name, "dyn.dynIterNHelper", []);
|
|
3723
3969
|
const host = this.host;
|
|
3724
3970
|
host.declare(`declare ptr @scr_dyn_new_arr()`);
|
|
3725
3971
|
host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
|
|
@@ -3914,12 +4160,38 @@ export class LlDyn {
|
|
|
3914
4160
|
});
|
|
3915
4161
|
B.terminate(`ret ptr ${out}`);
|
|
3916
4162
|
this.defs.push(`define internal ptr @${name}(ptr %d, ${host.sizeType} %n, ptr %spelling) ${FN_ATTRS} { ; destructuring GetIterator + N steps`, B.render(), `}`, ``);
|
|
4163
|
+
this.host.journalBuilt?.();
|
|
3917
4164
|
return name;
|
|
3918
4165
|
}
|
|
3919
4166
|
/* ── the checked-dynamic function boundary (ported) ────────────────── */
|
|
3920
4167
|
/** The dyn argument spelling of one static value: dyn passes through
|
|
3921
4168
|
* (+1), funcs box anonymously, everything else rides toDyn. `expr` is
|
|
3922
4169
|
* BORROWED in every arm. Emits into the given builder. */
|
|
4170
|
+
/** A live capsule of a record or array value (+1; the value is
|
|
4171
|
+
* borrowed), as `dynFrom` with `liveRef` builds it; null for other
|
|
4172
|
+
* types. Closures boxed in a declaration-typed boundary program return
|
|
4173
|
+
* their records and arrays this way. */
|
|
4174
|
+
liveToDyn(B, t, expr) {
|
|
4175
|
+
const host = this.host;
|
|
4176
|
+
if (t.kind === "union") {
|
|
4177
|
+
const arms = host.unionsById.get(t.unionId)?.arms ?? [];
|
|
4178
|
+
if (!arms.some((arm) => arm.kind === "record" || arm.kind === "array"))
|
|
4179
|
+
return null;
|
|
4180
|
+
const boxed = B.tmp();
|
|
4181
|
+
B.line(`${boxed} = call ptr @${host.liveDynUnionRefAdapter(t)}(ptr ${expr})`);
|
|
4182
|
+
return boxed;
|
|
4183
|
+
}
|
|
4184
|
+
if ((t.kind !== "record" && t.kind !== "array") || !streamTypedRefEligible(t))
|
|
4185
|
+
return null;
|
|
4186
|
+
const key = typeKey(t);
|
|
4187
|
+
const adapter = host.liveDynRefAdapter(t);
|
|
4188
|
+
const rc = vAdapters(host, t);
|
|
4189
|
+
const boxed = B.tmp();
|
|
4190
|
+
B.line(`${boxed} = call ptr ${typedRefConstructor(host, t)}(ptr ${expr}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${host.cstr(key)}, ${host.sizeType} ${Buffer.byteLength(key, "utf8")}, ptr @${adapter.snapshot}, ptr ${adapter.commit})`);
|
|
4191
|
+
for (const line of bindLiveArrayOps(host, adapter, boxed))
|
|
4192
|
+
B.line(line);
|
|
4193
|
+
return boxed;
|
|
4194
|
+
}
|
|
3923
4195
|
toDynExpr(B, t, expr) {
|
|
3924
4196
|
if (t.kind === "dyn")
|
|
3925
4197
|
return this.retainDyn(B, expr);
|
|
@@ -3943,6 +4215,7 @@ export class LlDyn {
|
|
|
3943
4215
|
return existing;
|
|
3944
4216
|
const name = `sc_dfk_${this.dynFuncThunks.size}`;
|
|
3945
4217
|
this.dynFuncThunks.set(key, name);
|
|
4218
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncThunkHelper", [t]);
|
|
3946
4219
|
const host = this.host;
|
|
3947
4220
|
const B = new BlockBuilder();
|
|
3948
4221
|
const argNames = [];
|
|
@@ -4041,6 +4314,22 @@ export class LlDyn {
|
|
|
4041
4314
|
B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
|
|
4042
4315
|
});
|
|
4043
4316
|
}, "ptr null");
|
|
4317
|
+
// Declaration-typed boundary programs: an argument package code
|
|
4318
|
+
// passes keeps its identity (scr_dyn_decl_adopt).
|
|
4319
|
+
const capsule = this.host.declBoundary?.() === true ? this.liveToDyn(B, p, a) : null;
|
|
4320
|
+
if (capsule !== null) {
|
|
4321
|
+
host.declare(`declare void @scr_dyn_decl_adopt(ptr, ptr)`);
|
|
4322
|
+
host.declare(`declare void @scr_dyn_release(ptr)`);
|
|
4323
|
+
B.line(`call void @scr_dyn_decl_adopt(ptr ${ad}, ptr ${capsule})`);
|
|
4324
|
+
B.line(`call void @scr_dyn_release(ptr ${capsule})`);
|
|
4325
|
+
this.pendingBail(B, "dfk.adopt", () => {
|
|
4326
|
+
t.params.slice(0, i + 1).forEach((q, j) => {
|
|
4327
|
+
const name = j === i ? a : argNames[j];
|
|
4328
|
+
if (isRefCounted(q))
|
|
4329
|
+
B.line(`call void ${releaseSym(host, q)}(ptr ${name})`);
|
|
4330
|
+
});
|
|
4331
|
+
}, "ptr null");
|
|
4332
|
+
}
|
|
4044
4333
|
argNames.push(a);
|
|
4045
4334
|
}
|
|
4046
4335
|
});
|
|
@@ -4075,12 +4364,15 @@ export class LlDyn {
|
|
|
4075
4364
|
const r = B.tmp();
|
|
4076
4365
|
B.line(`${r} = call ${retTy} ${fn}(${callArgs})`);
|
|
4077
4366
|
this.pendingBail(B, "dfkr", () => { }, "ptr null");
|
|
4078
|
-
const out = this.
|
|
4367
|
+
const out = this.host.declBoundary?.() === true
|
|
4368
|
+
? (this.liveToDyn(B, t.ret, r) ?? this.toDynExpr(B, t.ret, r))
|
|
4369
|
+
: this.toDynExpr(B, t.ret, r);
|
|
4079
4370
|
if (isRefCounted(t.ret))
|
|
4080
4371
|
B.line(`call void ${releaseSym(host, t.ret)}(ptr ${r})`);
|
|
4081
4372
|
B.terminate(`ret ptr ${out}`);
|
|
4082
4373
|
}
|
|
4083
4374
|
this.defs.push(`define internal ptr @${name}(ptr %c, ptr %args, ${host.sizeType} %argc) ${FN_ATTRS} { ; dyn call thunk for ${key}`, B.render(), `}`, ``);
|
|
4375
|
+
this.host.journalBuilt?.();
|
|
4084
4376
|
return name;
|
|
4085
4377
|
}
|
|
4086
4378
|
/** The box builder dynFrom emits for one closure signature. */
|
|
@@ -4091,12 +4383,14 @@ export class LlDyn {
|
|
|
4091
4383
|
return existing;
|
|
4092
4384
|
const name = `sc_dfb_${this.dynFuncBoxes.size}`;
|
|
4093
4385
|
this.dynFuncBoxes.set(key, name);
|
|
4386
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncBoxHelper", [t]);
|
|
4094
4387
|
const host = this.host;
|
|
4095
4388
|
const thunk = this.dynFuncThunkHelper(t);
|
|
4096
4389
|
host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
|
|
4097
4390
|
host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
|
|
4098
4391
|
const sigLit = host.cstr(key);
|
|
4099
4392
|
this.defs.push(`define internal ptr @${name}(ptr %v, ptr %fname) ${FN_ATTRS} { ; box ${key} into dyn`, `entry:`, ` %c = call ptr @scr_closure_retain_v(ptr %v)`, ` %r = call ptr @scr_dyn_new_func(ptr %c, ptr @${thunk}, i32 ${t.params.length - (t.restAbi === "typed" ? 1 : 0)}, ptr ${sigLit}, ptr %fname)`, ` ret ptr %r`, `}`, ``);
|
|
4393
|
+
this.host.journalBuilt?.();
|
|
4100
4394
|
return name;
|
|
4101
4395
|
}
|
|
4102
4396
|
/** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
|
|
@@ -4118,11 +4412,15 @@ export class LlDyn {
|
|
|
4118
4412
|
(t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
|
|
4119
4413
|
this.messageReadable(param, new Set());
|
|
4120
4414
|
if (!supported) {
|
|
4415
|
+
// A signature without an entry still takes a number.
|
|
4121
4416
|
this.messageListeners.set(key, null);
|
|
4417
|
+
this.host.journalAllocated?.("", "dyn.messageListenerHelper", [t]);
|
|
4418
|
+
this.host.journalBuilt?.();
|
|
4122
4419
|
return null;
|
|
4123
4420
|
}
|
|
4124
4421
|
const name = `sc_dml_${this.messageListeners.size}`;
|
|
4125
4422
|
this.messageListeners.set(key, name);
|
|
4423
|
+
this.host.journalAllocated?.(name, "dyn.messageListenerHelper", [t]);
|
|
4126
4424
|
const B = new BlockBuilder();
|
|
4127
4425
|
B.entryAllocas.push(`%fail = alloca i1`);
|
|
4128
4426
|
B.line(`store i1 false, ptr %fail`);
|
|
@@ -4149,6 +4447,7 @@ export class LlDyn {
|
|
|
4149
4447
|
B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
|
|
4150
4448
|
B.terminate(`ret i1 true`);
|
|
4151
4449
|
this.defs.push(`define internal zeroext i1 @${name}(ptr %c, ptr %m) ${FN_ATTRS} { ; message entry for ${llvmCommentText(key)}`, B.render(), `}`, ``);
|
|
4450
|
+
this.host.journalBuilt?.();
|
|
4152
4451
|
return name;
|
|
4153
4452
|
}
|
|
4154
4453
|
/** Whether a message reader can build T: numbers, booleans and strings;
|
|
@@ -4212,6 +4511,7 @@ export class LlDyn {
|
|
|
4212
4511
|
return existing;
|
|
4213
4512
|
const name = `sc_dmr_${this.messageReaders.size}`;
|
|
4214
4513
|
this.messageReaders.set(key, name);
|
|
4514
|
+
this.host.journalAllocated?.(name, "dyn.messageReaderHelper", [t]);
|
|
4215
4515
|
const host = this.host;
|
|
4216
4516
|
const S = host.sizeType;
|
|
4217
4517
|
if (t.kind !== "record")
|
|
@@ -4370,6 +4670,7 @@ export class LlDyn {
|
|
|
4370
4670
|
B.line(`store i1 true, ptr %fail`);
|
|
4371
4671
|
B.terminate(`ret ${retTy} ${dummy}`);
|
|
4372
4672
|
this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(ptr %m, ${S} %n, ptr %fail) ${FN_ATTRS} { ; message reader for ${llvmCommentText(key)}`, B.render(), `}`, ``);
|
|
4673
|
+
this.host.journalBuilt?.();
|
|
4373
4674
|
return name;
|
|
4374
4675
|
}
|
|
4375
4676
|
/** The adapter closure body for one TARGET signature: caps[0] is an
|
|
@@ -4381,6 +4682,7 @@ export class LlDyn {
|
|
|
4381
4682
|
return existing;
|
|
4382
4683
|
const name = `sc_dfa_${this.dynFuncAdapters.size}`;
|
|
4383
4684
|
this.dynFuncAdapters.set(key, name);
|
|
4685
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncAdapterHelper", [t]);
|
|
4384
4686
|
const host = this.host;
|
|
4385
4687
|
const B = new BlockBuilder();
|
|
4386
4688
|
host.declare(`declare ptr @scr_box_get_ref(ptr)`);
|
|
@@ -4475,6 +4777,7 @@ export class LlDyn {
|
|
|
4475
4777
|
...(checkedRest ? ["ptr %rest"] : []),
|
|
4476
4778
|
].join(", ");
|
|
4477
4779
|
this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(${params}) ${FN_ATTRS} { ; dyn fn adapter to ${key}`, B.render(), `}`, ``);
|
|
4780
|
+
this.host.journalBuilt?.();
|
|
4478
4781
|
return name;
|
|
4479
4782
|
}
|
|
4480
4783
|
}
|