@scriptc/compiler 0.4.2 → 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 +397 -37
- package/dist/backend/cycle-analysis.d.ts +4 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +7 -0
- package/dist/backend/cycle-mutability.js +19 -1
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +2 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +6 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +16 -1
- package/dist/backend/llvm/alloc.js +54 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +21 -9
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
- package/dist/backend/llvm/bytes-loop-versions.js +473 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +258 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +7 -5
- package/dist/backend/llvm/classes.js +44 -20
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +167 -7
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +9 -3
- package/dist/backend/llvm/common.js +9 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +83 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +7 -0
- package/dist/backend/llvm/counted-loops.js +18 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
- package/dist/backend/llvm/dense-array-loops.js +194 -5
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +90 -1
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +26 -0
- package/dist/backend/llvm/dyn.js +352 -61
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +11 -20
- 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 +195 -27
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -4
- package/dist/backend/llvm/emit-statements.js +268 -84
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +176 -37
- package/dist/backend/llvm/emitter.js +724 -85
- 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-bytes.js +34 -12
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +28 -14
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +129 -37
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-dynamic.js +18 -11
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +100 -28
- 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 +194 -65
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +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 +80 -2
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +4 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +4 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +73 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +35 -5
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +115 -19
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +10 -0
- package/dist/backend/llvm/publish.js +12 -0
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/receivers.js +6 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +89 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +71 -15
- package/dist/backend/llvm/shapes.js +222 -33
- 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-reads.d.ts +12 -0
- package/dist/backend/llvm/string-reads.js +44 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/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/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +7 -0
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-diagnostics.js +5 -3
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +3 -3
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +4 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.js +12 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -0
- package/dist/diagnostics/envelope.js +1 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +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/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +100 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +84 -9
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +88 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +35 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +24 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +4 -1
- package/dist/frontend/lowering/class-construction.js +17 -3
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +39 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -108
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +32 -9
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +31 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +91 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/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.js +338 -18
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +10 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +15 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +2 -1
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +7 -2
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +43 -19
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.js +15 -1
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +47 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +47 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +36 -2
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +90 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +33 -4
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +95 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +138 -51
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +113 -11
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +212 -33
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +22 -3
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +49 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +7 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +186 -1
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
- package/dist/frontend/lowering/key-order-witness.js +770 -22
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +428 -8
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +4 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +7 -0
- package/dist/frontend/lowering/lower-calls.js +443 -41
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +302 -22
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +10 -2
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +83 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +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 +18 -6
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +32 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +5 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +2 -2
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +30 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +454 -48
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +1483 -156
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +77 -6
- package/dist/frontend/lowering/lowerer.js +313 -29
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +18 -6
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +29 -13
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.js +4 -20
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +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 +8 -1
- package/dist/frontend/program.js +484 -69
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +43 -3
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +22 -0
- package/dist/frontend/ts7/ast-node.js +1048 -103
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +24 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -3
- package/dist/frontend/ts7/ast-wire.js +34 -24
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +4 -0
- package/dist/frontend/ts7/checker.js +7 -0
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +25 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +22 -0
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +191 -11
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +34 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +19 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +24 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +52 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +6 -4
- package/dist/ir/builtin-signatures.js +166 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +14 -16
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +3 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +24 -2
- package/dist/ir/int32-slots.js +259 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +14 -6
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +10 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +30 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +70 -7
- package/dist/ir/ir.js +58 -1
- 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 +34 -13
- package/dist/ir/runtime-features.js +152 -38
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +18 -6
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +122 -36
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +2 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +21 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -1
- package/dist/native/prepare.js +119 -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 +2 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/surface-manifest.json +26 -4
package/dist/backend/llvm/dyn.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { emitPerKeyOrder } from "./key-orders.js";
|
|
1
2
|
import { typedRefConstructor } from "./shapes.js";
|
|
2
3
|
import { bindLiveArrayOps } from "./expr-stream-bridges.js";
|
|
3
|
-
import { BYTES_ELEM_NUM, SCR_ARR_FIELD, f64Lit, sizeToDouble } from "./common.js";
|
|
4
|
+
import { BYTES_ELEM_NUM, SCR_ARR_FIELD, SCR_ARR_STATES, f64Lit, sizeToDouble } from "./common.js";
|
|
4
5
|
import { emitUnionPeek, emitUnionTag } from "./union-repr.js";
|
|
5
6
|
import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, storeInlineUnion, unionBoxBits, } from "./inline-unions.js";
|
|
6
7
|
import { InternalCompilerError } from "../../errors.js";
|
|
7
|
-
import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, isDynTypedRefType, isRefCounted, isUnitType, typeKey, } from "../../ir/ir.js";
|
|
8
|
+
import { accessorSlotProp, DYN_HANDLE_KINDS, isDirentShape, KEY_ORDER_FIELD, shapeKeyOrders, isDynTypedRefType, isRefCounted, isUnitType, recordTextCodecClass, textCodecRecordClass, typeKey, } from "../../ir/ir.js";
|
|
8
9
|
import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
|
|
9
10
|
import { mangleRecordNew, mangleRecordStruct } from "../mangle.js";
|
|
10
11
|
import { BlockBuilder } from "./blocks.js";
|
|
@@ -39,6 +40,15 @@ export const DYN_HANDLE_TAG_NUM = {
|
|
|
39
40
|
cryptoHash: 52,
|
|
40
41
|
cryptoHmac: 53,
|
|
41
42
|
};
|
|
43
|
+
/** The handle tags of TextEncoder and TextDecoder records boxed as dyn
|
|
44
|
+
* (scr_dyn.h; scr_text_codec_dyn.c boxes and unboxes them). */
|
|
45
|
+
export const TEXT_CODEC_TAG_NUM = {
|
|
46
|
+
TextDecoder: 76,
|
|
47
|
+
TextEncoder: 77,
|
|
48
|
+
};
|
|
49
|
+
/** The decoder record fields scr_text_decoder_to_dyn reads, in its
|
|
50
|
+
* parameter order. */
|
|
51
|
+
const TEXT_DECODER_FIELDS = ["%TextDecoder", "%fatal", "%ignoreBOM", "%state"];
|
|
42
52
|
/** Handle kinds whose runtime unit boxes them through its own function,
|
|
43
53
|
* which installs the tag's ops on first use (scr_crypto.h). Programs that
|
|
44
54
|
* never box one of these values do not link its dynamic members. */
|
|
@@ -114,6 +124,54 @@ export class LlDyn {
|
|
|
114
124
|
constructor(host) {
|
|
115
125
|
this.host = host;
|
|
116
126
|
}
|
|
127
|
+
/** Journal replay (emit-journal.ts): builds or finds the helper a chunk
|
|
128
|
+
* emitter recorded, and answers its name. */
|
|
129
|
+
replayHelper(op, args) {
|
|
130
|
+
switch (op) {
|
|
131
|
+
case "dyn.collectionDynOps":
|
|
132
|
+
return this.collectionDynOps(args[0]);
|
|
133
|
+
case "dyn.dynMatchHelper":
|
|
134
|
+
return this.dynMatchHelper(args[0], args[1]);
|
|
135
|
+
case "dyn.jsonSchema":
|
|
136
|
+
return this.jsonSchema(args[0]);
|
|
137
|
+
case "dyn.recordNameTable": {
|
|
138
|
+
const shapeId = args[0];
|
|
139
|
+
return this.recordNameTable(shapeId, this.host.recordsById.get(shapeId)).names;
|
|
140
|
+
}
|
|
141
|
+
case "dyn.jsonParseHelper":
|
|
142
|
+
return this.jsonParseHelper(args[0]);
|
|
143
|
+
case "dyn.dynCheckHelper":
|
|
144
|
+
return this.dynCheckHelper(args[0], args[1]);
|
|
145
|
+
case "dyn.toDynHelper":
|
|
146
|
+
return this.toDynHelper(args[0]);
|
|
147
|
+
case "dyn.promiseDynAdapterHelper":
|
|
148
|
+
return this.promiseDynAdapterHelper(args[0]);
|
|
149
|
+
case "dyn.dynFuncThunkHelper":
|
|
150
|
+
return this.dynFuncThunkHelper(args[0]);
|
|
151
|
+
case "dyn.dynFuncBoxHelper":
|
|
152
|
+
return this.dynFuncBoxHelper(args[0]);
|
|
153
|
+
case "dyn.dynFuncAdapterHelper":
|
|
154
|
+
return this.dynFuncAdapterHelper(args[0]);
|
|
155
|
+
case "dyn.dynToStrHelper":
|
|
156
|
+
return this.dynToStrHelper();
|
|
157
|
+
case "dyn.dynIterNHelper":
|
|
158
|
+
return this.dynIterNHelper();
|
|
159
|
+
case "dyn.dynDestrCheckHelper":
|
|
160
|
+
return this.dynDestrCheckHelper();
|
|
161
|
+
case "dyn.dynKeyGetHelper":
|
|
162
|
+
return this.dynKeyGetHelper();
|
|
163
|
+
case "dyn.dynComputedKeyGetHelper":
|
|
164
|
+
return this.dynComputedKeyGetHelper();
|
|
165
|
+
case "dyn.caughtToDynHelper":
|
|
166
|
+
return this.caughtToDynHelper();
|
|
167
|
+
case "dyn.messageListenerHelper":
|
|
168
|
+
return this.messageListenerHelper(args[0]) ?? "";
|
|
169
|
+
case "dyn.messageReaderHelper":
|
|
170
|
+
return this.messageReaderHelper(args[0]);
|
|
171
|
+
default:
|
|
172
|
+
throw new InternalCompilerError(`llvm emitter bug: no dyn helper replay ${op}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
117
175
|
/** The types a dyn matcher or builder for `t` checks structurally: record
|
|
118
176
|
* fields and index values, array elements and union arms. */
|
|
119
177
|
structuralChildren(t) {
|
|
@@ -218,6 +276,34 @@ export class LlDyn {
|
|
|
218
276
|
this.host.declare(`declare void @scr_dyn_build_add(ptr, ptr, ptr)`);
|
|
219
277
|
B.line(`call void @scr_dyn_build_add(ptr %d, ptr @${name}, ptr ${value})`);
|
|
220
278
|
}
|
|
279
|
+
/** The order a dyn value tries a union's arms in: the canonical order,
|
|
280
|
+
* except that among the record arms, those with more required fields go
|
|
281
|
+
* first, then those with more fields. Records are width-tolerant, so an
|
|
282
|
+
* arm with fewer fields (`{}`, or one whose fields are all optional,
|
|
283
|
+
* matches every object) would otherwise take an object that a wider arm
|
|
284
|
+
* also matches and drop the fields only the wider arm has. */
|
|
285
|
+
unionArmOrder(def) {
|
|
286
|
+
const width = (i) => {
|
|
287
|
+
const arm = def.arms[i];
|
|
288
|
+
if (arm.kind !== "record")
|
|
289
|
+
return null;
|
|
290
|
+
const shape = this.host.recordsById.get(arm.shapeId);
|
|
291
|
+
if (!shape || shape.tuple)
|
|
292
|
+
return null;
|
|
293
|
+
const required = shape.fields.filter((field) => field.type.kind !== "union" ||
|
|
294
|
+
!this.host.unionsById.get(field.type.unionId)?.arms.some((x) => x.kind === "undefinedT")).length;
|
|
295
|
+
return [required, shape.fields.length];
|
|
296
|
+
};
|
|
297
|
+
const order = def.arms.map((_, i) => i);
|
|
298
|
+
const records = order.filter((i) => width(i) !== null);
|
|
299
|
+
const widest = [...records].sort((x, y) => {
|
|
300
|
+
const [rx, fx] = width(x);
|
|
301
|
+
const [ry, fy] = width(y);
|
|
302
|
+
return ry - rx || fy - fx || x - y;
|
|
303
|
+
});
|
|
304
|
+
records.forEach((slot, k) => (order[slot] = widest[k]));
|
|
305
|
+
return order;
|
|
306
|
+
}
|
|
221
307
|
/** Branch to a variant only after its literal discriminator and complete
|
|
222
308
|
* structure match. Use the same path for predicates and builders. */
|
|
223
309
|
unionArmMatch(B, def, tag, yes, no, preserveRefs = false) {
|
|
@@ -271,6 +357,7 @@ export class LlDyn {
|
|
|
271
357
|
return prior;
|
|
272
358
|
const name = `sc_map_dyn_${this.mapDynOps.size}`;
|
|
273
359
|
this.mapDynOps.set(key, name);
|
|
360
|
+
this.host.journalAllocated?.(name, "dyn.collectionDynOps", [t]);
|
|
274
361
|
const keyType = t.kind === "map" ? t.key : t.elem;
|
|
275
362
|
const valueType = t.kind === "map" ? t.value : { kind: "f64" };
|
|
276
363
|
const emitSlot = (type, role) => {
|
|
@@ -311,6 +398,7 @@ export class LlDyn {
|
|
|
311
398
|
emitSlot(keyType, "key");
|
|
312
399
|
emitSlot(valueType, "value");
|
|
313
400
|
this.defs.push(`@${name} = internal constant { ptr, ptr, ptr, ptr, ptr, ptr } { ptr ${this.host.cstr(key)}, ptr @${name}_key_box, ptr @${name}_key_unbox, ptr @${this.dynMatchHelper(keyType)}, ptr @${name}_value_box, ptr @${name}_value_unbox }`, "");
|
|
401
|
+
this.host.journalBuilt?.();
|
|
314
402
|
return name;
|
|
315
403
|
}
|
|
316
404
|
/* ── dyn node plumbing ─────────────────────────────────────────────── */
|
|
@@ -651,6 +739,17 @@ export class LlDyn {
|
|
|
651
739
|
return existing;
|
|
652
740
|
const name = `sc_dm_${this.dynMatchers.size}`;
|
|
653
741
|
this.dynMatchers.set(matcherKey, name);
|
|
742
|
+
this.host.journalAllocated?.(name, "dyn.dynMatchHelper", [t, preserveRefs]);
|
|
743
|
+
const codec = textCodecRecordClass(t, (id) => this.host.recordsById.get(id));
|
|
744
|
+
if (codec !== null) {
|
|
745
|
+
// A codec matches only its own handle box.
|
|
746
|
+
const B = new BlockBuilder();
|
|
747
|
+
const matched = this.handleTagMatches(B, TEXT_CODEC_TAG_NUM[codec]);
|
|
748
|
+
B.terminate(`ret i1 ${matched}`);
|
|
749
|
+
this.defs.push(`define internal zeroext i1 @${name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
|
|
750
|
+
this.host.journalBuilt?.();
|
|
751
|
+
return name;
|
|
752
|
+
}
|
|
654
753
|
const recursive = this.isRecursiveShape(t);
|
|
655
754
|
const wrapped = recursive || this.holdsRecursiveShape(t);
|
|
656
755
|
const B = new BlockBuilder();
|
|
@@ -856,9 +955,10 @@ export class LlDyn {
|
|
|
856
955
|
}
|
|
857
956
|
B.condBr(readable, l0, fail);
|
|
858
957
|
B.startBlock(l0);
|
|
859
|
-
// 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.
|
|
860
960
|
for (const f of shape.fields) {
|
|
861
|
-
if (f.type.kind === "dyn")
|
|
961
|
+
if (f.type.kind === "dyn" || f.name === KEY_ORDER_FIELD)
|
|
862
962
|
continue;
|
|
863
963
|
const { value: m, release } = this.memberRead(B, f.name, f.type);
|
|
864
964
|
const lNext = B.newLabel("dm.n");
|
|
@@ -986,6 +1086,7 @@ export class LlDyn {
|
|
|
986
1086
|
this.defs.push(`define internal zeroext i1 @${wrapped ? `${name}_body` : name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
|
|
987
1087
|
if (wrapped)
|
|
988
1088
|
this.emitVisitWrapper(name, t, recursive ? "match" : "visit");
|
|
1089
|
+
this.host.journalBuilt?.();
|
|
989
1090
|
return name;
|
|
990
1091
|
}
|
|
991
1092
|
/* ── schema-directed JSON.parse ───────────────────────────────── */
|
|
@@ -1022,9 +1123,10 @@ export class LlDyn {
|
|
|
1022
1123
|
if (shape.fields.length > 64 || (shape.fields.length === 0 && !index))
|
|
1023
1124
|
return false;
|
|
1024
1125
|
visiting.add(t.shapeId);
|
|
1025
|
-
return (shape.fields.every((f) =>
|
|
1026
|
-
f.name
|
|
1027
|
-
|
|
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))) &&
|
|
1028
1130
|
(!index || this.jsonSchemaSupported(index, visiting)));
|
|
1029
1131
|
}
|
|
1030
1132
|
case "union":
|
|
@@ -1073,6 +1175,7 @@ export class LlDyn {
|
|
|
1073
1175
|
const S = host.sizeType;
|
|
1074
1176
|
const name = `sc_jsch_${this.jsonSchemas.size}`;
|
|
1075
1177
|
this.jsonSchemas.set(key, name);
|
|
1178
|
+
this.host.journalAllocated?.(name, "dyn.jsonSchema", [t]);
|
|
1076
1179
|
let body;
|
|
1077
1180
|
switch (t.kind) {
|
|
1078
1181
|
case "f64":
|
|
@@ -1097,7 +1200,9 @@ export class LlDyn {
|
|
|
1097
1200
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
1098
1201
|
const index = new Map(shape.fields.map((f, i) => [f.name, i + base]));
|
|
1099
1202
|
// The runtime names kept-source keys by this index (record-sources.ts).
|
|
1100
|
-
|
|
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);
|
|
1101
1206
|
if (recordMayKeepSource(shape))
|
|
1102
1207
|
this.keepsRecordSources = true;
|
|
1103
1208
|
const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
|
|
@@ -1130,6 +1235,7 @@ export class LlDyn {
|
|
|
1130
1235
|
throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
|
|
1131
1236
|
}
|
|
1132
1237
|
this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr, ptr, ${S} } { ${body} }`, ``);
|
|
1238
|
+
this.host.journalBuilt?.();
|
|
1133
1239
|
return name;
|
|
1134
1240
|
}
|
|
1135
1241
|
/** The ScrJsonUnion descriptor of a union member (scr_json.h layout):
|
|
@@ -1200,9 +1306,11 @@ export class LlDyn {
|
|
|
1200
1306
|
const base = `sc_rnames_${this.recordNameTables.size}`;
|
|
1201
1307
|
const table = { names: `@${base}`, lens: `@${base}_lens` };
|
|
1202
1308
|
this.recordNameTables.set(shapeId, table);
|
|
1309
|
+
this.host.journalAllocated?.(base, "dyn.recordNameTable", [shapeId]);
|
|
1203
1310
|
const n = shape.fields.length;
|
|
1204
1311
|
const names = recordSourceFieldOrder(shape);
|
|
1205
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?.();
|
|
1206
1314
|
return table;
|
|
1207
1315
|
}
|
|
1208
1316
|
/** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
|
|
@@ -1223,12 +1331,14 @@ export class LlDyn {
|
|
|
1223
1331
|
const host = this.host;
|
|
1224
1332
|
const name = `sc_jp_${this.jsonParsers.size}`;
|
|
1225
1333
|
this.jsonParsers.set(key, name);
|
|
1334
|
+
this.host.journalAllocated?.(name, "dyn.jsonParseHelper", [t]);
|
|
1226
1335
|
const schema = this.jsonSchema(t);
|
|
1227
1336
|
const check = this.dynCheckHelper(t);
|
|
1228
1337
|
host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
|
|
1229
1338
|
host.declare(`declare ptr @scr_json_parse(ptr)`);
|
|
1230
1339
|
host.declare(`declare void @scr_dyn_release(ptr)`);
|
|
1231
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?.();
|
|
1232
1342
|
return name;
|
|
1233
1343
|
}
|
|
1234
1344
|
/* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
|
|
@@ -1243,6 +1353,7 @@ export class LlDyn {
|
|
|
1243
1353
|
return existing;
|
|
1244
1354
|
const name = `sc_dc_${this.dynBuilders.size}`;
|
|
1245
1355
|
this.dynBuilders.set(builderKey, name);
|
|
1356
|
+
this.host.journalAllocated?.(name, "dyn.dynCheckHelper", [t, preserveRefs]);
|
|
1246
1357
|
const recursive = this.isRecursiveShape(t);
|
|
1247
1358
|
const memo = !recursive && this.holdsRecursiveShape(t) && this.valTy(t) === "ptr";
|
|
1248
1359
|
const host = this.host;
|
|
@@ -1257,6 +1368,18 @@ export class LlDyn {
|
|
|
1257
1368
|
B.line(`${checked} = call ptr @scr_dyn_class_check(ptr %d, ptr ${host.cstr(key)}, ptr %path)`);
|
|
1258
1369
|
B.terminate(`ret ptr ${checked}`);
|
|
1259
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?.();
|
|
1260
1383
|
return name;
|
|
1261
1384
|
}
|
|
1262
1385
|
if (isRefCounted(t) && t.kind !== "dyn") {
|
|
@@ -1416,6 +1539,26 @@ export class LlDyn {
|
|
|
1416
1539
|
B.line(`store ${member.type} ${oldValue}, ptr ${checkedPtr}`);
|
|
1417
1540
|
});
|
|
1418
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);
|
|
1419
1562
|
// Sparse slots and numeric properties live out of line; each
|
|
1420
1563
|
// array keeps its own match metadata.
|
|
1421
1564
|
host.declare("declare void @scr_arr_swap_indexed_ext(ptr, ptr)");
|
|
@@ -1746,7 +1889,11 @@ export class LlDyn {
|
|
|
1746
1889
|
B.line(`%r0 = call ptr @${mangleRecordNew(t.shapeId)}()`);
|
|
1747
1890
|
if (recursive)
|
|
1748
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.
|
|
1749
1894
|
for (const f of shape.fields) {
|
|
1895
|
+
if (f.name === KEY_ORDER_FIELD)
|
|
1896
|
+
continue;
|
|
1750
1897
|
const { value: m, release } = this.memberRead(B, f.name, f.type);
|
|
1751
1898
|
this.pendingBail(B, "dcr.read", () => {
|
|
1752
1899
|
B.line(`call void @${release}(ptr ${m})`);
|
|
@@ -1914,9 +2061,10 @@ export class LlDyn {
|
|
|
1914
2061
|
const def = host.unionsById.get(t.unionId);
|
|
1915
2062
|
if (!def)
|
|
1916
2063
|
throw new InternalCompilerError(`llvm emitter bug: dynCheck of unknown union ${t.unionId}`);
|
|
1917
|
-
// Arms in
|
|
1918
|
-
//
|
|
1919
|
-
|
|
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];
|
|
1920
2068
|
const lHit = B.newLabel("dcu.h");
|
|
1921
2069
|
const lNext = B.newLabel("dcu.n");
|
|
1922
2070
|
this.unionArmMatch(B, def, i, lHit, lNext, preserveRefs);
|
|
@@ -1958,7 +2106,7 @@ export class LlDyn {
|
|
|
1958
2106
|
B.terminate(`ret ptr ${u}`);
|
|
1959
2107
|
}
|
|
1960
2108
|
B.startBlock(lNext);
|
|
1961
|
-
}
|
|
2109
|
+
}
|
|
1962
2110
|
if (preserveRefs) {
|
|
1963
2111
|
B.line(`call void @scr_dyn_check_fail(ptr %path, ptr ${host.cstr("reference with its original layout")}, ptr %d)`);
|
|
1964
2112
|
B.terminate(`ret ptr null`);
|
|
@@ -2157,8 +2305,64 @@ export class LlDyn {
|
|
|
2157
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(), `}`, ``);
|
|
2158
2306
|
if (recursive || memo)
|
|
2159
2307
|
this.emitVisitWrapper(name, t, recursive ? "build" : "memo");
|
|
2308
|
+
this.host.journalBuilt?.();
|
|
2160
2309
|
return name;
|
|
2161
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
|
+
}
|
|
2162
2366
|
/* ── toDynHelper (walkers.ts, ported) ─────────────────────────── */
|
|
2163
2367
|
/** `sc_td_<n>(<T> v) -> ptr` — build a fresh dyn value from a
|
|
2164
2368
|
* static one (+1), DEEP-COPYING composites. Borrows the operand.
|
|
@@ -2170,6 +2374,7 @@ export class LlDyn {
|
|
|
2170
2374
|
return existing;
|
|
2171
2375
|
const name = `sc_td_${this.toDynFns.size}`;
|
|
2172
2376
|
this.toDynFns.set(key, name);
|
|
2377
|
+
this.host.journalAllocated?.(name, "dyn.toDynHelper", [t]);
|
|
2173
2378
|
const host = this.host;
|
|
2174
2379
|
const B = new BlockBuilder();
|
|
2175
2380
|
let sourceAccessor = null;
|
|
@@ -2319,6 +2524,11 @@ export class LlDyn {
|
|
|
2319
2524
|
const shape = host.recordsById.get(t.shapeId);
|
|
2320
2525
|
if (!shape)
|
|
2321
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
|
+
}
|
|
2322
2532
|
const struct = mangleRecordStruct(t.shapeId);
|
|
2323
2533
|
const base = host.nullableUnions.fieldBase(t.shapeId);
|
|
2324
2534
|
const fieldIndex = new Map(shape.fields.map((f, i) => [f.name, i + base]));
|
|
@@ -2401,58 +2611,68 @@ export class LlDyn {
|
|
|
2401
2611
|
host.declare(`declare ptr @scr_dyn_new_obj()`);
|
|
2402
2612
|
B.line(`${d} = call ptr @scr_dyn_new_obj()`);
|
|
2403
2613
|
}
|
|
2404
|
-
// Keys insert in DECLARED order (JS insertion order)
|
|
2405
|
-
// '
|
|
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).
|
|
2406
2618
|
const byName = new Map(shape.fields.map((f) => [f.name, f]));
|
|
2407
2619
|
// An accessor property is one key whose getter and setter are the
|
|
2408
2620
|
// slot closures (see accessorSlotProp), in accessorOrder's place.
|
|
2409
|
-
const
|
|
2410
|
-
const
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
B.
|
|
2453
|
-
B.
|
|
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
|
+
}
|
|
2454
2670
|
}
|
|
2455
|
-
}
|
|
2671
|
+
};
|
|
2672
|
+
if (orders.length === 1)
|
|
2673
|
+
perOrder(orders[0]);
|
|
2674
|
+
else
|
|
2675
|
+
emitPerKeyOrder(B, shape, base, "%v", perOrder);
|
|
2456
2676
|
// A Dirent row takes Node's Dirent prototype (the type probes) and
|
|
2457
2677
|
// its Symbol(type) key; %dtype stays readable but non-enumerable.
|
|
2458
2678
|
if (isDirentShape(shape)) {
|
|
@@ -2724,6 +2944,7 @@ export class LlDyn {
|
|
|
2724
2944
|
if (sourceAccessor) {
|
|
2725
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`, `}`, ``);
|
|
2726
2946
|
}
|
|
2947
|
+
this.host.journalBuilt?.();
|
|
2727
2948
|
return name;
|
|
2728
2949
|
}
|
|
2729
2950
|
/** The checked-dynamic tree-promise settle adapter for one fulfillment payload type —
|
|
@@ -2740,6 +2961,7 @@ export class LlDyn {
|
|
|
2740
2961
|
return existing;
|
|
2741
2962
|
const name = `sc_pda_${this.promiseDynAdapters.size}`;
|
|
2742
2963
|
this.promiseDynAdapters.set(key, name);
|
|
2964
|
+
this.host.journalAllocated?.(name, "dyn.promiseDynAdapterHelper", [inner]);
|
|
2743
2965
|
const host = this.host;
|
|
2744
2966
|
const B = new BlockBuilder();
|
|
2745
2967
|
host.declare(`declare void @scr_promise_fulfill_ref(ptr, ptr, ptr, ptr, ptr)`);
|
|
@@ -2811,6 +3033,7 @@ export class LlDyn {
|
|
|
2811
3033
|
}
|
|
2812
3034
|
B.terminate(`ret void`);
|
|
2813
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?.();
|
|
2814
3037
|
return name;
|
|
2815
3038
|
}
|
|
2816
3039
|
/* ── the dyn ToString pair (dynToStrHelper, ported) ────────────────── */
|
|
@@ -2822,6 +3045,7 @@ export class LlDyn {
|
|
|
2822
3045
|
return this.dynToStrFn;
|
|
2823
3046
|
const name = "sc_ds";
|
|
2824
3047
|
this.dynToStrFn = name;
|
|
3048
|
+
this.host.journalAllocated?.(name, "dyn.dynToStrHelper", []);
|
|
2825
3049
|
const host = this.host;
|
|
2826
3050
|
host.declare(`declare void @scr_jb_init(ptr)`);
|
|
2827
3051
|
host.declare(`declare ptr @scr_jb_finish(ptr)`);
|
|
@@ -3112,6 +3336,7 @@ export class LlDyn {
|
|
|
3112
3336
|
B.terminate(`ret ptr ${out}`);
|
|
3113
3337
|
this.defs.push(`define internal ptr @${name}(ptr %d) ${FN_ATTRS} { ; String(unknown) -> owned (+1)`, B.render(), `}`, ``);
|
|
3114
3338
|
}
|
|
3339
|
+
this.host.journalBuilt?.();
|
|
3115
3340
|
return name;
|
|
3116
3341
|
}
|
|
3117
3342
|
/* ── caughtToDyn (walkers.ts, ported) ─────────────────────────── */
|
|
@@ -3122,6 +3347,7 @@ export class LlDyn {
|
|
|
3122
3347
|
return this.caughtToDynFn;
|
|
3123
3348
|
const name = "sc_cd";
|
|
3124
3349
|
this.caughtToDynFn = name;
|
|
3350
|
+
this.host.journalAllocated?.(name, "dyn.caughtToDynHelper", []);
|
|
3125
3351
|
const host = this.host;
|
|
3126
3352
|
const B = new BlockBuilder();
|
|
3127
3353
|
const kp = B.tmp();
|
|
@@ -3220,6 +3446,7 @@ export class LlDyn {
|
|
|
3220
3446
|
B.terminate(`ret ptr ${e}`);
|
|
3221
3447
|
}
|
|
3222
3448
|
this.defs.push(`define internal ptr @${name}(ptr %c) ${FN_ATTRS} { ; caught -> unknown (+1, fresh tree)`, B.render(), `}`, ``);
|
|
3449
|
+
this.host.journalBuilt?.();
|
|
3223
3450
|
return name;
|
|
3224
3451
|
}
|
|
3225
3452
|
/* ── the keyed read (dynKeyGetHelper, ported) ──────────────────────── */
|
|
@@ -3232,6 +3459,7 @@ export class LlDyn {
|
|
|
3232
3459
|
this.helperMemo.set(name, name);
|
|
3233
3460
|
const B = new BlockBuilder();
|
|
3234
3461
|
const host = this.host;
|
|
3462
|
+
this.host.journalAllocated?.(name, "dyn.dynComputedKeyGetHelper", []);
|
|
3235
3463
|
const stringHelper = this.dynKeyGetHelper();
|
|
3236
3464
|
host.declare(`declare ptr @scr_dyn_property_key_value(ptr)`);
|
|
3237
3465
|
host.declare(`declare ptr @scr_dyn_symbol_key_get(ptr, ptr, i1 zeroext)`);
|
|
@@ -3264,6 +3492,7 @@ export class LlDyn {
|
|
|
3264
3492
|
B.line(`call void @scr_dyn_release(ptr ${key})`);
|
|
3265
3493
|
B.terminate(`ret ptr ${value}`);
|
|
3266
3494
|
this.defs.push(`define internal ptr @${name}(ptr %d, ptr %key, i1 zeroext %opt) ${FN_ATTRS} {`, B.render(), "}", "");
|
|
3495
|
+
this.host.journalBuilt?.();
|
|
3267
3496
|
return name;
|
|
3268
3497
|
}
|
|
3269
3498
|
dynKeyGetHelper() {
|
|
@@ -3273,6 +3502,7 @@ export class LlDyn {
|
|
|
3273
3502
|
return existing;
|
|
3274
3503
|
const name = "sc_dyn_key_get";
|
|
3275
3504
|
this.dynBuilders.set(memoKey, name);
|
|
3505
|
+
this.host.journalAllocated?.(name, "dyn.dynKeyGetHelper", []);
|
|
3276
3506
|
const host = this.host;
|
|
3277
3507
|
const B = new BlockBuilder();
|
|
3278
3508
|
const kd = this.kindOf(B, "%d");
|
|
@@ -3651,6 +3881,7 @@ export class LlDyn {
|
|
|
3651
3881
|
}
|
|
3652
3882
|
retainUndef();
|
|
3653
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?.();
|
|
3654
3885
|
return name;
|
|
3655
3886
|
}
|
|
3656
3887
|
/* ── destructuring RequireObjectCoercible (ported) ─────────────────── */
|
|
@@ -3661,6 +3892,7 @@ export class LlDyn {
|
|
|
3661
3892
|
return existing;
|
|
3662
3893
|
const name = "sc_dyn_destr_check";
|
|
3663
3894
|
this.dynBuilders.set(memoKey, name);
|
|
3895
|
+
this.host.journalAllocated?.(name, "dyn.dynDestrCheckHelper", []);
|
|
3664
3896
|
const host = this.host;
|
|
3665
3897
|
host.declare(`declare void @scr_jb_init(ptr)`);
|
|
3666
3898
|
host.declare(`declare ptr @scr_jb_finish(ptr)`);
|
|
@@ -3710,6 +3942,7 @@ export class LlDyn {
|
|
|
3710
3942
|
B.line(`call void @scr_throw_error(i32 1, ptr ${msg}) ; SCR_ERR_TYPE`);
|
|
3711
3943
|
B.terminate(`ret void`);
|
|
3712
3944
|
this.defs.push(`define internal void @${name}(ptr %d, ptr %spell, ptr %firstProp) ${FN_ATTRS} { ; destructuring RequireObjectCoercible`, B.render(), `}`, ``);
|
|
3945
|
+
this.host.journalBuilt?.();
|
|
3713
3946
|
return name;
|
|
3714
3947
|
}
|
|
3715
3948
|
/* ── GetIterator + first-N steps (dynIterNHelper, ported) ──────────── */
|
|
@@ -3720,6 +3953,7 @@ export class LlDyn {
|
|
|
3720
3953
|
return existing;
|
|
3721
3954
|
const name = "sc_dyn_iter_n";
|
|
3722
3955
|
this.dynBuilders.set(memoKey, name);
|
|
3956
|
+
this.host.journalAllocated?.(name, "dyn.dynIterNHelper", []);
|
|
3723
3957
|
const host = this.host;
|
|
3724
3958
|
host.declare(`declare ptr @scr_dyn_new_arr()`);
|
|
3725
3959
|
host.declare(`declare void @scr_dyn_arr_push(ptr, ptr)`);
|
|
@@ -3914,12 +4148,38 @@ export class LlDyn {
|
|
|
3914
4148
|
});
|
|
3915
4149
|
B.terminate(`ret ptr ${out}`);
|
|
3916
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?.();
|
|
3917
4152
|
return name;
|
|
3918
4153
|
}
|
|
3919
4154
|
/* ── the checked-dynamic function boundary (ported) ────────────────── */
|
|
3920
4155
|
/** The dyn argument spelling of one static value: dyn passes through
|
|
3921
4156
|
* (+1), funcs box anonymously, everything else rides toDyn. `expr` is
|
|
3922
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
|
+
}
|
|
3923
4183
|
toDynExpr(B, t, expr) {
|
|
3924
4184
|
if (t.kind === "dyn")
|
|
3925
4185
|
return this.retainDyn(B, expr);
|
|
@@ -3943,6 +4203,7 @@ export class LlDyn {
|
|
|
3943
4203
|
return existing;
|
|
3944
4204
|
const name = `sc_dfk_${this.dynFuncThunks.size}`;
|
|
3945
4205
|
this.dynFuncThunks.set(key, name);
|
|
4206
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncThunkHelper", [t]);
|
|
3946
4207
|
const host = this.host;
|
|
3947
4208
|
const B = new BlockBuilder();
|
|
3948
4209
|
const argNames = [];
|
|
@@ -4041,6 +4302,22 @@ export class LlDyn {
|
|
|
4041
4302
|
B.line(`call void ${releaseSym(host, q)}(ptr ${argNames[j]})`);
|
|
4042
4303
|
});
|
|
4043
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
|
+
}
|
|
4044
4321
|
argNames.push(a);
|
|
4045
4322
|
}
|
|
4046
4323
|
});
|
|
@@ -4075,12 +4352,15 @@ export class LlDyn {
|
|
|
4075
4352
|
const r = B.tmp();
|
|
4076
4353
|
B.line(`${r} = call ${retTy} ${fn}(${callArgs})`);
|
|
4077
4354
|
this.pendingBail(B, "dfkr", () => { }, "ptr null");
|
|
4078
|
-
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);
|
|
4079
4358
|
if (isRefCounted(t.ret))
|
|
4080
4359
|
B.line(`call void ${releaseSym(host, t.ret)}(ptr ${r})`);
|
|
4081
4360
|
B.terminate(`ret ptr ${out}`);
|
|
4082
4361
|
}
|
|
4083
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?.();
|
|
4084
4364
|
return name;
|
|
4085
4365
|
}
|
|
4086
4366
|
/** The box builder dynFrom emits for one closure signature. */
|
|
@@ -4091,12 +4371,14 @@ export class LlDyn {
|
|
|
4091
4371
|
return existing;
|
|
4092
4372
|
const name = `sc_dfb_${this.dynFuncBoxes.size}`;
|
|
4093
4373
|
this.dynFuncBoxes.set(key, name);
|
|
4374
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncBoxHelper", [t]);
|
|
4094
4375
|
const host = this.host;
|
|
4095
4376
|
const thunk = this.dynFuncThunkHelper(t);
|
|
4096
4377
|
host.declare(`declare ptr @scr_closure_retain_v(ptr)`);
|
|
4097
4378
|
host.declare(`declare ptr @scr_dyn_new_func(ptr, ptr, i32, ptr, ptr)`);
|
|
4098
4379
|
const sigLit = host.cstr(key);
|
|
4099
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?.();
|
|
4100
4382
|
return name;
|
|
4101
4383
|
}
|
|
4102
4384
|
/** `sc_dml_<n>(ptr c, ptr message) -> i1`, the typed message entry of a
|
|
@@ -4118,11 +4400,15 @@ export class LlDyn {
|
|
|
4118
4400
|
(t.ret.kind === "void" || t.ret.kind === "f64" || t.ret.kind === "bool") &&
|
|
4119
4401
|
this.messageReadable(param, new Set());
|
|
4120
4402
|
if (!supported) {
|
|
4403
|
+
// A signature without an entry still takes a number.
|
|
4121
4404
|
this.messageListeners.set(key, null);
|
|
4405
|
+
this.host.journalAllocated?.("", "dyn.messageListenerHelper", [t]);
|
|
4406
|
+
this.host.journalBuilt?.();
|
|
4122
4407
|
return null;
|
|
4123
4408
|
}
|
|
4124
4409
|
const name = `sc_dml_${this.messageListeners.size}`;
|
|
4125
4410
|
this.messageListeners.set(key, name);
|
|
4411
|
+
this.host.journalAllocated?.(name, "dyn.messageListenerHelper", [t]);
|
|
4126
4412
|
const B = new BlockBuilder();
|
|
4127
4413
|
B.entryAllocas.push(`%fail = alloca i1`);
|
|
4128
4414
|
B.line(`store i1 false, ptr %fail`);
|
|
@@ -4149,6 +4435,7 @@ export class LlDyn {
|
|
|
4149
4435
|
B.line(`${B.tmp()} = call ${this.valTy(t.ret)} ${fn}(${args})`);
|
|
4150
4436
|
B.terminate(`ret i1 true`);
|
|
4151
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?.();
|
|
4152
4439
|
return name;
|
|
4153
4440
|
}
|
|
4154
4441
|
/** Whether a message reader can build T: numbers, booleans and strings;
|
|
@@ -4212,6 +4499,7 @@ export class LlDyn {
|
|
|
4212
4499
|
return existing;
|
|
4213
4500
|
const name = `sc_dmr_${this.messageReaders.size}`;
|
|
4214
4501
|
this.messageReaders.set(key, name);
|
|
4502
|
+
this.host.journalAllocated?.(name, "dyn.messageReaderHelper", [t]);
|
|
4215
4503
|
const host = this.host;
|
|
4216
4504
|
const S = host.sizeType;
|
|
4217
4505
|
if (t.kind !== "record")
|
|
@@ -4370,6 +4658,7 @@ export class LlDyn {
|
|
|
4370
4658
|
B.line(`store i1 true, ptr %fail`);
|
|
4371
4659
|
B.terminate(`ret ${retTy} ${dummy}`);
|
|
4372
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?.();
|
|
4373
4662
|
return name;
|
|
4374
4663
|
}
|
|
4375
4664
|
/** The adapter closure body for one TARGET signature: caps[0] is an
|
|
@@ -4381,6 +4670,7 @@ export class LlDyn {
|
|
|
4381
4670
|
return existing;
|
|
4382
4671
|
const name = `sc_dfa_${this.dynFuncAdapters.size}`;
|
|
4383
4672
|
this.dynFuncAdapters.set(key, name);
|
|
4673
|
+
this.host.journalAllocated?.(name, "dyn.dynFuncAdapterHelper", [t]);
|
|
4384
4674
|
const host = this.host;
|
|
4385
4675
|
const B = new BlockBuilder();
|
|
4386
4676
|
host.declare(`declare ptr @scr_box_get_ref(ptr)`);
|
|
@@ -4475,6 +4765,7 @@ export class LlDyn {
|
|
|
4475
4765
|
...(checkedRest ? ["ptr %rest"] : []),
|
|
4476
4766
|
].join(", ");
|
|
4477
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?.();
|
|
4478
4769
|
return name;
|
|
4479
4770
|
}
|
|
4480
4771
|
}
|