@scriptc/compiler 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +470 -66
- package/dist/backend/cycle-analysis.d.ts +4 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +7 -0
- package/dist/backend/cycle-mutability.js +19 -1
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +2 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +6 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +16 -1
- package/dist/backend/llvm/alloc.js +54 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +21 -9
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
- package/dist/backend/llvm/bytes-loop-versions.js +479 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +7 -5
- package/dist/backend/llvm/classes.js +44 -20
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +167 -7
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +9 -3
- package/dist/backend/llvm/common.js +9 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +83 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +7 -0
- package/dist/backend/llvm/counted-loops.js +18 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -5
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
- package/dist/backend/llvm/dense-array-loops.js +194 -5
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +90 -1
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +30 -0
- package/dist/backend/llvm/dyn.js +373 -70
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +13 -28
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +211 -33
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -4
- package/dist/backend/llvm/emit-statements.js +268 -84
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +186 -37
- package/dist/backend/llvm/emitter.js +733 -90
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +65 -7
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +48 -20
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +28 -14
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +143 -37
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-dynamic.js +18 -11
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +119 -38
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +210 -69
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +25 -1
- package/dist/backend/llvm/integer-values.js +95 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +213 -5
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +4 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +4 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +37 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +94 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +35 -5
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +115 -19
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +10 -0
- package/dist/backend/llvm/publish.js +15 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/receivers.js +6 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +89 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +71 -15
- package/dist/backend/llvm/shapes.js +224 -40
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +12 -0
- package/dist/backend/llvm/string-reads.js +44 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +101 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +7 -0
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- package/dist/backend/target-diagnostics.js +5 -3
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +20 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +10 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.js +4 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.js +12 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -0
- package/dist/diagnostics/envelope.js +1 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +5 -0
- package/dist/executable/executable-cache.js +5 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +949 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +100 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +87 -10
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.js +4 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
- package/dist/frontend/lowering/builtins/promises.js +236 -139
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +35 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +24 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +0 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +307 -4
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +4 -1
- package/dist/frontend/lowering/class-construction.js +17 -3
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +83 -24
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +31 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +91 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +10 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +5 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +26 -3
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +455 -46
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +7 -2
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +43 -19
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +11 -0
- package/dist/frontend/lowering/date-values.js +207 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.js +15 -1
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +47 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +53 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +100 -28
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +169 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +64 -5
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +95 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +138 -51
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +168 -10
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +212 -33
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +6 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +39 -3
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +64 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +7 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +186 -1
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
- package/dist/frontend/lowering/key-order-witness.js +974 -48
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +530 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +15 -3
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +4 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +7 -0
- package/dist/frontend/lowering/lower-calls.js +462 -44
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +324 -69
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +215 -3
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +83 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +42 -32
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +53 -17
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +53 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +5 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +2 -2
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +30 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +553 -81
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +1483 -156
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +107 -8
- package/dist/frontend/lowering/lowerer.js +381 -36
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +73 -8
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +29 -13
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.js +4 -20
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +19 -11
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +5 -1
- package/dist/frontend/program-analysis.js +5 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +21 -6
- package/dist/frontend/program.js +681 -83
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +43 -3
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +22 -0
- package/dist/frontend/ts7/ast-node.js +1048 -103
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +24 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -3
- package/dist/frontend/ts7/ast-wire.js +34 -24
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +4 -0
- package/dist/frontend/ts7/checker.js +7 -0
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +25 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +5 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +22 -0
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +229 -20
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +19 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +24 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +60 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +6 -4
- package/dist/ir/builtin-signatures.js +222 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +14 -16
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +3 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +24 -2
- package/dist/ir/int32-slots.js +266 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +33 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +28 -10
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +10 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +30 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +83 -10
- package/dist/ir/ir.js +77 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +23 -2
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +4 -0
- package/dist/ir/js-ic.js +17 -1
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +46 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +34 -13
- package/dist/ir/runtime-features.js +177 -39
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +18 -6
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +167 -40
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +21 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +4 -2
- package/dist/native/prepare.js +130 -32
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +96 -20
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +2 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/surface-manifest.json +27 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isIdentityCollectionKey, isRefCounted, mapOf, POINTER_KINDS, runtimeRcStem, RUNTIME_EMITTER_CLASS, RUNTIME_EVENT_CLASS, RUNTIME_EVENT_TARGET_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, DYN, STRING, } from "../../ir/ir.js";
|
|
2
2
|
import { mangleClassRelease, mangleClassRetain, mangleClassTrace, mangleRecordGcFree, mangleRecordClone, mangleRecordNew, mangleRecordRelease, mangleRecordRetain, mangleRecordStruct, mangleRecordTrace, } from "../mangle.js";
|
|
3
|
-
import { CYC_HDR, cycTypeDescriptor, emitObjectAlloc, emitObjectFree, CYC_APPEND, cycleAppendDecls, cycleAppendHelper, inlineBufferingSupported, } from "./alloc.js";
|
|
3
|
+
import { CYC_HDR, cycTypeDescriptor, emitObjectAlloc, emitObjectFree, emitSegmentFree, CYC_APPEND, cycleAppendDecls, cycleAppendHelper, inlineBufferingSupported, } from "./alloc.js";
|
|
4
4
|
import { SCR_ARR_FIELD, llvmCommentText } from "./common.js";
|
|
5
5
|
import { NULLABLE_NULL, SHAPE_WORD_INDEX, shapeReleaseFn, shapeTagFn, shapeTraceFn, shapeWordHeader, } from "./nullable-unions.js";
|
|
6
6
|
import { INLINE_UNION_FIELD, loadInlineUnion, stackUnionBox, } from "./inline-unions.js";
|
|
@@ -210,6 +210,7 @@ function nullableRetainSym(host, arm) {
|
|
|
210
210
|
const sym = `@sc_nretain_${arm.kind}`;
|
|
211
211
|
if (!host.nullableUnions.retainWrappers.has(sym))
|
|
212
212
|
host.nullableUnions.retainWrappers.set(sym, retainSym(host, arm));
|
|
213
|
+
host.journalEntry?.("retainWrapper", sym, host.nullableUnions.retainWrappers.get(sym));
|
|
213
214
|
return sym;
|
|
214
215
|
}
|
|
215
216
|
/** Definitions of the requested NULL-skipping retain wrappers. */
|
|
@@ -354,6 +355,8 @@ export function inlineRcFamily(host, stem, op) {
|
|
|
354
355
|
}
|
|
355
356
|
const RELEASE_RC_OPS = new Set([
|
|
356
357
|
"str:retain",
|
|
358
|
+
"str:release",
|
|
359
|
+
"map:retain",
|
|
357
360
|
"dyn:retain",
|
|
358
361
|
"dyn:release",
|
|
359
362
|
"js:retain",
|
|
@@ -428,12 +431,25 @@ function inlineRcName(family, op) {
|
|
|
428
431
|
* thousands of release sites; a body with more calls scr_dyn_release, which
|
|
429
432
|
* the inline helper mirrors, at every site. */
|
|
430
433
|
export const INLINE_DYN_RELEASES_PER_FUNCTION = 256;
|
|
431
|
-
/**
|
|
432
|
-
*
|
|
433
|
-
*
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
434
|
+
/** Inlined string releases one function body keeps in `release` emission,
|
|
435
|
+
* which inlines string releases (RELEASE_RC_OPS); the bodies with the most of them, such as
|
|
436
|
+
* builders of string-heavy records and module initializers, would grow the
|
|
437
|
+
* most for the least gain, so a body with more calls scr_str_release at
|
|
438
|
+
* every site. */
|
|
439
|
+
export const INLINE_STR_RELEASES_PER_FUNCTION = 8;
|
|
440
|
+
/** Apply {@link INLINE_DYN_RELEASES_PER_FUNCTION}, and in `release` emission
|
|
441
|
+
* {@link INLINE_STR_RELEASES_PER_FUNCTION}, to each function of an emitted
|
|
442
|
+
* module, given as parts joined by newlines. A function can span parts
|
|
443
|
+
* (main's lines) and a part can hold several functions. */
|
|
444
|
+
export function limitInlineReleases(parts, mode) {
|
|
445
|
+
const dyn = limitInlineReleaseFamily(parts, "dyn", INLINE_DYN_RELEASES_PER_FUNCTION);
|
|
446
|
+
return mode === "release"
|
|
447
|
+
? limitInlineReleaseFamily(dyn, "str", INLINE_STR_RELEASES_PER_FUNCTION)
|
|
448
|
+
: dyn;
|
|
449
|
+
}
|
|
450
|
+
function limitInlineReleaseFamily(parts, family, max) {
|
|
451
|
+
const call = `call void @${inlineRcName(family, "release")}(`;
|
|
452
|
+
const runtime = `call void @${INLINE_RC_FAMILIES[family].release}(`;
|
|
437
453
|
// The function each release site belongs to: the last `define` line
|
|
438
454
|
// before it, counted over the joined text.
|
|
439
455
|
const sites = (part, each, first) => {
|
|
@@ -456,7 +472,7 @@ export function limitInlineDynReleases(parts) {
|
|
|
456
472
|
let fn = 0;
|
|
457
473
|
for (const part of parts)
|
|
458
474
|
fn = sites(part, (_, f) => counts.set(f, (counts.get(f) ?? 0) + 1), fn);
|
|
459
|
-
const over = new Set([...counts].filter(([, n]) => n >
|
|
475
|
+
const over = new Set([...counts].filter(([, n]) => n > max).map(([f]) => f));
|
|
460
476
|
if (over.size === 0)
|
|
461
477
|
return [...parts];
|
|
462
478
|
fn = 0;
|
|
@@ -813,6 +829,7 @@ small = false) {
|
|
|
813
829
|
elem.kind === "stats" || // fs.Stats snapshots: scr_stats_* adapters, no trace
|
|
814
830
|
elem.kind === "dyn" || // native collection seeds/drains: traced REF
|
|
815
831
|
elem.kind === "regex" || // RegExp values: scr_regex_* adapters, no trace (no refs inside)
|
|
832
|
+
elem.kind === "date" || // Date objects: scr_date_* adapters, no trace (no refs inside)
|
|
816
833
|
(elem.kind === "array" && traceAdapter(host, elem) !== null);
|
|
817
834
|
if (!useRef) {
|
|
818
835
|
if (small) {
|
|
@@ -831,15 +848,33 @@ small = false) {
|
|
|
831
848
|
}
|
|
832
849
|
/** The %ScrArrOps descriptor (retain, release, trace, registry id) of a REF
|
|
833
850
|
* element type, defined once per module and shared by all its arrays. It is
|
|
834
|
-
* writable: the runtime stores its registry id on the first array.
|
|
851
|
+
* writable: the runtime stores its registry id on the first array. Its tail
|
|
852
|
+
* padding is the runtime's flags word (0); arrays of compact class
|
|
853
|
+
* references (ShapeHost.compactArrayElem) spell the word out as
|
|
854
|
+
* SCR_ARR_OPS_COMPACT, and on 64-bit targets arrays whose element release
|
|
855
|
+
* does nothing (ShapeHost.releasesNothing) as SCR_ARR_OPS_RELEASE_NOTHING,
|
|
856
|
+
* so that destroying them only frees their storage. */
|
|
835
857
|
export function arrOps(host, elem) {
|
|
836
858
|
const v = vAdapters(host, elem);
|
|
837
859
|
const trace = traceArg(host, elem);
|
|
838
860
|
const part = (sym) => sym.replace(/^@/, "").replace(/[^A-Za-z0-9_.]/g, "_");
|
|
839
861
|
const name = `@sc_arrops.${part(v.retain)}.${part(v.release)}.${part(trace)}`;
|
|
862
|
+
if (host.compactArrayElem?.(elem) === true) {
|
|
863
|
+
host.declare(`${name}.c = internal global { ptr, ptr, ptr, i32, i32 } { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0, i32 ${SCR_ARR_OPS_COMPACT} }`);
|
|
864
|
+
return `${name}.c`;
|
|
865
|
+
}
|
|
866
|
+
const nullable = host.nullableUnions.of(elem);
|
|
867
|
+
const payload = nullable?.repr === "single" ? nullable.arm : elem;
|
|
868
|
+
if (host.sizeType === "i64" && host.releasesNothing?.(payload) === true) {
|
|
869
|
+
host.declare(`${name}.n = internal global { ptr, ptr, ptr, i32, i32 } { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0, i32 ${SCR_ARR_OPS_RELEASE_NOTHING} }`);
|
|
870
|
+
return `${name}.n`;
|
|
871
|
+
}
|
|
840
872
|
host.declare(`${name} = internal global %ScrArrOps { ptr ${v.retain}, ptr ${v.release}, ptr ${trace}, i32 0 }`);
|
|
841
873
|
return name;
|
|
842
874
|
}
|
|
875
|
+
/** scr_array.h SCR_ARR_OPS_COMPACT and SCR_ARR_OPS_RELEASE_NOTHING. */
|
|
876
|
+
const SCR_ARR_OPS_COMPACT = 1;
|
|
877
|
+
const SCR_ARR_OPS_RELEASE_NOTHING = 2;
|
|
843
878
|
/* ── capture boxes ────────────────────────────────────────────────────── */
|
|
844
879
|
/** Box construction call text (boxNewC's dispatch): plain-kind boxes for
|
|
845
880
|
* the runtime-known payloads, obj-kind boxes (RC entry points + trace as
|
|
@@ -848,7 +883,6 @@ export function arrOps(host, elem) {
|
|
|
848
883
|
export function boxNewCall(host, t) {
|
|
849
884
|
const plain = {
|
|
850
885
|
f64: 0,
|
|
851
|
-
date: 0,
|
|
852
886
|
procStream: 0,
|
|
853
887
|
bool: 1,
|
|
854
888
|
string: 2,
|
|
@@ -872,11 +906,7 @@ export function boxNewCall(host, t) {
|
|
|
872
906
|
}
|
|
873
907
|
/** Box accessor suffix (boxAccess): scalars unboxed, ref kinds pointers. */
|
|
874
908
|
export function boxAccess(t) {
|
|
875
|
-
return t.kind === "f64" || t.kind === "
|
|
876
|
-
? "f64"
|
|
877
|
-
: t.kind === "bool"
|
|
878
|
-
? "bool"
|
|
879
|
-
: "ref";
|
|
909
|
+
return t.kind === "f64" || t.kind === "procStream" ? "f64" : t.kind === "bool" ? "bool" : "ref";
|
|
880
910
|
}
|
|
881
911
|
/* ── record shapes ────────────────────────────────────────────────────── */
|
|
882
912
|
/** A record field's in-struct LLVM type. bool fields store as i8 (the C
|
|
@@ -889,7 +919,6 @@ export function llFieldType(t, inline) {
|
|
|
889
919
|
return "ptr";
|
|
890
920
|
switch (t.kind) {
|
|
891
921
|
case "f64":
|
|
892
|
-
case "date":
|
|
893
922
|
case "procStream":
|
|
894
923
|
return "double";
|
|
895
924
|
case "bool":
|
|
@@ -1041,11 +1070,18 @@ export const DIRECT_DESTROY_CHAIN = 16;
|
|
|
1041
1070
|
/** The release of child `value` (a loaded field, possibly NULL) inside a
|
|
1042
1071
|
* teardown whose chain length is `%d`: the child's own release for a shared
|
|
1043
1072
|
* or immortal reference, its teardown for the last one. Labels use `tag`;
|
|
1044
|
-
* the lines end in the open block `${tag}.next`.
|
|
1045
|
-
|
|
1073
|
+
* the lines end in the open block `${tag}.next`.
|
|
1074
|
+
*
|
|
1075
|
+
* With `segment` (the child has the teardown's own type, in a segmented
|
|
1076
|
+
* teardown; segmentPrologueLines), the child's teardown appends its blocks
|
|
1077
|
+
* to the teardown's segment. */
|
|
1078
|
+
export function directChildReleaseLines(host, tag, value, target, comment, segment = false) {
|
|
1046
1079
|
const S = host.sizeType;
|
|
1047
1080
|
const C = target.count ?? S;
|
|
1048
|
-
|
|
1081
|
+
if (segment)
|
|
1082
|
+
host.declare(`declare ptr @scr_rc_destroy_seg(ptr, ptr, ptr, ptr)`);
|
|
1083
|
+
else
|
|
1084
|
+
host.declare(`declare void @scr_rc_destroy(ptr, ptr)`);
|
|
1049
1085
|
const lines = [
|
|
1050
1086
|
` %${tag}.nn = icmp ne ptr ${value}, null`,
|
|
1051
1087
|
` br i1 %${tag}.nn, label %${tag}.chk, label %${tag}.next`,
|
|
@@ -1063,9 +1099,85 @@ export function directChildReleaseLines(host, tag, value, target, comment) {
|
|
|
1063
1099
|
host.declare(`declare void @scr_cyc_on_dead(ptr)`);
|
|
1064
1100
|
lines.push(` %${tag}.bufp = getelementptr i8, ptr ${value}, ${S} -${host.cycleBufOffset}`, ` %${tag}.buf = load i32, ptr %${tag}.bufp`, ` %${tag}.queued = icmp slt i32 %${tag}.buf, -1 ; buffered, not SCR_CYC_ACYCLIC`, ` br i1 %${tag}.queued, label %${tag}.unbuffer, label %${tag}.teardown`, `${tag}.unbuffer:`, ` call void @scr_cyc_on_dead(ptr ${value})`, ` br label %${tag}.teardown`, `${tag}.teardown:`);
|
|
1065
1101
|
}
|
|
1066
|
-
lines.push(` %${tag}.short = icmp ult i32 %d, ${DIRECT_DESTROY_CHAIN}`, ` br i1 %${tag}.short, label %${tag}.direct, label %${tag}.bounded`, `${tag}.direct:`, ` %${tag}.d = add i32 %d, 1
|
|
1102
|
+
lines.push(` %${tag}.short = icmp ult i32 %d, ${DIRECT_DESTROY_CHAIN}`, ` br i1 %${tag}.short, label %${tag}.direct, label %${tag}.bounded`, `${tag}.direct:`, ` %${tag}.d = add i32 %d, 1`);
|
|
1103
|
+
if (!segment) {
|
|
1104
|
+
lines.push(` call void @${target.destroy}_d(ptr ${value}, i32 %${tag}.d)`, ` br label %${tag}.next`, `${tag}.bounded:`, ` call void @scr_rc_destroy(ptr ${value}, ptr @${target.destroy})`, ` br label %${tag}.next`, `${tag}.next:`);
|
|
1105
|
+
return lines;
|
|
1106
|
+
}
|
|
1107
|
+
lines.push(` %${tag}.t = load ptr, ptr %sg.t`, ` %${tag}.dt = call ptr @${target.destroy}_s(ptr ${value}, i32 %${tag}.d, ptr %${tag}.t)`, ` store ptr %${tag}.dt, ptr %sg.t`, ` br label %${tag}.next`, `${tag}.bounded:`, ` %${tag}.bt = load ptr, ptr %sg.t`, ` %${tag}.rt = call ptr @scr_rc_destroy_seg(ptr ${value}, ptr @${target.destroy}_sc, ptr @${target.destroy}, ptr %${tag}.bt)`, ` store ptr %${tag}.rt, ptr %sg.t`, ` br label %${tag}.next`, `${tag}.next:`);
|
|
1067
1108
|
return lines;
|
|
1068
1109
|
}
|
|
1110
|
+
/* Teardown segments. A typed teardown that frees each block onto its free
|
|
1111
|
+
* list as it goes frees a tree in walk order, and the free lists, which are
|
|
1112
|
+
* LIFO, hand the blocks to the next allocations in the reverse order: a tree
|
|
1113
|
+
* built again in the same order as the last (each generation of a structure
|
|
1114
|
+
* a loop rebuilds) is laid out mirrored, and every walk over it, the next
|
|
1115
|
+
* teardown included, runs through memory backwards, which defeats the
|
|
1116
|
+
* hardware prefetchers. The runtime frees large dead sets of the cycle
|
|
1117
|
+
* collector in address order for the same reason (scr_mem_order_for_free).
|
|
1118
|
+
*
|
|
1119
|
+
* So the teardown of a type with children of its own type (the `_s` form,
|
|
1120
|
+
* segmentedTeardown) keeps the blocks it frees in a segment, linked through
|
|
1121
|
+
* their first words, which it builds in order through a tail pointer: the
|
|
1122
|
+
* `_s` form takes the segment's last link (the first word of its last block,
|
|
1123
|
+
* or the head slot of an empty segment) and returns the new one. A node
|
|
1124
|
+
* first releases its own block (emitObjectFree, keeping it), then appends it
|
|
1125
|
+
* ahead of its children's blocks when its address is the lower, behind them
|
|
1126
|
+
* otherwise (segmentTeardownLines), and the children append theirs in field
|
|
1127
|
+
* order, so a structure
|
|
1128
|
+
* built parent first (object literals allocate before their fields) or
|
|
1129
|
+
* children first (constructor arguments) comes back in ascending order. The
|
|
1130
|
+
* chain's first teardown (`_d`) frees the whole segment onto the class's
|
|
1131
|
+
* free list in one step (emitSegmentFree), and the walks over the next
|
|
1132
|
+
* generation run forward. A teardown past DIRECT_DESTROY_CHAIN appends
|
|
1133
|
+
* through scr_rc_destroy_seg, under the same depth budget as
|
|
1134
|
+
* scr_rc_destroy. Blocks outside the calling thread's arena are freed as
|
|
1135
|
+
* before; one type's blocks are all of one class. */
|
|
1136
|
+
/** Whether the teardown of a type whose reference fields have `fieldTypes`
|
|
1137
|
+
* (with direct targets `targets`) and whose own teardown is `destroy` keeps
|
|
1138
|
+
* a segment: a child field has its own type, and the inline allocation paths
|
|
1139
|
+
* are in use. */
|
|
1140
|
+
export function segmentedTeardown(host, destroy, fieldTypes, targets) {
|
|
1141
|
+
if (host.inlineAlloc !== true)
|
|
1142
|
+
return false;
|
|
1143
|
+
return fieldTypes.some((t) => directDestroyTarget(host, t, targets)?.destroy === destroy);
|
|
1144
|
+
}
|
|
1145
|
+
/** The first lines of a segmented teardown, in its entry block: the
|
|
1146
|
+
* segment's last link (`%sg.t`, from the `%tail` argument) and the kept own
|
|
1147
|
+
* block (`%sg.own`, for emitObjectFree). */
|
|
1148
|
+
export function segmentPrologueLines() {
|
|
1149
|
+
return [
|
|
1150
|
+
` %sg.t = alloca ptr`,
|
|
1151
|
+
` %sg.own = alloca ptr`,
|
|
1152
|
+
` store ptr %tail, ptr %sg.t`,
|
|
1153
|
+
` store ptr null, ptr %sg.own`,
|
|
1154
|
+
];
|
|
1155
|
+
}
|
|
1156
|
+
/** The rest of a segmented teardown after emitObjectFree kept (or freed)
|
|
1157
|
+
* its own block: the block goes ahead of its children's when its address is
|
|
1158
|
+
* below the first non-NULL one of `children` (loaded fields of the
|
|
1159
|
+
* teardown's own type, which stand for their blocks) or there is none, and
|
|
1160
|
+
* behind them otherwise; then the children's releases (`releases`, given a
|
|
1161
|
+
* label prefix), and the segment's last link is returned. Each order has its
|
|
1162
|
+
* own copy of the releases, so neither keeps the decision, or the block once
|
|
1163
|
+
* it is appended, across the children's teardowns. */
|
|
1164
|
+
export function segmentTeardownLines(children, releases) {
|
|
1165
|
+
const lines = [` %sg.o = load ptr, ptr %sg.own`, ` %sg.kept = icmp ne ptr %sg.o, null`];
|
|
1166
|
+
let ref = "null";
|
|
1167
|
+
[...children].reverse().forEach((child, i) => {
|
|
1168
|
+
lines.push(` %sg.nn${i} = icmp ne ptr ${child}, null`, ` %sg.r${i} = select i1 %sg.nn${i}, ptr ${child}, ptr ${ref}`);
|
|
1169
|
+
ref = `%sg.r${i}`;
|
|
1170
|
+
});
|
|
1171
|
+
lines.push(` %sg.leaf = icmp eq ptr ${ref}, null`, ` %sg.lower = icmp ult ptr %sg.o, ${ref}`, ` %sg.first = or i1 %sg.leaf, %sg.lower`, ` %sg.ahead = and i1 %sg.kept, %sg.first`, ` br i1 %sg.ahead, label %sg.front, label %sg.back`, `sg.front:`, ...segmentAppendLines("a"), ...releases("ta"), ` br label %sg.ret`, `sg.back:`, ...releases("tb"), ` %sg.keep = icmp ne ptr %sg.o, null`, ` br i1 %sg.keep, label %sg.last, label %sg.ret`, `sg.last:`, ...segmentAppendLines("l"), ` br label %sg.ret`, `sg.ret:`, ` %sg.tr = load ptr, ptr %sg.t`, ` ret ptr %sg.tr`);
|
|
1172
|
+
return lines;
|
|
1173
|
+
}
|
|
1174
|
+
function segmentAppendLines(tag) {
|
|
1175
|
+
return [
|
|
1176
|
+
` %sg.t${tag} = load ptr, ptr %sg.t`,
|
|
1177
|
+
` store ptr %sg.o, ptr %sg.t${tag}`,
|
|
1178
|
+
` store ptr %sg.o, ptr %sg.t`,
|
|
1179
|
+
];
|
|
1180
|
+
}
|
|
1069
1181
|
/** The direct-teardown target of a reference of `type`, if `targets` (keyed
|
|
1070
1182
|
* `record:<id>` / `object:<class>`) has one. Nullable unions hold the arm's
|
|
1071
1183
|
* pointer, NULL or an immortal sentinel, which the child release handles. */
|
|
@@ -1100,8 +1212,37 @@ export function usedDirectTargets(host, candidates, fieldTypes) {
|
|
|
1100
1212
|
}
|
|
1101
1213
|
/** The teardown definitions for `destroy`: with `chained`, the body takes
|
|
1102
1214
|
* the chain length `%d` (directChildReleaseLines) and the runtime's
|
|
1103
|
-
* one-argument entry starts a chain.
|
|
1104
|
-
|
|
1215
|
+
* one-argument entry starts a chain. With `segment` (the host, for a
|
|
1216
|
+
* segmented teardown), the body is a segment teardown's
|
|
1217
|
+
* (segmentPrologueLines to segmentTeardownLines), defined as `_s`, with
|
|
1218
|
+
* `_sc` for scr_rc_destroy_seg, and `_d` starts a segment and frees it. */
|
|
1219
|
+
export function destroyDefinitions(destroy, body, chained, segment = null) {
|
|
1220
|
+
if (segment !== null)
|
|
1221
|
+
return [
|
|
1222
|
+
`define internal ptr @${destroy}_s(ptr %o, i32 %d, ptr %tail) ${FN_ATTRS} {`,
|
|
1223
|
+
`entry:`,
|
|
1224
|
+
...body,
|
|
1225
|
+
`}`,
|
|
1226
|
+
`define internal ptr @${destroy}_sc(ptr %o, ptr %tail) ${FN_ATTRS} {`,
|
|
1227
|
+
`entry:`,
|
|
1228
|
+
` %t = call ptr @${destroy}_s(ptr %o, i32 0, ptr %tail)`,
|
|
1229
|
+
` ret ptr %t`,
|
|
1230
|
+
`}`,
|
|
1231
|
+
`define internal void @${destroy}_d(ptr %o, i32 %d) ${FN_ATTRS} {`,
|
|
1232
|
+
`entry:`,
|
|
1233
|
+
` %head = alloca ptr`,
|
|
1234
|
+
` store ptr null, ptr %head`,
|
|
1235
|
+
` %last = call ptr @${destroy}_s(ptr %o, i32 %d, ptr %head)`,
|
|
1236
|
+
` %first = load ptr, ptr %head`,
|
|
1237
|
+
...emitSegmentFree(segment, "sgf", "%first", "%last"),
|
|
1238
|
+
` ret void`,
|
|
1239
|
+
`}`,
|
|
1240
|
+
`define internal void @${destroy}(ptr %o) ${FN_ATTRS} {`,
|
|
1241
|
+
`entry:`,
|
|
1242
|
+
` call void @${destroy}_d(ptr %o, i32 0)`,
|
|
1243
|
+
` ret void`,
|
|
1244
|
+
`}`,
|
|
1245
|
+
];
|
|
1105
1246
|
if (!chained)
|
|
1106
1247
|
return [
|
|
1107
1248
|
`define internal void @${destroy}(ptr %o) ${FN_ATTRS} {`,
|
|
@@ -1123,6 +1264,15 @@ export function destroyDefinitions(destroy, body, chained) {
|
|
|
1123
1264
|
`}`,
|
|
1124
1265
|
];
|
|
1125
1266
|
}
|
|
1267
|
+
/** The frozen bit of a freezable record's rc word (scr_rc.h SCR_RC_FROZEN):
|
|
1268
|
+
* bit 62 on 64-bit targets, bit 30 on 32-bit ones. */
|
|
1269
|
+
function recordFrozenBit(sizeType) {
|
|
1270
|
+
return 1n << (sizeType === "i64" ? 62n : 30n);
|
|
1271
|
+
}
|
|
1272
|
+
/** `value` as a signed LLVM integer literal of `sizeType`. */
|
|
1273
|
+
function sizeLiteral(sizeType, value) {
|
|
1274
|
+
return BigInt.asIntN(sizeType === "i64" ? 64 : 32, value).toString();
|
|
1275
|
+
}
|
|
1126
1276
|
/** Common NULL/immortal/decrement skeleton for ordinary object releases.
|
|
1127
1277
|
* `freeBody` owns the zero-ref teardown and must leave the current block at
|
|
1128
1278
|
* its end; traced objects also get the possible-cycle-root branch.
|
|
@@ -1130,14 +1280,16 @@ export function destroyDefinitions(destroy, body, chained) {
|
|
|
1130
1280
|
* `fnName` is only the inlinable fast path (releaseFastPath); the complete
|
|
1131
1281
|
* release is `${fnName}_slow`, kept out of line so callers that inline the
|
|
1132
1282
|
* release do not also inline its teardown. */
|
|
1133
|
-
export function releaseBody(host, fnName, traced, freeBody, comment = "", bounded = true, immortal = false, chained = false) {
|
|
1283
|
+
export function releaseBody(host, fnName, traced, freeBody, comment = "", bounded = true, immortal = false, chained = false, segmented = false, frozen = false) {
|
|
1134
1284
|
const S = host.sizeType;
|
|
1135
1285
|
if (bounded)
|
|
1136
1286
|
host.declare(`declare void @scr_rc_destroy(ptr, ptr)`);
|
|
1137
1287
|
const destroy = `${fnName}_destroy`;
|
|
1288
|
+
// A freezable record's count is the word without its frozen bit.
|
|
1289
|
+
const notFrozen = sizeLiteral(S, ~recordFrozenBit(S));
|
|
1138
1290
|
const lines = [
|
|
1139
|
-
...(bounded ? destroyDefinitions(destroy, freeBody, chained) : []),
|
|
1140
|
-
...releaseFastPath(host, fnName, `${fnName}_slow`, traced, comment, immortal),
|
|
1291
|
+
...(bounded ? destroyDefinitions(destroy, freeBody, chained, segmented ? host : null) : []),
|
|
1292
|
+
...releaseFastPath(host, fnName, `${fnName}_slow`, traced, comment, immortal, S, frozen),
|
|
1141
1293
|
`define internal void @${fnName}_slow(ptr %o) noinline ${FN_ATTRS} {${comment ? ` ; ${comment}` : ""}`,
|
|
1142
1294
|
`entry:`,
|
|
1143
1295
|
` %isnull = icmp eq ptr %o, null`,
|
|
@@ -1149,7 +1301,9 @@ export function releaseBody(host, fnName, traced, freeBody, comment = "", bounde
|
|
|
1149
1301
|
`dec:`,
|
|
1150
1302
|
` %n = sub ${S} %rc, 1`,
|
|
1151
1303
|
` store ${S} %n, ptr %o`,
|
|
1152
|
-
|
|
1304
|
+
...(frozen
|
|
1305
|
+
? [` %refs = and ${S} %n, ${notFrozen}`, ` %dead = icmp eq ${S} %refs, 0`]
|
|
1306
|
+
: [` %dead = icmp eq ${S} %n, 0`]),
|
|
1153
1307
|
` br i1 %dead, label %free, label %${traced ? "root" : "done"}`,
|
|
1154
1308
|
`free:`,
|
|
1155
1309
|
...(traced ? cycleDeadLines(host, "teardown") : []),
|
|
@@ -1170,10 +1324,14 @@ export function releaseBody(host, fnName, traced, freeBody, comment = "", bounde
|
|
|
1170
1324
|
* call `slow`, which
|
|
1171
1325
|
* holds the complete release: inlining it everywhere would copy teardowns
|
|
1172
1326
|
* (and their destroy calls) into every caller. */
|
|
1173
|
-
export function releaseFastPath(host, fnName, slow, traced, comment = "", immortal = false, count = host.sizeType) {
|
|
1327
|
+
export function releaseFastPath(host, fnName, slow, traced, comment = "", immortal = false, count = host.sizeType, frozen = false) {
|
|
1174
1328
|
const S = count;
|
|
1175
1329
|
if (immortal)
|
|
1176
1330
|
return immortalRcBody(host, fnName, "void", comment);
|
|
1331
|
+
// A freezable record compares its count without the frozen bit: an
|
|
1332
|
+
// immortal word's count is then ~FROZEN, which the same compare sends to
|
|
1333
|
+
// `slow`.
|
|
1334
|
+
const notFrozen = ~recordFrozenBit(S);
|
|
1177
1335
|
return [
|
|
1178
1336
|
`define internal void @${fnName}(ptr %o) ${FN_ATTRS} {${comment ? ` ; ${comment} (fast path)` : ""}`,
|
|
1179
1337
|
`entry:`,
|
|
@@ -1181,8 +1339,13 @@ export function releaseFastPath(host, fnName, slow, traced, comment = "", immort
|
|
|
1181
1339
|
` br i1 %isnull, label %done, label %check`,
|
|
1182
1340
|
`check:`,
|
|
1183
1341
|
` %rc = load ${S}, ptr %o`,
|
|
1184
|
-
|
|
1185
|
-
|
|
1342
|
+
...(frozen
|
|
1343
|
+
? [
|
|
1344
|
+
` %refs = and ${S} %rc, ${sizeLiteral(S, notFrozen)}`,
|
|
1345
|
+
` %rcm2 = sub ${S} %refs, 2`,
|
|
1346
|
+
` %shared = icmp ult ${S} %rcm2, ${sizeLiteral(S, notFrozen - 2n)}`,
|
|
1347
|
+
]
|
|
1348
|
+
: [` %rcm2 = sub ${S} %rc, 2`, ` %shared = icmp ult ${S} %rcm2, -3`]),
|
|
1186
1349
|
` br i1 %shared, label %dec, label %slow`,
|
|
1187
1350
|
`dec:`,
|
|
1188
1351
|
` %n = sub ${S} %rc, 1`,
|
|
@@ -1344,21 +1507,42 @@ export function emitRecordShapes(host, mod) {
|
|
|
1344
1507
|
// direct children.
|
|
1345
1508
|
const chained = directTargets.has(`record:${shape.id}`) ||
|
|
1346
1509
|
refMembers.some((m) => directDestroyTarget(host, m.type, directTargets) !== null);
|
|
1347
|
-
|
|
1348
|
-
|
|
1510
|
+
const destroy = `${mangleRecordRelease(shape.id)}_destroy`;
|
|
1511
|
+
const bounded = refMembers.some((member) => needsBoundedRelease(member.type));
|
|
1512
|
+
const segmented = bounded &&
|
|
1513
|
+
segmentedTeardown(host, destroy, refMembers.map((m) => m.type), directTargets);
|
|
1514
|
+
// Closed layouts can carry a kept record source (record-sources.ts).
|
|
1515
|
+
const observers = recordMayKeepSource(shape) ? "weak-or-source" : "weak";
|
|
1516
|
+
// A segmented teardown loads its fields, releases its own block, and
|
|
1517
|
+
// then releases the fields (segmentTeardownLines).
|
|
1518
|
+
const loads = [];
|
|
1519
|
+
const ownType = [];
|
|
1520
|
+
const release = (prefix, m, i) => {
|
|
1349
1521
|
const direct = directDestroyTarget(host, m.type, directTargets);
|
|
1350
|
-
if (direct)
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1522
|
+
if (direct === null)
|
|
1523
|
+
return [` call void ${releaseSym(host, m.type)}(ptr %v${i}) ; ${llvmCommentText(m.name)}`];
|
|
1524
|
+
const own = segmented && direct.destroy === destroy;
|
|
1525
|
+
return directChildReleaseLines(host, `${prefix}${i}`, `%v${i}`, direct, llvmCommentText(m.name), own);
|
|
1526
|
+
};
|
|
1527
|
+
for (const m of refMembers) {
|
|
1528
|
+
const fieldLines = [
|
|
1529
|
+
` %f${t} = getelementptr inbounds %${struct}, ptr %o, i64 0, i32 ${m.index}`,
|
|
1530
|
+
` %v${t} = load ptr, ptr %f${t}`,
|
|
1531
|
+
];
|
|
1532
|
+
if (segmented) {
|
|
1533
|
+
loads.push(...fieldLines);
|
|
1534
|
+
if (directDestroyTarget(host, m.type, directTargets)?.destroy === destroy)
|
|
1535
|
+
ownType.push(`%v${t}`);
|
|
1355
1536
|
}
|
|
1537
|
+
else
|
|
1538
|
+
freeBody.push(...fieldLines, ...release("td", m, t));
|
|
1356
1539
|
t++;
|
|
1357
1540
|
}
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1541
|
+
if (segmented)
|
|
1542
|
+
freeBody.push(...segmentPrologueLines(), ...loads, ...emitObjectFree(host, traced, observers, "%sg.own"), ...segmentTeardownLines(ownType, (prefix) => refMembers.flatMap((m, i) => release(prefix, m, i))));
|
|
1543
|
+
else
|
|
1544
|
+
freeBody.push(...emitObjectFree(host, traced, observers));
|
|
1545
|
+
defs.push(...releaseBody(host, mangleRecordRelease(shape.id), traced, freeBody, "", bounded, false, chained, segmented, shape.freezable === true), ``);
|
|
1362
1546
|
// new: zeroed allocation (+ the overflow map on index-signature
|
|
1363
1547
|
// shapes), rc = 1. Traced shapes allocate with the collector header;
|
|
1364
1548
|
// alloc.ts inlines the allocator fast paths and the alloc note.
|