@scriptc/compiler 0.4.1 → 0.4.3
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 +977 -113
- package/dist/backend/cycle-analysis.d.ts +5 -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 +9 -1
- package/dist/backend/cycle-mutability.js +21 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +6 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +7 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +5 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +23 -4
- package/dist/backend/llvm/alloc.js +61 -8
- 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 +23 -10
- 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 +70 -7
- package/dist/backend/llvm/bytes-loop-versions.js +567 -30
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +389 -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 +74 -1
- package/dist/backend/llvm/classes.js +364 -54
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +384 -17
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +10 -6
- package/dist/backend/llvm/common.js +10 -6
- 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 +91 -56
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +4 -4
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +11 -1
- package/dist/backend/llvm/counted-loops.js +80 -23
- package/dist/backend/llvm/counted-loops.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 +35 -16
- package/dist/backend/llvm/dense-array-loops.js +237 -12
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +140 -15
- 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 +51 -1
- package/dist/backend/llvm/dyn.js +683 -69
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +33 -26
- 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 +208 -34
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -27
- package/dist/backend/llvm/emit-statements.js +577 -93
- 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 +314 -49
- package/dist/backend/llvm/emitter.js +1241 -129
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +54 -5
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -0
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +5 -2
- package/dist/backend/llvm/expr-bytes.js +144 -52
- 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.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +62 -36
- 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 +148 -40
- 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-control.js +2 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +71 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +126 -36
- 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 +225 -64
- 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 +200 -50
- 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 +20 -1
- package/dist/backend/llvm/integer-values.js +71 -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 +90 -2
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +65 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +4 -0
- package/dist/backend/llvm/lib-http2.js +24 -17
- 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 +65 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +126 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +97 -30
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +23 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +181 -64
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +28 -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 +18 -1
- package/dist/backend/llvm/publish.js +76 -25
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +7 -2
- 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-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +91 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.js +161 -14
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +18 -0
- package/dist/backend/llvm/regex-matchers.test.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 +79 -21
- package/dist/backend/llvm/shapes.js +233 -42
- 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-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-lifetimes.test.js +2 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +15 -0
- package/dist/backend/llvm/string-reads.js +128 -0
- package/dist/backend/llvm/string-reads.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 +88 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +6 -5
- package/dist/backend/llvm/wasm-modules.js +32 -9
- package/dist/backend/llvm/wasm-modules.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/mangle.d.ts +3 -0
- package/dist/backend/mangle.js +5 -0
- package/dist/backend/mangle.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 +27 -4
- package/dist/backend/native/executable.js +31 -8
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -0
- package/dist/backend/native/library.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.d.ts +11 -6
- package/dist/backend/native-codegen.js +36 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +0 -23
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +18 -4
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/optimization.d.ts +2 -2
- 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 +2 -1
- package/dist/backend/runtime-pack-core.js +2 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +5 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +0 -21
- package/dist/backend/runtime-pack.js +0 -29
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +10 -69
- 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-diagnostics.js +33 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +4 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +26 -6
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +5 -1
- package/dist/cli/usage.js +10 -5
- 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/contracts/check.js +5 -4
- 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.d.ts +7 -2
- package/dist/coverage/report.js +30 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -0
- package/dist/coverage/verdict-cache.js +4 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-semantic.js +4 -0
- package/dist/coverage/verdict-semantic.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.d.ts +40 -0
- package/dist/diagnostics/dynamic-tier.js +57 -0
- package/dist/diagnostics/dynamic-tier.js.map +1 -0
- package/dist/diagnostics/envelope.d.ts +5 -1
- package/dist/diagnostics/envelope.js +6 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +25 -1
- package/dist/executable/executable-cache.js +60 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +46 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +3 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +854 -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/dispose-hook.d.ts +2 -0
- package/dist/frontend/dispose-hook.js +14 -0
- package/dist/frontend/dispose-hook.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/jsx-entities.d.ts +4 -0
- package/dist/frontend/jsx-entities.js +259 -0
- package/dist/frontend/jsx-entities.js.map +1 -0
- package/dist/frontend/jsx-source.d.ts +71 -0
- package/dist/frontend/jsx-source.js +781 -0
- package/dist/frontend/jsx-source.js.map +1 -0
- package/dist/frontend/jsx-source.test.d.ts +1 -0
- package/dist/frontend/jsx-source.test.js +200 -0
- package/dist/frontend/jsx-source.test.js.map +1 -0
- package/dist/frontend/literal-values.test.js +8 -9
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +103 -4
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +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/arguments.d.ts +3 -0
- package/dist/frontend/lowering/builtins/arguments.js +30 -15
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +10 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-async.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-sync.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-sync.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.d.ts +4 -2
- package/dist/frontend/lowering/builtins/crypto.js +136 -5
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
- package/dist/frontend/lowering/builtins/ecdh.js +7 -7
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- 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/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +2 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +18 -6
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.js +4 -3
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.js +3 -2
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +3 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +91 -4
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
- package/dist/frontend/lowering/builtins/readline.js +58 -9
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +1 -1
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +28 -4
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.js +2 -1
- package/dist/frontend/lowering/builtins/v8.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/builtins/webcrypto.js +39 -20
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +2 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +13 -6
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.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 +6 -2
- package/dist/frontend/lowering/class-construction.js +25 -16
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +1 -1
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -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 +35 -9
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +1 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +7 -0
- package/dist/frontend/lowering/class-protocols.js +64 -4
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +67 -5
- 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/class-to-primitive.js +25 -5
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
- package/dist/frontend/lowering/coercions/function-adapters.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 +99 -8
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.js +8 -7
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -1
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- 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 +7 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +12 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +25 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +21 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
- package/dist/frontend/lowering/containers/bytes.js +131 -29
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +15 -9
- 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 +54 -14
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
- package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +45 -20
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.js +25 -4
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +218 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
- package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
- package/dist/frontend/lowering/dyn-streams.js +1 -1
- package/dist/frontend/lowering/dyn-streams.js.map +1 -1
- package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
- package/dist/frontend/lowering/dynamic-tier.js +327 -0
- package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +51 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +62 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +81 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +107 -14
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +79 -11
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +130 -6
- 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 -3
- package/dist/frontend/lowering/expressions/object-literals.js +164 -56
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
- package/dist/frontend/lowering/expressions/property-access.js +211 -17
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +267 -30
- package/dist/frontend/lowering/expressions/relational.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 +85 -12
- 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 +49 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +42 -1
- package/dist/frontend/lowering/generic-functions.js +455 -20
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- 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 +195 -9
- 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/js-dynamic-objects.js +3 -2
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
- package/dist/frontend/lowering/json-require.js +2 -1
- package/dist/frontend/lowering/json-require.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
- package/dist/frontend/lowering/key-order-witness.js +790 -25
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +466 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.js +2 -1
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +6 -5
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +7 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +11 -0
- package/dist/frontend/lowering/lower-calls.js +776 -126
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +29 -2
- package/dist/frontend/lowering/lower-classes.js +581 -46
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +6 -3
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
- package/dist/frontend/lowering/lower-event-emitter.js +267 -20
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
- package/dist/frontend/lowering/lower-exprs.js +126 -13
- 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 +387 -72
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +41 -31
- 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.js +28 -12
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +47 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +9 -4
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +10 -0
- package/dist/frontend/lowering/lower-server.js +239 -61
- 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 +42 -10
- 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 +622 -68
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +2055 -318
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +4 -3
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +197 -29
- package/dist/frontend/lowering/lowerer.js +862 -84
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +21 -9
- package/dist/frontend/lowering/lowerer.test.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/narrowing-stability.js +5 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +1 -1
- package/dist/frontend/lowering/native-ffi.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-enumeration-receiver.js +2 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +9 -0
- package/dist/frontend/lowering/private-brands.js +66 -15
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
- package/dist/frontend/lowering/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +2 -2
- package/dist/frontend/lowering/static-typeof.js +42 -3
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +60 -32
- 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 +66 -16
- 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-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +8 -0
- package/dist/frontend/npm-static.js +51 -22
- 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 +18 -10
- 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.d.ts +21 -1
- package/dist/frontend/program.js +586 -74
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +44 -4
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/services.d.ts +6 -0
- package/dist/frontend/services.js +18 -0
- package/dist/frontend/services.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 +43 -7
- package/dist/frontend/ts7/ast-node.js +1176 -129
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +84 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +29 -3
- package/dist/frontend/ts7/ast-wire.js +144 -31
- 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/ast.d.ts +23 -2
- package/dist/frontend/ts7/ast.js +143 -2
- package/dist/frontend/ts7/ast.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 +17 -1
- package/dist/frontend/ts7/checker.js +82 -1
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +9 -6
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.d.ts +3 -3
- package/dist/frontend/ts7/enums.generated.d.ts +10 -0
- package/dist/frontend/ts7/enums.generated.js +21 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -1
- package/dist/frontend/ts7/enums.js +19 -0
- package/dist/frontend/ts7/enums.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 +30 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
- package/dist/frontend/ts7/semantic-checker.js +25 -20
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +13 -0
- package/dist/frontend/ts7/semantic-json.js +146 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +57 -1
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +15 -0
- package/dist/frontend/ts7/semantic-model.js +67 -19
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +23 -1
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +1 -1
- package/dist/frontend/tsc-codes.js +7 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +51 -7
- package/dist/frontend/type-mapper.js +456 -43
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +1 -1
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend-process-args.d.ts +4 -0
- package/dist/frontend-process-args.js +52 -0
- package/dist/frontend-process-args.js.map +1 -0
- package/dist/frontend-process-args.test.d.ts +1 -0
- package/dist/frontend-process-args.test.js +47 -0
- package/dist/frontend-process-args.test.js.map +1 -0
- package/dist/frontend-process.d.ts +1 -0
- package/dist/frontend-process.js +23 -0
- package/dist/frontend-process.js.map +1 -0
- package/dist/heap-collection.d.ts +16 -0
- package/dist/heap-collection.js +42 -0
- package/dist/heap-collection.js.map +1 -0
- package/dist/heap-collection.test.d.ts +1 -0
- package/dist/heap-collection.test.js +59 -0
- package/dist/heap-collection.test.js.map +1 -0
- package/dist/heap-pressure.d.ts +2 -0
- package/dist/heap-pressure.js +12 -0
- package/dist/heap-pressure.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +435 -89
- 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 +26 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +49 -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 +80 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -1
- package/dist/ir/builtin-signatures.js +303 -21
- 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 +3 -1
- package/dist/ir/final-fields.js +15 -17
- 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 +5 -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 +36 -6
- package/dist/ir/int32-slots.js +370 -171
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +3 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +9 -4
- package/dist/ir/integer-loop-facts.js +93 -18
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +202 -40
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +211 -1
- 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 +94 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +87 -9
- package/dist/ir/ir.js +61 -2
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +21 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +19 -2
- package/dist/ir/js-ic.js +95 -11
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +188 -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 +60 -15
- package/dist/ir/runtime-features.js +276 -35
- 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/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.d.ts +2 -0
- package/dist/ir/traverse.js +29 -5
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +171 -45
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +12 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/prepare.js +2 -0
- package/dist/library/prepare.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 +26 -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 +3 -1
- package/dist/native/prepare.js +123 -31
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +78 -18
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +6 -1
- 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/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/text-parts.d.ts +7 -0
- package/dist/text-parts.js +44 -0
- package/dist/text-parts.js.map +1 -1
- package/dist/text-parts.test.d.ts +1 -0
- package/dist/text-parts.test.js +46 -0
- package/dist/text-parts.test.js.map +1 -0
- package/dist/timing.d.ts +9 -2
- package/dist/timing.js +7 -4
- package/dist/timing.js.map +1 -1
- package/dist/wasm/translate.d.ts +4 -0
- package/dist/wasm/translate.js +2 -2
- package/dist/wasm/translate.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/shims/undici/core/client.ts +4 -4
- package/surface-manifest.json +44 -52
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. */
|
|
@@ -54,6 +64,14 @@ const DYN_HANDLE_BOX_FN = {
|
|
|
54
64
|
const DYN_HANDLE_UNBOX_FN = {
|
|
55
65
|
dgramSocket: "scr_dgram_from_dyn",
|
|
56
66
|
};
|
|
67
|
+
/** ScrMessageKind (scr_message.h): the node kinds message readers test. */
|
|
68
|
+
const MESSAGE_KIND = {
|
|
69
|
+
UNDEFINED: 0,
|
|
70
|
+
NULL: 1,
|
|
71
|
+
BOOL: 2,
|
|
72
|
+
NUMBER: 3,
|
|
73
|
+
STRING: 4,
|
|
74
|
+
};
|
|
57
75
|
export const DYN_KIND = {
|
|
58
76
|
NULL: 0,
|
|
59
77
|
BOOL: 1,
|
|
@@ -92,6 +110,8 @@ export class LlDyn {
|
|
|
92
110
|
dynFuncThunks = new Map();
|
|
93
111
|
dynFuncBoxes = new Map();
|
|
94
112
|
dynFuncAdapters = new Map();
|
|
113
|
+
messageListeners = new Map();
|
|
114
|
+
messageReaders = new Map();
|
|
95
115
|
promiseDynAdapters = new Map();
|
|
96
116
|
mapDynOps = new Map();
|
|
97
117
|
dynToStrFn = null;
|
|
@@ -104,6 +124,54 @@ export class LlDyn {
|
|
|
104
124
|
constructor(host) {
|
|
105
125
|
this.host = host;
|
|
106
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
|
+
}
|
|
107
175
|
/** The types a dyn matcher or builder for `t` checks structurally: record
|
|
108
176
|
* fields and index values, array elements and union arms. */
|
|
109
177
|
structuralChildren(t) {
|
|
@@ -208,6 +276,34 @@ export class LlDyn {
|
|
|
208
276
|
this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
|
|
209
277
|
B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
|
|
210
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
|
+
}
|
|
211
307
|
/** Branch to a variant only after its literal discriminator and complete
|
|
212
308
|
* structure match. Use the same path for predicates and builders. */
|
|
213
309
|
unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
|
|
@@ -261,6 +357,7 @@ export class LlDyn {
|
|
|
261
357
|
return prior;
|
|
262
358
|
const name = `sc_map_dyn_${this.mapDynOps.size}`;
|
|
263
359
|
this.mapDynOps.set(key, name);
|
|
360
|
+
this.host.journalAllocated?.(name, "dyn.collectionDynOps", [t]);
|
|
264
361
|
const keyType = t.kind === "map" ? t.key : t.elem;
|
|
265
362
|
const valueType = t.kind === "map" ? t.value : { kind: "f64" };
|
|
266
363
|
const emitSlot = (type, role) => {
|
|
@@ -301,6 +398,7 @@ export class LlDyn {
|
|
|
301
398
|
emitSlot(keyType, "key");
|
|
302
399
|
emitSlot(valueType, "value");
|
|
303
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?.();
|
|
304
402
|
return name;
|
|
305
403
|
}
|
|
306
404
|
/* ── dyn node plumbing ─────────────────────────────────────────────── */
|
|
@@ -641,6 +739,17 @@ export class LlDyn {
|
|
|
641
739
|
return existing;
|
|
642
740
|
const name = `sc_dm_${this.dynMatchers.size}`;
|
|
643
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
|
+
}
|
|
644
753
|
const recursive = this.isRecursiveShape(t);
|
|
645
754
|
const wrapped = recursive || this.holdsRecursiveShape(t);
|
|
646
755
|
const B = new BlockBuilder();
|
|
@@ -846,9 +955,10 @@ export class LlDyn {
|
|
|
846
955
|
}
|
|
847
956
|
B.condBr(readable, l0, fail);
|
|
848
957
|
B.startBlock(l0);
|
|
849
|
-
// dyn ('unknown') fields match ANY value, present or missing.
|
|
958
|
+
// dyn ('unknown') fields match ANY value, present or missing. The
|
|
959
|
+
// order index is no key.
|
|
850
960
|
for (const f of shape.fields) {
|
|
851
|
-
if (f.type.kind === "dyn")
|
|
961
|
+
if (f.type.kind === "dyn" || f.name === KEY_ORDER_FIELD)
|
|
852
962
|
continue;
|
|
853
963
|
const { value: m, release } = this.memberRead(B, f.name, f.type);
|
|
854
964
|
const lNext = B.newLabel("dm.n");
|
|
@@ -976,6 +1086,7 @@ export class LlDyn {
|
|
|
976
1086
|
this.defs.push(`define internal zeroext i1 @${wrapped ? `${name}_body` : name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
|
|
977
1087
|
if (wrapped)
|
|
978
1088
|
this.emitVisitWrapper(name, t, recursive ? "match" : "visit");
|
|
1089
|
+
this.host.journalBuilt?.();
|
|
979
1090
|
return name;
|
|
980
1091
|
}
|
|
981
1092
|
/* ── schema-directed JSON.parse ───────────────────────────────── */
|
|
@@ -1012,9 +1123,10 @@ export class LlDyn {
|
|
|
1012
1123
|
if (shape.fields.length > 64 || (shape.fields.length === 0 && !index))
|
|
1013
1124
|
return false;
|
|
1014
1125
|
visiting.add(t.shapeId);
|
|
1015
|
-
return (shape.fields.every((f) =>
|
|
1016
|
-
f.name
|
|
1017
|
-
|
|
1126
|
+
return (shape.fields.every((f) => f.name === KEY_ORDER_FIELD ||
|
|
1127
|
+
(!f.name.startsWith("%") &&
|
|
1128
|
+
f.name !== "__proto__" &&
|
|
1129
|
+
this.jsonSchemaSupported(f.type, visiting, true))) &&
|
|
1018
1130
|
(!index || this.jsonSchemaSupported(index, visiting)));
|
|
1019
1131
|
}
|
|
1020
1132
|
case "union":
|
|
@@ -1063,6 +1175,7 @@ export class LlDyn {
|
|
|
1063
1175
|
const S = host.sizeType;
|
|
1064
1176
|
const name = `sc_jsch_${this.jsonSchemas.size}`;
|
|
1065
1177
|
this.jsonSchemas.set(key, name);
|
|
1178
|
+
this.host.journalAllocated?.(name, "dyn.jsonSchema", [t]);
|
|
1066
1179
|
let body;
|
|
1067
1180
|
switch (t.kind) {
|
|
1068
1181
|
case "f64":
|
|
@@ -1087,7 +1200,9 @@ export class LlDyn {
|
|
|
1087
1200
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
1088
1201
|
const index = new Map(shape.fields.map((f, i) => [f.name, i + base]));
|
|
1089
1202
|
// The runtime names kept-source keys by this index (record-sources.ts).
|
|
1090
|
-
|
|
1203
|
+
// The order index is no key: parsed values keep the table's order
|
|
1204
|
+
// and their source's own order.
|
|
1205
|
+
const order = recordSourceFieldOrder(shape).filter((name) => name !== KEY_ORDER_FIELD);
|
|
1091
1206
|
if (recordMayKeepSource(shape))
|
|
1092
1207
|
this.keepsRecordSources = true;
|
|
1093
1208
|
const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
|
|
@@ -1120,6 +1235,7 @@ export class LlDyn {
|
|
|
1120
1235
|
throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
|
|
1121
1236
|
}
|
|
1122
1237
|
this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr, ptr, ${S} } { ${body} }`, ``);
|
|
1238
|
+
this.host.journalBuilt?.();
|
|
1123
1239
|
return name;
|
|
1124
1240
|
}
|
|
1125
1241
|
/** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
|
|
@@ -1190,9 +1306,11 @@ export class LlDyn {
|
|
|
1190
1306
|
const base = `sc_rnames_${this.recordNameTables.size}`;
|
|
1191
1307
|
const table = { names: `@${base}`, lens: `@${base}_lens` };
|
|
1192
1308
|
this.recordNameTables.set(shapeId, table);
|
|
1309
|
+
this.host.journalAllocated?.(base, "dyn.recordNameTable", [shapeId]);
|
|
1193
1310
|
const n = shape.fields.length;
|
|
1194
1311
|
const names = recordSourceFieldOrder(shape);
|
|
1195
1312
|
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(", ")}]`, ``);
|
|
1313
|
+
this.host.journalBuilt?.();
|
|
1196
1314
|
return table;
|
|
1197
1315
|
}
|
|
1198
1316
|
/** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
|
|
@@ -1213,12 +1331,14 @@ export class LlDyn {
|
|
|
1213
1331
|
const host = this.host;
|
|
1214
1332
|
const name = `sc_jp_${this.jsonParsers.size}`;
|
|
1215
1333
|
this.jsonParsers.set(key, name);
|
|
1334
|
+
this.host.journalAllocated?.(name, "dyn.jsonParseHelper", [t]);
|
|
1216
1335
|
const schema = this.jsonSchema(t);
|
|
1217
1336
|
const check = this.dynCheckHelper(t);
|
|
1218
1337
|
host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
|
|
1219
1338
|
host.declare(`declare ptr @scr_json_parse(ptr)`);
|
|
1220
1339
|
host.declare(`declare void @scr_dyn_release(ptr)`);
|
|
1221
1340
|
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`, `}`, ``);
|
|
1341
|
+
this.host.journalBuilt?.();
|
|
1222
1342
|
return name;
|
|
1223
1343
|
}
|
|
1224
1344
|
/* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
|
|
@@ -1233,6 +1353,7 @@ export class LlDyn {
|
|
|
1233
1353
|
return existing;
|
|
1234
1354
|
const name = `sc_dc_${this.dynBuilders.size}`;
|
|
1235
1355
|
this.dynBuilders.set(builderKey, name);
|
|
1356
|
+
this.host.journalAllocated?.(name, "dyn.dynCheckHelper", [t, preserveRefs]);
|
|
1236
1357
|
const recursive = this.isRecursiveShape(t);
|
|
1237
1358
|
const memo = !recursive && this.holdsRecursiveShape(t) && this.valTy(t) === "ptr";
|
|
1238
1359
|
const host = this.host;
|
|
@@ -1247,6 +1368,18 @@ export class LlDyn {
|
|
|
1247
1368
|
B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
|
|
1248
1369
|
B.terminate(`ret ptr ${checked}`);
|
|
1249
1370
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
|
|
1371
|
+
this.host.journalBuilt?.();
|
|
1372
|
+
return name;
|
|
1373
|
+
}
|
|
1374
|
+
const codec = textCodecRecordClass(t, (id) => host.recordsById.get(id));
|
|
1375
|
+
if (codec !== null) {
|
|
1376
|
+
// The record the codec's handle box holds (+1), or the path TypeError.
|
|
1377
|
+
host.declare(`declare ptr @scr_text_codec_from_dyn(ptr, i1 zeroext, ptr, ptr)`);
|
|
1378
|
+
const checked = B.tmp();
|
|
1379
|
+
B.line(`${checked} = call ptr @scr_text_codec_from_dyn(ptr %d, i1 ${codec === "TextDecoder"}, ptr %path, ptr ${want})`);
|
|
1380
|
+
B.terminate(`ret ptr ${checked}`);
|
|
1381
|
+
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %path) ${FN_ATTRS} {`, B.render(), `}`, ``);
|
|
1382
|
+
this.host.journalBuilt?.();
|
|
1250
1383
|
return name;
|
|
1251
1384
|
}
|
|
1252
1385
|
if (isRefCounted(t) && t.kind !== "dyn") {
|
|
@@ -1406,6 +1539,26 @@ export class LlDyn {
|
|
|
1406
1539
|
B.line(`store ${member.type} ${oldValue}, ptr ${checkedPtr}`);
|
|
1407
1540
|
});
|
|
1408
1541
|
if (t.kind !== "record") {
|
|
1542
|
+
// Whether the dense slots carry states (SCR_ARR_STATES in
|
|
1543
|
+
// `spare`) moves with them; the rest of `spare` stays.
|
|
1544
|
+
const cachedSpare = B.tmp(), checkedSpare = B.tmp();
|
|
1545
|
+
const sparePtr = (array) => {
|
|
1546
|
+
const ptr = B.tmp();
|
|
1547
|
+
B.line(`${ptr} = getelementptr inbounds %ScrArr, ptr ${array}, i64 0, i32 ${SCR_ARR_FIELD.spare}`);
|
|
1548
|
+
return ptr;
|
|
1549
|
+
};
|
|
1550
|
+
const cachedSparePtr = sparePtr(cached), checkedSparePtr = sparePtr(checked);
|
|
1551
|
+
B.line(`${cachedSpare} = load i16, ptr ${cachedSparePtr}`);
|
|
1552
|
+
B.line(`${checkedSpare} = load i16, ptr ${checkedSparePtr}`);
|
|
1553
|
+
const exchange = (own, other, ptr) => {
|
|
1554
|
+
const kept = B.tmp(), moved = B.tmp(), next = B.tmp();
|
|
1555
|
+
B.line(`${kept} = and i16 ${own}, ${~SCR_ARR_STATES}`);
|
|
1556
|
+
B.line(`${moved} = and i16 ${other}, ${SCR_ARR_STATES}`);
|
|
1557
|
+
B.line(`${next} = or i16 ${kept}, ${moved}`);
|
|
1558
|
+
B.line(`store i16 ${next}, ptr ${ptr}`);
|
|
1559
|
+
};
|
|
1560
|
+
exchange(cachedSpare, checkedSpare, cachedSparePtr);
|
|
1561
|
+
exchange(checkedSpare, cachedSpare, checkedSparePtr);
|
|
1409
1562
|
// Sparse slots and numeric properties live out of line; each
|
|
1410
1563
|
// array keeps its own match metadata.
|
|
1411
1564
|
host.declare("declare void @scr_arr_swap_indexed_ext(ptr, ptr)");
|
|
@@ -1736,7 +1889,11 @@ export class LlDyn {
|
|
|
1736
1889
|
B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
|
|
1737
1890
|
if (recursive)
|
|
1738
1891
|
this.recordBuilt(B, name, "%r0");
|
|
1892
|
+
// The order index stays 0: the source's own order is kept below
|
|
1893
|
+
// when it differs from the table.
|
|
1739
1894
|
for (const f of shape.fields) {
|
|
1895
|
+
if (f.name === KEY_ORDER_FIELD)
|
|
1896
|
+
continue;
|
|
1740
1897
|
const { value: m, release } = this.memberRead(B, f.name, f.type);
|
|
1741
1898
|
this.pendingBail(B, "dcr.read", () => {
|
|
1742
1899
|
B.line(`call void @${release}(ptr ${m})`);
|
|
@@ -1904,9 +2061,10 @@ export class LlDyn {
|
|
|
1904
2061
|
const def = host.unionsById.get(t.unionId);
|
|
1905
2062
|
if (!def)
|
|
1906
2063
|
throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
|
|
1907
|
-
// Arms in
|
|
1908
|
-
//
|
|
1909
|
-
|
|
2064
|
+
// Arms in unionArmOrder, first FULL match wins. The matched arm's
|
|
2065
|
+
// builder can no longer fail.
|
|
2066
|
+
for (const i of this.unionArmOrder(def)) {
|
|
2067
|
+
const arm = def.arms[i];
|
|
1910
2068
|
const lHit = B.newLabel("dcu.h");
|
|
1911
2069
|
const lNext = B.newLabel("dcu.n");
|
|
1912
2070
|
this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
|
|
@@ -1948,7 +2106,7 @@ export class LlDyn {
|
|
|
1948
2106
|
B.terminate(`ret ptr ${u}`);
|
|
1949
2107
|
}
|
|
1950
2108
|
B.startBlock(lNext);
|
|
1951
|
-
}
|
|
2109
|
+
}
|
|
1952
2110
|
if (preserveRefs) {
|
|
1953
2111
|
B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
|
|
1954
2112
|
B.terminate(`ret ptr null`);
|
|
@@ -2147,8 +2305,64 @@ export class LlDyn {
|
|
|
2147
2305
|
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(), `}`, ``);
|
|
2148
2306
|
if (recursive || memo)
|
|
2149
2307
|
this.emitVisitWrapper(name, t, recursive ? "build" : "memo");
|
|
2308
|
+
this.host.journalBuilt?.();
|
|
2150
2309
|
return name;
|
|
2151
2310
|
}
|
|
2311
|
+
/** `i1`: %d is a handle box with tag `tag`. */
|
|
2312
|
+
handleTagMatches(B, tag) {
|
|
2313
|
+
const kd = this.kindOf(B, "%d");
|
|
2314
|
+
const isHandle = B.tmp();
|
|
2315
|
+
B.line(`${isHandle} = icmp eq i32 ${kd}, ${DYN_KIND.HANDLE}`);
|
|
2316
|
+
const lHandle = B.newLabel("dm.handle");
|
|
2317
|
+
const lDone = B.newLabel("dm.handle.done");
|
|
2318
|
+
const entry = B.currentLabel();
|
|
2319
|
+
B.condBr(isHandle, lHandle, lDone);
|
|
2320
|
+
B.startBlock(lHandle);
|
|
2321
|
+
const tagPtr = B.tmp();
|
|
2322
|
+
const loaded = B.tmp();
|
|
2323
|
+
B.line(`${tagPtr} = getelementptr inbounds i8, ptr %d, i64 ${this.abiOffset(24, 20)} ; ->v.handle.tag`);
|
|
2324
|
+
B.line(`${loaded} = load i32, ptr ${tagPtr}`);
|
|
2325
|
+
const same = B.tmp();
|
|
2326
|
+
B.line(`${same} = icmp eq i32 ${loaded}, ${tag}`);
|
|
2327
|
+
B.br(lDone);
|
|
2328
|
+
B.startBlock(lDone);
|
|
2329
|
+
const matched = B.tmp();
|
|
2330
|
+
B.line(`${matched} = phi i1 [ false, %${entry} ], [ ${same}, %${lHandle} ]`);
|
|
2331
|
+
return matched;
|
|
2332
|
+
}
|
|
2333
|
+
/** A TextEncoder or TextDecoder record boxes as its handle (+1), which
|
|
2334
|
+
* holds the record by reference. A decoder passes the byte offsets of the
|
|
2335
|
+
* fields its boxed decode reads. */
|
|
2336
|
+
textCodecToDyn(B, t, shape, codec) {
|
|
2337
|
+
const host = this.host;
|
|
2338
|
+
const rc = vAdapters(host, t);
|
|
2339
|
+
const r = B.tmp();
|
|
2340
|
+
if (codec === "TextEncoder") {
|
|
2341
|
+
host.declare(`declare ptr @scr_text_encoder_to_dyn(ptr, ptr, ptr)`);
|
|
2342
|
+
B.line(`${r} = call ptr @scr_text_encoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release})`);
|
|
2343
|
+
}
|
|
2344
|
+
else {
|
|
2345
|
+
const struct = mangleRecordStruct(t.shapeId);
|
|
2346
|
+
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
2347
|
+
const start = B.tmp();
|
|
2348
|
+
B.line(`${start} = ptrtoint ptr %v to ${this.S}`);
|
|
2349
|
+
const offsets = TEXT_DECODER_FIELDS.map((field) => {
|
|
2350
|
+
const index = shape.fields.findIndex((f) => f.name === field);
|
|
2351
|
+
if (index < 0)
|
|
2352
|
+
throw new InternalCompilerError(`llvm emitter bug: TextDecoder record lacks ${field}`);
|
|
2353
|
+
const p = B.tmp();
|
|
2354
|
+
const at = B.tmp();
|
|
2355
|
+
const offset = B.tmp();
|
|
2356
|
+
B.line(`${p} = getelementptr inbounds %${struct}, ptr %v, i64 0, i32 ${index + base} ; .${llvmCommentText(field)}`);
|
|
2357
|
+
B.line(`${at} = ptrtoint ptr ${p} to ${this.S}`);
|
|
2358
|
+
B.line(`${offset} = sub ${this.S} ${at}, ${start}`);
|
|
2359
|
+
return `${this.S} ${offset}`;
|
|
2360
|
+
});
|
|
2361
|
+
host.declare(`declare ptr @scr_text_decoder_to_dyn(ptr, ptr, ptr, ${this.S}, ${this.S}, ${this.S}, ${this.S})`);
|
|
2362
|
+
B.line(`${r} = call ptr @scr_text_decoder_to_dyn(ptr %v, ptr ${rc.retain}, ptr ${rc.release}, ${offsets.join(", ")})`);
|
|
2363
|
+
}
|
|
2364
|
+
B.terminate(`ret ptr ${r}`);
|
|
2365
|
+
}
|
|
2152
2366
|
/* ── toDynHelper (walkers.ts, ported) ─────────────────────────── */
|
|
2153
2367
|
/** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn value from a
|
|
2154
2368
|
* static one (+1), DEEP-COPYING composites. Borrows the operand.
|
|
@@ -2160,6 +2374,7 @@ export class LlDyn {
|
|
|
2160
2374
|
return existing;
|
|
2161
2375
|
const name = `sc_td_${this.toDynFns.size}`;
|
|
2162
2376
|
this.toDynFns.set(key, name);
|
|
2377
|
+
this.host.journalAllocated?.(name, "dyn.toDynHelper", [t]);
|
|
2163
2378
|
const host = this.host;
|
|
2164
2379
|
const B = new BlockBuilder();
|
|
2165
2380
|
let sourceAccessor = null;
|
|
@@ -2309,6 +2524,11 @@ export class LlDyn {
|
|
|
2309
2524
|
const shape = host.recordsById.get(t.shapeId);
|
|
2310
2525
|
if (!shape)
|
|
2311
2526
|
throw new InternalCompilerError(`llvm emitter bug: to-dyn of unknown shape ${t.shapeId}`);
|
|
2527
|
+
const codec = recordTextCodecClass(shape);
|
|
2528
|
+
if (codec !== null) {
|
|
2529
|
+
this.textCodecToDyn(B, t, shape, codec);
|
|
2530
|
+
break;
|
|
2531
|
+
}
|
|
2312
2532
|
const struct = mangleRecordStruct(t.shapeId);
|
|
2313
2533
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
2314
2534
|
const fieldIndex = new Map(shape.fields.map((f, i) => [f.name, i + base]));
|
|
@@ -2391,58 +2611,68 @@ export class LlDyn {
|
|
|
2391
2611
|
host.declare(`declare ptr @scr_dyn_new_obj()`);
|
|
2392
2612
|
B.line(`${d} = call ptr @scr_dyn_new_obj()`);
|
|
2393
2613
|
}
|
|
2394
|
-
// Keys insert in DECLARED order (JS insertion order)
|
|
2395
|
-
// '
|
|
2614
|
+
// Keys insert in DECLARED order (JS insertion order), or in the
|
|
2615
|
+
// value's own order for a shape with orderVariants; internal
|
|
2616
|
+
// '%'-fields follow so a record→dyn→record round trip keeps them
|
|
2617
|
+
// (all but the order index, which is no key).
|
|
2396
2618
|
const byName = new Map(shape.fields.map((f) => [f.name, f]));
|
|
2397
2619
|
// An accessor property is one key whose getter and setter are the
|
|
2398
2620
|
// slot closures (see accessorSlotProp), in accessorOrder's place.
|
|
2399
|
-
const
|
|
2400
|
-
const
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
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
|
-
B.
|
|
2443
|
-
B.
|
|
2621
|
+
const orders = shape.accessorOrder !== undefined ? [shape.accessorOrder] : shapeKeyOrders(shape);
|
|
2622
|
+
const perOrder = (order) => {
|
|
2623
|
+
const inOrder = new Set(order);
|
|
2624
|
+
const accessors = new Set(shape.accessorOrder === undefined
|
|
2625
|
+
? []
|
|
2626
|
+
: shape.fields.flatMap((f) => {
|
|
2627
|
+
const slot = accessorSlotProp(f.name);
|
|
2628
|
+
return slot === null ? [] : [slot.prop];
|
|
2629
|
+
}));
|
|
2630
|
+
const dynFields = [
|
|
2631
|
+
...order.flatMap((n) => {
|
|
2632
|
+
if (accessors.has(n))
|
|
2633
|
+
return [{ accessor: n }];
|
|
2634
|
+
const f = byName.get(n);
|
|
2635
|
+
return f === undefined ? [] : [f];
|
|
2636
|
+
}),
|
|
2637
|
+
...shape.fields.filter((f) => !inOrder.has(f.name) &&
|
|
2638
|
+
f.name !== KEY_ORDER_FIELD &&
|
|
2639
|
+
!(accessors.size > 0 && accessorSlotProp(f.name) !== null)),
|
|
2640
|
+
];
|
|
2641
|
+
for (const entry of dynFields) {
|
|
2642
|
+
if ("accessor" in entry) {
|
|
2643
|
+
host.declare(`declare void @scr_dyn_obj_set_accessor(ptr, ptr, ${host.sizeType}, ptr, ptr)`);
|
|
2644
|
+
const boxed = (kind) => {
|
|
2645
|
+
const slot = byName.get(`%${kind}:${entry.accessor}`);
|
|
2646
|
+
if (slot === undefined)
|
|
2647
|
+
return "null";
|
|
2648
|
+
const fv = loadFieldOf(slot.name, slot.type);
|
|
2649
|
+
const conv = B.tmp();
|
|
2650
|
+
B.line(`${conv} = call ptr @${this.toDynHelper(slot.type)}(${this.valTy(slot.type)} ${fv})`);
|
|
2651
|
+
return conv;
|
|
2652
|
+
};
|
|
2653
|
+
const getter = boxed("get");
|
|
2654
|
+
const setter = boxed("set");
|
|
2655
|
+
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)}`);
|
|
2656
|
+
continue;
|
|
2657
|
+
}
|
|
2658
|
+
const f = entry;
|
|
2659
|
+
const klen = Buffer.byteLength(f.name, "utf8");
|
|
2660
|
+
const fv = loadFieldOf(f.name, f.type);
|
|
2661
|
+
// An ABSENT optional field contributes no key.
|
|
2662
|
+
const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
|
|
2663
|
+
const conv = B.tmp();
|
|
2664
|
+
B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
|
|
2665
|
+
B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
|
|
2666
|
+
if (lSkip !== null) {
|
|
2667
|
+
B.br(lSkip);
|
|
2668
|
+
B.startBlock(lSkip);
|
|
2669
|
+
}
|
|
2444
2670
|
}
|
|
2445
|
-
}
|
|
2671
|
+
};
|
|
2672
|
+
if (orders.length === 1)
|
|
2673
|
+
perOrder(orders[0]);
|
|
2674
|
+
else
|
|
2675
|
+
emitPerKeyOrder(B, shape, base, "%v", perOrder);
|
|
2446
2676
|
// A Dirent row takes Node's Dirent prototype (the type probes) and
|
|
2447
2677
|
// its Symbol(type) key; %dtype stays readable but non-enumerable.
|
|
2448
2678
|
if (isDirentShape(shape)) {
|
|
@@ -2714,6 +2944,7 @@ export class LlDyn {
|
|
|
2714
2944
|
if (sourceAccessor) {
|
|
2715
2945
|
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`, `}`, ``);
|
|
2716
2946
|
}
|
|
2947
|
+
this.host.journalBuilt?.();
|
|
2717
2948
|
return name;
|
|
2718
2949
|
}
|
|
2719
2950
|
/** The checked-dynamic tree-promise settle adapter for one fulfillment payload type —
|
|
@@ -2730,6 +2961,7 @@ export class LlDyn {
|
|
|
2730
2961
|
return existing;
|
|
2731
2962
|
const name = `sc_pda_${this.promiseDynAdapters.size}`;
|
|
2732
2963
|
this.promiseDynAdapters.set(key, name);
|
|
2964
|
+
this.host.journalAllocated?.(name, "dyn.promiseDynAdapterHelper", [inner]);
|
|
2733
2965
|
const host = this.host;
|
|
2734
2966
|
const B = new BlockBuilder();
|
|
2735
2967
|
host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
|
|
@@ -2801,16 +3033,19 @@ export class LlDyn {
|
|
|
2801
3033
|
}
|
|
2802
3034
|
B.terminate(`ret void`);
|
|
2803
3035
|
this.defs.push(`define internal void @${name}(ptr %dst, ptr %src) ${FN_ATTRS} { ; dyn-box settle adapter for promise<${key}>`, B.render(), `}`, ``);
|
|
3036
|
+
this.host.journalBuilt?.();
|
|
2804
3037
|
return name;
|
|
2805
3038
|
}
|
|
2806
3039
|
/* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
|
|
2807
3040
|
/** Node's String() over a dyn value — sc_ds (+1 result) over the
|
|
2808
|
-
* recursive sc_ds_buf walker. Borrowed operand;
|
|
3041
|
+
* recursive sc_ds_buf walker. Borrowed operand; an exception that an
|
|
3042
|
+
* object's toString or valueOf throws stays pending. */
|
|
2809
3043
|
dynToStrHelper() {
|
|
2810
3044
|
if (this.dynToStrFn)
|
|
2811
3045
|
return this.dynToStrFn;
|
|
2812
3046
|
const name = "sc_ds";
|
|
2813
3047
|
this.dynToStrFn = name;
|
|
3048
|
+
this.host.journalAllocated?.(name, "dyn.dynToStrHelper", []);
|
|
2814
3049
|
const host = this.host;
|
|
2815
3050
|
host.declare(`declare void @scr_jb_init(ptr)`);
|
|
2816
3051
|
host.declare(`declare ptr @scr_jb_finish(ptr)`);
|
|
@@ -2909,9 +3144,9 @@ export class LlDyn {
|
|
|
2909
3144
|
B.startBlock(labels.get(DYN_KIND.ARR));
|
|
2910
3145
|
{
|
|
2911
3146
|
// Array.prototype.toString: join(",") — null/undefined ELEMENTS
|
|
2912
|
-
// print empty (unlike top level), nested arrays flatten.
|
|
3147
|
+
// print empty (unlike top level), nested arrays flatten. The length
|
|
3148
|
+
// is read once, as join reads it.
|
|
2913
3149
|
const n = this.lenOf(B, "%d");
|
|
2914
|
-
const items = this.itemsOf(B, "%d");
|
|
2915
3150
|
this.i64Loop(B, "ds.ar", n, (i, brNext) => {
|
|
2916
3151
|
const nz = B.tmp();
|
|
2917
3152
|
B.line(`${nz} = icmp ugt ${this.S} ${i}, 0`);
|
|
@@ -2922,7 +3157,22 @@ export class LlDyn {
|
|
|
2922
3157
|
B.line(`call void @scr_jb_putc(ptr %b, i8 44)`);
|
|
2923
3158
|
B.br(lel);
|
|
2924
3159
|
B.startBlock(lel);
|
|
2925
|
-
|
|
3160
|
+
// Each index reads the element as join does (scr_dyn_arr_at, +1):
|
|
3161
|
+
// from the current storage, undefined past the current length,
|
|
3162
|
+
// and through the prototype for a hole. An element's toString
|
|
3163
|
+
// can append to, shrink or reallocate the array; a getter that
|
|
3164
|
+
// throws answers NULL with the exception pending.
|
|
3165
|
+
host.declare(`declare ptr @scr_dyn_arr_at(ptr, double)`);
|
|
3166
|
+
host.declare(`declare void @scr_dyn_release_v(ptr)`);
|
|
3167
|
+
const index = B.tmp();
|
|
3168
|
+
B.line(`${index} = uitofp ${this.S} ${i} to double`);
|
|
3169
|
+
const e = B.tmp();
|
|
3170
|
+
B.line(`${e} = call ptr @scr_dyn_arr_at(ptr %d, double ${index})`);
|
|
3171
|
+
const missing = B.tmp();
|
|
3172
|
+
B.line(`${missing} = icmp eq ptr ${e}, null`);
|
|
3173
|
+
const lGot = B.newLabel("ds.gt");
|
|
3174
|
+
B.condBr(missing, done, lGot);
|
|
3175
|
+
B.startBlock(lGot);
|
|
2926
3176
|
const ek = this.kindOf(B, e);
|
|
2927
3177
|
const isU = B.tmp();
|
|
2928
3178
|
const isN = B.tmp();
|
|
@@ -2930,20 +3180,31 @@ export class LlDyn {
|
|
|
2930
3180
|
B.line(`${isU} = icmp eq i32 ${ek}, ${DYN_KIND.UNDEF}`);
|
|
2931
3181
|
B.line(`${isN} = icmp eq i32 ${ek}, ${DYN_KIND.NULL}`);
|
|
2932
3182
|
B.line(`${unit} = or i1 ${isU}, ${isN}`);
|
|
2933
|
-
const lSkip = B.newLabel("ds.sk");
|
|
2934
3183
|
const lRec = B.newLabel("ds.rc");
|
|
3184
|
+
const lSkip = B.newLabel("ds.sk");
|
|
2935
3185
|
B.condBr(unit, lSkip, lRec);
|
|
2936
3186
|
B.startBlock(lSkip);
|
|
3187
|
+
B.line(`call void @scr_dyn_release_v(ptr ${e})`);
|
|
2937
3188
|
brNext();
|
|
2938
3189
|
B.startBlock(lRec);
|
|
2939
3190
|
B.line(`call void @sc_ds_buf(ptr %b, ptr ${e})`);
|
|
3191
|
+
B.line(`call void @scr_dyn_release_v(ptr ${e})`);
|
|
3192
|
+
// The first exception an element's conversion throws ends the
|
|
3193
|
+
// conversion; later elements are not read.
|
|
3194
|
+
const thrown = B.tmp();
|
|
3195
|
+
for (const line of host.pendingTestLines(thrown))
|
|
3196
|
+
B.line(line.trimStart());
|
|
3197
|
+
const lMore = B.newLabel("ds.mo");
|
|
3198
|
+
B.condBr(thrown, done, lMore);
|
|
3199
|
+
B.startBlock(lMore);
|
|
2940
3200
|
});
|
|
2941
3201
|
B.br(done);
|
|
2942
3202
|
}
|
|
2943
3203
|
B.startBlock(labels.get(DYN_KIND.OBJ));
|
|
2944
3204
|
{
|
|
2945
3205
|
// The checked-dynamic tree's error encoding renders Error.prototype.toString;
|
|
2946
|
-
//
|
|
3206
|
+
// other objects convert with ToPrimitive's string hint: a toString or
|
|
3207
|
+
// valueOf of their own or of their prototypes, else "[object Object]".
|
|
2947
3208
|
const marker = this.objGetLit(B, "%d", "%error");
|
|
2948
3209
|
const isErr = B.tmp();
|
|
2949
3210
|
B.line(`${isErr} = icmp ne ptr ${marker}, null`);
|
|
@@ -2951,8 +3212,21 @@ export class LlDyn {
|
|
|
2951
3212
|
const lPlain = B.newLabel("ds.pl");
|
|
2952
3213
|
B.condBr(isErr, lErr, lPlain);
|
|
2953
3214
|
B.startBlock(lPlain);
|
|
2954
|
-
|
|
2955
|
-
|
|
3215
|
+
{
|
|
3216
|
+
// Null leaves the exception the conversion threw pending.
|
|
3217
|
+
host.declare(`declare ptr @scr_dyn_string_coerce_js(ptr)`);
|
|
3218
|
+
host.declare(`declare void @scr_str_release(ptr)`);
|
|
3219
|
+
const text = B.tmp();
|
|
3220
|
+
B.line(`${text} = call ptr @scr_dyn_string_coerce_js(ptr %d)`);
|
|
3221
|
+
const converted = B.tmp();
|
|
3222
|
+
B.line(`${converted} = icmp ne ptr ${text}, null`);
|
|
3223
|
+
const lPut = B.newLabel("ds.pp");
|
|
3224
|
+
B.condBr(converted, lPut, done);
|
|
3225
|
+
B.startBlock(lPut);
|
|
3226
|
+
this.putScrStr(B, "%b", text);
|
|
3227
|
+
B.line(`call void @scr_str_release(ptr ${text})`);
|
|
3228
|
+
B.br(done);
|
|
3229
|
+
}
|
|
2956
3230
|
B.startBlock(lErr);
|
|
2957
3231
|
// Error.prototype.toString, reading name and message through the
|
|
2958
3232
|
// prototype. Null leaves the exception its conversion threw pending.
|
|
@@ -3062,6 +3336,7 @@ export class LlDyn {
|
|
|
3062
3336
|
B.terminate(`ret ptr ${out}`);
|
|
3063
3337
|
this.defs.push(`define internal ptr @${name}(ptr %d) ${FN_ATTRS} { ; String(unknown) -> owned (+1)`, B.render(), `}`, ``);
|
|
3064
3338
|
}
|
|
3339
|
+
this.host.journalBuilt?.();
|
|
3065
3340
|
return name;
|
|
3066
3341
|
}
|
|
3067
3342
|
/* ── caughtToDyn (walkers.ts, ported) ─────────────────────────── */
|
|
@@ -3072,6 +3347,7 @@ export class LlDyn {
|
|
|
3072
3347
|
return this.caughtToDynFn;
|
|
3073
3348
|
const name = "sc_cd";
|
|
3074
3349
|
this.caughtToDynFn = name;
|
|
3350
|
+
this.host.journalAllocated?.(name, "dyn.caughtToDynHelper", []);
|
|
3075
3351
|
const host = this.host;
|
|
3076
3352
|
const B = new BlockBuilder();
|
|
3077
3353
|
const kp = B.tmp();
|
|
@@ -3170,6 +3446,7 @@ export class LlDyn {
|
|
|
3170
3446
|
B.terminate(`ret ptr ${e}`);
|
|
3171
3447
|
}
|
|
3172
3448
|
this.defs.push(`define internal ptr @${name}(ptr %c) ${FN_ATTRS} { ; caught -> unknown (+1, fresh tree)`, B.render(), `}`, ``);
|
|
3449
|
+
this.host.journalBuilt?.();
|
|
3173
3450
|
return name;
|
|
3174
3451
|
}
|
|
3175
3452
|
/* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
|
|
@@ -3182,6 +3459,7 @@ export class LlDyn {
|
|
|
3182
3459
|
this.helperMemo.set(name, name);
|
|
3183
3460
|
const B = new BlockBuilder();
|
|
3184
3461
|
const host = this.host;
|
|
3462
|
+
this.host.journalAllocated?.(name, "dyn.dynComputedKeyGetHelper", []);
|
|
3185
3463
|
const stringHelper = this.dynKeyGetHelper();
|
|
3186
3464
|
host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
|
|
3187
3465
|
host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
|
|
@@ -3214,6 +3492,7 @@ export class LlDyn {
|
|
|
3214
3492
|
B.line(`call void @scr_dyn_release(ptr ${key})`);
|
|
3215
3493
|
B.terminate(`ret ptr ${value}`);
|
|
3216
3494
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
|
|
3495
|
+
this.host.journalBuilt?.();
|
|
3217
3496
|
return name;
|
|
3218
3497
|
}
|
|
3219
3498
|
dynKeyGetHelper() {
|
|
@@ -3223,6 +3502,7 @@ export class LlDyn {
|
|
|
3223
3502
|
return existing;
|
|
3224
3503
|
const name = "sc_dyn_key_get";
|
|
3225
3504
|
this.dynBuilders.set(memoKey, name);
|
|
3505
|
+
this.host.journalAllocated?.(name, "dyn.dynKeyGetHelper", []);
|
|
3226
3506
|
const host = this.host;
|
|
3227
3507
|
const B = new BlockBuilder();
|
|
3228
3508
|
const kd = this.kindOf(B, "%d");
|
|
@@ -3601,6 +3881,7 @@ export class LlDyn {
|
|
|
3601
3881
|
}
|
|
3602
3882
|
retainUndef();
|
|
3603
3883
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %k, i1 zeroext %opt) ${FN_ATTRS} { ; d[k] on dyn`, B.render(), `}`, ``);
|
|
3884
|
+
this.host.journalBuilt?.();
|
|
3604
3885
|
return name;
|
|
3605
3886
|
}
|
|
3606
3887
|
/* ── destructuring RequireObjectCoercible (ported) ─────────────────── */
|
|
@@ -3611,6 +3892,7 @@ export class LlDyn {
|
|
|
3611
3892
|
return existing;
|
|
3612
3893
|
const name = "sc_dyn_destr_check";
|
|
3613
3894
|
this.dynBuilders.set(memoKey, name);
|
|
3895
|
+
this.host.journalAllocated?.(name, "dyn.dynDestrCheckHelper", []);
|
|
3614
3896
|
const host = this.host;
|
|
3615
3897
|
host.declare(`declare void @scr_jb_init(ptr)`);
|
|
3616
3898
|
host.declare(`declare ptr @scr_jb_finish(ptr)`);
|
|
@@ -3660,6 +3942,7 @@ export class LlDyn {
|
|
|
3660
3942
|
B.line(`call void @scr_throw_error(i32 1, ptr ${msg}) ; SCR_ERR_TYPE`);
|
|
3661
3943
|
B.terminate(`ret void`);
|
|
3662
3944
|
this.defs.push(`define internal void @${name}(ptr %d, ptr %spell, ptr %firstProp) ${FN_ATTRS} { ; destructuring RequireObjectCoercible`, B.render(), `}`, ``);
|
|
3945
|
+
this.host.journalBuilt?.();
|
|
3663
3946
|
return name;
|
|
3664
3947
|
}
|
|
3665
3948
|
/* ── GetIterator + first-N steps (dynIterNHelper, ported) ──────────── */
|
|
@@ -3670,6 +3953,7 @@ export class LlDyn {
|
|
|
3670
3953
|
return existing;
|
|
3671
3954
|
const name = "sc_dyn_iter_n";
|
|
3672
3955
|
this.dynBuilders.set(memoKey, name);
|
|
3956
|
+
this.host.journalAllocated?.(name, "dyn.dynIterNHelper", []);
|
|
3673
3957
|
const host = this.host;
|
|
3674
3958
|
host.declare(`declare ptr @scr_dyn_new_arr()`);
|
|
3675
3959
|
host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
|
|
@@ -3864,12 +4148,38 @@ export class LlDyn {
|
|
|
3864
4148
|
});
|
|
3865
4149
|
B.terminate(`ret ptr ${out}`);
|
|
3866
4150
|
this.defs.push(`define internal ptr @${name}(ptr %d, ${host.sizeType} %n, ptr %spelling) ${FN_ATTRS} { ; destructuring GetIterator + N steps`, B.render(), `}`, ``);
|
|
4151
|
+
this.host.journalBuilt?.();
|
|
3867
4152
|
return name;
|
|
3868
4153
|
}
|
|
3869
4154
|
/* ── the checked-dynamic function boundary (ported) ────────────────── */
|
|
3870
4155
|
/** The dyn argument spelling of one static value: dyn passes through
|
|
3871
4156
|
* (+1), funcs box anonymously, everything else rides toDyn. `expr` is
|
|
3872
4157
|
* BORROWED in every arm. Emits into the given builder. */
|
|
4158
|
+
/** A live capsule of a record or array value (+1; the value is
|
|
4159
|
+
* borrowed), as `dynFrom` with `liveRef` builds it; null for other
|
|
4160
|
+
* types. Closures boxed in a declaration-typed boundary program return
|
|
4161
|
+
* their records and arrays this way. */
|
|
4162
|
+
liveToDyn(B, t, expr) {
|
|
4163
|
+
const host = this.host;
|
|
4164
|
+
if (t.kind === "union") {
|
|
4165
|
+
const arms = host.unionsById.get(t.unionId)?.arms ?? [];
|
|
4166
|
+
if (!arms.some((arm) => arm.kind === "record" || arm.kind === "array"))
|
|
4167
|
+
return null;
|
|
4168
|
+
const boxed = B.tmp();
|
|
4169
|
+
B.line(`${boxed} = call ptr @${host.liveDynUnionRefAdapter(t)}(ptr ${expr})`);
|
|
4170
|
+
return boxed;
|
|
4171
|
+
}
|
|
4172
|
+
if ((t.kind !== "record" && t.kind !== "array") || !streamTypedRefEligible(t))
|
|
4173
|
+
return null;
|
|
4174
|
+
const key = typeKey(t);
|
|
4175
|
+
const adapter = host.liveDynRefAdapter(t);
|
|
4176
|
+
const rc = vAdapters(host, t);
|
|
4177
|
+
const boxed = B.tmp();
|
|
4178
|
+
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})`);
|
|
4179
|
+
for (const line of bindLiveArrayOps(host, adapter, boxed))
|
|
4180
|
+
B.line(line);
|
|
4181
|
+
return boxed;
|
|
4182
|
+
}
|
|
3873
4183
|
toDynExpr(B, t, expr) {
|
|
3874
4184
|
if (t.kind === "dyn")
|
|
3875
4185
|
return this.retainDyn(B, expr);
|
|
@@ -3893,6 +4203,7 @@ export class LlDyn {
|
|
|
3893
4203
|
return existing;
|
|
3894
4204
|
const name = `sc_dfk_${this.dynFuncThunks.size}`;
|
|
3895
4205
|
this.dynFuncThunks.set(key, name);
|
|
4206
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncThunkHelper", [t]);
|
|
3896
4207
|
const host = this.host;
|
|
3897
4208
|
const B = new BlockBuilder();
|
|
3898
4209
|
const argNames = [];
|
|
@@ -3991,6 +4302,22 @@ export class LlDyn {
|
|
|
3991
4302
|
B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
|
|
3992
4303
|
});
|
|
3993
4304
|
}, "ptr null");
|
|
4305
|
+
// Declaration-typed boundary programs: an argument package code
|
|
4306
|
+
// passes keeps its identity (scr_dyn_decl_adopt).
|
|
4307
|
+
const capsule = this.host.declBoundary?.() === true ? this.liveToDyn(B, p, a) : null;
|
|
4308
|
+
if (capsule !== null) {
|
|
4309
|
+
host.declare(`declare void @scr_dyn_decl_adopt(ptr, ptr)`);
|
|
4310
|
+
host.declare(`declare void @scr_dyn_release(ptr)`);
|
|
4311
|
+
B.line(`call void @scr_dyn_decl_adopt(ptr ${ad}, ptr ${capsule})`);
|
|
4312
|
+
B.line(`call void @scr_dyn_release(ptr ${capsule})`);
|
|
4313
|
+
this.pendingBail(B, "dfk.adopt", () => {
|
|
4314
|
+
t.params.slice(0, i + 1).forEach((q, j) => {
|
|
4315
|
+
const name = j === i ? a : argNames[j];
|
|
4316
|
+
if (isRefCounted(q))
|
|
4317
|
+
B.line(`call void ${releaseSym(host, q)}(ptr ${name})`);
|
|
4318
|
+
});
|
|
4319
|
+
}, "ptr null");
|
|
4320
|
+
}
|
|
3994
4321
|
argNames.push(a);
|
|
3995
4322
|
}
|
|
3996
4323
|
});
|
|
@@ -4025,12 +4352,15 @@ export class LlDyn {
|
|
|
4025
4352
|
const r = B.tmp();
|
|
4026
4353
|
B.line(`${r} = call ${retTy} ${fn}(${callArgs})`);
|
|
4027
4354
|
this.pendingBail(B, "dfkr", () => { }, "ptr null");
|
|
4028
|
-
const out = this.
|
|
4355
|
+
const out = this.host.declBoundary?.() === true
|
|
4356
|
+
? (this.liveToDyn(B, t.ret, r) ?? this.toDynExpr(B, t.ret, r))
|
|
4357
|
+
: this.toDynExpr(B, t.ret, r);
|
|
4029
4358
|
if (isRefCounted(t.ret))
|
|
4030
4359
|
B.line(`call void ${releaseSym(host, t.ret)}(ptr ${r})`);
|
|
4031
4360
|
B.terminate(`ret ptr ${out}`);
|
|
4032
4361
|
}
|
|
4033
4362
|
this.defs.push(`define internal ptr @${name}(ptr %c, ptr %args, ${host.sizeType} %argc) ${FN_ATTRS} { ; dyn call thunk for ${key}`, B.render(), `}`, ``);
|
|
4363
|
+
this.host.journalBuilt?.();
|
|
4034
4364
|
return name;
|
|
4035
4365
|
}
|
|
4036
4366
|
/** The box builder dynFrom emits for one closure signature. */
|
|
@@ -4041,12 +4371,294 @@ export class LlDyn {
|
|
|
4041
4371
|
return existing;
|
|
4042
4372
|
const name = `sc_dfb_${this.dynFuncBoxes.size}`;
|
|
4043
4373
|
this.dynFuncBoxes.set(key, name);
|
|
4374
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncBoxHelper", [t]);
|
|
4044
4375
|
const host = this.host;
|
|
4045
4376
|
const thunk = this.dynFuncThunkHelper(t);
|
|
4046
4377
|
host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
|
|
4047
4378
|
host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
|
|
4048
4379
|
const sigLit = host.cstr(key);
|
|
4049
4380
|
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`, `}`, ``);
|
|
4381
|
+
this.host.journalBuilt?.();
|
|
4382
|
+
return name;
|
|
4383
|
+
}
|
|
4384
|
+
/** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
|
|
4385
|
+
* closure registered as a 'message' listener (ScrDynMessageListener):
|
|
4386
|
+
* builds the closure's parameter from the message's nodes and calls the
|
|
4387
|
+
* closure. It answers false, without calling it, when the message does
|
|
4388
|
+
* not have the parameter's exact layout, and the listener then runs
|
|
4389
|
+
* through its thunk on the decoded message, as before. Null when the
|
|
4390
|
+
* signature's parameter has no message reader (messageReadable). */
|
|
4391
|
+
messageListenerHelper(t) {
|
|
4392
|
+
const key = typeKey(t);
|
|
4393
|
+
const existing = this.messageListeners.get(key);
|
|
4394
|
+
if (existing !== undefined)
|
|
4395
|
+
return existing;
|
|
4396
|
+
const param = t.params[0];
|
|
4397
|
+
const supported = t.params.length === 1 &&
|
|
4398
|
+
t.rest !== true &&
|
|
4399
|
+
param !== undefined &&
|
|
4400
|
+
(t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
|
|
4401
|
+
this.messageReadable(param, new Set());
|
|
4402
|
+
if (!supported) {
|
|
4403
|
+
// A signature without an entry still takes a number.
|
|
4404
|
+
this.messageListeners.set(key, null);
|
|
4405
|
+
this.host.journalAllocated?.("", "dyn.messageListenerHelper", [t]);
|
|
4406
|
+
this.host.journalBuilt?.();
|
|
4407
|
+
return null;
|
|
4408
|
+
}
|
|
4409
|
+
const name = `sc_dml_${this.messageListeners.size}`;
|
|
4410
|
+
this.messageListeners.set(key, name);
|
|
4411
|
+
this.host.journalAllocated?.(name, "dyn.messageListenerHelper", [t]);
|
|
4412
|
+
const B = new BlockBuilder();
|
|
4413
|
+
B.entryAllocas.push(`%fail = alloca i1`);
|
|
4414
|
+
B.line(`store i1 false, ptr %fail`);
|
|
4415
|
+
const value = B.tmp();
|
|
4416
|
+
B.line(`${value} = call ${this.valTy(param)} @${this.messageReaderHelper(param)}(ptr %m, ${this.host.sizeType} 0, ptr %fail)`);
|
|
4417
|
+
const failed = B.tmp();
|
|
4418
|
+
B.line(`${failed} = load i1, ptr %fail`);
|
|
4419
|
+
const lMiss = B.newLabel("dml.miss");
|
|
4420
|
+
const lCall = B.newLabel("dml.call");
|
|
4421
|
+
B.condBr(failed, lMiss, lCall);
|
|
4422
|
+
B.startBlock(lMiss);
|
|
4423
|
+
B.terminate(`ret i1 false`);
|
|
4424
|
+
B.startBlock(lCall);
|
|
4425
|
+
// The closure consumes its parameter; a pending exception stays for
|
|
4426
|
+
// the emitter, as after the thunk.
|
|
4427
|
+
const fnp = B.tmp();
|
|
4428
|
+
const fn = B.tmp();
|
|
4429
|
+
B.line(`${fnp} = getelementptr inbounds %ScrClosure, ptr %c, i64 0, i32 1`);
|
|
4430
|
+
B.line(`${fn} = load ptr, ptr ${fnp}`);
|
|
4431
|
+
const args = `ptr %c, ${this.valTy(param)} ${value}`;
|
|
4432
|
+
if (t.ret.kind === "void")
|
|
4433
|
+
B.line(`call void ${fn}(${args})`);
|
|
4434
|
+
else
|
|
4435
|
+
B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
|
|
4436
|
+
B.terminate(`ret i1 true`);
|
|
4437
|
+
this.defs.push(`define internal zeroext i1 @${name}(ptr %c, ptr %m) ${FN_ATTRS} { ; message entry for ${llvmCommentText(key)}`, B.render(), `}`, ``);
|
|
4438
|
+
this.host.journalBuilt?.();
|
|
4439
|
+
return name;
|
|
4440
|
+
}
|
|
4441
|
+
/** Whether a message reader can build T: numbers, booleans and strings;
|
|
4442
|
+
* records of them with only declared fields, none of union type; and
|
|
4443
|
+
* boxed unions of those arms and null or undefined without a literal
|
|
4444
|
+
* discriminator, with at most one number, boolean and string arm. */
|
|
4445
|
+
messageReadable(t, seen) {
|
|
4446
|
+
switch (t.kind) {
|
|
4447
|
+
case "f64":
|
|
4448
|
+
case "bool":
|
|
4449
|
+
case "string":
|
|
4450
|
+
return true;
|
|
4451
|
+
case "record": {
|
|
4452
|
+
const shape = this.host.recordsById.get(t.shapeId);
|
|
4453
|
+
if (!shape || shape.tuple || shape.indexValue || shape.fields.length === 0)
|
|
4454
|
+
return false;
|
|
4455
|
+
if (seen.has(t.shapeId) || this.isRecursiveShape(t))
|
|
4456
|
+
return false;
|
|
4457
|
+
seen.add(t.shapeId);
|
|
4458
|
+
const readable = shape.fields.every((f) => !f.name.startsWith("%") &&
|
|
4459
|
+
f.type.kind !== "union" &&
|
|
4460
|
+
llFieldType(f.type, this.host.inlineUnions.record(f.type)) !== INLINE_UNION_FIELD &&
|
|
4461
|
+
this.messageReadable(f.type, seen));
|
|
4462
|
+
seen.delete(t.shapeId);
|
|
4463
|
+
return readable;
|
|
4464
|
+
}
|
|
4465
|
+
case "union": {
|
|
4466
|
+
const def = this.host.unionsById.get(t.unionId);
|
|
4467
|
+
// A discriminated union's checked conversion also tests the arm's
|
|
4468
|
+
// literal discriminator, which the readers do not.
|
|
4469
|
+
if (!def || def.discriminant || this.host.nullableUnions.has(t.unionId))
|
|
4470
|
+
return false;
|
|
4471
|
+
const scalars = new Set();
|
|
4472
|
+
for (const arm of def.arms) {
|
|
4473
|
+
if (arm.kind === "nullT" || arm.kind === "undefinedT")
|
|
4474
|
+
continue;
|
|
4475
|
+
if (arm.kind === "f64" || arm.kind === "bool" || arm.kind === "string") {
|
|
4476
|
+
if (scalars.has(arm.kind))
|
|
4477
|
+
return false;
|
|
4478
|
+
scalars.add(arm.kind);
|
|
4479
|
+
continue;
|
|
4480
|
+
}
|
|
4481
|
+
if (arm.kind !== "record" || !this.messageReadable(arm, seen))
|
|
4482
|
+
return false;
|
|
4483
|
+
}
|
|
4484
|
+
return true;
|
|
4485
|
+
}
|
|
4486
|
+
default:
|
|
4487
|
+
return false;
|
|
4488
|
+
}
|
|
4489
|
+
}
|
|
4490
|
+
/** `sc_dmr_<n>(ptr message, size node, ptr fail) -> T`: T (+1) built
|
|
4491
|
+
* from a message node, for a type messageReadable accepts. Sets *fail
|
|
4492
|
+
* and returns a dummy when the node does not have T's layout: the arm
|
|
4493
|
+
* the checked conversion would choose, a record's declared keys in
|
|
4494
|
+
* declaration order and no others. */
|
|
4495
|
+
messageReaderHelper(t) {
|
|
4496
|
+
const key = typeKey(t);
|
|
4497
|
+
const existing = this.messageReaders.get(key);
|
|
4498
|
+
if (existing)
|
|
4499
|
+
return existing;
|
|
4500
|
+
const name = `sc_dmr_${this.messageReaders.size}`;
|
|
4501
|
+
this.messageReaders.set(key, name);
|
|
4502
|
+
this.host.journalAllocated?.(name, "dyn.messageReaderHelper", [t]);
|
|
4503
|
+
const host = this.host;
|
|
4504
|
+
const S = host.sizeType;
|
|
4505
|
+
if (t.kind !== "record")
|
|
4506
|
+
host.declare(`declare i32 @scr_message_kind(ptr, ${S})`);
|
|
4507
|
+
const retTy = this.valTy(t);
|
|
4508
|
+
const dummy = retTy === "double" ? f64Lit(0) : retTy === "i1" ? "false" : "null";
|
|
4509
|
+
const B = new BlockBuilder();
|
|
4510
|
+
const lFail = B.newLabel("dmr.fail");
|
|
4511
|
+
// scr_message_fields tests a record's kind itself.
|
|
4512
|
+
const kind = B.tmp();
|
|
4513
|
+
if (t.kind !== "record")
|
|
4514
|
+
B.line(`${kind} = call i32 @scr_message_kind(ptr %m, ${S} %n)`);
|
|
4515
|
+
const requireKind = (want) => {
|
|
4516
|
+
const ok = B.tmp();
|
|
4517
|
+
B.line(`${ok} = icmp eq i32 ${kind}, ${want}`);
|
|
4518
|
+
const lOk = B.newLabel("dmr.kind");
|
|
4519
|
+
B.condBr(ok, lOk, lFail);
|
|
4520
|
+
B.startBlock(lOk);
|
|
4521
|
+
};
|
|
4522
|
+
switch (t.kind) {
|
|
4523
|
+
case "f64":
|
|
4524
|
+
case "bool": {
|
|
4525
|
+
host.declare(`declare double @scr_message_number(ptr, ${S})`);
|
|
4526
|
+
requireKind(t.kind === "f64" ? MESSAGE_KIND.NUMBER : MESSAGE_KIND.BOOL);
|
|
4527
|
+
const n = B.tmp();
|
|
4528
|
+
B.line(`${n} = call double @scr_message_number(ptr %m, ${S} %n)`);
|
|
4529
|
+
if (t.kind === "f64")
|
|
4530
|
+
B.terminate(`ret double ${n}`);
|
|
4531
|
+
else {
|
|
4532
|
+
const b = B.tmp();
|
|
4533
|
+
B.line(`${b} = fcmp une double ${n}, ${f64Lit(0)}`);
|
|
4534
|
+
B.terminate(`ret i1 ${b}`);
|
|
4535
|
+
}
|
|
4536
|
+
break;
|
|
4537
|
+
}
|
|
4538
|
+
case "string": {
|
|
4539
|
+
host.declare(`declare ptr @scr_message_string(ptr, ${S})`);
|
|
4540
|
+
requireKind(MESSAGE_KIND.STRING);
|
|
4541
|
+
const str = B.tmp();
|
|
4542
|
+
B.line(`${str} = call ptr @scr_message_string(ptr %m, ${S} %n)`);
|
|
4543
|
+
B.terminate(`ret ptr ${str}`);
|
|
4544
|
+
break;
|
|
4545
|
+
}
|
|
4546
|
+
case "record": {
|
|
4547
|
+
const shape = host.recordsById.get(t.shapeId);
|
|
4548
|
+
const order = recordSourceFieldOrder(shape);
|
|
4549
|
+
const fields = new Map(shape.fields.map((f, i) => [f.name, { field: f, index: i }]));
|
|
4550
|
+
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
4551
|
+
const struct = mangleRecordStruct(t.shapeId);
|
|
4552
|
+
const names = this.recordNameTable(t.shapeId, shape);
|
|
4553
|
+
host.declare(`declare zeroext i1 @scr_message_fields(ptr, ${S}, ptr, ptr, ${S}, ptr)`);
|
|
4554
|
+
B.entryAllocas.push(`%kids = alloca [${order.length} x ${S}]`);
|
|
4555
|
+
const matched = B.tmp();
|
|
4556
|
+
B.line(`${matched} = call zeroext i1 @scr_message_fields(ptr %m, ${S} %n, ptr ${names.names}, ptr ${names.lens}, ${S} ${order.length}, ptr %kids)`);
|
|
4557
|
+
const lBuild = B.newLabel("dmr.build");
|
|
4558
|
+
B.condBr(matched, lBuild, lFail);
|
|
4559
|
+
B.startBlock(lBuild);
|
|
4560
|
+
B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
|
|
4561
|
+
order.forEach((fieldName, i) => {
|
|
4562
|
+
const { field, index } = fields.get(fieldName);
|
|
4563
|
+
const kidp = B.tmp();
|
|
4564
|
+
const kid = B.tmp();
|
|
4565
|
+
B.line(`${kidp} = getelementptr inbounds [${order.length} x ${S}], ptr %kids, i64 0, i64 ${i}`);
|
|
4566
|
+
B.line(`${kid} = load ${S}, ptr ${kidp}`);
|
|
4567
|
+
const v = B.tmp();
|
|
4568
|
+
B.line(`${v} = call ${this.valTy(field.type)} @${this.messageReaderHelper(field.type)}(ptr %m, ${S} ${kid}, ptr %fail)`);
|
|
4569
|
+
const failed = B.tmp();
|
|
4570
|
+
B.line(`${failed} = load i1, ptr %fail`);
|
|
4571
|
+
const lDrop = B.newLabel("dmr.drop");
|
|
4572
|
+
const lStore = B.newLabel("dmr.store");
|
|
4573
|
+
B.condBr(failed, lDrop, lStore);
|
|
4574
|
+
B.startBlock(lDrop);
|
|
4575
|
+
B.line(`call void ${releaseSym(host, t)}(ptr %r0)`);
|
|
4576
|
+
B.terminate(`ret ptr null`);
|
|
4577
|
+
B.startBlock(lStore);
|
|
4578
|
+
const p = B.tmp();
|
|
4579
|
+
B.line(`${p} = getelementptr inbounds %${struct}, ptr %r0, i64 0, i32 ${index + base} ; .${llvmCommentText(fieldName)}`);
|
|
4580
|
+
const fieldTy = llFieldType(field.type, host.inlineUnions.record(field.type));
|
|
4581
|
+
if (fieldTy === "i8") {
|
|
4582
|
+
const z = B.tmp();
|
|
4583
|
+
B.line(`${z} = zext i1 ${v} to i8`);
|
|
4584
|
+
B.line(`store i8 ${z}, ptr ${p}`);
|
|
4585
|
+
}
|
|
4586
|
+
else {
|
|
4587
|
+
B.line(`store ${fieldTy} ${v}, ptr ${p}`);
|
|
4588
|
+
}
|
|
4589
|
+
});
|
|
4590
|
+
B.terminate(`ret ptr %r0`);
|
|
4591
|
+
break;
|
|
4592
|
+
}
|
|
4593
|
+
case "union": {
|
|
4594
|
+
const def = host.unionsById.get(t.unionId);
|
|
4595
|
+
def.arms.forEach((arm, i) => {
|
|
4596
|
+
const lNext = B.newLabel("dmr.next");
|
|
4597
|
+
if (arm.kind === "nullT" || arm.kind === "undefinedT") {
|
|
4598
|
+
const hit = B.tmp();
|
|
4599
|
+
B.line(`${hit} = icmp eq i32 ${kind}, ${arm.kind === "nullT" ? MESSAGE_KIND.NULL : MESSAGE_KIND.UNDEFINED}`);
|
|
4600
|
+
const lHit = B.newLabel("dmr.unit");
|
|
4601
|
+
B.condBr(hit, lHit, lNext);
|
|
4602
|
+
B.startBlock(lHit);
|
|
4603
|
+
B.terminate(`ret ptr ${host.unitInstanceRef(t.unionId, i)}`);
|
|
4604
|
+
B.startBlock(lNext);
|
|
4605
|
+
return;
|
|
4606
|
+
}
|
|
4607
|
+
if (arm.kind !== "record") {
|
|
4608
|
+
const want = arm.kind === "f64"
|
|
4609
|
+
? MESSAGE_KIND.NUMBER
|
|
4610
|
+
: arm.kind === "bool"
|
|
4611
|
+
? MESSAGE_KIND.BOOL
|
|
4612
|
+
: MESSAGE_KIND.STRING;
|
|
4613
|
+
const hit = B.tmp();
|
|
4614
|
+
B.line(`${hit} = icmp eq i32 ${kind}, ${want}`);
|
|
4615
|
+
const lHit = B.newLabel("dmr.arm");
|
|
4616
|
+
B.condBr(hit, lHit, lNext);
|
|
4617
|
+
B.startBlock(lHit);
|
|
4618
|
+
}
|
|
4619
|
+
// A record arm that does not match leaves *fail clear for the
|
|
4620
|
+
// next arm, like the checked conversion's next-arm match.
|
|
4621
|
+
const v = B.tmp();
|
|
4622
|
+
B.line(`${v} = call ${this.valTy(arm)} @${this.messageReaderHelper(arm)}(ptr %m, ${S} %n, ptr %fail)`);
|
|
4623
|
+
if (arm.kind === "record") {
|
|
4624
|
+
const failed = B.tmp();
|
|
4625
|
+
B.line(`${failed} = load i1, ptr %fail`);
|
|
4626
|
+
const lHit = B.newLabel("dmr.arm");
|
|
4627
|
+
const lMiss = B.newLabel("dmr.miss");
|
|
4628
|
+
B.condBr(failed, lMiss, lHit);
|
|
4629
|
+
B.startBlock(lMiss);
|
|
4630
|
+
B.line(`store i1 false, ptr %fail`);
|
|
4631
|
+
B.br(lNext);
|
|
4632
|
+
B.startBlock(lHit);
|
|
4633
|
+
}
|
|
4634
|
+
const u = B.tmp();
|
|
4635
|
+
if (arm.kind === "f64") {
|
|
4636
|
+
host.declare(`declare ptr @scr_union_new_f64(i32, double)`);
|
|
4637
|
+
B.line(`${u} = call ptr @scr_union_new_f64(i32 ${i}, double ${v})`);
|
|
4638
|
+
}
|
|
4639
|
+
else if (arm.kind === "bool") {
|
|
4640
|
+
host.declare(`declare ptr @scr_union_new_bool(i32, i1 zeroext)`);
|
|
4641
|
+
B.line(`${u} = call ptr @scr_union_new_bool(i32 ${i}, i1 ${v})`);
|
|
4642
|
+
}
|
|
4643
|
+
else {
|
|
4644
|
+
const rc = vAdapters(host, arm);
|
|
4645
|
+
host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
|
|
4646
|
+
B.line(`${u} = call ptr @scr_union_new_ref(i32 ${i}, ptr ${v}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, arm)})`);
|
|
4647
|
+
}
|
|
4648
|
+
B.terminate(`ret ptr ${u}`);
|
|
4649
|
+
B.startBlock(lNext);
|
|
4650
|
+
});
|
|
4651
|
+
B.br(lFail);
|
|
4652
|
+
break;
|
|
4653
|
+
}
|
|
4654
|
+
default:
|
|
4655
|
+
throw new InternalCompilerError(`llvm emitter bug: message reader of ${key}`);
|
|
4656
|
+
}
|
|
4657
|
+
B.startBlock(lFail);
|
|
4658
|
+
B.line(`store i1 true, ptr %fail`);
|
|
4659
|
+
B.terminate(`ret ${retTy} ${dummy}`);
|
|
4660
|
+
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(), `}`, ``);
|
|
4661
|
+
this.host.journalBuilt?.();
|
|
4050
4662
|
return name;
|
|
4051
4663
|
}
|
|
4052
4664
|
/** The adapter closure body for one TARGET signature: caps[0] is an
|
|
@@ -4058,6 +4670,7 @@ export class LlDyn {
|
|
|
4058
4670
|
return existing;
|
|
4059
4671
|
const name = `sc_dfa_${this.dynFuncAdapters.size}`;
|
|
4060
4672
|
this.dynFuncAdapters.set(key, name);
|
|
4673
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncAdapterHelper", [t]);
|
|
4061
4674
|
const host = this.host;
|
|
4062
4675
|
const B = new BlockBuilder();
|
|
4063
4676
|
host.declare(`declare ptr @scr_box_get_ref(ptr)`);
|
|
@@ -4152,6 +4765,7 @@ export class LlDyn {
|
|
|
4152
4765
|
...(checkedRest ? ["ptr %rest"] : []),
|
|
4153
4766
|
].join(", ");
|
|
4154
4767
|
this.defs.push(`define internal ${retTy === "i1" ? "zeroext i1" : retTy} @${name}(${params}) ${FN_ATTRS} { ; dyn fn adapter to ${key}`, B.render(), `}`, ``);
|
|
4768
|
+
this.host.journalBuilt?.();
|
|
4155
4769
|
return name;
|
|
4156
4770
|
}
|
|
4157
4771
|
}
|