@scriptc/compiler 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +977 -113
- package/dist/backend/cycle-analysis.d.ts +5 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +9 -1
- package/dist/backend/cycle-mutability.js +21 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +6 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +7 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +5 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +23 -4
- package/dist/backend/llvm/alloc.js +61 -8
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +23 -10
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
- package/dist/backend/llvm/bytes-loop-versions.js +567 -30
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +74 -1
- package/dist/backend/llvm/classes.js +364 -54
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +384 -17
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +10 -6
- package/dist/backend/llvm/common.js +10 -6
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +91 -56
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +4 -4
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +11 -1
- package/dist/backend/llvm/counted-loops.js +80 -23
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
- package/dist/backend/llvm/dense-array-loops.js +237 -12
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +140 -15
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +51 -1
- package/dist/backend/llvm/dyn.js +683 -69
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +33 -26
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +208 -34
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -27
- package/dist/backend/llvm/emit-statements.js +577 -93
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +314 -49
- package/dist/backend/llvm/emitter.js +1241 -129
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +54 -5
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -0
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +5 -2
- package/dist/backend/llvm/expr-bytes.js +144 -52
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +62 -36
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +148 -40
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-control.js +2 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +71 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +126 -36
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +225 -64
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +20 -1
- package/dist/backend/llvm/integer-values.js +71 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +90 -2
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +65 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +4 -0
- package/dist/backend/llvm/lib-http2.js +24 -17
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +65 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +126 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +97 -30
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +23 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +181 -64
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +28 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +18 -1
- package/dist/backend/llvm/publish.js +76 -25
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +7 -2
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +91 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.js +161 -14
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +18 -0
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +79 -21
- package/dist/backend/llvm/shapes.js +233 -42
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +2 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +15 -0
- package/dist/backend/llvm/string-reads.js +128 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +88 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +6 -5
- package/dist/backend/llvm/wasm-modules.js +32 -9
- package/dist/backend/llvm/wasm-modules.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/mangle.d.ts +3 -0
- package/dist/backend/mangle.js +5 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +27 -4
- package/dist/backend/native/executable.js +31 -8
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -0
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +11 -6
- package/dist/backend/native-codegen.js +36 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +0 -23
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +18 -4
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/optimization.d.ts +2 -2
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +2 -1
- package/dist/backend/runtime-pack-core.js +2 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +5 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +0 -21
- package/dist/backend/runtime-pack.js +0 -29
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +10 -69
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-diagnostics.js +33 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +4 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +26 -6
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +5 -1
- package/dist/cli/usage.js +10 -5
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +5 -4
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.d.ts +7 -2
- package/dist/coverage/report.js +30 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -0
- package/dist/coverage/verdict-cache.js +4 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-semantic.js +4 -0
- package/dist/coverage/verdict-semantic.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.d.ts +40 -0
- package/dist/diagnostics/dynamic-tier.js +57 -0
- package/dist/diagnostics/dynamic-tier.js.map +1 -0
- package/dist/diagnostics/envelope.d.ts +5 -1
- package/dist/diagnostics/envelope.js +6 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +25 -1
- package/dist/executable/executable-cache.js +60 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +46 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +3 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +854 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dispose-hook.d.ts +2 -0
- package/dist/frontend/dispose-hook.js +14 -0
- package/dist/frontend/dispose-hook.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/jsx-entities.d.ts +4 -0
- package/dist/frontend/jsx-entities.js +259 -0
- package/dist/frontend/jsx-entities.js.map +1 -0
- package/dist/frontend/jsx-source.d.ts +71 -0
- package/dist/frontend/jsx-source.js +781 -0
- package/dist/frontend/jsx-source.js.map +1 -0
- package/dist/frontend/jsx-source.test.d.ts +1 -0
- package/dist/frontend/jsx-source.test.js +200 -0
- package/dist/frontend/jsx-source.test.js.map +1 -0
- package/dist/frontend/literal-values.test.js +8 -9
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +103 -4
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
- package/dist/frontend/lowering/builtins/arguments.js +30 -15
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +10 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
- package/dist/frontend/lowering/builtins/crypto.js +136 -5
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
- package/dist/frontend/lowering/builtins/ecdh.js +7 -7
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +2 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +18 -6
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.js +4 -3
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.js +3 -2
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +3 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +91 -4
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
- package/dist/frontend/lowering/builtins/readline.js +58 -9
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +1 -1
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +28 -4
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.js +2 -1
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +2 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +13 -6
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +6 -2
- package/dist/frontend/lowering/class-construction.js +25 -16
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +1 -1
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +35 -9
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +1 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +7 -0
- package/dist/frontend/lowering/class-protocols.js +64 -4
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +67 -5
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.js +25 -5
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +99 -8
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.js +8 -7
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -1
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +12 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +25 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +21 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
- package/dist/frontend/lowering/containers/bytes.js +131 -29
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +15 -9
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
- package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +45 -20
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.js +25 -4
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +218 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
- package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
- package/dist/frontend/lowering/dyn-streams.js +1 -1
- package/dist/frontend/lowering/dyn-streams.js.map +1 -1
- package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
- package/dist/frontend/lowering/dynamic-tier.js +327 -0
- package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +51 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +62 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +81 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +107 -14
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +79 -11
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +130 -6
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
- package/dist/frontend/lowering/expressions/object-literals.js +164 -56
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
- package/dist/frontend/lowering/expressions/property-access.js +211 -17
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +267 -30
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +85 -12
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +49 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +42 -1
- package/dist/frontend/lowering/generic-functions.js +455 -20
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +195 -9
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
- package/dist/frontend/lowering/json-require.js +2 -1
- package/dist/frontend/lowering/json-require.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
- package/dist/frontend/lowering/key-order-witness.js +790 -25
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +466 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.js +2 -1
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +6 -5
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +7 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +11 -0
- package/dist/frontend/lowering/lower-calls.js +776 -126
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +29 -2
- package/dist/frontend/lowering/lower-classes.js +581 -46
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +6 -3
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
- package/dist/frontend/lowering/lower-event-emitter.js +267 -20
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
- package/dist/frontend/lowering/lower-exprs.js +126 -13
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +387 -72
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +41 -31
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +28 -12
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +47 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +9 -4
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +10 -0
- package/dist/frontend/lowering/lower-server.js +239 -61
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +42 -10
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +622 -68
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +2055 -318
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +4 -3
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +197 -29
- package/dist/frontend/lowering/lowerer.js +862 -84
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +21 -9
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.js +5 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +1 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +9 -0
- package/dist/frontend/lowering/private-brands.js +66 -15
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
- package/dist/frontend/lowering/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +2 -2
- package/dist/frontend/lowering/static-typeof.js +42 -3
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +60 -32
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +66 -16
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +8 -0
- package/dist/frontend/npm-static.js +51 -22
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +18 -10
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program.d.ts +21 -1
- package/dist/frontend/program.js +586 -74
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +44 -4
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/services.d.ts +6 -0
- package/dist/frontend/services.js +18 -0
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +43 -7
- package/dist/frontend/ts7/ast-node.js +1176 -129
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +84 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +29 -3
- package/dist/frontend/ts7/ast-wire.js +144 -31
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +23 -2
- package/dist/frontend/ts7/ast.js +143 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +17 -1
- package/dist/frontend/ts7/checker.js +82 -1
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +9 -6
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.d.ts +3 -3
- package/dist/frontend/ts7/enums.generated.d.ts +10 -0
- package/dist/frontend/ts7/enums.generated.js +21 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -1
- package/dist/frontend/ts7/enums.js +19 -0
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +30 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
- package/dist/frontend/ts7/semantic-checker.js +25 -20
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +13 -0
- package/dist/frontend/ts7/semantic-json.js +146 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +57 -1
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +15 -0
- package/dist/frontend/ts7/semantic-model.js +67 -19
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +23 -1
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +1 -1
- package/dist/frontend/tsc-codes.js +7 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +51 -7
- package/dist/frontend/type-mapper.js +456 -43
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +1 -1
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend-process-args.d.ts +4 -0
- package/dist/frontend-process-args.js +52 -0
- package/dist/frontend-process-args.js.map +1 -0
- package/dist/frontend-process-args.test.d.ts +1 -0
- package/dist/frontend-process-args.test.js +47 -0
- package/dist/frontend-process-args.test.js.map +1 -0
- package/dist/frontend-process.d.ts +1 -0
- package/dist/frontend-process.js +23 -0
- package/dist/frontend-process.js.map +1 -0
- package/dist/heap-collection.d.ts +16 -0
- package/dist/heap-collection.js +42 -0
- package/dist/heap-collection.js.map +1 -0
- package/dist/heap-collection.test.d.ts +1 -0
- package/dist/heap-collection.test.js +59 -0
- package/dist/heap-collection.test.js.map +1 -0
- package/dist/heap-pressure.d.ts +2 -0
- package/dist/heap-pressure.js +12 -0
- package/dist/heap-pressure.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +435 -89
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +26 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +49 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +80 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -1
- package/dist/ir/builtin-signatures.js +303 -21
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +3 -1
- package/dist/ir/final-fields.js +15 -17
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +5 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +36 -6
- package/dist/ir/int32-slots.js +370 -171
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +3 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +9 -4
- package/dist/ir/integer-loop-facts.js +93 -18
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +202 -40
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +211 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +94 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +87 -9
- package/dist/ir/ir.js +61 -2
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +21 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +19 -2
- package/dist/ir/js-ic.js +95 -11
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +188 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +60 -15
- package/dist/ir/runtime-features.js +276 -35
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.d.ts +2 -0
- package/dist/ir/traverse.js +29 -5
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +171 -45
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +12 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/prepare.js +2 -0
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +26 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -1
- package/dist/native/prepare.js +123 -31
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +78 -18
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +6 -1
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/text-parts.d.ts +7 -0
- package/dist/text-parts.js +44 -0
- package/dist/text-parts.js.map +1 -1
- package/dist/text-parts.test.d.ts +1 -0
- package/dist/text-parts.test.js +46 -0
- package/dist/text-parts.test.js.map +1 -0
- package/dist/timing.d.ts +9 -2
- package/dist/timing.js +7 -4
- package/dist/timing.js.map +1 -1
- package/dist/wasm/translate.d.ts +4 -0
- package/dist/wasm/translate.js +2 -2
- package/dist/wasm/translate.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/shims/undici/core/client.ts +4 -4
- package/surface-manifest.json +44 -52
|
@@ -11,24 +11,32 @@ import { allocateLocalUnion, storeLocalUnion } from "./local-union-storage.js";
|
|
|
11
11
|
import { boxAccess, boxNewCall, elemAccess } from "./shapes.js";
|
|
12
12
|
import { dynHoleRead } from "./loop-array-borrows.js";
|
|
13
13
|
import { endsWithJump, matchStringSelfConcat } from "../../ir/analysis.js";
|
|
14
|
-
import { emitDiscardedSplice } from "./expr-containers.js";
|
|
14
|
+
import { charAtUnitRead, emitDiscardedSplice } from "./expr-containers.js";
|
|
15
15
|
import { InternalCompilerError } from "../../errors.js";
|
|
16
|
-
import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet } from "./dense-array-access.js";
|
|
16
|
+
import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet, SCR_ELEM_I32, } from "./dense-array-access.js";
|
|
17
17
|
import { emitBorrowedInput } from "./borrowed-inputs.js";
|
|
18
|
-
import { f64Lit, llvmCommentText, loadArrCount, sizeToDouble } from "./common.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
18
|
+
import { f64Lit, llvmCommentText, loadArrCount, SCR_ARR_FIELD, sizeToDouble } from "./common.js";
|
|
19
|
+
import { planInt32KindLoop } from "./int32-kind-loops.js";
|
|
20
|
+
import { withinInt32 } from "../../ir/integer-ranges.js";
|
|
21
|
+
import { resultSlotStore } from "../result-slots.js";
|
|
22
|
+
import { matchIntegerArrayForLoop, matchIntegerBytesForLoop, matchIntegerCountedForLoop, matchIntegerPairedForLoop, } from "../../ir/integer-loops.js";
|
|
21
23
|
import { emitByteWindowGuard, matchByteWindow } from "./byte-windows.js";
|
|
22
|
-
import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop } from "./dense-array-loops.js";
|
|
23
|
-
import { emitCountedLoopLimit, emitCountedLoopSafety } from "./counted-loops.js";
|
|
24
|
+
import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop, pairedDenseShape, } from "./dense-array-loops.js";
|
|
25
|
+
import { emitCountedLoopLimit, emitCountedLoopSafety, emitPairedLoopSafety, } from "./counted-loops.js";
|
|
24
26
|
import { emitBytesLoopVersionGuard } from "./bytes-loop-versions.js";
|
|
27
|
+
import { bytesHeaderAlias } from "./bytes-alias.js";
|
|
25
28
|
import { mangleLocal } from "../mangle.js";
|
|
26
29
|
import { LlvmUnsupportedError } from "./unsupported.js";
|
|
30
|
+
import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
|
|
31
|
+
import { widenInteger } from "./integer-values.js";
|
|
27
32
|
import { SCALAR_UNION_RESULT } from "./int32-abi.js";
|
|
28
33
|
import { emitLiteralSwitch } from "./switch-dispatch.js";
|
|
29
34
|
import { SPECULATIVE_RANGE, emitSafeIntegerCheck, emitSpeculativeInteger, planProvenIntegerLoop, planSpeculativeLoop, speculativeReads, speculativeWriteTarget, } from "./speculative-integers.js";
|
|
30
35
|
import { emitConcatInputs, emitMixedConcat, numberPart, stringParts, } from "./string-construction.js";
|
|
31
36
|
import { emitStringInputs } from "./string-lifetimes.js";
|
|
37
|
+
import { LOOPS } from "./loop-state.js";
|
|
38
|
+
/** A callback loop version copies the loop; keep the copies small. */
|
|
39
|
+
const MAX_CALLBACK_VERSION_COST = 400;
|
|
32
40
|
export function emitStmtBody(emitter, s) {
|
|
33
41
|
const B = emitter.B;
|
|
34
42
|
emitter.frames.push([]);
|
|
@@ -216,6 +224,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
216
224
|
emitter.toFrame(v);
|
|
217
225
|
B.line(`store ${emitter.llType(b.type)} ${v.name}, ptr ${b.slot}`);
|
|
218
226
|
emitter.storeIntegerView(s.localId, v, s.init);
|
|
227
|
+
storeIntegerTemp(emitter, s.localId, b, v);
|
|
219
228
|
if (isRefCounted(b.type)) {
|
|
220
229
|
emitter.scopes[emitter.scopes.length - 1].push({ slot: b.slot, type: b.type });
|
|
221
230
|
emitter.noteLastUseMove(s, b);
|
|
@@ -357,11 +366,26 @@ export function emitStmtBody(emitter, s) {
|
|
|
357
366
|
const v = emitter.emitExpr(s.value);
|
|
358
367
|
if (s.arr.type.kind !== "array")
|
|
359
368
|
throw new InternalCompilerError("llvm emitter bug: arraySet on non-array");
|
|
360
|
-
|
|
369
|
+
if (emitter.checkedInt32Array(s.arr)) {
|
|
370
|
+
// An int32 array with checked stores: the int32 arm stores an int32
|
|
371
|
+
// value, and widens the array for any other first.
|
|
372
|
+
emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
|
|
373
|
+
const elem = s.arr.type.elem;
|
|
374
|
+
const proven = emitter.provenDenseIndex(s.arr, s.index);
|
|
375
|
+
emitter.emitByElementKind(arr.name, null, (acc, widened) => {
|
|
376
|
+
if (acc === "i32")
|
|
377
|
+
emitter.emitCheckedInt32Store(arr.name, v.name, s.value, widened);
|
|
378
|
+
emitDenseArraySet(emitter, arr.name, idx, s.index, acc, elem, v.name, proven);
|
|
379
|
+
return null;
|
|
380
|
+
});
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
const acc = emitter.arrayAccess(s.arr, s.arr.type.elem);
|
|
384
|
+
const int32 = emitter.emitInt32KindStoreCheck(s.arr, v, s.value);
|
|
361
385
|
emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
|
|
362
386
|
if (acc === "ref")
|
|
363
387
|
emitter.toHeap(v);
|
|
364
|
-
emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index));
|
|
388
|
+
emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index), int32);
|
|
365
389
|
break;
|
|
366
390
|
}
|
|
367
391
|
case "arraySetLength": {
|
|
@@ -376,6 +400,11 @@ export function emitStmtBody(emitter, s) {
|
|
|
376
400
|
const length = emitter.emitExpr(s.length);
|
|
377
401
|
if (s.arr.type.kind !== "array")
|
|
378
402
|
throw new InternalCompilerError("llvm emitter bug: arraySetLength on non-array");
|
|
403
|
+
if (s.reserve === true) {
|
|
404
|
+
emitter.declare(`declare void @scr_arr_reserve_len(ptr, double)`);
|
|
405
|
+
B.line(`call void @scr_arr_reserve_len(ptr ${arr.name}, double ${length.name})`);
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
379
408
|
emitter.emitPublishedArrayGuard(arr.name, s.arr.type, s.pop === true ? 2 : 3);
|
|
380
409
|
emitter.declare(`declare void @scr_arr_set_len(ptr, double)`);
|
|
381
410
|
// Assigning the current length (a reused work array reset to where
|
|
@@ -401,12 +430,20 @@ export function emitStmtBody(emitter, s) {
|
|
|
401
430
|
B.condBr(dropsLast, pop, call);
|
|
402
431
|
B.startBlock(pop);
|
|
403
432
|
const elem = s.arr.type.elem;
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
433
|
+
if (emitter.checkedInt32Array(s.arr)) {
|
|
434
|
+
emitter.emitByElementKind(arr.name, null, (acc) => {
|
|
435
|
+
emitDenseArrayPop(emitter, arr.name, acc, elem, call, call);
|
|
436
|
+
return null;
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
const acc = emitter.arrayAccess(s.arr, elem);
|
|
441
|
+
const raw = emitDenseArrayPop(emitter, arr.name, acc, elem, call, call);
|
|
442
|
+
if (acc === "ref" && isRefCounted(elem)) {
|
|
443
|
+
const old = B.tmp();
|
|
444
|
+
B.line(`${old} = inttoptr i64 ${raw} to ptr`);
|
|
445
|
+
emitter.releaseHeap(old, elem);
|
|
446
|
+
}
|
|
410
447
|
}
|
|
411
448
|
B.br(done);
|
|
412
449
|
B.startBlock(call);
|
|
@@ -443,7 +480,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
443
480
|
const v = emitter.emitExpr(s.value);
|
|
444
481
|
if (s.arr.type.kind !== "bytes")
|
|
445
482
|
throw new InternalCompilerError("llvm emitter bug: bytesSet on non-bytes");
|
|
446
|
-
emitter.emitBytesSet(s.arr.type.elem, arr.name, idx, v, s.index, s.value, emitter.bytesBounds.has(s));
|
|
483
|
+
emitter.emitBytesSet(s.arr.type.elem, arr.name, idx, v, s.index, s.value, emitter.bytesBounds.has(s), emitter.bytesOwned.has(s));
|
|
447
484
|
break;
|
|
448
485
|
}
|
|
449
486
|
case "fieldSet":
|
|
@@ -481,13 +518,10 @@ export function emitStmtBody(emitter, s) {
|
|
|
481
518
|
else if (emitter.publishedTypes?.recordGuarded(s.shapeId) === true)
|
|
482
519
|
emitter.emitPublishedFieldGuard(obj.name, null, s.field);
|
|
483
520
|
const { ptr, type, inline } = s.kind === "fieldSet"
|
|
484
|
-
? emitter.classFieldPtr(obj.name, s.className, s.field)
|
|
521
|
+
? emitter.classFieldPtr(obj.name, s.className, s.field, "compressed")
|
|
485
522
|
: emitter.recordFieldPtr(obj.name, s.shapeId, s.field);
|
|
486
523
|
// A result-slot entry fills zeroed caller storage, each field once.
|
|
487
|
-
if (
|
|
488
|
-
s.obj.kind === "varRef" &&
|
|
489
|
-
s.obj.localId === RESULT_DST_ID &&
|
|
490
|
-
emitter.currentFunctionName.startsWith(RESULT_ENTRY_PREFIX))
|
|
524
|
+
if (resultSlotStore(emitter.currentFunctionName, s))
|
|
491
525
|
emitter.initField(ptr, type, inline, v);
|
|
492
526
|
else
|
|
493
527
|
emitter.replaceField(ptr, type, inline, v);
|
|
@@ -691,7 +725,12 @@ export function emitStmtBody(emitter, s) {
|
|
|
691
725
|
const trueLabel = B.newLabel("if.t");
|
|
692
726
|
const joinLabel = B.newLabel("if.j");
|
|
693
727
|
const falseLabel = s.else_ ? B.newLabel("if.f") : joinLabel;
|
|
694
|
-
|
|
728
|
+
// A running maximum or minimum is rarely updated; the weights keep
|
|
729
|
+
// the branch, where a select would make each element wait on the last.
|
|
730
|
+
const weights = emitter.runningExtrema.has(s)
|
|
731
|
+
? `, !prof !{!"branch_weights", i32 1, i32 1000}`
|
|
732
|
+
: "";
|
|
733
|
+
B.condBr(cond, trueLabel, falseLabel, weights);
|
|
695
734
|
B.startBlock(trueLabel);
|
|
696
735
|
emitter.emitBlock(s.then);
|
|
697
736
|
B.br(joinLabel);
|
|
@@ -704,6 +743,20 @@ export function emitStmtBody(emitter, s) {
|
|
|
704
743
|
break;
|
|
705
744
|
}
|
|
706
745
|
case "while": {
|
|
746
|
+
const callbacks = callbackVersionBindings(emitter, s);
|
|
747
|
+
if (callbacks) {
|
|
748
|
+
emitCallbackVersionedLoop(emitter, s, callbacks);
|
|
749
|
+
break;
|
|
750
|
+
}
|
|
751
|
+
const version = LOOPS.of(emitter).bytesLoopVersionsEnabled &&
|
|
752
|
+
LOOPS.of(emitter).bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
|
|
753
|
+
!LOOPS.of(emitter).bytesLoopVersioning.has(s)
|
|
754
|
+
? emitter.matchBytesLoopVersion(s, null)
|
|
755
|
+
: null;
|
|
756
|
+
if (version) {
|
|
757
|
+
emitVersionedLoop(emitter, s, version);
|
|
758
|
+
break;
|
|
759
|
+
}
|
|
707
760
|
const workerBudget = emitter.workerLoopBudget(s);
|
|
708
761
|
const le = B.newLabel("loop.e");
|
|
709
762
|
emitter.emitLoopCopies(s, true, le, (exit) => {
|
|
@@ -712,6 +765,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
712
765
|
const lp = workerBudget !== null ? B.newLabel("loop.p") : lc;
|
|
713
766
|
B.br(lc);
|
|
714
767
|
B.startBlock(lc);
|
|
768
|
+
enterLoopHeader(emitter, lc);
|
|
715
769
|
B.condBr(emitter.emitCondition(s.cond), lb, exit);
|
|
716
770
|
B.startBlock(lb);
|
|
717
771
|
emitter.jumpTargets.push({
|
|
@@ -736,6 +790,11 @@ export function emitStmtBody(emitter, s) {
|
|
|
736
790
|
break;
|
|
737
791
|
}
|
|
738
792
|
case "doWhile": {
|
|
793
|
+
const callbacks = callbackVersionBindings(emitter, s);
|
|
794
|
+
if (callbacks) {
|
|
795
|
+
emitCallbackVersionedLoop(emitter, s, callbacks);
|
|
796
|
+
break;
|
|
797
|
+
}
|
|
739
798
|
const workerBudget = emitter.workerLoopBudget(s);
|
|
740
799
|
// Body first (runs at least once); continue jumps to the CONDITION.
|
|
741
800
|
const le = B.newLabel("loop.e");
|
|
@@ -744,6 +803,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
744
803
|
const lc = B.newLabel("loop.c");
|
|
745
804
|
B.br(lb);
|
|
746
805
|
B.startBlock(lb);
|
|
806
|
+
enterLoopHeader(emitter, lb);
|
|
747
807
|
emitter.jumpTargets.push({
|
|
748
808
|
kind: "loop",
|
|
749
809
|
brkLabel: exit,
|
|
@@ -764,6 +824,11 @@ export function emitStmtBody(emitter, s) {
|
|
|
764
824
|
break;
|
|
765
825
|
}
|
|
766
826
|
case "for": {
|
|
827
|
+
const callbacks = callbackVersionBindings(emitter, s);
|
|
828
|
+
if (callbacks) {
|
|
829
|
+
emitCallbackVersionedLoop(emitter, s, callbacks);
|
|
830
|
+
break;
|
|
831
|
+
}
|
|
767
832
|
// The init's scope wraps the whole loop (break/continue must NOT
|
|
768
833
|
// release it — scopeDepth captured after the push, C parity).
|
|
769
834
|
const integerArrayLoop = emitter.debug === null
|
|
@@ -771,13 +836,19 @@ export function emitStmtBody(emitter, s) {
|
|
|
771
836
|
: null;
|
|
772
837
|
const integerLoop = integerArrayLoop ??
|
|
773
838
|
(emitter.debug === null ? matchIntegerBytesForLoop(s, emitter.numericLocals) : null);
|
|
774
|
-
const countedLoop = !integerLoop && emitter.countedLoopsEnabled
|
|
775
|
-
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, emitter.unaliasedArrays)
|
|
839
|
+
const countedLoop = !integerLoop && LOOPS.of(emitter).countedLoopsEnabled
|
|
840
|
+
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
|
|
776
841
|
: null;
|
|
777
|
-
|
|
778
|
-
|
|
842
|
+
// Two counters closing in on each other (`lo++, hi--`) take the same
|
|
843
|
+
// integer storage as a counted loop's one.
|
|
844
|
+
const pairedLoop = !integerLoop && !countedLoop && LOOPS.of(emitter).countedLoopsEnabled
|
|
845
|
+
? matchIntegerPairedForLoop(s, emitter.numericLocals, emitter.integerRanges)
|
|
779
846
|
: null;
|
|
780
|
-
|
|
847
|
+
// Byte windows and dense loops reason about one counter.
|
|
848
|
+
const window = countedLoop && countedLoop.followers.length === 0 && LOOPS.of(emitter).byteWindowsEnabled
|
|
849
|
+
? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, LOOPS.of(emitter).byteWindowEntries.get(s) ?? new Set())
|
|
850
|
+
: null;
|
|
851
|
+
const denseShape = !LOOPS.of(emitter).denseLoopsEnabled
|
|
781
852
|
? null
|
|
782
853
|
: integerArrayLoop
|
|
783
854
|
? {
|
|
@@ -785,29 +856,31 @@ export function emitStmtBody(emitter, s) {
|
|
|
785
856
|
length: integerArrayLoop.limitReceiver,
|
|
786
857
|
range: { min: 0, max: 4294967294 },
|
|
787
858
|
}
|
|
788
|
-
: countedLoop && !countedLoop.guarded
|
|
859
|
+
: countedLoop && !countedLoop.guarded && countedLoop.followers.length === 0
|
|
789
860
|
? countedDenseShape(s, countedLoop)
|
|
790
|
-
:
|
|
861
|
+
: pairedLoop
|
|
862
|
+
? pairedDenseShape(pairedLoop)
|
|
863
|
+
: null;
|
|
791
864
|
const dense = denseShape && !window
|
|
792
|
-
? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, emitter.unaliasedArrays, emitter.denseLoopEntries.get(s) ?? new Set())
|
|
865
|
+
? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, LOOPS.of(emitter).unaliasedArrays, LOOPS.of(emitter).denseLoopEntries.get(s) ?? new Set())
|
|
793
866
|
: null;
|
|
794
867
|
if (dense) {
|
|
795
868
|
const valid = emitDenseLoopGuard(emitter, dense);
|
|
796
869
|
const fast = B.newLabel("dense.loop.fast"), slow = B.newLabel("dense.loop.slow"), done = B.newLabel("dense.loop.done");
|
|
797
870
|
B.condBr(valid, fast, slow);
|
|
798
|
-
emitter.denseLoopsEnabled = false;
|
|
871
|
+
LOOPS.of(emitter).denseLoopsEnabled = false;
|
|
799
872
|
try {
|
|
800
873
|
B.startBlock(slow);
|
|
801
874
|
emitter.emitStmt(s);
|
|
802
875
|
B.br(done);
|
|
803
876
|
B.startBlock(fast);
|
|
804
|
-
emitter.denseLoop = dense;
|
|
877
|
+
LOOPS.of(emitter).denseLoop = dense;
|
|
805
878
|
emitter.emitStmt(s);
|
|
806
879
|
B.br(done);
|
|
807
880
|
}
|
|
808
881
|
finally {
|
|
809
|
-
emitter.denseLoop = null;
|
|
810
|
-
emitter.denseLoopsEnabled = true;
|
|
882
|
+
LOOPS.of(emitter).denseLoop = null;
|
|
883
|
+
LOOPS.of(emitter).denseLoopsEnabled = true;
|
|
811
884
|
}
|
|
812
885
|
B.startBlock(done);
|
|
813
886
|
break;
|
|
@@ -817,7 +890,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
817
890
|
const fast = B.newLabel("bytes.window.fast"), slow = B.newLabel("bytes.window.slow"), done = B.newLabel("bytes.window.done");
|
|
818
891
|
B.condBr(valid, fast, slow);
|
|
819
892
|
const originalRanges = emitter.integerRanges, originalBounds = emitter.bytesBounds;
|
|
820
|
-
emitter.byteWindowsEnabled = false;
|
|
893
|
+
LOOPS.of(emitter).byteWindowsEnabled = false;
|
|
821
894
|
try {
|
|
822
895
|
B.startBlock(slow);
|
|
823
896
|
emitter.emitStmt(s);
|
|
@@ -831,60 +904,51 @@ export function emitStmtBody(emitter, s) {
|
|
|
831
904
|
finally {
|
|
832
905
|
emitter.integerRanges = originalRanges;
|
|
833
906
|
emitter.bytesBounds = originalBounds;
|
|
834
|
-
emitter.byteWindowsEnabled = true;
|
|
907
|
+
LOOPS.of(emitter).byteWindowsEnabled = true;
|
|
835
908
|
}
|
|
836
909
|
B.startBlock(done);
|
|
837
910
|
break;
|
|
838
911
|
}
|
|
839
|
-
const
|
|
840
|
-
emitter.bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
|
|
841
|
-
!emitter.bytesLoopVersioning.has(s)
|
|
842
|
-
|
|
912
|
+
const versionable = LOOPS.of(emitter).bytesLoopVersionsEnabled &&
|
|
913
|
+
LOOPS.of(emitter).bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
|
|
914
|
+
!LOOPS.of(emitter).bytesLoopVersioning.has(s);
|
|
915
|
+
// A loop to a typed array's or an array's length keeps its integer
|
|
916
|
+
// induction. Its counted form only gives the version guard the
|
|
917
|
+
// counter's iteration space, so the guard also covers accesses of
|
|
918
|
+
// other typed arrays at the counter, such as `x[i]` and `y[i]` in
|
|
919
|
+
// `for (let i = 0; i < out.length; i++) out[i] = x[i] * y[i]`.
|
|
920
|
+
const versionCounted = versionable && !countedLoop && integerLoop && LOOPS.of(emitter).countedLoopsEnabled
|
|
921
|
+
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
|
|
922
|
+
: countedLoop;
|
|
923
|
+
const version = versionable
|
|
924
|
+
? emitter.matchBytesLoopVersion(s, versionCounted, versionCounted ? null : pairedLoop)
|
|
843
925
|
: null;
|
|
844
926
|
if (version) {
|
|
845
|
-
|
|
846
|
-
emitBytesLoopVersionGuard(emitter, version, fast, slow);
|
|
847
|
-
const originalBounds = emitter.bytesBounds, originalRanges = emitter.integerRanges;
|
|
848
|
-
emitter.bytesLoopVersioning.add(s);
|
|
849
|
-
try {
|
|
850
|
-
B.startBlock(slow);
|
|
851
|
-
emitter.emitStmt(s);
|
|
852
|
-
B.br(done);
|
|
853
|
-
B.startBlock(fast);
|
|
854
|
-
emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
|
|
855
|
-
if (version.ranges.size > 0)
|
|
856
|
-
emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
|
|
857
|
-
if (version.counted?.guarded)
|
|
858
|
-
emitter.provenCountedGuards.add(s);
|
|
859
|
-
emitter.emitStmt(s);
|
|
860
|
-
B.br(done);
|
|
861
|
-
}
|
|
862
|
-
finally {
|
|
863
|
-
emitter.bytesBounds = originalBounds;
|
|
864
|
-
emitter.integerRanges = originalRanges;
|
|
865
|
-
emitter.provenCountedGuards.delete(s);
|
|
866
|
-
emitter.bytesLoopVersioning.delete(s);
|
|
867
|
-
}
|
|
868
|
-
B.startBlock(done);
|
|
927
|
+
emitVersionedLoop(emitter, s, version);
|
|
869
928
|
break;
|
|
870
929
|
}
|
|
871
930
|
let countedJoin = null;
|
|
872
|
-
if (countedLoop?.guarded
|
|
873
|
-
|
|
931
|
+
if ((countedLoop?.guarded || pairedLoop?.guarded) &&
|
|
932
|
+
!LOOPS.of(emitter).provenCountedGuards.has(s)) {
|
|
933
|
+
const safe = countedLoop
|
|
934
|
+
? emitCountedLoopSafety(emitter, countedLoop)
|
|
935
|
+
: emitPairedLoopSafety(emitter, pairedLoop);
|
|
874
936
|
const fast = B.newLabel("counted.fast");
|
|
875
937
|
const slow = B.newLabel("counted.slow");
|
|
876
938
|
countedJoin = B.newLabel("counted.done");
|
|
877
939
|
B.condBr(safe, fast, slow);
|
|
878
940
|
B.startBlock(slow);
|
|
879
|
-
emitter.countedLoopsEnabled = false;
|
|
941
|
+
LOOPS.of(emitter).countedLoopsEnabled = false;
|
|
880
942
|
emitter.emitStmt(s);
|
|
881
|
-
emitter.countedLoopsEnabled = true;
|
|
943
|
+
LOOPS.of(emitter).countedLoopsEnabled = true;
|
|
882
944
|
B.br(countedJoin);
|
|
883
945
|
B.startBlock(fast);
|
|
884
946
|
}
|
|
885
947
|
emitter.scopes.push([]);
|
|
886
948
|
let integerSlot = null;
|
|
887
949
|
let countedLimit = null;
|
|
950
|
+
const pairedSlots = [];
|
|
951
|
+
const followerSlots = [];
|
|
888
952
|
if (integerLoop) {
|
|
889
953
|
integerSlot = B.slot();
|
|
890
954
|
B.entryAllocas.push(`${integerSlot} = alloca ${emitter.sizeType} ; integer induction ${emitter.currentLocals.get(integerLoop.localId).name}`);
|
|
@@ -903,8 +967,8 @@ export function emitStmtBody(emitter, s) {
|
|
|
903
967
|
emitter.integerLoopBindings.set(integerLoop.localId, {
|
|
904
968
|
slot: integerSlot,
|
|
905
969
|
type: emitter.sizeType,
|
|
906
|
-
range: emitter.denseLoop?.counter === integerLoop.localId
|
|
907
|
-
? emitter.denseLoop.range
|
|
970
|
+
range: LOOPS.of(emitter).denseLoop?.counter === integerLoop.localId
|
|
971
|
+
? LOOPS.of(emitter).denseLoop.range
|
|
908
972
|
: { min: 0, max: integerArrayLoop ? 4294967294 : Number.MAX_SAFE_INTEGER - 1 },
|
|
909
973
|
});
|
|
910
974
|
}
|
|
@@ -919,12 +983,47 @@ export function emitStmtBody(emitter, s) {
|
|
|
919
983
|
slot: integerSlot,
|
|
920
984
|
type: "i64",
|
|
921
985
|
signed: true,
|
|
922
|
-
range: emitter.denseLoop?.counter === countedLoop.localId
|
|
923
|
-
? emitter.denseLoop.range
|
|
986
|
+
range: LOOPS.of(emitter).denseLoop?.counter === countedLoop.localId
|
|
987
|
+
? LOOPS.of(emitter).denseLoop.range
|
|
924
988
|
: countedLoop.range,
|
|
925
989
|
});
|
|
990
|
+
for (const follower of countedLoop.followers) {
|
|
991
|
+
const slot = B.slot();
|
|
992
|
+
B.entryAllocas.push(`${slot} = alloca i64 ; integer induction ${emitter.currentLocals.get(follower.localId).name}`);
|
|
993
|
+
const value = emitter.emitExpr(follower.start);
|
|
994
|
+
const followerStart = B.tmp();
|
|
995
|
+
B.line(`${followerStart} = fptosi double ${value.name} to i64`);
|
|
996
|
+
B.line(`store i64 ${followerStart}, ptr ${slot}`);
|
|
997
|
+
followerSlots.push(slot);
|
|
998
|
+
emitter.integerLoopBindings.set(follower.localId, {
|
|
999
|
+
slot,
|
|
1000
|
+
type: "i64",
|
|
1001
|
+
signed: true,
|
|
1002
|
+
range: follower.range,
|
|
1003
|
+
});
|
|
1004
|
+
}
|
|
926
1005
|
countedLimit = emitCountedLoopLimit(emitter, countedLoop);
|
|
927
1006
|
}
|
|
1007
|
+
else if (pairedLoop) {
|
|
1008
|
+
for (const counter of [pairedLoop.low, pairedLoop.high]) {
|
|
1009
|
+
const slot = B.slot();
|
|
1010
|
+
B.entryAllocas.push(`${slot} = alloca i64 ; integer induction ${emitter.currentLocals.get(counter.localId).name}`);
|
|
1011
|
+
const value = emitter.emitExpr(counter.start);
|
|
1012
|
+
const start = B.tmp();
|
|
1013
|
+
B.line(`${start} = fptosi double ${value.name} to i64`);
|
|
1014
|
+
B.line(`store i64 ${start}, ptr ${slot}`);
|
|
1015
|
+
pairedSlots.push(slot);
|
|
1016
|
+
const dense = LOOPS.of(emitter).denseLoop;
|
|
1017
|
+
emitter.integerLoopBindings.set(counter.localId, {
|
|
1018
|
+
slot,
|
|
1019
|
+
type: "i64",
|
|
1020
|
+
signed: true,
|
|
1021
|
+
range: dense?.pair && dense.counter === pairedLoop.low.localId
|
|
1022
|
+
? dense.range
|
|
1023
|
+
: pairedLoop.range,
|
|
1024
|
+
});
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
928
1027
|
else if (s.init) {
|
|
929
1028
|
// A multi-declarator head shares the loop's scope. Emitting its
|
|
930
1029
|
// IR block as an ordinary block would release captured/ref locals
|
|
@@ -966,6 +1065,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
966
1065
|
const lu = s.update || capturedLets.length > 0 || workerBudget !== null ? B.newLabel("loop.u") : lc;
|
|
967
1066
|
B.br(lc);
|
|
968
1067
|
B.startBlock(lc);
|
|
1068
|
+
enterLoopHeader(emitter, lc);
|
|
969
1069
|
if (integerLoop && integerSlot) {
|
|
970
1070
|
const receiver = emitter.emitStableReceiver(integerLoop.limitReceiver, []);
|
|
971
1071
|
const lenPtr = B.tmp();
|
|
@@ -988,8 +1088,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
988
1088
|
B.line(`${inBounds} = icmp ult i32 ${narrow}, ${len}`);
|
|
989
1089
|
}
|
|
990
1090
|
else {
|
|
991
|
-
emitter.
|
|
992
|
-
B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${emitter.fieldAliasAttachment(lenPtr)}`);
|
|
1091
|
+
B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${bytesHeaderAlias(emitter)}`);
|
|
993
1092
|
B.line(`${inBounds} = icmp ult ${emitter.sizeType} ${index}, ${len}`);
|
|
994
1093
|
}
|
|
995
1094
|
B.condBr(inBounds, lb, exit);
|
|
@@ -1001,6 +1100,13 @@ export function emitStmtBody(emitter, s) {
|
|
|
1001
1100
|
B.line(`${inBounds} = icmp ${countedLoop.step > 0 ? "slt" : "sgt"} i64 ${index}, ${countedLimit}`);
|
|
1002
1101
|
B.condBr(inBounds, lb, exit);
|
|
1003
1102
|
}
|
|
1103
|
+
else if (pairedLoop) {
|
|
1104
|
+
const low = B.tmp(), high = B.tmp(), open = B.tmp();
|
|
1105
|
+
B.line(`${low} = load i64, ptr ${pairedSlots[0]}`);
|
|
1106
|
+
B.line(`${high} = load i64, ptr ${pairedSlots[1]}`);
|
|
1107
|
+
B.line(`${open} = icmp ${pairedLoop.inclusive ? "sle" : "slt"} i64 ${low}, ${high}`);
|
|
1108
|
+
B.condBr(open, lb, exit);
|
|
1109
|
+
}
|
|
1004
1110
|
else if (s.cond)
|
|
1005
1111
|
B.condBr(emitter.emitCondition(s.cond), lb, exit);
|
|
1006
1112
|
else
|
|
@@ -1035,6 +1141,22 @@ export function emitStmtBody(emitter, s) {
|
|
|
1035
1141
|
B.line(`${old} = load i64, ptr ${integerSlot}`);
|
|
1036
1142
|
B.line(`${next} = add nsw i64 ${old}, ${countedLoop.step}`);
|
|
1037
1143
|
B.line(`store i64 ${next}, ptr ${integerSlot}`);
|
|
1144
|
+
countedLoop.followers.forEach((follower, i) => {
|
|
1145
|
+
const was = B.tmp();
|
|
1146
|
+
const now = B.tmp();
|
|
1147
|
+
B.line(`${was} = load i64, ptr ${followerSlots[i]}`);
|
|
1148
|
+
B.line(`${now} = add nsw i64 ${was}, ${follower.step}`);
|
|
1149
|
+
B.line(`store i64 ${now}, ptr ${followerSlots[i]}`);
|
|
1150
|
+
});
|
|
1151
|
+
}
|
|
1152
|
+
else if (pairedLoop) {
|
|
1153
|
+
[pairedLoop.low, pairedLoop.high].forEach((counter, i) => {
|
|
1154
|
+
const old = B.tmp();
|
|
1155
|
+
const next = B.tmp();
|
|
1156
|
+
B.line(`${old} = load i64, ptr ${pairedSlots[i]}`);
|
|
1157
|
+
B.line(`${next} = add nsw i64 ${old}, ${counter.step}`);
|
|
1158
|
+
B.line(`store i64 ${next}, ptr ${pairedSlots[i]}`);
|
|
1159
|
+
});
|
|
1038
1160
|
}
|
|
1039
1161
|
else if (s.update)
|
|
1040
1162
|
emitter.emitStmt(s.update);
|
|
@@ -1045,8 +1167,15 @@ export function emitStmtBody(emitter, s) {
|
|
|
1045
1167
|
emitter.releaseScope(emitter.scopes.pop());
|
|
1046
1168
|
if (integerLoop)
|
|
1047
1169
|
emitter.integerLoopBindings.delete(integerLoop.localId);
|
|
1048
|
-
if (countedLoop)
|
|
1170
|
+
if (countedLoop) {
|
|
1049
1171
|
emitter.integerLoopBindings.delete(countedLoop.localId);
|
|
1172
|
+
for (const follower of countedLoop.followers)
|
|
1173
|
+
emitter.integerLoopBindings.delete(follower.localId);
|
|
1174
|
+
}
|
|
1175
|
+
if (pairedLoop) {
|
|
1176
|
+
emitter.integerLoopBindings.delete(pairedLoop.low.localId);
|
|
1177
|
+
emitter.integerLoopBindings.delete(pairedLoop.high.localId);
|
|
1178
|
+
}
|
|
1050
1179
|
if (integerArrayLoop)
|
|
1051
1180
|
emitter.integerArrayBindings.delete(integerArrayLoop.localId);
|
|
1052
1181
|
if (countedJoin) {
|
|
@@ -1416,6 +1545,40 @@ export function emitStmtBody(emitter, s) {
|
|
|
1416
1545
|
* Abrupt completions inside tryBody/catchBody ride the finallyStack:
|
|
1417
1546
|
* returns inline copies at the return site, while break/continue use the
|
|
1418
1547
|
* shared region walk before branching to their resolved target. */
|
|
1548
|
+
/** A constant number local whose initializer has an exact integer form
|
|
1549
|
+
* (such as `const j = i * 4` in a typed-array loop version) keeps that
|
|
1550
|
+
* integer in an i64 slot beside the double, so reads such as `px[j + 1]`
|
|
1551
|
+
* index with integer arithmetic instead of converting the double back.
|
|
1552
|
+
* Every other declaration of the local drops the integer: the same
|
|
1553
|
+
* declaration is emitted once per loop copy, and a copy must not read the
|
|
1554
|
+
* integer another copy stored. */
|
|
1555
|
+
function storeIntegerTemp(emitter, localId, b, v) {
|
|
1556
|
+
const local = b.local;
|
|
1557
|
+
if (!emitter.integerTempsEnabled ||
|
|
1558
|
+
b.kind !== "local" ||
|
|
1559
|
+
!local ||
|
|
1560
|
+
local.type.kind !== "f64" ||
|
|
1561
|
+
local.mutable ||
|
|
1562
|
+
local.tdz === true ||
|
|
1563
|
+
emitter.captureIds.has(localId) ||
|
|
1564
|
+
!v.integer) {
|
|
1565
|
+
emitter.integerTemps.delete(localId);
|
|
1566
|
+
return;
|
|
1567
|
+
}
|
|
1568
|
+
const B = emitter.B;
|
|
1569
|
+
let slot = emitter.integerTemps.get(localId)?.slot;
|
|
1570
|
+
if (slot === undefined) {
|
|
1571
|
+
slot = B.slot();
|
|
1572
|
+
B.entryAllocas.push(`${slot} = alloca i64 ; integer ${local.name}`);
|
|
1573
|
+
}
|
|
1574
|
+
B.line(`store i64 ${widenInteger(emitter, v.integer)}, ptr ${slot}`);
|
|
1575
|
+
emitter.integerTemps.set(localId, {
|
|
1576
|
+
slot,
|
|
1577
|
+
type: "i64",
|
|
1578
|
+
signed: true,
|
|
1579
|
+
range: v.integer.range,
|
|
1580
|
+
});
|
|
1581
|
+
}
|
|
1419
1582
|
export function emitTryCatch(emitter, s) {
|
|
1420
1583
|
const B = emitter.B;
|
|
1421
1584
|
const hasCatch = s.catchBody !== null;
|
|
@@ -1562,7 +1725,7 @@ export function emitTryCatch(emitter, s) {
|
|
|
1562
1725
|
* case, refcounted/boxed case-body locals are NULL-reset up front and
|
|
1563
1726
|
* the scope-exit releases rely on NULL tolerance. */
|
|
1564
1727
|
export function emitSwitch(emitter, s) {
|
|
1565
|
-
const unitSwitch = charAtUnitSwitch(s);
|
|
1728
|
+
const unitSwitch = charAtUnitSwitch(emitter, s);
|
|
1566
1729
|
if (unitSwitch !== null)
|
|
1567
1730
|
return emitSwitch(emitter, unitSwitch);
|
|
1568
1731
|
const B = emitter.B;
|
|
@@ -1668,10 +1831,136 @@ export function emitSwitch(emitter, s) {
|
|
|
1668
1831
|
B.br(end);
|
|
1669
1832
|
B.startBlock(end);
|
|
1670
1833
|
}
|
|
1834
|
+
/** The loop copies a callback loop version needs: the bindings the loop
|
|
1835
|
+
* calls that the constant-callback census resolves to one function, each
|
|
1836
|
+
* with that function's direct entry. Only small loops of optimized
|
|
1837
|
+
* synchronous functions, and only bindings declared before the loop,
|
|
1838
|
+
* qualify: the guard reads each binding before the loop runs. Versions do
|
|
1839
|
+
* not nest: a loop inside either copy of a version (including the
|
|
1840
|
+
* versioned loop itself, emitted again for each copy) keeps its calls as
|
|
1841
|
+
* they are, so a loop nest is emitted at most twice. */
|
|
1842
|
+
function callbackVersionBindings(emitter, s) {
|
|
1843
|
+
if (!emitter.callbackVersionsEnabled ||
|
|
1844
|
+
emitter.currentConstantCallbacks.size === 0 ||
|
|
1845
|
+
emitter.callbackVersioning.size > 0)
|
|
1846
|
+
return null;
|
|
1847
|
+
const found = new Map();
|
|
1848
|
+
// Bindings the loop declares or writes (a callback declared in its body).
|
|
1849
|
+
const bound = new Set();
|
|
1850
|
+
let cost = 0;
|
|
1851
|
+
const expr = (e) => {
|
|
1852
|
+
if (++cost > MAX_CALLBACK_VERSION_COST)
|
|
1853
|
+
return false;
|
|
1854
|
+
if (e.kind === "assignExpr")
|
|
1855
|
+
bound.add(e.localId);
|
|
1856
|
+
if (e.kind === "callValue" && e.callee.kind === "varRef" && !found.has(e.callee.localId)) {
|
|
1857
|
+
const local = emitter.currentLocals.get(e.callee.localId);
|
|
1858
|
+
const target = local && local.tdz !== true ? emitter.knownCallbackTarget(e.callee) : undefined;
|
|
1859
|
+
if (target)
|
|
1860
|
+
found.set(e.callee.localId, { ref: e.callee, direct: target.direct });
|
|
1861
|
+
}
|
|
1862
|
+
return everyExprChild(e, expr, stmt);
|
|
1863
|
+
};
|
|
1864
|
+
const stmt = (x) => {
|
|
1865
|
+
if (++cost > MAX_CALLBACK_VERSION_COST)
|
|
1866
|
+
return false;
|
|
1867
|
+
if (x.kind === "varDecl" || x.kind === "assign" || x.kind === "forOf")
|
|
1868
|
+
bound.add(x.localId);
|
|
1869
|
+
else if (x.kind === "tryCatch" && x.catchLocalId !== null)
|
|
1870
|
+
bound.add(x.catchLocalId);
|
|
1871
|
+
return everyStmtChild(x, expr, stmt);
|
|
1872
|
+
};
|
|
1873
|
+
if (!stmt(s))
|
|
1874
|
+
return null;
|
|
1875
|
+
const bindings = [...found.values()].filter(({ ref }) => !bound.has(ref.localId));
|
|
1876
|
+
return bindings.length > 0 ? bindings : null;
|
|
1877
|
+
}
|
|
1878
|
+
/** A callback loop version. The guard tests, once before the loop, that
|
|
1879
|
+
* each binding's closure holds its known function: a closure's code
|
|
1880
|
+
* pointer is written only when the closure is built, and the census
|
|
1881
|
+
* resolves only bindings the function never rebinds. The copy where the
|
|
1882
|
+
* guard holds calls those functions directly, with no indirect fallback
|
|
1883
|
+
* that could rewrite the closure or what it captures, so LLVM can keep a
|
|
1884
|
+
* captured scalar the callback updates in a register. The other copy is the
|
|
1885
|
+
* ordinary loop. */
|
|
1886
|
+
function emitCallbackVersionedLoop(emitter, s, bindings) {
|
|
1887
|
+
const B = emitter.B;
|
|
1888
|
+
let ok = "true";
|
|
1889
|
+
for (const { ref, direct } of bindings) {
|
|
1890
|
+
// A borrowed read: the guard only compares the code pointer.
|
|
1891
|
+
const closure = emitter.emitReadReceiver(ref).name;
|
|
1892
|
+
const fnp = B.tmp(), fn = B.tmp(), same = B.tmp();
|
|
1893
|
+
B.line(`${fnp} = getelementptr inbounds %ScrClosure, ptr ${closure}, i64 0, i32 1`);
|
|
1894
|
+
B.line(`${fn} = load ptr, ptr ${fnp}`);
|
|
1895
|
+
B.line(`${same} = icmp eq ptr ${fn}, ${direct}`);
|
|
1896
|
+
if (ok === "true")
|
|
1897
|
+
ok = same;
|
|
1898
|
+
else {
|
|
1899
|
+
const both = B.tmp();
|
|
1900
|
+
B.line(`${both} = and i1 ${ok}, ${same}`);
|
|
1901
|
+
ok = both;
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
const fast = B.newLabel("callback.version.fast"), slow = B.newLabel("callback.version.slow"), done = B.newLabel("callback.version.done");
|
|
1905
|
+
B.condBr(ok, fast, slow);
|
|
1906
|
+
emitter.callbackVersioning.add(s);
|
|
1907
|
+
try {
|
|
1908
|
+
B.startBlock(slow);
|
|
1909
|
+
emitter.emitStmt(s);
|
|
1910
|
+
B.br(done);
|
|
1911
|
+
B.startBlock(fast);
|
|
1912
|
+
for (const { ref } of bindings)
|
|
1913
|
+
emitter.knownCallbacks.add(ref.localId);
|
|
1914
|
+
emitter.emitStmt(s);
|
|
1915
|
+
B.br(done);
|
|
1916
|
+
}
|
|
1917
|
+
finally {
|
|
1918
|
+
for (const { ref } of bindings)
|
|
1919
|
+
emitter.knownCallbacks.delete(ref.localId);
|
|
1920
|
+
emitter.callbackVersioning.delete(s);
|
|
1921
|
+
}
|
|
1922
|
+
B.startBlock(done);
|
|
1923
|
+
}
|
|
1924
|
+
/** Entries in a row whose fast copy bailed before a speculative loop site
|
|
1925
|
+
* stops trying it. */
|
|
1926
|
+
const SPECULATION_BAILS = 8;
|
|
1671
1927
|
/** Emit a loop's condition, body and update through `emitCopy`, twice
|
|
1672
1928
|
* when speculative-integers.ts plans a fast integer copy. Both copies
|
|
1673
1929
|
* share the loop's setup and exit; the ordinary copy comes first so the
|
|
1674
1930
|
* fast copy is only emitted when every resume point exists. */
|
|
1931
|
+
/** A typed-array loop version: the guard, then the checked copy, which
|
|
1932
|
+
* runs whenever the guard fails, and the copy whose accesses the guard
|
|
1933
|
+
* proves in bounds (or thread-owned). */
|
|
1934
|
+
function emitVersionedLoop(emitter, s, version) {
|
|
1935
|
+
const B = emitter.B;
|
|
1936
|
+
const fast = B.newLabel("bytes.version.fast"), slow = B.newLabel("bytes.version.slow"), done = B.newLabel("bytes.version.done");
|
|
1937
|
+
emitBytesLoopVersionGuard(emitter, version, fast, slow);
|
|
1938
|
+
const originalBounds = emitter.bytesBounds, originalOwned = emitter.bytesOwned, originalRanges = emitter.integerRanges;
|
|
1939
|
+
LOOPS.of(emitter).bytesLoopVersioning.add(s);
|
|
1940
|
+
try {
|
|
1941
|
+
B.startBlock(slow);
|
|
1942
|
+
emitter.emitStmt(s);
|
|
1943
|
+
B.br(done);
|
|
1944
|
+
B.startBlock(fast);
|
|
1945
|
+
emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
|
|
1946
|
+
if (version.owned.size > 0)
|
|
1947
|
+
emitter.bytesOwned = new Set([...originalOwned, ...version.owned]);
|
|
1948
|
+
if (version.ranges.size > 0)
|
|
1949
|
+
emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
|
|
1950
|
+
if (version.counted?.guarded || version.paired?.loop.guarded)
|
|
1951
|
+
LOOPS.of(emitter).provenCountedGuards.add(s);
|
|
1952
|
+
emitter.emitStmt(s);
|
|
1953
|
+
B.br(done);
|
|
1954
|
+
}
|
|
1955
|
+
finally {
|
|
1956
|
+
emitter.bytesBounds = originalBounds;
|
|
1957
|
+
emitter.bytesOwned = originalOwned;
|
|
1958
|
+
emitter.integerRanges = originalRanges;
|
|
1959
|
+
LOOPS.of(emitter).provenCountedGuards.delete(s);
|
|
1960
|
+
LOOPS.of(emitter).bytesLoopVersioning.delete(s);
|
|
1961
|
+
}
|
|
1962
|
+
B.startBlock(done);
|
|
1963
|
+
}
|
|
1675
1964
|
export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
1676
1965
|
const plan = allowed &&
|
|
1677
1966
|
emitter.speculativeLoopsEnabled &&
|
|
@@ -1686,11 +1975,25 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
1686
1975
|
}, (id) => emitter.speculativeLocal(id) || emitter.speculativeInvariantGlobal(id))
|
|
1687
1976
|
: null;
|
|
1688
1977
|
if (!plan) {
|
|
1689
|
-
const
|
|
1690
|
-
|
|
1691
|
-
|
|
1978
|
+
const ordinary = (exit) => {
|
|
1979
|
+
const proven = allowed ? planProvenLoop(emitter, loop) : null;
|
|
1980
|
+
if (proven)
|
|
1981
|
+
emitProvenLoop(emitter, proven, exit, emitCopy);
|
|
1982
|
+
else
|
|
1983
|
+
emitCopy(exit);
|
|
1984
|
+
};
|
|
1985
|
+
const kinds = allowed &&
|
|
1986
|
+
emitter.speculativeLoopsEnabled &&
|
|
1987
|
+
emitter.int32Slots.checkedInt32Arrays.size > 0 &&
|
|
1988
|
+
emitter.int32Kinds === null &&
|
|
1989
|
+
emitter.speculation === null &&
|
|
1990
|
+
emitter.speculationResume === null
|
|
1991
|
+
? planInt32KindLoop(loop, (id) => emitter.checkedInt32Local(id), (e) => withinInt32(emitter.integerRanges.get(e)))
|
|
1992
|
+
: null;
|
|
1993
|
+
if (kinds)
|
|
1994
|
+
emitInt32KindLoop(emitter, kinds, exit, kinds.writes.size > 0 ? emitCopy : ordinary);
|
|
1692
1995
|
else
|
|
1693
|
-
|
|
1996
|
+
ordinary(exit);
|
|
1694
1997
|
return;
|
|
1695
1998
|
}
|
|
1696
1999
|
const B = emitter.B;
|
|
@@ -1711,24 +2014,67 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
1711
2014
|
ok = both;
|
|
1712
2015
|
}
|
|
1713
2016
|
}
|
|
2017
|
+
// Each entry whose fast copy bails counts at the loop site, and a fast
|
|
2018
|
+
// copy that completes a speculated write and leaves the loop clears the
|
|
2019
|
+
// count. After SPECULATION_BAILS bailing entries in a row, the site runs
|
|
2020
|
+
// the ordinary copy only. The count is a hint: both copies give the same
|
|
2021
|
+
// results, and a race between workers loses at most an update.
|
|
2022
|
+
const bails = emitter.speculativeLoopSite();
|
|
2023
|
+
const count = B.tmp(), trying = B.tmp();
|
|
2024
|
+
B.line(`${count} = load atomic i8, ptr ${bails} unordered, align 1`);
|
|
2025
|
+
B.line(`${trying} = icmp ult i8 ${count}, ${SPECULATION_BAILS}`);
|
|
2026
|
+
if (ok === "true")
|
|
2027
|
+
ok = trying;
|
|
2028
|
+
else {
|
|
2029
|
+
const both = B.tmp();
|
|
2030
|
+
B.line(`${both} = and i1 ${ok}, ${trying}`);
|
|
2031
|
+
ok = both;
|
|
2032
|
+
}
|
|
1714
2033
|
const fast = B.newLabel("spec.fast"), slow = B.newLabel("spec.slow");
|
|
1715
2034
|
B.condBr(ok, fast, slow);
|
|
1716
2035
|
const resume = new Map();
|
|
1717
2036
|
for (const s of plan.writes)
|
|
1718
2037
|
resume.set(s, { label: B.newLabel("spec.resume"), placed: false });
|
|
2038
|
+
// A failed check finishes its iteration in a third copy, entered only
|
|
2039
|
+
// there: it re-executes the statement and the rest of the body and the
|
|
2040
|
+
// update, then enters the ordinary copy through its header. Jumping
|
|
2041
|
+
// into the middle of the ordinary copy instead would give that loop a
|
|
2042
|
+
// second entry, and LLVM does not optimize an irreducible loop.
|
|
2043
|
+
const points = [...resume.values()];
|
|
2044
|
+
let header = null;
|
|
1719
2045
|
B.startBlock(slow);
|
|
2046
|
+
emitter.speculationHeader = (label) => {
|
|
2047
|
+
header = label;
|
|
2048
|
+
};
|
|
2049
|
+
try {
|
|
2050
|
+
emitCopy(exit);
|
|
2051
|
+
}
|
|
2052
|
+
finally {
|
|
2053
|
+
emitter.speculationHeader = null;
|
|
2054
|
+
}
|
|
2055
|
+
if (header === null)
|
|
2056
|
+
throw new InternalCompilerError("llvm emitter bug: speculative loop copy without a header");
|
|
2057
|
+
B.startBlock(B.newLabel("spec.tail"));
|
|
1720
2058
|
emitter.speculationResume = resume;
|
|
2059
|
+
emitter.speculationHeader = () => {
|
|
2060
|
+
B.br(header);
|
|
2061
|
+
B.startBlock(B.newLabel("spec.unused"));
|
|
2062
|
+
};
|
|
1721
2063
|
try {
|
|
1722
2064
|
emitCopy(exit);
|
|
1723
2065
|
}
|
|
1724
2066
|
finally {
|
|
1725
2067
|
emitter.speculationResume = null;
|
|
2068
|
+
emitter.speculationHeader = null;
|
|
1726
2069
|
}
|
|
1727
2070
|
B.startBlock(fast);
|
|
1728
|
-
if (!
|
|
2071
|
+
if (!points.every((r) => r.placed)) {
|
|
1729
2072
|
B.br(slow);
|
|
1730
2073
|
return;
|
|
1731
2074
|
}
|
|
2075
|
+
const ran = B.slot();
|
|
2076
|
+
B.entryAllocas.push(`${ran} = alloca i1 ; speculated write completed`);
|
|
2077
|
+
B.line(`store i1 false, ptr ${ran}`);
|
|
1732
2078
|
for (const id of plan.locals.keys()) {
|
|
1733
2079
|
const shadow = B.slot();
|
|
1734
2080
|
B.entryAllocas.push(`${shadow} = alloca i64 ; speculative integer ${emitter.currentLocals.get(id)?.name ?? id}`);
|
|
@@ -1766,17 +2112,25 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
1766
2112
|
writes: plan.writes,
|
|
1767
2113
|
resume: new Map([...resume].map(([s, r]) => [s, r.label])),
|
|
1768
2114
|
deferred,
|
|
2115
|
+
bails,
|
|
2116
|
+
ran,
|
|
1769
2117
|
};
|
|
1770
2118
|
try {
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
}
|
|
2119
|
+
const leave = B.newLabel("spec.leave");
|
|
2120
|
+
emitCopy(leave);
|
|
2121
|
+
B.startBlock(leave);
|
|
2122
|
+
emitter.writeBackDeferred(deferred);
|
|
2123
|
+
// An entry that never ran a speculated write (a loop of no iterations)
|
|
2124
|
+
// says nothing about the site.
|
|
2125
|
+
const wrote = B.tmp(), left = B.tmp(), counted = B.tmp(), both = B.tmp(), clear = B.newLabel("spec.clear");
|
|
2126
|
+
B.line(`${wrote} = load i1, ptr ${ran}`);
|
|
2127
|
+
B.line(`${left} = load atomic i8, ptr ${bails} unordered, align 1`);
|
|
2128
|
+
B.line(`${counted} = icmp ne i8 ${left}, 0`);
|
|
2129
|
+
B.line(`${both} = and i1 ${wrote}, ${counted}`);
|
|
2130
|
+
B.condBr(both, clear, exit);
|
|
2131
|
+
B.startBlock(clear);
|
|
2132
|
+
B.line(`store atomic i8 0, ptr ${bails} unordered, align 1`);
|
|
2133
|
+
B.br(exit);
|
|
1780
2134
|
}
|
|
1781
2135
|
finally {
|
|
1782
2136
|
emitter.speculation = null;
|
|
@@ -1784,6 +2138,127 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
1784
2138
|
emitter.integerLoopBindings.delete(id);
|
|
1785
2139
|
}
|
|
1786
2140
|
}
|
|
2141
|
+
/** An int32 kind loop (int32-kind-loops.ts). The entry test reads the kind
|
|
2142
|
+
* of each of the plan's arrays: when every one holds int32 slots the fast
|
|
2143
|
+
* copy runs, when every one holds doubles the wide copy, which reads and
|
|
2144
|
+
* writes them as double arrays, and otherwise (a plan with several arrays)
|
|
2145
|
+
* the mixed copy, which tests their kinds at each access. A failed store of
|
|
2146
|
+
* the fast copy re-executes in the third copy, which finishes its
|
|
2147
|
+
* iteration with kind tests and then enters the mixed copy, or the wide
|
|
2148
|
+
* copy when the plan has one array (it just widened). Each copy is emitted
|
|
2149
|
+
* by `ordinary`: the loop's plain copy when a store may fail, since a
|
|
2150
|
+
* proven integer loop keeps locals in shadows of its own copy that another
|
|
2151
|
+
* copy cannot resume from. */
|
|
2152
|
+
function emitInt32KindLoop(emitter, plan, exit, ordinary) {
|
|
2153
|
+
const B = emitter.B;
|
|
2154
|
+
const fn = emitter.currentFunctionName;
|
|
2155
|
+
const keys = new Set([...plan.arrays.keys()].map((id) => `${fn}\0${id}`));
|
|
2156
|
+
const several = keys.size > 1;
|
|
2157
|
+
let allInt32 = "true", allWide = "true";
|
|
2158
|
+
const and = (all, next) => {
|
|
2159
|
+
if (all === "true")
|
|
2160
|
+
return next;
|
|
2161
|
+
const both = B.tmp();
|
|
2162
|
+
B.line(`${both} = and i1 ${all}, ${next}`);
|
|
2163
|
+
return both;
|
|
2164
|
+
};
|
|
2165
|
+
for (const ref of plan.arrays.values()) {
|
|
2166
|
+
const arr = emitter.emitStableReceiver(ref, []);
|
|
2167
|
+
const kindPtr = B.tmp(), kind = B.tmp(), isInt32 = B.tmp();
|
|
2168
|
+
B.line(`${kindPtr} = getelementptr inbounds %ScrArr, ptr ${arr.name}, i32 0, i32 ${SCR_ARR_FIELD.elem}`);
|
|
2169
|
+
emitter.markMemoryPointer(kindPtr, "array:header");
|
|
2170
|
+
B.line(`${kind} = load i8, ptr ${kindPtr}${emitter.fieldAliasAttachment(kindPtr)}`);
|
|
2171
|
+
B.line(`${isInt32} = icmp eq i8 ${kind}, ${SCR_ELEM_I32}`);
|
|
2172
|
+
allInt32 = and(allInt32, isInt32);
|
|
2173
|
+
if (several) {
|
|
2174
|
+
const isWide = B.tmp();
|
|
2175
|
+
B.line(`${isWide} = xor i1 ${isInt32}, true`);
|
|
2176
|
+
allWide = and(allWide, isWide);
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
const fast = B.newLabel("kind.fast"), wide = B.newLabel("kind.wide"), mixed = several ? B.newLabel("kind.mixed") : null;
|
|
2180
|
+
if (mixed === null)
|
|
2181
|
+
B.condBr(allInt32, fast, wide);
|
|
2182
|
+
else {
|
|
2183
|
+
const other = B.newLabel("kind.other");
|
|
2184
|
+
B.condBr(allInt32, fast, other);
|
|
2185
|
+
B.startBlock(other);
|
|
2186
|
+
B.condBr(allWide, wide, mixed);
|
|
2187
|
+
}
|
|
2188
|
+
const resume = new Map();
|
|
2189
|
+
for (const s of plan.writes)
|
|
2190
|
+
resume.set(s, { label: B.newLabel("kind.resume"), placed: false });
|
|
2191
|
+
// The header the third copy enters: the mixed copy's, or the wide copy's.
|
|
2192
|
+
let header = null;
|
|
2193
|
+
const capture = (label) => {
|
|
2194
|
+
header = label;
|
|
2195
|
+
};
|
|
2196
|
+
B.startBlock(wide);
|
|
2197
|
+
if (resume.size > 0 && mixed === null)
|
|
2198
|
+
emitter.speculationHeader = capture;
|
|
2199
|
+
emitter.int32Kinds = { int32: new Set(), wide: keys, resume: new Map() };
|
|
2200
|
+
try {
|
|
2201
|
+
ordinary(exit);
|
|
2202
|
+
}
|
|
2203
|
+
finally {
|
|
2204
|
+
emitter.speculationHeader = null;
|
|
2205
|
+
emitter.int32Kinds = null;
|
|
2206
|
+
}
|
|
2207
|
+
if (mixed !== null) {
|
|
2208
|
+
B.startBlock(mixed);
|
|
2209
|
+
if (resume.size > 0)
|
|
2210
|
+
emitter.speculationHeader = capture;
|
|
2211
|
+
try {
|
|
2212
|
+
ordinary(exit);
|
|
2213
|
+
}
|
|
2214
|
+
finally {
|
|
2215
|
+
emitter.speculationHeader = null;
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
if (resume.size > 0) {
|
|
2219
|
+
if (header === null)
|
|
2220
|
+
throw new InternalCompilerError("llvm emitter bug: int32 kind loop copy without a header");
|
|
2221
|
+
// A failed store finishes its iteration here, as in a speculative
|
|
2222
|
+
// integer loop's third copy.
|
|
2223
|
+
B.startBlock(B.newLabel("kind.tail"));
|
|
2224
|
+
emitter.speculationResume = resume;
|
|
2225
|
+
emitter.speculationHeader = () => {
|
|
2226
|
+
B.br(header);
|
|
2227
|
+
B.startBlock(B.newLabel("kind.unused"));
|
|
2228
|
+
};
|
|
2229
|
+
try {
|
|
2230
|
+
ordinary(exit);
|
|
2231
|
+
}
|
|
2232
|
+
finally {
|
|
2233
|
+
emitter.speculationResume = null;
|
|
2234
|
+
emitter.speculationHeader = null;
|
|
2235
|
+
}
|
|
2236
|
+
}
|
|
2237
|
+
B.startBlock(fast);
|
|
2238
|
+
if (![...resume.values()].every((r) => r.placed)) {
|
|
2239
|
+
// A write the third copy never reached: this copy tests the kinds.
|
|
2240
|
+
ordinary(exit);
|
|
2241
|
+
return;
|
|
2242
|
+
}
|
|
2243
|
+
emitter.int32Kinds = {
|
|
2244
|
+
int32: keys,
|
|
2245
|
+
wide: new Set(),
|
|
2246
|
+
resume: new Map([...resume].map(([s, r]) => [s, r.label])),
|
|
2247
|
+
};
|
|
2248
|
+
try {
|
|
2249
|
+
ordinary(exit);
|
|
2250
|
+
}
|
|
2251
|
+
finally {
|
|
2252
|
+
emitter.int32Kinds = null;
|
|
2253
|
+
}
|
|
2254
|
+
}
|
|
2255
|
+
/** At the top of a loop copy's header: lets a speculative loop find its
|
|
2256
|
+
* ordinary copy's header, and keeps its third copy out of the loop. */
|
|
2257
|
+
function enterLoopHeader(emitter, header) {
|
|
2258
|
+
const dispatch = emitter.speculationHeader;
|
|
2259
|
+
emitter.speculationHeader = null;
|
|
2260
|
+
dispatch?.(header);
|
|
2261
|
+
}
|
|
1787
2262
|
/** A proven integer loop (speculative-integers.ts) for this loop, or null.
|
|
1788
2263
|
* A shadowed local's double is stale until the loop is left, which only
|
|
1789
2264
|
* the loop's exit, a return and an exception do: the loop is planned only
|
|
@@ -1890,7 +2365,9 @@ export function emitSpeculativeWrite(emitter, s, resume) {
|
|
|
1890
2365
|
if (emitter.frames.pop().length > 0)
|
|
1891
2366
|
throw new InternalCompilerError("llvm emitter bug: speculative write owns a temporary");
|
|
1892
2367
|
B.line(`store i64 ${result}, ptr ${binding.slot}`);
|
|
1893
|
-
const deferred = emitter.speculation
|
|
2368
|
+
const { deferred, bails: site, ran } = emitter.speculation;
|
|
2369
|
+
if (ran !== undefined)
|
|
2370
|
+
B.line(`store i1 true, ptr ${ran}`);
|
|
1894
2371
|
if (!deferred.has(target.localId)) {
|
|
1895
2372
|
const number = B.tmp();
|
|
1896
2373
|
B.line(`${number} = sitofp i64 ${result} to double`);
|
|
@@ -1902,6 +2379,13 @@ export function emitSpeculativeWrite(emitter, s, resume) {
|
|
|
1902
2379
|
B.br(done);
|
|
1903
2380
|
B.startBlock(failed);
|
|
1904
2381
|
emitter.writeBackDeferred(deferred);
|
|
2382
|
+
if (site !== undefined) {
|
|
2383
|
+
const count = B.tmp(), next = B.tmp();
|
|
2384
|
+
emitter.declare("declare i8 @llvm.uadd.sat.i8(i8, i8)");
|
|
2385
|
+
B.line(`${count} = load atomic i8, ptr ${site} unordered, align 1`);
|
|
2386
|
+
B.line(`${next} = call i8 @llvm.uadd.sat.i8(i8 ${count}, i8 1)`);
|
|
2387
|
+
B.line(`store atomic i8 ${next}, ptr ${site} unordered, align 1`);
|
|
2388
|
+
}
|
|
1905
2389
|
B.br(resume);
|
|
1906
2390
|
B.startBlock(done);
|
|
1907
2391
|
}
|
|
@@ -2019,7 +2503,7 @@ function nullableStringSwitch(emitter, s) {
|
|
|
2019
2503
|
* one-unit string literals, as a switch on `s.charCodeAt(i)` with the units
|
|
2020
2504
|
* as cases: no character string is built. An index out of range answers
|
|
2021
2505
|
* NaN, which matches no case, as "" matches no one-unit literal. */
|
|
2022
|
-
function charAtUnitSwitch(s) {
|
|
2506
|
+
function charAtUnitSwitch(emitter, s) {
|
|
2023
2507
|
const disc = s.disc;
|
|
2024
2508
|
if (disc.kind !== "strIntrinsic" || disc.method !== "charAt" || disc.args.length !== 1)
|
|
2025
2509
|
return null;
|
|
@@ -2029,7 +2513,7 @@ function charAtUnitSwitch(s) {
|
|
|
2029
2513
|
return null;
|
|
2030
2514
|
return {
|
|
2031
2515
|
...s,
|
|
2032
|
-
disc:
|
|
2516
|
+
disc: charAtUnitRead(emitter, disc),
|
|
2033
2517
|
cases: s.cases.map((c) => c.test?.kind === "strLit"
|
|
2034
2518
|
? {
|
|
2035
2519
|
...c,
|