@scriptc/compiler 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +977 -113
- package/dist/backend/cycle-analysis.d.ts +5 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +9 -1
- package/dist/backend/cycle-mutability.js +21 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +6 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +7 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +5 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +23 -4
- package/dist/backend/llvm/alloc.js +61 -8
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +23 -10
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +70 -7
- package/dist/backend/llvm/bytes-loop-versions.js +567 -30
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +389 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +74 -1
- package/dist/backend/llvm/classes.js +364 -54
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +384 -17
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +10 -6
- package/dist/backend/llvm/common.js +10 -6
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +91 -56
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +4 -4
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +11 -1
- package/dist/backend/llvm/counted-loops.js +80 -23
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +35 -16
- package/dist/backend/llvm/dense-array-loops.js +237 -12
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +140 -15
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +51 -1
- package/dist/backend/llvm/dyn.js +683 -69
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +33 -26
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +208 -34
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -27
- package/dist/backend/llvm/emit-statements.js +577 -93
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +314 -49
- package/dist/backend/llvm/emitter.js +1241 -129
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +54 -5
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -0
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +5 -2
- package/dist/backend/llvm/expr-bytes.js +144 -52
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +62 -36
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +148 -40
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-control.js +2 -3
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +71 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +126 -36
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +225 -64
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +200 -50
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +20 -1
- package/dist/backend/llvm/integer-values.js +71 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +90 -2
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +65 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +4 -0
- package/dist/backend/llvm/lib-http2.js +24 -17
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +65 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +126 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +97 -30
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +23 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +181 -64
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +28 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +18 -1
- package/dist/backend/llvm/publish.js +76 -25
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +3 -0
- package/dist/backend/llvm/publish.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +7 -2
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +91 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.js +161 -14
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +18 -0
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +79 -21
- package/dist/backend/llvm/shapes.js +233 -42
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +2 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +15 -0
- package/dist/backend/llvm/string-reads.js +128 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +88 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +6 -5
- package/dist/backend/llvm/wasm-modules.js +32 -9
- package/dist/backend/llvm/wasm-modules.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/mangle.d.ts +3 -0
- package/dist/backend/mangle.js +5 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +27 -4
- package/dist/backend/native/executable.js +31 -8
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -0
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +11 -6
- package/dist/backend/native-codegen.js +36 -9
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +0 -23
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +18 -4
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/optimization.d.ts +2 -2
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +2 -1
- package/dist/backend/runtime-pack-core.js +2 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +5 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +0 -21
- package/dist/backend/runtime-pack.js +0 -29
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +10 -69
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-diagnostics.js +33 -1
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +4 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +26 -6
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +5 -1
- package/dist/cli/usage.js +10 -5
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +5 -4
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.d.ts +7 -2
- package/dist/coverage/report.js +30 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -0
- package/dist/coverage/verdict-cache.js +4 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-semantic.js +4 -0
- package/dist/coverage/verdict-semantic.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.d.ts +40 -0
- package/dist/diagnostics/dynamic-tier.js +57 -0
- package/dist/diagnostics/dynamic-tier.js.map +1 -0
- package/dist/diagnostics/envelope.d.ts +5 -1
- package/dist/diagnostics/envelope.js +6 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +25 -1
- package/dist/executable/executable-cache.js +60 -7
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +46 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +3 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +1 -0
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +854 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dispose-hook.d.ts +2 -0
- package/dist/frontend/dispose-hook.js +14 -0
- package/dist/frontend/dispose-hook.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/jsx-entities.d.ts +4 -0
- package/dist/frontend/jsx-entities.js +259 -0
- package/dist/frontend/jsx-entities.js.map +1 -0
- package/dist/frontend/jsx-source.d.ts +71 -0
- package/dist/frontend/jsx-source.js +781 -0
- package/dist/frontend/jsx-source.js.map +1 -0
- package/dist/frontend/jsx-source.test.d.ts +1 -0
- package/dist/frontend/jsx-source.test.js +200 -0
- package/dist/frontend/jsx-source.test.js.map +1 -0
- package/dist/frontend/literal-values.test.js +8 -9
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +2 -1
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +103 -4
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.d.ts +3 -0
- package/dist/frontend/lowering/builtins/arguments.js +30 -15
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +10 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +2 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +4 -2
- package/dist/frontend/lowering/builtins/crypto.js +136 -5
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.d.ts +46 -0
- package/dist/frontend/lowering/builtins/date-classes.js +477 -0
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +11 -1
- package/dist/frontend/lowering/builtins/dates.js +55 -26
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/dh.d.ts +15 -0
- package/dist/frontend/lowering/builtins/dh.js +151 -0
- package/dist/frontend/lowering/builtins/dh.js.map +1 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +2 -1
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
- package/dist/frontend/lowering/builtins/ecdh.d.ts +12 -1
- package/dist/frontend/lowering/builtins/ecdh.js +7 -7
- package/dist/frontend/lowering/builtins/ecdh.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +15 -0
- package/dist/frontend/lowering/builtins/errors.js +110 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +23 -17
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +6 -4
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +15 -0
- package/dist/frontend/lowering/builtins/fs-paths.js +209 -0
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +16 -4
- package/dist/frontend/lowering/builtins/hash-stream.js +86 -23
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +2 -1
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.d.ts +2 -1
- package/dist/frontend/lowering/builtins/key-object.js +20 -7
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +11 -4
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +18 -6
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.js +4 -3
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.js +3 -2
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +3 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +91 -4
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js +2 -1
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +7 -2
- package/dist/frontend/lowering/builtins/readline.js +58 -9
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/strings.js +13 -5
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +2 -1
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +1 -1
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +28 -4
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.js +2 -1
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/builtins/webcrypto.js +39 -20
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +2 -1
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +13 -6
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +18 -1
- package/dist/frontend/lowering/caught-value-dispatch.js +201 -32
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-assertions.js +3 -2
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +6 -2
- package/dist/frontend/lowering/class-construction.js +25 -16
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +1 -1
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +73 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1334 -259
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +124 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +35 -9
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +1 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +7 -0
- package/dist/frontend/lowering/class-protocols.js +64 -4
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +5 -0
- package/dist/frontend/lowering/class-prototypes.js +67 -5
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.js +25 -5
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +2 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +6 -5
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +99 -8
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.js +8 -7
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -1
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +352 -31
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +12 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +25 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +21 -5
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +21 -9
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
- package/dist/frontend/lowering/containers/bytes.js +131 -29
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -2
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +3 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +15 -9
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +54 -14
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +32 -1
- package/dist/frontend/lowering/containers/iterator-helpers.js +6 -5
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +87 -14
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +45 -20
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.js +25 -4
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.d.ts +18 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +226 -115
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.d.ts +59 -0
- package/dist/frontend/lowering/dispatch-sites.js +218 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.d.ts +1 -0
- package/dist/frontend/lowering/dispatch-sites.test.js +59 -0
- package/dist/frontend/lowering/dispatch-sites.test.js.map +1 -0
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +3 -0
- package/dist/frontend/lowering/dyn-streams.js +1 -1
- package/dist/frontend/lowering/dyn-streams.js.map +1 -1
- package/dist/frontend/lowering/dynamic-tier.d.ts +25 -0
- package/dist/frontend/lowering/dynamic-tier.js +327 -0
- package/dist/frontend/lowering/dynamic-tier.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +51 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +62 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +81 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +107 -14
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +79 -11
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +130 -6
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -3
- package/dist/frontend/lowering/expressions/object-literals.js +164 -56
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +17 -5
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +0 -4
- package/dist/frontend/lowering/expressions/property-access.js +211 -17
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +267 -30
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +85 -12
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +49 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +20 -30
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +42 -1
- package/dist/frontend/lowering/generic-functions.js +455 -20
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +2 -1
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +195 -9
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/js-dynamic-objects.js +3 -2
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -1
- package/dist/frontend/lowering/json-require.js +2 -1
- package/dist/frontend/lowering/json-require.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +24 -4
- package/dist/frontend/lowering/key-order-witness.js +790 -25
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +466 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.js +2 -1
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +6 -5
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +7 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +11 -0
- package/dist/frontend/lowering/lower-calls.js +776 -126
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +29 -2
- package/dist/frontend/lowering/lower-classes.js +581 -46
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +6 -3
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +14 -0
- package/dist/frontend/lowering/lower-event-emitter.js +267 -20
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +19 -2
- package/dist/frontend/lowering/lower-exprs.js +126 -13
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +387 -72
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +41 -31
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +28 -12
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +2 -1
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.js +2 -1
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +47 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +2 -2
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +2 -1
- package/dist/frontend/lowering/lower-namespaces.js +9 -4
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +10 -0
- package/dist/frontend/lowering/lower-server.js +239 -61
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +42 -10
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +622 -68
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +2055 -318
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +4 -3
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +197 -29
- package/dist/frontend/lowering/lowerer.js +862 -84
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +21 -9
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.js +5 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +1 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js +2 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +9 -0
- package/dist/frontend/lowering/private-brands.js +66 -15
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/promise-executor-adapter.js +2 -1
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -1
- package/dist/frontend/lowering/require-initialization.js +2 -1
- package/dist/frontend/lowering/require-initialization.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +5 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +17 -1
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +2 -0
- package/dist/frontend/lowering/runtime-optional-records.js +18 -5
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +35 -0
- package/dist/frontend/lowering/site-dependencies.js +84 -0
- package/dist/frontend/lowering/site-dependencies.js.map +1 -0
- package/dist/frontend/lowering/site-dependencies.test.d.ts +1 -0
- package/dist/frontend/lowering/site-dependencies.test.js +53 -0
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -0
- package/dist/frontend/lowering/stable-names.d.ts +11 -0
- package/dist/frontend/lowering/stable-names.js +35 -0
- package/dist/frontend/lowering/stable-names.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +2 -2
- package/dist/frontend/lowering/static-typeof.js +42 -3
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-equality.js +2 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/structural-positions.d.ts +32 -0
- package/dist/frontend/lowering/structural-positions.js +108 -0
- package/dist/frontend/lowering/structural-positions.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +60 -32
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +66 -16
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-tsc-helpers.d.ts +5 -0
- package/dist/frontend/npm-static-tsc-helpers.js +106 -0
- package/dist/frontend/npm-static-tsc-helpers.js.map +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.d.ts +1 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js +58 -0
- package/dist/frontend/npm-static-tsc-helpers.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.d.ts +8 -0
- package/dist/frontend/npm-static-type-exports-host.js +214 -0
- package/dist/frontend/npm-static-type-exports-host.js.map +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports-host.test.js +53 -0
- package/dist/frontend/npm-static-type-exports-host.test.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.d.ts +52 -0
- package/dist/frontend/npm-static-type-exports.js +261 -0
- package/dist/frontend/npm-static-type-exports.js.map +1 -0
- package/dist/frontend/npm-static-type-exports.test.d.ts +1 -0
- package/dist/frontend/npm-static-type-exports.test.js +103 -0
- package/dist/frontend/npm-static-type-exports.test.js.map +1 -0
- package/dist/frontend/npm-static-umd.d.ts +6 -0
- package/dist/frontend/npm-static-umd.js +203 -0
- package/dist/frontend/npm-static-umd.js.map +1 -0
- package/dist/frontend/npm-static-umd.test.d.ts +1 -0
- package/dist/frontend/npm-static-umd.test.js +105 -0
- package/dist/frontend/npm-static-umd.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +8 -0
- package/dist/frontend/npm-static.js +51 -22
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +18 -10
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program.d.ts +21 -1
- package/dist/frontend/program.js +586 -74
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +44 -4
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/services.d.ts +6 -0
- package/dist/frontend/services.js +18 -0
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +43 -7
- package/dist/frontend/ts7/ast-node.js +1176 -129
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +84 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +29 -3
- package/dist/frontend/ts7/ast-wire.js +144 -31
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +23 -2
- package/dist/frontend/ts7/ast.js +143 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +17 -1
- package/dist/frontend/ts7/checker.js +82 -1
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +9 -6
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.d.ts +3 -3
- package/dist/frontend/ts7/enums.generated.d.ts +10 -0
- package/dist/frontend/ts7/enums.generated.js +21 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -1
- package/dist/frontend/ts7/enums.js +19 -0
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +30 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +10 -0
- package/dist/frontend/ts7/semantic-checker.js +25 -20
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +13 -0
- package/dist/frontend/ts7/semantic-json.js +146 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +57 -1
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +15 -0
- package/dist/frontend/ts7/semantic-model.js +67 -19
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +3 -2
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +23 -1
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +1 -1
- package/dist/frontend/tsc-codes.js +7 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +51 -7
- package/dist/frontend/type-mapper.js +456 -43
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +1 -1
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend-process-args.d.ts +4 -0
- package/dist/frontend-process-args.js +52 -0
- package/dist/frontend-process-args.js.map +1 -0
- package/dist/frontend-process-args.test.d.ts +1 -0
- package/dist/frontend-process-args.test.js +47 -0
- package/dist/frontend-process-args.test.js.map +1 -0
- package/dist/frontend-process.d.ts +1 -0
- package/dist/frontend-process.js +23 -0
- package/dist/frontend-process.js.map +1 -0
- package/dist/heap-collection.d.ts +16 -0
- package/dist/heap-collection.js +42 -0
- package/dist/heap-collection.js.map +1 -0
- package/dist/heap-collection.test.d.ts +1 -0
- package/dist/heap-collection.test.js +59 -0
- package/dist/heap-collection.test.js.map +1 -0
- package/dist/heap-pressure.d.ts +2 -0
- package/dist/heap-pressure.js +12 -0
- package/dist/heap-pressure.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +435 -89
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +26 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +49 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +80 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -1
- package/dist/ir/builtin-signatures.js +303 -21
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +3 -1
- package/dist/ir/final-fields.js +15 -17
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +5 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +36 -6
- package/dist/ir/int32-slots.js +370 -171
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +3 -1
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +9 -4
- package/dist/ir/integer-loop-facts.js +93 -18
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +49 -0
- package/dist/ir/integer-loops.js +202 -40
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +211 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +94 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +87 -9
- package/dist/ir/ir.js +61 -2
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +21 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +19 -2
- package/dist/ir/js-ic.js +95 -11
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +188 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +60 -15
- package/dist/ir/runtime-features.js +276 -35
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.d.ts +2 -0
- package/dist/ir/traverse.js +29 -5
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +171 -45
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +12 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/prepare.js +2 -0
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +26 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -1
- package/dist/native/prepare.js +123 -31
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +78 -18
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +6 -1
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/text-parts.d.ts +7 -0
- package/dist/text-parts.js +44 -0
- package/dist/text-parts.js.map +1 -1
- package/dist/text-parts.test.d.ts +1 -0
- package/dist/text-parts.test.js +46 -0
- package/dist/text-parts.test.js.map +1 -0
- package/dist/timing.d.ts +9 -2
- package/dist/timing.js +7 -4
- package/dist/timing.js.map +1 -1
- package/dist/wasm/translate.d.ts +4 -0
- package/dist/wasm/translate.js +2 -2
- package/dist/wasm/translate.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/shims/undici/core/client.ts +4 -4
- package/surface-manifest.json +44 -52
package/dist/ir/int32-slots.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { analyzeIntegerRanges, INT32_RANGE, NON_NEGATIVE_INT32_RANGE, withinInt32, } from "./integer-ranges.js";
|
|
2
|
-
import { exprFunctionReference, moduleFunctionReferences } from "./function-references.js";
|
|
2
|
+
import { exprFunctionReference, FUNCTION_REFERENCE_KINDS, moduleFunctionReferences, } from "./function-references.js";
|
|
3
|
+
import { eachNodeOfKinds, } from "./node-index.js";
|
|
3
4
|
import { findInitializerBindings, withInitializerBindings } from "./initializer-bindings.js";
|
|
4
|
-
import {
|
|
5
|
+
import { checkableInt32Allocations, int32ArrayGroups, int32ArrayKey, int32ArraySlot, int32ArrayStores, } from "./int32-arrays.js";
|
|
6
|
+
import { everyExprChild, everyStmtChild, everyTypeChild } from "./traverse.js";
|
|
5
7
|
/** The storage slot an array-valued expression reads, as an
|
|
6
8
|
* IrContracts.int32Elements key: a local or parameter
|
|
7
9
|
* (`l:${function}\0${localId}`), a module global (`g:${globalId}`), a class
|
|
@@ -151,8 +153,11 @@ export class Int32Slots {
|
|
|
151
153
|
result.locals = (localId) => this.int32Locals.has(`${fnName}\0${localId}`) || this.int32Locals.has(`\0${localId}`)
|
|
152
154
|
? INT32_RANGE
|
|
153
155
|
: null;
|
|
154
|
-
if (this.int32Elements.size > 0)
|
|
156
|
+
if (this.int32Elements.size > 0) {
|
|
155
157
|
result.elements = (arr) => this.hasInt32Elements(fnName, arr);
|
|
158
|
+
if (this.narrowedReads)
|
|
159
|
+
result.narrowedReads = true;
|
|
160
|
+
}
|
|
156
161
|
const params = this.paramFacts.get(fnName);
|
|
157
162
|
if (params)
|
|
158
163
|
result.params =
|
|
@@ -212,6 +217,29 @@ export class Int32Slots {
|
|
|
212
217
|
addInt32Elements(key) {
|
|
213
218
|
this.int32Elements.add(key);
|
|
214
219
|
}
|
|
220
|
+
dropInt32Elements(key) {
|
|
221
|
+
return this.int32Elements.delete(key);
|
|
222
|
+
}
|
|
223
|
+
hasInt32ElementSlot(key) {
|
|
224
|
+
return this.int32Elements.has(key);
|
|
225
|
+
}
|
|
226
|
+
/** Whether the module has int32 array candidates (the narrowedReads
|
|
227
|
+
* range fact). */
|
|
228
|
+
narrowedReads = false;
|
|
229
|
+
/** Number arrays stored as int32 slots (int32ArrayKey keys: locals and
|
|
230
|
+
* parameters as `function\0local`, globals as `\0global`): the module's
|
|
231
|
+
* int32 array candidates whose every stored element, through every
|
|
232
|
+
* binding that can hold the same array, the fixpoint proved an int32. */
|
|
233
|
+
int32Arrays = new Set();
|
|
234
|
+
/** Local number arrays that may hold int32 slots with checked stores: the
|
|
235
|
+
* candidates whose element stores the fixpoint proved exact integers but
|
|
236
|
+
* not int32s, allocated only by fills that may be long. A fill of at least
|
|
237
|
+
* CHECKED_INT32_MIN_LENGTH elements creates one with int32 slots and a
|
|
238
|
+
* shorter one with doubles. Their elements give no int32 facts; compiled
|
|
239
|
+
* accesses test the array's kind (once per innermost loop where they can,
|
|
240
|
+
* backend/llvm/int32-kind-loops.ts), and a store that is not an int32
|
|
241
|
+
* widens it first (scr_arr_widen_i32). */
|
|
242
|
+
checkedInt32Arrays = new Set();
|
|
215
243
|
/** Whether every present element of the number array `arr` evaluates to
|
|
216
244
|
* (read inside `fnName`) is an int32. */
|
|
217
245
|
hasInt32Elements(fnName, arr) {
|
|
@@ -335,6 +363,7 @@ const DYN_READ_ONLY = new Set([
|
|
|
335
363
|
"date.nativeNew",
|
|
336
364
|
"date.nativeNewFields",
|
|
337
365
|
"date.nativeNewValue",
|
|
366
|
+
"date.argumentsTime",
|
|
338
367
|
// The dynamic operators run the ToPrimitive and coercion helpers of
|
|
339
368
|
// dyn.compare, dyn.numberConstructor and dyn.toStringCoerce, then build a
|
|
340
369
|
// fresh number, string or bigint. dyn.increment steps dyn.toNumeric's result.
|
|
@@ -350,6 +379,7 @@ const DYN_READ_ONLY = new Set([
|
|
|
350
379
|
"dyn.forInStable",
|
|
351
380
|
"dyn.getOwnPropertyNames",
|
|
352
381
|
"dyn.getPrototype",
|
|
382
|
+
"dyn.getPrototypeForIdentity",
|
|
353
383
|
"dyn.hasKey",
|
|
354
384
|
"dyn.hasOwn",
|
|
355
385
|
"dyn.in",
|
|
@@ -362,6 +392,7 @@ const DYN_READ_ONLY = new Set([
|
|
|
362
392
|
"dyn.collectionIteratorIndex",
|
|
363
393
|
"dyn.mapSeedEntries",
|
|
364
394
|
"dyn.mapSeedEntry",
|
|
395
|
+
"dyn.nameClassPrototype",
|
|
365
396
|
"dyn.numberConstructor",
|
|
366
397
|
"dyn.objCreate",
|
|
367
398
|
"dyn.objEntries",
|
|
@@ -424,7 +455,58 @@ const DYN_READ_ONLY = new Set([
|
|
|
424
455
|
"text.decodeStream",
|
|
425
456
|
"worker.new",
|
|
426
457
|
]);
|
|
427
|
-
|
|
458
|
+
/** The node kinds each walk below reads. */
|
|
459
|
+
const LIB_CALL_KINDS = ["libCall"];
|
|
460
|
+
const CALL_FACT_KINDS = [
|
|
461
|
+
...FUNCTION_REFERENCE_KINDS,
|
|
462
|
+
"virtualCall",
|
|
463
|
+
"instanceOfValue",
|
|
464
|
+
"varRef",
|
|
465
|
+
"assignExpr",
|
|
466
|
+
"incDec",
|
|
467
|
+
"classRef",
|
|
468
|
+
"varDecl",
|
|
469
|
+
"assign",
|
|
470
|
+
"forOf",
|
|
471
|
+
];
|
|
472
|
+
const CENSUS_KINDS = [
|
|
473
|
+
"call",
|
|
474
|
+
"new",
|
|
475
|
+
"varRef",
|
|
476
|
+
"fieldGet",
|
|
477
|
+
"fieldIncDec",
|
|
478
|
+
"closure",
|
|
479
|
+
"classRef",
|
|
480
|
+
"incDec",
|
|
481
|
+
"forOf",
|
|
482
|
+
"tryCatch",
|
|
483
|
+
];
|
|
484
|
+
const DECLARATION_KINDS = ["varDecl"];
|
|
485
|
+
const CANDIDATE_WRITE_KINDS = [
|
|
486
|
+
"assign",
|
|
487
|
+
"varDecl",
|
|
488
|
+
"fieldSet",
|
|
489
|
+
"return",
|
|
490
|
+
"call",
|
|
491
|
+
"new",
|
|
492
|
+
"assignExpr",
|
|
493
|
+
];
|
|
494
|
+
const CALL_KINDS = ["call", "new"];
|
|
495
|
+
const SLOT_WRITE_KINDS = ["return", "call", "new"];
|
|
496
|
+
const NARROW_WRITE_KINDS = ["assign", "varDecl", "fieldSet", "assignExpr"];
|
|
497
|
+
/** Visits the nodes of `fn` in walk order; with `scan`, only those of its
|
|
498
|
+
* kinds, read from the module's node index (the visitors must ignore the
|
|
499
|
+
* other kinds). */
|
|
500
|
+
function walkFunction(fn, scan, visit) {
|
|
501
|
+
if (scan !== undefined) {
|
|
502
|
+
eachNodeOfKinds(fn, scan, (node, statement) => {
|
|
503
|
+
if (statement)
|
|
504
|
+
visit.stmt?.(node);
|
|
505
|
+
else
|
|
506
|
+
visit.expr?.(node);
|
|
507
|
+
});
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
428
510
|
const expr = (e) => {
|
|
429
511
|
visit.expr?.(e);
|
|
430
512
|
return everyExprChild(e, expr, stmt);
|
|
@@ -436,12 +518,9 @@ function walkFunction(fn, visit) {
|
|
|
436
518
|
for (const s of fn.body)
|
|
437
519
|
stmt(s);
|
|
438
520
|
}
|
|
439
|
-
/**
|
|
440
|
-
*
|
|
441
|
-
|
|
442
|
-
* literal keys of `dyn.keySet`/`dyn.keyDelete`. A view commits a store back
|
|
443
|
-
* into the instance's native field slots, which the IR does not show. */
|
|
444
|
-
export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).map((r) => [r.id, r])), unions = new Map((mod.unions ?? []).map((u) => [u.id, u]))) {
|
|
521
|
+
/** Computes DynamicFieldStores with one walk of every function. Analyses of
|
|
522
|
+
* the same module accept the result so the emitter walks the module once. */
|
|
523
|
+
export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).map((r) => [r.id, r])), unions = new Map((mod.unions ?? []).map((u) => [u.id, u])), nodes) {
|
|
445
524
|
const dynTypes = new Map();
|
|
446
525
|
const dynNamed = new Map();
|
|
447
526
|
const dynish = (type) => {
|
|
@@ -481,8 +560,13 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
|
|
|
481
560
|
};
|
|
482
561
|
const dynWritten = new Set();
|
|
483
562
|
let dynWritesAll = false;
|
|
484
|
-
|
|
485
|
-
|
|
563
|
+
// A store whose key is not a literal names every field: later stores add
|
|
564
|
+
// nothing, so the walk stops there.
|
|
565
|
+
const scan = nodes?.scan(LIB_CALL_KINDS);
|
|
566
|
+
for (const fn of mod.functions) {
|
|
567
|
+
if (dynWritesAll)
|
|
568
|
+
break;
|
|
569
|
+
walkFunction(fn, scan, {
|
|
486
570
|
expr: (e) => {
|
|
487
571
|
if (dynWritesAll)
|
|
488
572
|
return;
|
|
@@ -497,13 +581,29 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
|
|
|
497
581
|
}
|
|
498
582
|
},
|
|
499
583
|
});
|
|
584
|
+
}
|
|
500
585
|
return { all: dynWritesAll, names: dynWritten };
|
|
501
586
|
}
|
|
502
587
|
/** The f64 class field families a runtime store through a live dynamic view
|
|
503
588
|
* can write: the class reaches checked-dynamic code (directly or through
|
|
504
589
|
* another exposed type), and some dynamic store in the program can name the
|
|
505
590
|
* field. */
|
|
506
|
-
export function dynamicallyStoredFamilies(mod, slots) {
|
|
591
|
+
export function dynamicallyStoredFamilies(mod, slots, stores) {
|
|
592
|
+
const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
|
|
593
|
+
const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
|
|
594
|
+
// A live dyn view (typed-ref capsule) of an instance writes back into
|
|
595
|
+
// its fields only after a runtime store into the capsule; the commit then
|
|
596
|
+
// writes every field from the view, which holds the exact snapshot value
|
|
597
|
+
// of any property no store named. So reaching dynamic code disqualifies
|
|
598
|
+
// exactly the field names some dynamic store in the program can name.
|
|
599
|
+
const { all: dynWritesAll, names: dynWritten } = stores ?? dynamicFieldStores(mod, records, unions);
|
|
600
|
+
const storable = (field) => field.type.kind === "f64" &&
|
|
601
|
+
!field.name.startsWith("%") &&
|
|
602
|
+
(dynWritesAll || dynWritten.has(field.name));
|
|
603
|
+
const families = new Set();
|
|
604
|
+
// Without a field some store can name, no class is worth exposing.
|
|
605
|
+
if (!(mod.classes ?? []).some((cls) => cls.fields.some(storable)))
|
|
606
|
+
return families;
|
|
507
607
|
const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
|
|
508
608
|
const children = new Map();
|
|
509
609
|
for (const cls of classes.values())
|
|
@@ -525,8 +625,6 @@ export function dynamicallyStoredFamilies(mod, slots) {
|
|
|
525
625
|
}
|
|
526
626
|
return out;
|
|
527
627
|
};
|
|
528
|
-
const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
|
|
529
|
-
const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
|
|
530
628
|
const exposedClasses = new Set();
|
|
531
629
|
const seenNamed = new Set();
|
|
532
630
|
let exposeAll = false;
|
|
@@ -575,14 +673,8 @@ export function dynamicallyStoredFamilies(mod, slots) {
|
|
|
575
673
|
});
|
|
576
674
|
}
|
|
577
675
|
};
|
|
578
|
-
// A live dyn view (typed-ref capsule) of an instance writes back into
|
|
579
|
-
// its fields only after a runtime store into the capsule; the commit then
|
|
580
|
-
// writes every field from the view, which holds the exact snapshot value
|
|
581
|
-
// of any property no store named. So reaching dynamic code disqualifies
|
|
582
|
-
// exactly the field names some dynamic store in the program can name.
|
|
583
|
-
const { all: dynWritesAll, names: dynWritten } = dynamicFieldStores(mod, records, unions);
|
|
584
676
|
for (const fn of mod.functions)
|
|
585
|
-
walkFunction(fn, {
|
|
677
|
+
walkFunction(fn, undefined, {
|
|
586
678
|
expr: (e) => {
|
|
587
679
|
const dynResult = DYN_KINDS.has(e.type.kind);
|
|
588
680
|
const boundary = BOUNDARY_KINDS.has(e.kind);
|
|
@@ -605,14 +697,11 @@ export function dynamicallyStoredFamilies(mod, slots) {
|
|
|
605
697
|
expose(s.value.type);
|
|
606
698
|
},
|
|
607
699
|
});
|
|
608
|
-
const families = new Set();
|
|
609
700
|
for (const cls of classes.values()) {
|
|
610
701
|
if (!exposeAll && !exposedClasses.has(cls.name))
|
|
611
702
|
continue;
|
|
612
703
|
for (const field of cls.fields)
|
|
613
|
-
if (field
|
|
614
|
-
!field.name.startsWith("%") &&
|
|
615
|
-
(dynWritesAll || dynWritten.has(field.name)))
|
|
704
|
+
if (storable(field))
|
|
616
705
|
families.add(slots.family(cls.name, field.name));
|
|
617
706
|
}
|
|
618
707
|
return families;
|
|
@@ -621,7 +710,7 @@ export function dynamicallyStoredFamilies(mod, slots) {
|
|
|
621
710
|
* the entry, constructors behind class values: `valueEscaped`), through
|
|
622
711
|
* virtual dispatch (`virtualTargets`), or as vtable entries the runtime
|
|
623
712
|
* calls (`runtimeVirtual`: methods of runtime-rooted hierarchies). */
|
|
624
|
-
export function functionCallFacts(mod, classes, subtree) {
|
|
713
|
+
export function functionCallFacts(mod, classes, subtree, nodes) {
|
|
625
714
|
const escaped = new Set(moduleFunctionReferences(mod));
|
|
626
715
|
const virtualTargets = new Set();
|
|
627
716
|
// Virtual dispatch: a `virtualCall` can reach the method's implementation
|
|
@@ -638,23 +727,11 @@ export function functionCallFacts(mod, classes, subtree) {
|
|
|
638
727
|
for (const cls of classes.values())
|
|
639
728
|
if (runtimeRooted(cls.name))
|
|
640
729
|
runtimePrefixes.push(`%${cls.name}.`);
|
|
641
|
-
for (const fn of mod.functions)
|
|
642
|
-
walkFunction(fn, {
|
|
643
|
-
expr: (e) => {
|
|
644
|
-
const referenced = exprFunctionReference(e);
|
|
645
|
-
if (referenced !== undefined)
|
|
646
|
-
escaped.add(referenced);
|
|
647
|
-
if (e.kind !== "virtualCall")
|
|
648
|
-
return;
|
|
649
|
-
for (const name of subtree(e.className))
|
|
650
|
-
virtualTargets.add(`%${name}.${e.method}`);
|
|
651
|
-
for (let c = classes.get(e.className); c; c = c.base ? classes.get(c.base) : undefined)
|
|
652
|
-
virtualTargets.add(`%${c.name}.${e.method}`);
|
|
653
|
-
},
|
|
654
|
-
});
|
|
655
730
|
// A class value can reach `new` through its construct thunk; one that
|
|
656
|
-
// only feeds an instanceof interval check cannot.
|
|
731
|
+
// only feeds an instanceof interval check cannot. Class references are
|
|
732
|
+
// checked once every function has contributed its tested-only ones.
|
|
657
733
|
const testedOnly = new Set();
|
|
734
|
+
const classRefs = [];
|
|
658
735
|
for (const fn of mod.functions) {
|
|
659
736
|
// Direct operands, and unboxed locals bound once to a class reference
|
|
660
737
|
// and read only as instanceof operands (the lowering's temporary).
|
|
@@ -665,9 +742,18 @@ export function functionCallFacts(mod, classes, subtree) {
|
|
|
665
742
|
const count = (map, id) => {
|
|
666
743
|
map.set(id, (map.get(id) ?? 0) + 1);
|
|
667
744
|
};
|
|
668
|
-
walkFunction(fn, {
|
|
745
|
+
walkFunction(fn, nodes?.scan(CALL_FACT_KINDS), {
|
|
669
746
|
expr: (e) => {
|
|
670
|
-
|
|
747
|
+
const referenced = exprFunctionReference(e);
|
|
748
|
+
if (referenced !== undefined)
|
|
749
|
+
escaped.add(referenced);
|
|
750
|
+
if (e.kind === "virtualCall") {
|
|
751
|
+
for (const name of subtree(e.className))
|
|
752
|
+
virtualTargets.add(`%${name}.${e.method}`);
|
|
753
|
+
for (let c = classes.get(e.className); c; c = c.base ? classes.get(c.base) : undefined)
|
|
754
|
+
virtualTargets.add(`%${c.name}.${e.method}`);
|
|
755
|
+
}
|
|
756
|
+
else if (e.kind === "instanceOfValue") {
|
|
671
757
|
if (e.classValue.kind === "classRef")
|
|
672
758
|
testedOnly.add(e.classValue);
|
|
673
759
|
else if (e.classValue.kind === "varRef")
|
|
@@ -677,6 +763,8 @@ export function functionCallFacts(mod, classes, subtree) {
|
|
|
677
763
|
count(reads, e.localId);
|
|
678
764
|
else if (e.kind === "assignExpr" || e.kind === "incDec")
|
|
679
765
|
count(writes, e.localId);
|
|
766
|
+
else if (e.kind === "classRef")
|
|
767
|
+
classRefs.push(e);
|
|
680
768
|
},
|
|
681
769
|
stmt: (s) => {
|
|
682
770
|
if (s.kind === "varDecl" && s.init?.kind === "classRef")
|
|
@@ -690,17 +778,14 @@ export function functionCallFacts(mod, classes, subtree) {
|
|
|
690
778
|
if (!boxed.has(id) && writes.get(id) === 1 && reads.get(id) === tests.get(id))
|
|
691
779
|
testedOnly.add(ref);
|
|
692
780
|
}
|
|
693
|
-
for (const
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
if (e.kind === "classRef" && !testedOnly.has(e))
|
|
697
|
-
escaped.add(`%${e.className}.constructor`);
|
|
698
|
-
},
|
|
699
|
-
});
|
|
781
|
+
for (const e of classRefs)
|
|
782
|
+
if (!testedOnly.has(e))
|
|
783
|
+
escaped.add(`%${e.className}.constructor`);
|
|
700
784
|
const runtimeVirtual = (name) => runtimePrefixes.some((prefix) => name.startsWith(prefix));
|
|
701
785
|
return { valueEscaped: escaped, virtualTargets, runtimeVirtual };
|
|
702
786
|
}
|
|
703
|
-
export function analyzeInt32Slots(mod) {
|
|
787
|
+
export function analyzeInt32Slots(mod, inputs = {}) {
|
|
788
|
+
const nodes = inputs.nodes;
|
|
704
789
|
const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
|
|
705
790
|
const slots = new Int32Slots(classes);
|
|
706
791
|
if (mod.lib)
|
|
@@ -729,6 +814,32 @@ export function analyzeInt32Slots(mod) {
|
|
|
729
814
|
slots.addInt32Local(key);
|
|
730
815
|
for (const key of contracts?.int32Elements ?? [])
|
|
731
816
|
slots.addInt32Elements(key);
|
|
817
|
+
// Int32 array candidates (ir/int32-arrays.ts): assumed to hold int32
|
|
818
|
+
// elements until a store the fixpoint cannot prove drops one, with every
|
|
819
|
+
// candidate the same array can reach (its group).
|
|
820
|
+
const arrayCandidates = new Map();
|
|
821
|
+
const globalArrays = new Set();
|
|
822
|
+
const arrayKeys = new Set(mod.int32ArrayCandidates ?? []);
|
|
823
|
+
slots.narrowedReads = arrayKeys.size > 0;
|
|
824
|
+
for (const key of arrayKeys) {
|
|
825
|
+
const cut = key.indexOf("\0");
|
|
826
|
+
if (cut === 0)
|
|
827
|
+
globalArrays.add(key.slice(1));
|
|
828
|
+
else {
|
|
829
|
+
const fnName = key.slice(0, cut);
|
|
830
|
+
const set = arrayCandidates.get(fnName) ?? new Set();
|
|
831
|
+
set.add(key.slice(cut + 1));
|
|
832
|
+
arrayCandidates.set(fnName, set);
|
|
833
|
+
}
|
|
834
|
+
slots.addInt32Elements(int32ArraySlot(key));
|
|
835
|
+
}
|
|
836
|
+
const arrayGroups = arrayKeys.size > 0 ? int32ArrayGroups(mod, arrayKeys) : null;
|
|
837
|
+
// Functions that read or write a candidate global.
|
|
838
|
+
const globalArrayFunctions = new Set();
|
|
839
|
+
if (arrayGroups)
|
|
840
|
+
for (const names of arrayGroups.globalReaders.values())
|
|
841
|
+
for (const name of names)
|
|
842
|
+
globalArrayFunctions.add(name);
|
|
732
843
|
/* ── candidate fields ── */
|
|
733
844
|
const children = new Map();
|
|
734
845
|
for (const cls of classes.values())
|
|
@@ -782,14 +893,14 @@ export function analyzeInt32Slots(mod) {
|
|
|
782
893
|
dropFamily(family, "runtime-provided or generic class");
|
|
783
894
|
}
|
|
784
895
|
/* ── dynamic, reflective and runtime exposure ── */
|
|
785
|
-
for (const family of dynamicallyStoredFamilies(mod, slots)) {
|
|
896
|
+
for (const family of dynamicallyStoredFamilies(mod, slots, inputs.dynamicStores)) {
|
|
786
897
|
if (slots.isPinnedField(family))
|
|
787
898
|
continue;
|
|
788
899
|
dropFamily(family, "dynamic stores can name the field");
|
|
789
900
|
}
|
|
790
901
|
/* ── functions: escapes, parameter and return candidates ── */
|
|
791
902
|
const functions = new Map(mod.functions.map((fn) => [fn.name, fn]));
|
|
792
|
-
const calls = functionCallFacts(mod, classes, subtree);
|
|
903
|
+
const calls = functionCallFacts(mod, classes, subtree, nodes);
|
|
793
904
|
const escaped = new Set([...calls.valueEscaped, ...calls.virtualTargets]);
|
|
794
905
|
const virtual = calls.runtimeVirtual;
|
|
795
906
|
const paramKey = (fnName, localId) => `param:${fnName}\0${localId}`;
|
|
@@ -801,57 +912,17 @@ export function analyzeInt32Slots(mod) {
|
|
|
801
912
|
for (const param of fn.params)
|
|
802
913
|
dropParam(fn.name, param.localId, why);
|
|
803
914
|
};
|
|
804
|
-
//
|
|
805
|
-
//
|
|
915
|
+
// One walk of every function collects what the steps below need: the
|
|
916
|
+
// functions IR calls reach directly, calls whose arity differs from their
|
|
917
|
+
// callee's, the captured bindings' boxes, and which functions read which
|
|
918
|
+
// slot facts. Facts that depend on earlier steps are applied in walk order
|
|
919
|
+
// where those steps complete.
|
|
806
920
|
const called = slots.called;
|
|
807
|
-
|
|
808
|
-
walkFunction(fn, {
|
|
809
|
-
expr: (e) => {
|
|
810
|
-
if (e.kind === "call")
|
|
811
|
-
called.add(e.callee);
|
|
812
|
-
else if (e.kind === "new")
|
|
813
|
-
called.add(`%${e.className}.constructor`);
|
|
814
|
-
},
|
|
815
|
-
});
|
|
816
|
-
for (const fn of mod.functions) {
|
|
817
|
-
if (fn.returnType.kind === "f64" && !fn.async && !fn.generator) {
|
|
818
|
-
slots.addReturn(fn.name);
|
|
819
|
-
slots.assumeNonNegative(`ret:${fn.name}`);
|
|
820
|
-
}
|
|
821
|
-
if (fn.async ||
|
|
822
|
-
fn.generator ||
|
|
823
|
-
!called.has(fn.name) ||
|
|
824
|
-
escaped.has(fn.name) ||
|
|
825
|
-
virtual(fn.name))
|
|
826
|
-
continue;
|
|
827
|
-
for (const param of fn.params)
|
|
828
|
-
if (param.type.kind === "f64" && !slots.isPinned(paramKey(fn.name, param.localId))) {
|
|
829
|
-
slots.addParam(fn.name, param.localId);
|
|
830
|
-
slots.assumeNonNegative(paramKey(fn.name, param.localId));
|
|
831
|
-
}
|
|
832
|
-
}
|
|
921
|
+
const arityMismatches = [];
|
|
833
922
|
const arityChecked = (fn, args, offset) => {
|
|
834
923
|
if (fn && fn.params.length !== args + offset)
|
|
835
|
-
|
|
924
|
+
arityMismatches.push(fn);
|
|
836
925
|
};
|
|
837
|
-
for (const fn of mod.functions)
|
|
838
|
-
walkFunction(fn, {
|
|
839
|
-
expr: (e) => {
|
|
840
|
-
if (e.kind === "call")
|
|
841
|
-
arityChecked(functions.get(e.callee), e.args.length, 0);
|
|
842
|
-
else if (e.kind === "new")
|
|
843
|
-
arityChecked(functions.get(`%${e.className}.constructor`), e.args.length, 1);
|
|
844
|
-
},
|
|
845
|
-
});
|
|
846
|
-
// Candidates the fixpoint may drop; rangedParameters retries some.
|
|
847
|
-
const candidates = new Map();
|
|
848
|
-
const retry = new Set();
|
|
849
|
-
for (const fn of mod.functions) {
|
|
850
|
-
const ids = fn.params.filter((p) => slots.hasParam(fn.name, p.localId)).map((p) => p.localId);
|
|
851
|
-
if (ids.length > 0)
|
|
852
|
-
candidates.set(fn.name, ids);
|
|
853
|
-
}
|
|
854
|
-
/* ── captured bindings ── */
|
|
855
926
|
// A captured local lives in one box shared by its declaring function and
|
|
856
927
|
// every closure that captures it (closure.captures[i] is the lifted
|
|
857
928
|
// function's captures[i]). The box holds an int32 when every write to it
|
|
@@ -869,6 +940,18 @@ export function analyzeInt32Slots(mod) {
|
|
|
869
940
|
const boxKey = (fnName, localId) => `${fnName}\0${localId}`;
|
|
870
941
|
const boxMembers = new Set();
|
|
871
942
|
const unstableBoxes = new Set();
|
|
943
|
+
// Readers: which functions depend on which slot facts. Reads of a boxed
|
|
944
|
+
// local resolve to its box once the boxes are known.
|
|
945
|
+
const readers = new Map();
|
|
946
|
+
const reads = (slot, fnName) => {
|
|
947
|
+
const set = readers.get(slot);
|
|
948
|
+
if (set)
|
|
949
|
+
set.add(fnName);
|
|
950
|
+
else
|
|
951
|
+
readers.set(slot, new Set([fnName]));
|
|
952
|
+
};
|
|
953
|
+
const boxedReads = [];
|
|
954
|
+
const incrementedFamilies = [];
|
|
872
955
|
for (const fn of mod.functions) {
|
|
873
956
|
for (const local of fn.locals)
|
|
874
957
|
if (local.boxed) {
|
|
@@ -879,9 +962,34 @@ export function analyzeInt32Slots(mod) {
|
|
|
879
962
|
}
|
|
880
963
|
for (const capture of fn.classCaptures ?? [])
|
|
881
964
|
unstableBoxes.add(boxKey(fn.name, capture.localId));
|
|
882
|
-
|
|
965
|
+
const read = new Set();
|
|
966
|
+
walkFunction(fn, nodes?.scan(CENSUS_KINDS), {
|
|
883
967
|
expr: (e) => {
|
|
884
|
-
if (e.kind === "
|
|
968
|
+
if (e.kind === "call") {
|
|
969
|
+
called.add(e.callee);
|
|
970
|
+
arityChecked(functions.get(e.callee), e.args.length, 0);
|
|
971
|
+
reads(`ret:${e.callee}`, fn.name);
|
|
972
|
+
}
|
|
973
|
+
else if (e.kind === "new") {
|
|
974
|
+
const constructor = `%${e.className}.constructor`;
|
|
975
|
+
called.add(constructor);
|
|
976
|
+
arityChecked(functions.get(constructor), e.args.length, 1);
|
|
977
|
+
// Constructors return nothing: this only records their callers.
|
|
978
|
+
reads(`ret:${constructor}`, fn.name);
|
|
979
|
+
}
|
|
980
|
+
else if (e.kind === "varRef")
|
|
981
|
+
read.add(e.localId);
|
|
982
|
+
else if (e.kind === "fieldGet") {
|
|
983
|
+
const family = slots.family(e.className, e.field);
|
|
984
|
+
if (family)
|
|
985
|
+
reads(`field:${family}`, fn.name);
|
|
986
|
+
}
|
|
987
|
+
else if (e.kind === "fieldIncDec") {
|
|
988
|
+
const family = slots.family(e.className, e.field);
|
|
989
|
+
if (family)
|
|
990
|
+
incrementedFamilies.push(family);
|
|
991
|
+
}
|
|
992
|
+
else if (e.kind === "closure") {
|
|
885
993
|
const lifted = functions.get(e.fnName);
|
|
886
994
|
e.captures.forEach((id, i) => {
|
|
887
995
|
const inner = lifted?.captures?.[i];
|
|
@@ -908,7 +1016,39 @@ export function analyzeInt32Slots(mod) {
|
|
|
908
1016
|
unstableBoxes.add(boxKey(fn.name, s.catchLocalId));
|
|
909
1017
|
},
|
|
910
1018
|
});
|
|
1019
|
+
if (read.size > 0)
|
|
1020
|
+
boxedReads.push([fn, read]);
|
|
911
1021
|
}
|
|
1022
|
+
// Only functions some IR call reaches directly get parameter facts: one
|
|
1023
|
+
// the backend invokes by convention has no call site to prove against.
|
|
1024
|
+
for (const fn of mod.functions) {
|
|
1025
|
+
if (fn.returnType.kind === "f64" && !fn.async && !fn.generator) {
|
|
1026
|
+
slots.addReturn(fn.name);
|
|
1027
|
+
slots.assumeNonNegative(`ret:${fn.name}`);
|
|
1028
|
+
}
|
|
1029
|
+
if (fn.async ||
|
|
1030
|
+
fn.generator ||
|
|
1031
|
+
!called.has(fn.name) ||
|
|
1032
|
+
escaped.has(fn.name) ||
|
|
1033
|
+
virtual(fn.name))
|
|
1034
|
+
continue;
|
|
1035
|
+
for (const param of fn.params)
|
|
1036
|
+
if (param.type.kind === "f64" && !slots.isPinned(paramKey(fn.name, param.localId))) {
|
|
1037
|
+
slots.addParam(fn.name, param.localId);
|
|
1038
|
+
slots.assumeNonNegative(paramKey(fn.name, param.localId));
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
for (const fn of arityMismatches)
|
|
1042
|
+
dropAllParams(fn, "call arity differs");
|
|
1043
|
+
// Candidates the fixpoint may drop; rangedParameters retries some.
|
|
1044
|
+
const candidates = new Map();
|
|
1045
|
+
const retry = new Set();
|
|
1046
|
+
for (const fn of mod.functions) {
|
|
1047
|
+
const ids = fn.params.filter((p) => slots.hasParam(fn.name, p.localId)).map((p) => p.localId);
|
|
1048
|
+
if (ids.length > 0)
|
|
1049
|
+
candidates.set(fn.name, ids);
|
|
1050
|
+
}
|
|
1051
|
+
/* ── captured bindings ── */
|
|
912
1052
|
const groups = new Map();
|
|
913
1053
|
for (const key of boxMembers) {
|
|
914
1054
|
const root = boxRoot(key);
|
|
@@ -935,7 +1075,7 @@ export function analyzeInt32Slots(mod) {
|
|
|
935
1075
|
let ids = initializedDeclarations.get(fn.name);
|
|
936
1076
|
if (ids === undefined) {
|
|
937
1077
|
const found = new Set();
|
|
938
|
-
walkFunction(fn, {
|
|
1078
|
+
walkFunction(fn, nodes?.scan(DECLARATION_KINDS), {
|
|
939
1079
|
stmt: (s) => {
|
|
940
1080
|
if (s.kind === "varDecl" && s.init)
|
|
941
1081
|
found.add(s.localId);
|
|
@@ -977,42 +1117,16 @@ export function analyzeInt32Slots(mod) {
|
|
|
977
1117
|
reason(`box:${group}`, why);
|
|
978
1118
|
return slots.dropBox(group);
|
|
979
1119
|
};
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
};
|
|
989
|
-
for (const fn of mod.functions)
|
|
990
|
-
walkFunction(fn, {
|
|
991
|
-
expr: (e) => {
|
|
992
|
-
if (e.kind === "fieldGet") {
|
|
993
|
-
const family = slots.family(e.className, e.field);
|
|
994
|
-
if (family)
|
|
995
|
-
reads(`field:${family}`, fn.name);
|
|
996
|
-
}
|
|
997
|
-
else if (e.kind === "call")
|
|
998
|
-
reads(`ret:${e.callee}`, fn.name);
|
|
999
|
-
// Constructors return nothing: this only records their callers.
|
|
1000
|
-
else if (e.kind === "new")
|
|
1001
|
-
reads(`ret:%${e.className}.constructor`, fn.name);
|
|
1002
|
-
else if (e.kind === "varRef") {
|
|
1003
|
-
const group = slots.boxGroup(fn.name, e.localId);
|
|
1004
|
-
if (group !== null)
|
|
1005
|
-
reads(`box:${group}`, fn.name);
|
|
1006
|
-
}
|
|
1007
|
-
else if (e.kind === "fieldIncDec") {
|
|
1008
|
-
const family = slots.family(e.className, e.field);
|
|
1009
|
-
if (family)
|
|
1010
|
-
dropFamily(family, "++/-- on the field");
|
|
1011
|
-
}
|
|
1012
|
-
},
|
|
1013
|
-
});
|
|
1120
|
+
for (const [fn, read] of boxedReads)
|
|
1121
|
+
for (const localId of read) {
|
|
1122
|
+
const group = slots.boxGroup(fn.name, localId);
|
|
1123
|
+
if (group !== null)
|
|
1124
|
+
reads(`box:${group}`, fn.name);
|
|
1125
|
+
}
|
|
1126
|
+
for (const family of incrementedFamilies)
|
|
1127
|
+
dropFamily(family, "++/-- on the field");
|
|
1014
1128
|
/* ── the optimistic fixpoint ── */
|
|
1015
|
-
const bindings = findInitializerBindings(mod);
|
|
1129
|
+
const bindings = inputs.initializerBindings ?? findInitializerBindings(mod);
|
|
1016
1130
|
const numeric = (fn) => withInitializerBindings(fn, bindings.get(fn.name) ?? []);
|
|
1017
1131
|
const queue = mod.functions.map((fn) => fn.name);
|
|
1018
1132
|
const queued = new Set(queue);
|
|
@@ -1035,31 +1149,44 @@ export function analyzeInt32Slots(mod) {
|
|
|
1035
1149
|
}
|
|
1036
1150
|
return false;
|
|
1037
1151
|
};
|
|
1152
|
+
const candidateWrites = nodes?.scan(CANDIDATE_WRITE_KINDS);
|
|
1038
1153
|
const hasCandidateWrite = (fn) => {
|
|
1154
|
+
if (arrayCandidates.has(fn.name))
|
|
1155
|
+
return true;
|
|
1156
|
+
if (globalArrayFunctions.has(fn.name))
|
|
1157
|
+
return true;
|
|
1039
1158
|
const box = (localId) => slots.hasBox(slots.boxGroup(fn.name, localId));
|
|
1040
1159
|
const returns = slots.hasReturn(fn.name);
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1160
|
+
let found = false;
|
|
1161
|
+
eachNodeOfKinds(fn, candidateWrites, (node) => {
|
|
1162
|
+
switch (node.kind) {
|
|
1163
|
+
case "assign":
|
|
1164
|
+
found = box(node.localId);
|
|
1165
|
+
break;
|
|
1166
|
+
case "varDecl":
|
|
1167
|
+
found = node.init !== null && box(node.localId);
|
|
1168
|
+
break;
|
|
1169
|
+
case "fieldSet": {
|
|
1170
|
+
const family = slots.family(node.className, node.field);
|
|
1171
|
+
found = !!family && slots.hasFamily(family);
|
|
1172
|
+
break;
|
|
1050
1173
|
}
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1174
|
+
case "return":
|
|
1175
|
+
found = returns;
|
|
1176
|
+
break;
|
|
1177
|
+
case "call":
|
|
1178
|
+
found = candidateArgs(functions.get(node.callee), node.args.length, 0);
|
|
1179
|
+
break;
|
|
1180
|
+
case "new":
|
|
1181
|
+
found = candidateArgs(functions.get(`%${node.className}.constructor`), node.args.length, 1);
|
|
1182
|
+
break;
|
|
1183
|
+
case "assignExpr":
|
|
1184
|
+
found = box(node.localId);
|
|
1185
|
+
break;
|
|
1186
|
+
}
|
|
1187
|
+
return !found;
|
|
1062
1188
|
});
|
|
1189
|
+
return found;
|
|
1063
1190
|
};
|
|
1064
1191
|
const provenByFunction = new Map();
|
|
1065
1192
|
// Each function's parameter and result writes under its latest analysis:
|
|
@@ -1074,15 +1201,84 @@ export function analyzeInt32Slots(mod) {
|
|
|
1074
1201
|
reads(`param:${fn.name}\0${id}`, fn.name);
|
|
1075
1202
|
// Range facts are consulted only at writes into candidate slots; slots
|
|
1076
1203
|
// are only ever dropped, so a body without such a write needs none.
|
|
1077
|
-
const
|
|
1204
|
+
const candidate = hasCandidateWrite(fn);
|
|
1205
|
+
const ranges = candidate
|
|
1078
1206
|
? analyzeIntegerRanges(numeric(fn), slots.facts(fn.name))
|
|
1079
1207
|
: new Map();
|
|
1080
1208
|
if (ranges.size > 0)
|
|
1081
|
-
lastWrites.set(fn.name, slotWrites(fn, ranges, functions));
|
|
1209
|
+
lastWrites.set(fn.name, slotWrites(fn, ranges, functions, nodes));
|
|
1082
1210
|
else
|
|
1083
1211
|
lastWrites.delete(fn.name);
|
|
1084
1212
|
const proven = [];
|
|
1213
|
+
// The walk below acts only at writes into candidate slots.
|
|
1214
|
+
if (!candidate) {
|
|
1215
|
+
provenByFunction.set(fn.name, proven);
|
|
1216
|
+
continue;
|
|
1217
|
+
}
|
|
1085
1218
|
const int32 = (e) => withinInt32(ranges.get(e));
|
|
1219
|
+
// Every element stored into an int32 array candidate must be an int32
|
|
1220
|
+
// under the facts that assume the candidates' own elements are; a
|
|
1221
|
+
// failing store drops its array's element facts, and the function is
|
|
1222
|
+
// analyzed again without them. When every failing store is still an
|
|
1223
|
+
// exact integer under those facts (a counter, `a[i]! + 1`) and the array
|
|
1224
|
+
// is only ever allocated by a fill that may be long
|
|
1225
|
+
// (checkableInt32Allocations), it keeps int32 slots with checked stores
|
|
1226
|
+
// (checkedInt32Arrays), which widen it to doubles in place at the first
|
|
1227
|
+
// store that is not an int32.
|
|
1228
|
+
const locals = arrayCandidates.get(fn.name);
|
|
1229
|
+
let arrays = locals;
|
|
1230
|
+
if (globalArrayFunctions.has(fn.name)) {
|
|
1231
|
+
const both = new Set();
|
|
1232
|
+
if (locals)
|
|
1233
|
+
for (const id of locals)
|
|
1234
|
+
both.add(id);
|
|
1235
|
+
for (const id of globalArrays)
|
|
1236
|
+
both.add(id);
|
|
1237
|
+
arrays = both;
|
|
1238
|
+
}
|
|
1239
|
+
if (arrays && arrayGroups) {
|
|
1240
|
+
const requeue = (name) => {
|
|
1241
|
+
if (queued.has(name))
|
|
1242
|
+
return;
|
|
1243
|
+
queued.add(name);
|
|
1244
|
+
queue.push(name);
|
|
1245
|
+
};
|
|
1246
|
+
const params = new Set(fn.params.map((param) => param.localId));
|
|
1247
|
+
for (const [id, values] of int32ArrayStores(fn, arrays)) {
|
|
1248
|
+
const key = int32ArrayKey(fn.name, id);
|
|
1249
|
+
if (!slots.hasInt32ElementSlot(int32ArraySlot(key)) || values.every(int32))
|
|
1250
|
+
continue;
|
|
1251
|
+
// The array's group drops together: every function reading a
|
|
1252
|
+
// member is analyzed again without its facts.
|
|
1253
|
+
const group = arrayGroups.group.get(key) ?? [key];
|
|
1254
|
+
for (const member of group) {
|
|
1255
|
+
slots.dropInt32Elements(int32ArraySlot(member));
|
|
1256
|
+
if (member.startsWith("\0")) {
|
|
1257
|
+
const names = arrayGroups.globalReaders.get(member);
|
|
1258
|
+
if (names)
|
|
1259
|
+
for (const name of names)
|
|
1260
|
+
requeue(name);
|
|
1261
|
+
}
|
|
1262
|
+
else
|
|
1263
|
+
requeue(member.slice(0, member.indexOf("\0")));
|
|
1264
|
+
}
|
|
1265
|
+
// Checked stores serve a lone local: its allocations are the only
|
|
1266
|
+
// arrays it holds.
|
|
1267
|
+
const checkable = (value) => {
|
|
1268
|
+
const range = ranges.get(value);
|
|
1269
|
+
return int32(value) || range != null;
|
|
1270
|
+
};
|
|
1271
|
+
if (group.length === 1 &&
|
|
1272
|
+
!key.startsWith("\0") &&
|
|
1273
|
+
!params.has(id) &&
|
|
1274
|
+
values.every(checkable) &&
|
|
1275
|
+
checkableInt32Allocations(fn, id))
|
|
1276
|
+
slots.checkedInt32Arrays.add(key);
|
|
1277
|
+
else
|
|
1278
|
+
for (const member of group)
|
|
1279
|
+
reason(`array:${member}`, "an element store is not int32");
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1086
1282
|
// An int32 written into a slot still assumed non-negative: widen the
|
|
1087
1283
|
// assumption when the value may be negative, and reanalyze its readers.
|
|
1088
1284
|
const settle = (slot, e) => {
|
|
@@ -1128,7 +1324,7 @@ export function analyzeInt32Slots(mod) {
|
|
|
1128
1324
|
else if (dropBox(group, `write in ${fn.name} is not int32`))
|
|
1129
1325
|
invalidate(`box:${group}`);
|
|
1130
1326
|
};
|
|
1131
|
-
walkFunction(fn, {
|
|
1327
|
+
walkFunction(fn, nodes?.scan(CANDIDATE_WRITE_KINDS), {
|
|
1132
1328
|
stmt: (s) => {
|
|
1133
1329
|
if (s.kind === "assign")
|
|
1134
1330
|
boxWrite(s.localId, s.value);
|
|
@@ -1169,8 +1365,11 @@ export function analyzeInt32Slots(mod) {
|
|
|
1169
1365
|
for (const proven of provenByFunction.values())
|
|
1170
1366
|
for (const value of proven)
|
|
1171
1367
|
slots.provenWrites.add(value);
|
|
1172
|
-
|
|
1173
|
-
|
|
1368
|
+
for (const key of arrayKeys)
|
|
1369
|
+
if (slots.hasInt32ElementSlot(int32ArraySlot(key)))
|
|
1370
|
+
slots.int32Arrays.add(key);
|
|
1371
|
+
const ranged = rangedParameters(slots, functions, retry, numeric, (callee) => readers.get(`ret:${callee}`), nodes);
|
|
1372
|
+
narrowSlotRanges(slots, functions, numeric, lastWrites, ranged, (slot) => readers.get(slot), nodes);
|
|
1174
1373
|
return slots;
|
|
1175
1374
|
}
|
|
1176
1375
|
/** Bounds a widened parameter range jumps to: the int32 limits, and the
|
|
@@ -1197,7 +1396,7 @@ const widenMax = (max) => WIDEN_MAX.find((bound) => bound >= max) ?? Infinity;
|
|
|
1197
1396
|
* other waiting functions) fail their parameters and are analyzed too, so
|
|
1198
1397
|
* every call site is checked under the final ranges. The facts the main
|
|
1199
1398
|
* fixpoint proved are fixed here: these ranges only add precision. */
|
|
1200
|
-
function rangedParameters(slots, functions, retry, numeric, callersOf) {
|
|
1399
|
+
function rangedParameters(slots, functions, retry, numeric, callersOf, nodes) {
|
|
1201
1400
|
const changed = new Set();
|
|
1202
1401
|
if (retry.size === 0)
|
|
1203
1402
|
return changed;
|
|
@@ -1280,7 +1479,7 @@ function rangedParameters(slots, functions, retry, numeric, callersOf) {
|
|
|
1280
1479
|
contribute(callee, param.localId, ranges.get(arg) ?? null);
|
|
1281
1480
|
});
|
|
1282
1481
|
};
|
|
1283
|
-
walkFunction(fn, {
|
|
1482
|
+
walkFunction(fn, nodes?.scan(CALL_KINDS), {
|
|
1284
1483
|
expr: (e) => {
|
|
1285
1484
|
if (e.kind === "call")
|
|
1286
1485
|
args(functions.get(e.callee), e.args, 0);
|
|
@@ -1323,7 +1522,7 @@ const sameRange = (a, b) => a.min === b.min && a.max === b.max;
|
|
|
1323
1522
|
/** The values one analysis of a function writes into parameter slots of
|
|
1324
1523
|
* its direct callees and into its own result slot (`param:` and `ret:`
|
|
1325
1524
|
* keys), joined per slot; null when some write has no proven range. */
|
|
1326
|
-
function slotWrites(fn, ranges, functions) {
|
|
1525
|
+
function slotWrites(fn, ranges, functions, nodes) {
|
|
1327
1526
|
const writes = new Map();
|
|
1328
1527
|
const write = (key, value) => {
|
|
1329
1528
|
const range = value ? (ranges.get(value) ?? null) : null;
|
|
@@ -1339,7 +1538,7 @@ function slotWrites(fn, ranges, functions) {
|
|
|
1339
1538
|
write(`param:${callee.name}\0${param.localId}`, arg);
|
|
1340
1539
|
});
|
|
1341
1540
|
};
|
|
1342
|
-
walkFunction(fn, {
|
|
1541
|
+
walkFunction(fn, nodes?.scan(SLOT_WRITE_KINDS), {
|
|
1343
1542
|
stmt: (s) => {
|
|
1344
1543
|
if (s.kind === "return")
|
|
1345
1544
|
write(`ret:${fn.name}`, s.value);
|
|
@@ -1376,7 +1575,7 @@ const NARROW_ROUNDS = 6;
|
|
|
1376
1575
|
* function must still prove every write into a field or box slot (whose
|
|
1377
1576
|
* facts do not change here), or the narrowing is abandoned. Pinned
|
|
1378
1577
|
* (contract) slots keep their contract range. */
|
|
1379
|
-
function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf) {
|
|
1578
|
+
function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf, nodes) {
|
|
1380
1579
|
// Every parameter and result slot with a fact, and that fact.
|
|
1381
1580
|
const proven = new Map();
|
|
1382
1581
|
const fixed = new Set();
|
|
@@ -1437,7 +1636,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
|
|
|
1437
1636
|
if (!rangeWithin(range, level))
|
|
1438
1637
|
sound = false;
|
|
1439
1638
|
};
|
|
1440
|
-
walkFunction(fn, {
|
|
1639
|
+
walkFunction(fn, nodes?.scan(NARROW_WRITE_KINDS), {
|
|
1441
1640
|
stmt: (s) => {
|
|
1442
1641
|
if (s.kind === "assign")
|
|
1443
1642
|
box(s.localId, s.value);
|
|
@@ -1452,7 +1651,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
|
|
|
1452
1651
|
box(e.localId, e.value);
|
|
1453
1652
|
},
|
|
1454
1653
|
});
|
|
1455
|
-
return { writes: slotWrites(fn, ranges, functions), sound };
|
|
1654
|
+
return { writes: slotWrites(fn, ranges, functions, nodes), sound };
|
|
1456
1655
|
};
|
|
1457
1656
|
const writesByFunction = new Map(lastWrites);
|
|
1458
1657
|
const join = () => {
|