@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
|
@@ -1,13 +1,19 @@
|
|
|
1
|
+
import { F64 } from "../../ir/ir.js";
|
|
1
2
|
import { byteNumberAccess } from "../../ir/byte-numbers.js";
|
|
2
3
|
import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
|
|
3
4
|
import { exactInteger, widenInteger } from "./integer-values.js";
|
|
4
|
-
import { emitCountedLoopLimit, emitCountedLoopSafety } from "./counted-loops.js";
|
|
5
|
-
import { emitBytesHeaderLength } from "./expr-bytes.js";
|
|
5
|
+
import { emitCountedLoopLimit, emitCountedLoopSafety, emitExactIntegerTest, } from "./counted-loops.js";
|
|
6
|
+
import { emitBytesHeaderLength, emitBytesSharedStorage } from "./expr-bytes.js";
|
|
7
|
+
import { f64Lit } from "./common.js";
|
|
8
|
+
import { emitStringAsciiFlag, emitStringByteLength } from "./string-reads.js";
|
|
6
9
|
const MAX_COST = 400;
|
|
7
|
-
const MAX_FIXED_END = 2 **
|
|
10
|
+
const MAX_FIXED_END = 2 ** 31;
|
|
8
11
|
const MAX_CHECKS = 8;
|
|
9
12
|
const MAX_OFFSET = 2 ** 31;
|
|
10
13
|
const SAFE = Number.MAX_SAFE_INTEGER;
|
|
14
|
+
/** The range the guard requires of an invariant index term without a
|
|
15
|
+
* proven one: every index of a typed array of at most 2^32 elements. */
|
|
16
|
+
const GUARDED_TERM = { min: -(2 ** 32), max: 2 ** 32 };
|
|
11
17
|
const INVARIANT_OPS = new Set(["+", "-", "*", "&", "|", "^", "<<", ">>", ">>>"]);
|
|
12
18
|
/** Loop versioning for typed-array bounds. A typed array's length and data
|
|
13
19
|
* pointer are fixed at construction (ScrBytes has no resize, transfer or
|
|
@@ -19,13 +25,28 @@ const INVARIANT_OPS = new Set(["+", "-", "*", "&", "|", "^", "<<", ">>", ">>>"])
|
|
|
19
25
|
* `hi < length`, such as `table[x & 0xff]` or a constant-trip counter;
|
|
20
26
|
* - an index `k * counter + invariant + c` of a counted loop needs its first
|
|
21
27
|
* and last values in bounds, such as `out[base + i]` for `i < n` or
|
|
22
|
-
* `view.getUint32(i * 4)`.
|
|
28
|
+
* `view.getUint32(i * 4)`. An invariant without a proven integer range,
|
|
29
|
+
* such as `base` for `const base = r * cols`, must also be an exact
|
|
30
|
+
* integer between -2^32 and 2^32, which the guard tests.
|
|
31
|
+
*
|
|
32
|
+
* `s.charCodeAt(index)` and `s.charAt(index)` (so `s[index]`) of a string
|
|
33
|
+
* binding qualify the same way. A string is immutable: its bytes, its
|
|
34
|
+
* length and the capacity-word bit that proves it ASCII (string-reads.ts)
|
|
35
|
+
* are fixed when it is built. The guard also requires that bit, so each
|
|
36
|
+
* UTF-16 unit is one byte and the length is the byte length. The fast copy
|
|
37
|
+
* reads each unit with one byte load, and each character as the immortal
|
|
38
|
+
* one-character string for its byte.
|
|
39
|
+
*
|
|
40
|
+
* In worker programs, every access of a view that may be shared tests its
|
|
41
|
+
* shared storage. A view's storage is also fixed at construction, so the
|
|
42
|
+
* same guard tests each invariant receiver once, and the fast copy reads
|
|
43
|
+
* and writes thread-owned views directly.
|
|
23
44
|
*
|
|
24
45
|
* Only small synchronous loops are versioned (nested loops included), and
|
|
25
46
|
* the emitter bounds how deeply versions nest. The checked loop runs
|
|
26
47
|
* whenever the guard fails, and keeps every out-of-bounds read, ignored
|
|
27
48
|
* write and NaN-index behavior. */
|
|
28
|
-
export function matchBytesLoopVersion(loop, counted, facts) {
|
|
49
|
+
export function matchBytesLoopVersion(loop, counted, facts, paired = null) {
|
|
29
50
|
const written = new Set();
|
|
30
51
|
const temps = new Map();
|
|
31
52
|
let cost = 0;
|
|
@@ -66,10 +87,10 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
66
87
|
// The guard runs before the initializer, so a binding the initializer
|
|
67
88
|
// writes is not invariant either: `for (let i = (a = b, 0); ...)` must
|
|
68
89
|
// not keep the bounds the guard proved for the old `a`.
|
|
69
|
-
if ((loop.init !== null && !scanStmt(loop.init)) ||
|
|
90
|
+
if ((loop.kind === "for" && loop.init !== null && !scanStmt(loop.init)) ||
|
|
70
91
|
!loop.body.every(scanStmt) ||
|
|
71
92
|
(loop.cond !== null && !scanExpr(loop.cond)) ||
|
|
72
|
-
(loop.update !== null && !scanStmt(loop.update)))
|
|
93
|
+
(loop.kind === "for" && loop.update !== null && !scanStmt(loop.update)))
|
|
73
94
|
return null;
|
|
74
95
|
// A body temp stands for its initializer only when it is a constant
|
|
75
96
|
// binding assigned exactly once, by that declaration.
|
|
@@ -106,7 +127,9 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
106
127
|
};
|
|
107
128
|
const resolving = new Set();
|
|
108
129
|
const root = (e) => {
|
|
109
|
-
if (e.kind !== "varRef" || e.type.kind !== "bytes")
|
|
130
|
+
if (e.kind !== "varRef" || (e.type.kind !== "bytes" && e.type.kind !== "string"))
|
|
131
|
+
return null;
|
|
132
|
+
if (facts.scalarStrings.has(e.localId))
|
|
110
133
|
return null;
|
|
111
134
|
const init = temp(e.localId);
|
|
112
135
|
if (init) {
|
|
@@ -119,10 +142,8 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
119
142
|
}
|
|
120
143
|
return invariant(e.localId) ? e : null;
|
|
121
144
|
};
|
|
122
|
-
// A pure
|
|
123
|
-
const
|
|
124
|
-
if (!facts.ranges.get(e))
|
|
125
|
-
return null;
|
|
145
|
+
// A pure loop-invariant number, evaluated again before the loop.
|
|
146
|
+
const pureKey = (e) => {
|
|
126
147
|
if (e.kind === "numLit")
|
|
127
148
|
return Number.isSafeInteger(e.value) ? `n${e.value}` : null;
|
|
128
149
|
if (e.kind === "varRef")
|
|
@@ -131,15 +152,33 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
131
152
|
INVARIANT_OPS.has(e.op) &&
|
|
132
153
|
e.left.type.kind === "f64" &&
|
|
133
154
|
e.right.type.kind === "f64") {
|
|
134
|
-
const left =
|
|
155
|
+
const left = pureKey(e.left), right = pureKey(e.right);
|
|
135
156
|
return left !== null && right !== null ? `(${e.op} ${left} ${right})` : null;
|
|
136
157
|
}
|
|
137
158
|
return null;
|
|
138
159
|
};
|
|
160
|
+
// Invariant terms without a proven range, such as `base` in
|
|
161
|
+
// `w[base + j]` with `const base = r * cols` for a parameter `cols`. The
|
|
162
|
+
// guard tests each one: an exact integer (not -0) within GUARDED_TERM.
|
|
163
|
+
const guardedRanges = new Map();
|
|
164
|
+
const guardedNodes = new Map();
|
|
165
|
+
// The key of a loop-invariant index term, with a proven range or guarded.
|
|
166
|
+
const invariantKey = (e) => {
|
|
167
|
+
const key = pureKey(e);
|
|
168
|
+
if (key === null || facts.ranges.get(e))
|
|
169
|
+
return key;
|
|
170
|
+
if (e.kind === "numLit")
|
|
171
|
+
return null;
|
|
172
|
+
guardedRanges.set(e, GUARDED_TERM);
|
|
173
|
+
guardedNodes.set(e, key);
|
|
174
|
+
return key;
|
|
175
|
+
};
|
|
176
|
+
const termRange = (e) => facts.ranges.get(e) ?? guardedRanges.get(e);
|
|
139
177
|
// Every operand of an affine index is `counter * k + Σ terms + offset`.
|
|
140
|
-
// Invariant terms need proven ranges
|
|
141
|
-
// need none: the guard bounds the
|
|
142
|
-
// integer, which makes the index's
|
|
178
|
+
// Invariant terms need proven ranges or the guard's test (guarded terms).
|
|
179
|
+
// Operands that involve the counter need none: the guard bounds the
|
|
180
|
+
// counter so that each of them is a safe integer, which makes the index's
|
|
181
|
+
// double arithmetic exact.
|
|
143
182
|
const shapes = new Map();
|
|
144
183
|
const affine = (e) => {
|
|
145
184
|
if (shapes.has(e))
|
|
@@ -224,9 +263,42 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
224
263
|
}
|
|
225
264
|
};
|
|
226
265
|
const termMagnitude = (terms) => terms.reduce((sum, t) => {
|
|
227
|
-
const r =
|
|
266
|
+
const r = termRange(t.expr);
|
|
228
267
|
return sum + Math.max(Math.abs(r.min), Math.abs(r.max));
|
|
229
268
|
}, 0);
|
|
269
|
+
const whileAccesses = loop.kind === "while" ? whileCounterAccesses(loop) : null;
|
|
270
|
+
function whileCounterAccesses(loop) {
|
|
271
|
+
return findWhileCounterAccesses(loop, {
|
|
272
|
+
counterLocal: (id) => {
|
|
273
|
+
const local = facts.locals.get(id);
|
|
274
|
+
return (local?.type.kind === "f64" &&
|
|
275
|
+
!local.boxed &&
|
|
276
|
+
!local.tdz &&
|
|
277
|
+
!facts.captured.has(id) &&
|
|
278
|
+
facts.initialized.has(id));
|
|
279
|
+
},
|
|
280
|
+
boundKey: (e) => {
|
|
281
|
+
if (e.type.kind !== "f64")
|
|
282
|
+
return null;
|
|
283
|
+
// The guard evaluates the bound before the loop: a typed array's
|
|
284
|
+
// length needs the binding itself, not a temp the body declares.
|
|
285
|
+
if (e.kind === "bytesIntrinsic" &&
|
|
286
|
+
e.method === "length" &&
|
|
287
|
+
e.receiver.kind === "varRef" &&
|
|
288
|
+
e.receiver.type.kind === "bytes" &&
|
|
289
|
+
invariant(e.receiver.localId))
|
|
290
|
+
return `bytes-length:${e.receiver.localId}`;
|
|
291
|
+
if (e.kind === "strIntrinsic" &&
|
|
292
|
+
e.method === "length" &&
|
|
293
|
+
e.args.length === 0 &&
|
|
294
|
+
e.receiver.kind === "varRef" &&
|
|
295
|
+
e.receiver.type.kind === "string" &&
|
|
296
|
+
invariant(e.receiver.localId))
|
|
297
|
+
return `string-length:${e.receiver.localId}`;
|
|
298
|
+
return pureKey(e);
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
}
|
|
230
302
|
const receivers = [];
|
|
231
303
|
const receiverIndex = new Map();
|
|
232
304
|
const fixed = new Map();
|
|
@@ -236,16 +308,49 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
236
308
|
if (index === undefined) {
|
|
237
309
|
index = receivers.length;
|
|
238
310
|
receiverIndex.set(ref.localId, index);
|
|
239
|
-
receivers.push({
|
|
311
|
+
receivers.push({
|
|
312
|
+
ref,
|
|
313
|
+
global: !facts.locals.has(ref.localId),
|
|
314
|
+
string: ref.type.kind === "string",
|
|
315
|
+
});
|
|
240
316
|
}
|
|
241
317
|
return index;
|
|
242
318
|
};
|
|
319
|
+
// Worker programs: accesses through invariant receivers, proven or not,
|
|
320
|
+
// become thread-owned when the guard finds no shared storage.
|
|
321
|
+
const owned = new Map();
|
|
322
|
+
// While loops: accesses at a counter below a bound, by receiver and bound.
|
|
323
|
+
const boundedChecks = new Map();
|
|
324
|
+
const pairedCounters = paired !== null && counted === null ? new Set([paired.low.localId, paired.high.localId]) : null;
|
|
325
|
+
const pairedNodes = new Map();
|
|
243
326
|
const access = (node, array, index, width) => {
|
|
244
|
-
if (facts.proven.has(node))
|
|
245
|
-
return;
|
|
246
327
|
const ref = root(array);
|
|
247
328
|
if (!ref)
|
|
248
329
|
return;
|
|
330
|
+
if (facts.workers && ref.type.kind === "bytes" && !facts.owned.has(node)) {
|
|
331
|
+
const receiver = receiverOf(ref);
|
|
332
|
+
const nodes = owned.get(receiver);
|
|
333
|
+
if (nodes)
|
|
334
|
+
nodes.push(node);
|
|
335
|
+
else
|
|
336
|
+
owned.set(receiver, [node]);
|
|
337
|
+
}
|
|
338
|
+
if (facts.proven.has(node))
|
|
339
|
+
return;
|
|
340
|
+
// An element at either counter of a two-counter loop.
|
|
341
|
+
if (pairedCounters !== null &&
|
|
342
|
+
width === 1 &&
|
|
343
|
+
ref.type.kind === "bytes" &&
|
|
344
|
+
index.kind === "varRef" &&
|
|
345
|
+
pairedCounters.has(index.localId)) {
|
|
346
|
+
const receiver = receiverOf(ref);
|
|
347
|
+
const nodes = pairedNodes.get(receiver);
|
|
348
|
+
if (nodes)
|
|
349
|
+
nodes.push(node);
|
|
350
|
+
else
|
|
351
|
+
pairedNodes.set(receiver, [node]);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
249
354
|
const shape = counter !== null ? affine(index) : null;
|
|
250
355
|
if (shape && shape.counter !== 0) {
|
|
251
356
|
const operands = new Set();
|
|
@@ -270,12 +375,32 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
270
375
|
});
|
|
271
376
|
return;
|
|
272
377
|
}
|
|
378
|
+
const bounded = whileAccesses?.accesses.get(node);
|
|
379
|
+
const loopCounter = bounded && whileAccesses.counters.get(bounded.counter);
|
|
380
|
+
if (bounded && loopCounter && (!loopCounter.wraps || loopCounter.bounds !== null)) {
|
|
381
|
+
const receiver = receiverOf(ref);
|
|
382
|
+
const key = `${receiver}|${bounded.key}|${bounded.adj}`;
|
|
383
|
+
const slack = bounded.offset + width - 1 + bounded.adj;
|
|
384
|
+
const group = boundedChecks.get(key);
|
|
385
|
+
if (group) {
|
|
386
|
+
group.check.slack = Math.max(group.check.slack, slack);
|
|
387
|
+
group.nodes.push({ node, access: bounded });
|
|
388
|
+
}
|
|
389
|
+
else
|
|
390
|
+
boundedChecks.set(key, {
|
|
391
|
+
check: { receiver, bound: bounded.bound, slack },
|
|
392
|
+
nodes: [{ node, access: bounded }],
|
|
393
|
+
});
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
273
396
|
const range = facts.ranges.get(index);
|
|
274
397
|
if (!range)
|
|
275
398
|
return;
|
|
276
399
|
const end = range.max + width - 1;
|
|
277
|
-
// Only
|
|
278
|
-
//
|
|
400
|
+
// Only an end below 2^31: an outer loop must not pay for a guard that
|
|
401
|
+
// bounds an inner loop's unbounded counter, and the counter of a loop to
|
|
402
|
+
// an array's length reaches 2^32 - 2, a length no typed array in
|
|
403
|
+
// practice has.
|
|
279
404
|
if (range.min < 0 || end >= MAX_FIXED_END)
|
|
280
405
|
return;
|
|
281
406
|
const receiver = receiverOf(ref);
|
|
@@ -295,6 +420,10 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
295
420
|
else if (e.method === "get" && e.args[0])
|
|
296
421
|
access(e, e.receiver, e.args[0], 1);
|
|
297
422
|
}
|
|
423
|
+
else if (e.kind === "strIntrinsic" &&
|
|
424
|
+
(e.method === "charCodeAt" || e.method === "charAt") &&
|
|
425
|
+
e.args[0])
|
|
426
|
+
access(e, e.receiver, e.args[0], 1);
|
|
298
427
|
return everyExprChild(e, visitExpr, visitStmt);
|
|
299
428
|
};
|
|
300
429
|
const visitStmt = (s) => {
|
|
@@ -303,6 +432,8 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
303
432
|
return everyStmtChild(s, visitExpr, visitStmt);
|
|
304
433
|
};
|
|
305
434
|
loop.body.every(visitStmt);
|
|
435
|
+
if (loop.kind === "while")
|
|
436
|
+
visitExpr(loop.cond);
|
|
306
437
|
// Bound the counter so every counter operand stays a safe integer.
|
|
307
438
|
let bound = SAFE;
|
|
308
439
|
const affineGroups = [...affineChecks.values()].filter((group) => {
|
|
@@ -319,10 +450,23 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
319
450
|
});
|
|
320
451
|
const fixedKept = [...fixed.values()].slice(0, MAX_CHECKS);
|
|
321
452
|
const affineKept = affineGroups.slice(0, MAX_CHECKS - fixedKept.length);
|
|
322
|
-
|
|
453
|
+
const boundedKept = [...boundedChecks.values()].slice(0, Math.max(0, MAX_CHECKS - fixedKept.length - affineKept.length));
|
|
454
|
+
const ownedKept = [...owned.entries()].slice(0, MAX_CHECKS);
|
|
455
|
+
const pairedKept = [...pairedNodes.entries()].slice(0, Math.max(0, MAX_CHECKS - fixedKept.length - affineKept.length - boundedKept.length));
|
|
456
|
+
if (fixedKept.length === 0 &&
|
|
457
|
+
affineKept.length === 0 &&
|
|
458
|
+
boundedKept.length === 0 &&
|
|
459
|
+
ownedKept.length === 0 &&
|
|
460
|
+
pairedKept.length === 0)
|
|
323
461
|
return null;
|
|
324
462
|
const bounds = new Set();
|
|
463
|
+
const ownedNodes = new Set();
|
|
325
464
|
const used = new Set();
|
|
465
|
+
for (const [receiver, nodes] of ownedKept) {
|
|
466
|
+
used.add(receiver);
|
|
467
|
+
for (const node of nodes)
|
|
468
|
+
ownedNodes.add(node);
|
|
469
|
+
}
|
|
326
470
|
const ranges = new Map();
|
|
327
471
|
const counterLow = Math.max(counted?.range.min ?? 0, -bound), counterHigh = Math.min(counted?.range.max ?? 0, bound);
|
|
328
472
|
for (const group of fixedKept) {
|
|
@@ -335,20 +479,72 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
335
479
|
for (const node of group.nodes)
|
|
336
480
|
bounds.add(node);
|
|
337
481
|
for (const operand of group.operands) {
|
|
338
|
-
if (facts.ranges.get(operand))
|
|
339
|
-
continue;
|
|
340
482
|
const shape = shapes.get(operand);
|
|
341
483
|
const a = shape.counter * counterLow, b = shape.counter * counterHigh;
|
|
342
484
|
let min = Math.min(a, b) + shape.offset, max = Math.max(a, b) + shape.offset;
|
|
343
485
|
for (const term of shape.terms) {
|
|
344
|
-
const r =
|
|
486
|
+
const r = termRange(term.expr);
|
|
345
487
|
min += term.sign > 0 ? r.min : -r.max;
|
|
346
488
|
max += term.sign > 0 ? r.max : -r.min;
|
|
347
489
|
}
|
|
348
|
-
if (counterLow
|
|
490
|
+
if (counterLow > counterHigh)
|
|
491
|
+
continue;
|
|
492
|
+
// The guard's bound on the counter can narrow a range the operand
|
|
493
|
+
// already has (a loop to a length proves only `i < 2^53`), so that
|
|
494
|
+
// `i * 4` in the fast copy is exact integer arithmetic.
|
|
495
|
+
const known = facts.ranges.get(operand);
|
|
496
|
+
if (!known)
|
|
349
497
|
ranges.set(operand, { min, max });
|
|
498
|
+
else if (min > known.min || max < known.max)
|
|
499
|
+
ranges.set(operand, { min: Math.max(min, known.min), max: Math.min(max, known.max) });
|
|
350
500
|
}
|
|
351
501
|
}
|
|
502
|
+
// Guarded terms of the kept checks, and the range the guard proves for
|
|
503
|
+
// every node of each in the fast copy.
|
|
504
|
+
const guarded = new Set();
|
|
505
|
+
for (const group of affineKept)
|
|
506
|
+
for (const term of group.check.terms)
|
|
507
|
+
if (guardedRanges.has(term.expr))
|
|
508
|
+
guarded.add(term.key);
|
|
509
|
+
for (const [node, key] of guardedNodes)
|
|
510
|
+
if (guarded.has(key))
|
|
511
|
+
ranges.set(node, GUARDED_TERM);
|
|
512
|
+
// While loop counters of the kept checks: each entry value is an exact
|
|
513
|
+
// integer that no access offset takes below 0. In the fast copy each
|
|
514
|
+
// access's index is below its length, and its counter read at least the
|
|
515
|
+
// most negative offset.
|
|
516
|
+
const narrow = (e, range) => {
|
|
517
|
+
const known = ranges.get(e) ?? facts.ranges.get(e);
|
|
518
|
+
ranges.set(e, known ? { min: Math.max(known.min, range.min), max: Math.min(known.max, range.max) } : range);
|
|
519
|
+
};
|
|
520
|
+
const counterMins = new Map();
|
|
521
|
+
for (const group of boundedKept) {
|
|
522
|
+
used.add(group.check.receiver);
|
|
523
|
+
for (const { node, access } of group.nodes) {
|
|
524
|
+
bounds.add(node);
|
|
525
|
+
const min = 0 - access.offset;
|
|
526
|
+
counterMins.set(access.counter, Math.max(counterMins.get(access.counter) ?? -SAFE, min));
|
|
527
|
+
narrow(access.ref, { min: -MAX_OFFSET, max: SAFE });
|
|
528
|
+
if (access.index !== access.ref)
|
|
529
|
+
narrow(access.index, { min: 0, max: SAFE });
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
for (const [receiver, nodes] of pairedKept) {
|
|
533
|
+
used.add(receiver);
|
|
534
|
+
for (const node of nodes)
|
|
535
|
+
bounds.add(node);
|
|
536
|
+
}
|
|
537
|
+
const counterChecks = [];
|
|
538
|
+
for (const [id, min] of counterMins) {
|
|
539
|
+
const info = whileAccesses.counters.get(id);
|
|
540
|
+
counterChecks.push({
|
|
541
|
+
ref: { kind: "varRef", localId: id, type: F64, loc: loop.loc },
|
|
542
|
+
min,
|
|
543
|
+
wrapBounds: info.wraps
|
|
544
|
+
? info.bounds.map((b) => ({ bound: b.bound, limit: 2 ** 31 - info.sum - b.adj }))
|
|
545
|
+
: [],
|
|
546
|
+
});
|
|
547
|
+
}
|
|
352
548
|
// Renumber the receivers the kept checks use.
|
|
353
549
|
const order = [...used].sort((a, b) => a - b);
|
|
354
550
|
const renumber = new Map(order.map((old, index) => [old, index]));
|
|
@@ -357,7 +553,9 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
357
553
|
(counted.range.min < -bound || counted.range.max > bound);
|
|
358
554
|
return {
|
|
359
555
|
bounds,
|
|
556
|
+
owned: ownedNodes,
|
|
360
557
|
receivers: order.map((index) => receivers[index]),
|
|
558
|
+
ownedReceivers: ownedKept.map(([receiver]) => renumber.get(receiver)),
|
|
361
559
|
fixed: fixedKept.map((g) => ({
|
|
362
560
|
receiver: renumber.get(g.check.receiver),
|
|
363
561
|
end: g.check.end,
|
|
@@ -369,13 +567,279 @@ export function matchBytesLoopVersion(loop, counted, facts) {
|
|
|
369
567
|
minOffset: g.check.minOffset,
|
|
370
568
|
maxEnd: g.check.maxEnd,
|
|
371
569
|
})),
|
|
570
|
+
bounded: boundedKept.map((g) => ({
|
|
571
|
+
receiver: renumber.get(g.check.receiver),
|
|
572
|
+
bound: g.check.bound,
|
|
573
|
+
slack: g.check.slack,
|
|
574
|
+
})),
|
|
575
|
+
counters: counterChecks,
|
|
576
|
+
guarded,
|
|
372
577
|
counted: affineKept.length > 0 ? counted : null,
|
|
578
|
+
paired: paired !== null && pairedKept.length > 0
|
|
579
|
+
? { loop: paired, receivers: pairedKept.map(([receiver]) => renumber.get(receiver)) }
|
|
580
|
+
: null,
|
|
373
581
|
counterBound: needsBound ? bound : null,
|
|
374
582
|
ranges,
|
|
375
583
|
};
|
|
376
584
|
}
|
|
585
|
+
/** `counter = counter + k`, `counter = (counter + k) | 0` or `counter++`. */
|
|
586
|
+
function counterStep(s) {
|
|
587
|
+
if (s.kind === "exprStmt" && s.expr.kind === "incDec" && s.expr.op === "+")
|
|
588
|
+
return { id: s.expr.localId, k: 1, wraps: false };
|
|
589
|
+
if (s.kind !== "assign")
|
|
590
|
+
return null;
|
|
591
|
+
let value = s.value, wraps = false;
|
|
592
|
+
if (value.kind === "bin" &&
|
|
593
|
+
value.op === "|" &&
|
|
594
|
+
value.right.kind === "numLit" &&
|
|
595
|
+
value.right.value === 0 &&
|
|
596
|
+
value.left.kind === "bin") {
|
|
597
|
+
value = value.left;
|
|
598
|
+
wraps = true;
|
|
599
|
+
}
|
|
600
|
+
if (value.kind !== "bin" ||
|
|
601
|
+
value.op !== "+" ||
|
|
602
|
+
value.left.kind !== "varRef" ||
|
|
603
|
+
value.left.localId !== s.localId ||
|
|
604
|
+
value.right.kind !== "numLit" ||
|
|
605
|
+
!Number.isSafeInteger(value.right.value) ||
|
|
606
|
+
value.right.value <= 0 ||
|
|
607
|
+
value.right.value > MAX_OFFSET)
|
|
608
|
+
return null;
|
|
609
|
+
return { id: s.localId, k: value.right.value, wraps };
|
|
610
|
+
}
|
|
611
|
+
/** Typed-array and string accesses of a while loop that happen at a
|
|
612
|
+
* counter below a loop-invariant bound. A counter is a number local that
|
|
613
|
+
* the loop changes only by positive integer increments, written as
|
|
614
|
+
* statements of the body, of its blocks and branches, or of nested while
|
|
615
|
+
* loops. The condition of the loop, an `if` or a `&&` chain that compares
|
|
616
|
+
* the counter below a bound (`while (pos < end && bytes[pos] === 32)
|
|
617
|
+
* pos++`, or `s.charCodeAt(pos)` of a string) makes it below that bound
|
|
618
|
+
* until the next increment on the path. The counter starts at its entry
|
|
619
|
+
* value and only grows (a `| 0` increment never wraps when every bound is
|
|
620
|
+
* at most 2^31 minus the increments), so an access at `counter + d` is in
|
|
621
|
+
* bounds for the whole loop when the entry value is at least `-d` and
|
|
622
|
+
* `bound + d < length` (`+ 1` for `<=`). */
|
|
623
|
+
function findWhileCounterAccesses(loop, host) {
|
|
624
|
+
const steps = new Map();
|
|
625
|
+
const refused = new Set();
|
|
626
|
+
// Increments count only as statements of the loop's straight-line
|
|
627
|
+
// structure; any other write refuses the binding.
|
|
628
|
+
const writes = (list, direct) => {
|
|
629
|
+
for (const s of list) {
|
|
630
|
+
const step = counterStep(s);
|
|
631
|
+
if (step && direct) {
|
|
632
|
+
const prior = steps.get(step.id);
|
|
633
|
+
steps.set(step.id, {
|
|
634
|
+
sum: (prior?.sum ?? 0) + step.k,
|
|
635
|
+
wraps: (prior?.wraps ?? false) || step.wraps,
|
|
636
|
+
});
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
if (step)
|
|
640
|
+
refused.add(step.id);
|
|
641
|
+
const nested = direct &&
|
|
642
|
+
(s.kind === "if" || s.kind === "while" || (s.kind === "block" && !s.labels?.length));
|
|
643
|
+
if (s.kind === "assign" || s.kind === "varDecl" || s.kind === "forOf")
|
|
644
|
+
refused.add(s.localId);
|
|
645
|
+
if (s.kind === "tryCatch" && s.catchLocalId)
|
|
646
|
+
refused.add(s.catchLocalId);
|
|
647
|
+
everyStmtChild(s, (e) => (exprWrites(e), true), (c) => (writes([c], nested), true));
|
|
648
|
+
}
|
|
649
|
+
};
|
|
650
|
+
const exprWrites = (e) => {
|
|
651
|
+
if (e.kind === "assignExpr" || e.kind === "incDec")
|
|
652
|
+
refused.add(e.localId);
|
|
653
|
+
everyExprChild(e, (c) => (exprWrites(c), true), (c) => (writes([c], false), true));
|
|
654
|
+
};
|
|
655
|
+
exprWrites(loop.cond);
|
|
656
|
+
writes(loop.body, true);
|
|
657
|
+
const counter = (id) => steps.has(id) && !refused.has(id) && host.counterLocal(id);
|
|
658
|
+
// The bounds a condition puts on counters while it holds.
|
|
659
|
+
const facts = (cond, into) => {
|
|
660
|
+
if (cond.kind === "toBool")
|
|
661
|
+
return facts(cond.operand, into);
|
|
662
|
+
if (cond.kind === "logical" && cond.op === "&&") {
|
|
663
|
+
facts(cond.left, into);
|
|
664
|
+
facts(cond.right, into);
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
if (cond.kind !== "bin")
|
|
668
|
+
return;
|
|
669
|
+
const below = cond.op === "<" || cond.op === "<=", above = cond.op === ">" || cond.op === ">=";
|
|
670
|
+
const c = below ? cond.left : above ? cond.right : null, bound = below ? cond.right : cond.left;
|
|
671
|
+
if (c?.kind !== "varRef" || !counter(c.localId) || into.has(c.localId))
|
|
672
|
+
return;
|
|
673
|
+
const key = host.boundKey(bound);
|
|
674
|
+
if (key === null)
|
|
675
|
+
return;
|
|
676
|
+
into.set(c.localId, { bound, key, adj: cond.op === "<=" || cond.op === ">=" ? 1 : 0 });
|
|
677
|
+
};
|
|
678
|
+
// The facts that hold after either of two paths.
|
|
679
|
+
const meet = (a, b) => {
|
|
680
|
+
if (a === null)
|
|
681
|
+
return b;
|
|
682
|
+
if (b === null)
|
|
683
|
+
return a;
|
|
684
|
+
const out = new Map();
|
|
685
|
+
for (const [id, fact] of a)
|
|
686
|
+
if (b.get(id) === fact)
|
|
687
|
+
out.set(id, fact);
|
|
688
|
+
return out;
|
|
689
|
+
};
|
|
690
|
+
const withFacts = (clean, cond) => {
|
|
691
|
+
const out = new Map(clean);
|
|
692
|
+
facts(cond, out);
|
|
693
|
+
return out;
|
|
694
|
+
};
|
|
695
|
+
const accesses = new Map();
|
|
696
|
+
const record = (node, index, clean) => {
|
|
697
|
+
let ref = index, offset = 0;
|
|
698
|
+
if (index.kind === "bin" && (index.op === "+" || index.op === "-")) {
|
|
699
|
+
const literal = index.right.kind === "numLit" ? index.right : index.op === "+" ? index.left : null;
|
|
700
|
+
const other = literal === index.right ? index.left : index.right;
|
|
701
|
+
if (literal?.kind !== "numLit" || !Number.isSafeInteger(literal.value))
|
|
702
|
+
return;
|
|
703
|
+
if (Math.abs(literal.value) > MAX_OFFSET || Object.is(literal.value, -0))
|
|
704
|
+
return;
|
|
705
|
+
offset = index.op === "-" ? -literal.value : literal.value;
|
|
706
|
+
ref = other;
|
|
707
|
+
}
|
|
708
|
+
if (ref.kind !== "varRef")
|
|
709
|
+
return;
|
|
710
|
+
const fact = clean.get(ref.localId);
|
|
711
|
+
if (fact)
|
|
712
|
+
accesses.set(node, { counter: ref.localId, index, ref, ...fact, offset });
|
|
713
|
+
};
|
|
714
|
+
const expr = (e, clean) => {
|
|
715
|
+
if (e.kind === "bytesIntrinsic") {
|
|
716
|
+
const numeric = byteNumberAccess(e);
|
|
717
|
+
const index = numeric
|
|
718
|
+
? e.args[numeric.offsetArg]
|
|
719
|
+
: e.method === "get"
|
|
720
|
+
? e.args[0]
|
|
721
|
+
: undefined;
|
|
722
|
+
if (index)
|
|
723
|
+
record(e, index, clean);
|
|
724
|
+
}
|
|
725
|
+
if (e.kind === "strIntrinsic" &&
|
|
726
|
+
(e.method === "charCodeAt" || e.method === "charAt") &&
|
|
727
|
+
e.args[0])
|
|
728
|
+
record(e, e.args[0], clean);
|
|
729
|
+
if (e.kind === "logical" && e.op === "&&") {
|
|
730
|
+
expr(e.left, clean);
|
|
731
|
+
expr(e.right, withFacts(clean, e.left));
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
if (e.kind === "ternary") {
|
|
735
|
+
expr(e.cond, clean);
|
|
736
|
+
expr(e.then, withFacts(clean, e.cond));
|
|
737
|
+
expr(e.else_, clean);
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
everyExprChild(e, (c) => (expr(c, clean), true), (c) => (stmts([c], clean), true));
|
|
741
|
+
};
|
|
742
|
+
// Walks statements in order; the result is the clean state where the
|
|
743
|
+
// list falls through, or null when it never does.
|
|
744
|
+
const stmts = (list, clean) => {
|
|
745
|
+
let current = clean;
|
|
746
|
+
for (const s of list) {
|
|
747
|
+
if (current === null)
|
|
748
|
+
return null;
|
|
749
|
+
const step = counterStep(s);
|
|
750
|
+
if (step) {
|
|
751
|
+
const next = new Map(current);
|
|
752
|
+
next.delete(step.id);
|
|
753
|
+
current = next;
|
|
754
|
+
continue;
|
|
755
|
+
}
|
|
756
|
+
switch (s.kind) {
|
|
757
|
+
case "if": {
|
|
758
|
+
expr(s.cond, current);
|
|
759
|
+
const then = stmts(s.then, withFacts(current, s.cond));
|
|
760
|
+
const otherwise = stmts(s.else_ ?? [], current);
|
|
761
|
+
current = meet(then, otherwise);
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
764
|
+
case "while": {
|
|
765
|
+
// A pass of the nested loop may follow its own increments.
|
|
766
|
+
const advanced = new Map(current);
|
|
767
|
+
for (const id of writtenCounters(s.body))
|
|
768
|
+
advanced.delete(id);
|
|
769
|
+
expr(s.cond, advanced);
|
|
770
|
+
stmts(s.body, withFacts(advanced, s.cond));
|
|
771
|
+
current = advanced;
|
|
772
|
+
break;
|
|
773
|
+
}
|
|
774
|
+
case "block":
|
|
775
|
+
if (!s.labels?.length) {
|
|
776
|
+
current = stmts(s.body, current);
|
|
777
|
+
break;
|
|
778
|
+
}
|
|
779
|
+
everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
|
|
780
|
+
break;
|
|
781
|
+
case "bytesSet":
|
|
782
|
+
record(s, s.index, current);
|
|
783
|
+
everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
|
|
784
|
+
break;
|
|
785
|
+
case "break":
|
|
786
|
+
case "continue":
|
|
787
|
+
case "return":
|
|
788
|
+
case "throw":
|
|
789
|
+
everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
|
|
790
|
+
current = null;
|
|
791
|
+
break;
|
|
792
|
+
default:
|
|
793
|
+
everyStmtChild(s, (e) => (expr(e, current), true), (c) => (stmts([c], current), true));
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return current;
|
|
798
|
+
};
|
|
799
|
+
const writtenCounters = (list) => {
|
|
800
|
+
const out = new Set();
|
|
801
|
+
const visit = (s) => {
|
|
802
|
+
const step = counterStep(s);
|
|
803
|
+
if (step)
|
|
804
|
+
out.add(step.id);
|
|
805
|
+
return everyStmtChild(s, () => true, visit);
|
|
806
|
+
};
|
|
807
|
+
list.every(visit);
|
|
808
|
+
return out;
|
|
809
|
+
};
|
|
810
|
+
expr(loop.cond, new Map());
|
|
811
|
+
stmts(loop.body, withFacts(new Map(), loop.cond));
|
|
812
|
+
// Each counter's bounds: the loop's and those of nested while loops that
|
|
813
|
+
// advance it.
|
|
814
|
+
const counters = new Map();
|
|
815
|
+
const loops = [loop];
|
|
816
|
+
const collectLoops = (s) => {
|
|
817
|
+
if (s.kind === "while")
|
|
818
|
+
loops.push(s);
|
|
819
|
+
return everyStmtChild(s, () => true, collectLoops);
|
|
820
|
+
};
|
|
821
|
+
loop.body.every(collectLoops);
|
|
822
|
+
for (const [id, step] of steps) {
|
|
823
|
+
if (!counter(id))
|
|
824
|
+
continue;
|
|
825
|
+
let bounds = [];
|
|
826
|
+
for (const l of loops) {
|
|
827
|
+
if (l !== loop && !writtenCounters(l.body).has(id))
|
|
828
|
+
continue;
|
|
829
|
+
const fact = withFacts(new Map(), l.cond).get(id);
|
|
830
|
+
if (!fact) {
|
|
831
|
+
bounds = null;
|
|
832
|
+
break;
|
|
833
|
+
}
|
|
834
|
+
bounds.push({ bound: fact.bound, adj: fact.adj });
|
|
835
|
+
}
|
|
836
|
+
counters.set(id, { ...step, bounds });
|
|
837
|
+
}
|
|
838
|
+
return { accesses, counters };
|
|
839
|
+
}
|
|
377
840
|
/** Branches to `fast` when every access the version proves is in bounds for
|
|
378
|
-
* every iteration
|
|
841
|
+
* every iteration and every view it proves thread-owned has no shared
|
|
842
|
+
* storage, and to `slow` otherwise (including a counted loop whose
|
|
379
843
|
* integer form is not established, or a module receiver not yet set). */
|
|
380
844
|
export function emitBytesLoopVersionGuard(host, version, fast, slow) {
|
|
381
845
|
const B = host.B;
|
|
@@ -398,8 +862,10 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
|
|
|
398
862
|
}
|
|
399
863
|
return value;
|
|
400
864
|
});
|
|
401
|
-
const lengths = receivers.map((receiver) => {
|
|
402
|
-
const len =
|
|
865
|
+
const lengths = receivers.map((receiver, index) => {
|
|
866
|
+
const len = version.receivers[index].string
|
|
867
|
+
? emitStringByteLength(host, receiver)
|
|
868
|
+
: emitBytesHeaderLength(host, receiver);
|
|
403
869
|
if (host.sizeType === "i64")
|
|
404
870
|
return len;
|
|
405
871
|
const wide = B.tmp();
|
|
@@ -407,11 +873,55 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
|
|
|
407
873
|
return wide;
|
|
408
874
|
});
|
|
409
875
|
const conditions = [];
|
|
876
|
+
// A string's byte length is its UTF-16 length when it is ASCII.
|
|
877
|
+
version.receivers.forEach(({ string }, index) => {
|
|
878
|
+
if (string)
|
|
879
|
+
conditions.push(emitStringAsciiFlag(host, receivers[index]));
|
|
880
|
+
});
|
|
881
|
+
for (const index of version.ownedReceivers) {
|
|
882
|
+
const owned = B.tmp();
|
|
883
|
+
B.line(`${owned} = icmp eq ptr ${emitBytesSharedStorage(host, receivers[index])}, null`);
|
|
884
|
+
conditions.push(owned);
|
|
885
|
+
}
|
|
410
886
|
for (const check of version.fixed) {
|
|
411
887
|
const ok = B.tmp();
|
|
412
888
|
B.line(`${ok} = icmp ugt i64 ${lengths[check.receiver]}, ${check.end}`);
|
|
413
889
|
conditions.push(ok);
|
|
414
890
|
}
|
|
891
|
+
for (const counter of version.counters) {
|
|
892
|
+
const value = host.emitExpr(counter.ref);
|
|
893
|
+
// A counter held as an integer (an int32 slot) is exact already and
|
|
894
|
+
// needs at most its lower bound tested.
|
|
895
|
+
const integer = exactInteger(host, value, counter.ref);
|
|
896
|
+
if (integer && integer.range.max <= SAFE) {
|
|
897
|
+
if (integer.range.min < counter.min) {
|
|
898
|
+
const ok = B.tmp();
|
|
899
|
+
B.line(`${ok} = icmp sge i64 ${widenInteger(host, integer)}, ${counter.min}`);
|
|
900
|
+
conditions.push(ok);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
else
|
|
904
|
+
conditions.push(emitExactIntegerTest(host, value.name, counter.min, SAFE).ok);
|
|
905
|
+
for (const wrap of counter.wrapBounds) {
|
|
906
|
+
const bound = host.emitExpr(wrap.bound);
|
|
907
|
+
const boundInteger = exactInteger(host, bound, wrap.bound);
|
|
908
|
+
if (boundInteger && boundInteger.range.max <= wrap.limit)
|
|
909
|
+
continue;
|
|
910
|
+
const ok = B.tmp();
|
|
911
|
+
B.line(`${ok} = fcmp ole double ${bound.name}, ${f64Lit(wrap.limit)}`);
|
|
912
|
+
conditions.push(ok);
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
for (const check of version.bounded) {
|
|
916
|
+
// `bound <= length - slack` in doubles: both sides are exact (a length
|
|
917
|
+
// is below 2^53 and a slack below 2^32), and NaN fails.
|
|
918
|
+
const bound = host.emitExpr(check.bound).name;
|
|
919
|
+
const length = B.tmp(), room = B.tmp(), ok = B.tmp();
|
|
920
|
+
B.line(`${length} = uitofp i64 ${lengths[check.receiver]} to double`);
|
|
921
|
+
B.line(`${room} = fsub double ${length}, ${f64Lit(check.slack)}`);
|
|
922
|
+
B.line(`${ok} = fcmp ole double ${bound}, ${room}`);
|
|
923
|
+
conditions.push(ok);
|
|
924
|
+
}
|
|
415
925
|
if (counted && version.affine.length > 0) {
|
|
416
926
|
// The first and last counter values, in ascending order. The last value
|
|
417
927
|
// of a non-unit step is exact: `start + ⌊(limit ∓ 1 - start) / step⌋ *
|
|
@@ -453,6 +963,14 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
|
|
|
453
963
|
let base = "0";
|
|
454
964
|
for (const term of check.terms) {
|
|
455
965
|
const value = host.emitExpr(term.expr);
|
|
966
|
+
if (version.guarded.has(term.key)) {
|
|
967
|
+
const tested = emitExactIntegerTest(host, value.name, GUARDED_TERM.min, GUARDED_TERM.max);
|
|
968
|
+
conditions.push(tested.ok);
|
|
969
|
+
const sum = B.tmp();
|
|
970
|
+
B.line(`${sum} = ${term.sign > 0 ? "add" : "sub"} i64 ${base}, ${tested.integer}`);
|
|
971
|
+
base = sum;
|
|
972
|
+
continue;
|
|
973
|
+
}
|
|
456
974
|
const integer = exactInteger(host, value, term.expr);
|
|
457
975
|
if (!integer) {
|
|
458
976
|
// Unreachable: every term has a proven range. Stay checked.
|
|
@@ -481,6 +999,25 @@ export function emitBytesLoopVersionGuard(host, version, fast, slow) {
|
|
|
481
999
|
conditions.push(both);
|
|
482
1000
|
}
|
|
483
1001
|
}
|
|
1002
|
+
if (version.paired !== null) {
|
|
1003
|
+
// Both counters stay within [lo, hi] (exact integers below 2^53): every
|
|
1004
|
+
// access at either one is in bounds when `lo >= 0` and `hi < length`.
|
|
1005
|
+
const { loop } = version.paired;
|
|
1006
|
+
const [low, high] = [loop.low.start, loop.high.start].map((expr) => {
|
|
1007
|
+
const tested = emitExactIntegerTest(host, host.emitExpr(expr).name, -SAFE, SAFE);
|
|
1008
|
+
conditions.push(tested.ok);
|
|
1009
|
+
return tested.integer;
|
|
1010
|
+
});
|
|
1011
|
+
const nonNegative = B.tmp();
|
|
1012
|
+
B.line(`${nonNegative} = icmp sge i64 ${low}, 0`);
|
|
1013
|
+
conditions.push(nonNegative);
|
|
1014
|
+
for (const receiver of version.paired.receivers) {
|
|
1015
|
+
// Lengths are at most 2^53 elements: a signed comparison is exact.
|
|
1016
|
+
const below = B.tmp();
|
|
1017
|
+
B.line(`${below} = icmp slt i64 ${high}, ${lengths[receiver]}`);
|
|
1018
|
+
conditions.push(below);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
484
1021
|
let valid = "true";
|
|
485
1022
|
for (const cond of conditions) {
|
|
486
1023
|
if (valid === "true")
|