@scriptc/compiler 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +470 -66
- package/dist/backend/cycle-analysis.d.ts +4 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +7 -0
- package/dist/backend/cycle-mutability.js +19 -1
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +2 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +6 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +16 -1
- package/dist/backend/llvm/alloc.js +54 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +21 -9
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
- package/dist/backend/llvm/bytes-loop-versions.js +479 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +263 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +7 -5
- package/dist/backend/llvm/classes.js +44 -20
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +167 -7
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +9 -3
- package/dist/backend/llvm/common.js +9 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +83 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +7 -0
- package/dist/backend/llvm/counted-loops.js +18 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -5
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
- package/dist/backend/llvm/dense-array-loops.js +194 -5
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +90 -1
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +30 -0
- package/dist/backend/llvm/dyn.js +373 -70
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +13 -28
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +211 -33
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -4
- package/dist/backend/llvm/emit-statements.js +268 -84
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +186 -37
- package/dist/backend/llvm/emitter.js +733 -90
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +65 -7
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +48 -20
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +28 -14
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +143 -37
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-dynamic.js +18 -11
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +119 -38
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +210 -69
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +25 -1
- package/dist/backend/llvm/integer-values.js +95 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +213 -5
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +4 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +4 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +37 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +94 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +35 -5
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +115 -19
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +10 -0
- package/dist/backend/llvm/publish.js +15 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/receivers.js +6 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +89 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +71 -15
- package/dist/backend/llvm/shapes.js +224 -40
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +12 -0
- package/dist/backend/llvm/string-reads.js +44 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +101 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +7 -0
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- package/dist/backend/target-diagnostics.js +5 -3
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +20 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +10 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.js +4 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.js +12 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -0
- package/dist/diagnostics/envelope.js +1 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +5 -0
- package/dist/executable/executable-cache.js +5 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +949 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +100 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +87 -10
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.js +4 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +7 -1
- package/dist/frontend/lowering/builtins/promises.js +236 -139
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +35 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +24 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +0 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +307 -4
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +4 -1
- package/dist/frontend/lowering/class-construction.js +17 -3
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +49 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -108
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +83 -24
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +31 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +91 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +10 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +5 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +26 -3
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +455 -46
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +7 -2
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +43 -19
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +11 -0
- package/dist/frontend/lowering/date-values.js +207 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/dispatch-sites.js +15 -1
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +47 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +53 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +100 -28
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +169 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +64 -5
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +95 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +138 -51
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +168 -10
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +212 -33
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +6 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +39 -3
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +64 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +7 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +186 -1
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
- package/dist/frontend/lowering/key-order-witness.js +974 -48
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +530 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +15 -3
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +4 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +7 -0
- package/dist/frontend/lowering/lower-calls.js +462 -44
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +324 -69
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +215 -3
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +83 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +42 -32
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +53 -17
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +53 -5
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +5 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +2 -2
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +30 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +553 -81
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +1483 -156
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +107 -8
- package/dist/frontend/lowering/lowerer.js +381 -36
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +73 -8
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +29 -13
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.js +4 -20
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +19 -11
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +5 -1
- package/dist/frontend/program-analysis.js +5 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +21 -6
- package/dist/frontend/program.js +681 -83
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +43 -3
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +22 -0
- package/dist/frontend/ts7/ast-node.js +1048 -103
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +24 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -3
- package/dist/frontend/ts7/ast-wire.js +34 -24
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +4 -0
- package/dist/frontend/ts7/checker.js +7 -0
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +25 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +5 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +22 -0
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +229 -20
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +19 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +24 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +60 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +6 -4
- package/dist/ir/builtin-signatures.js +222 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +14 -16
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +3 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +24 -2
- package/dist/ir/int32-slots.js +266 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +33 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +28 -10
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +10 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +30 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +83 -10
- package/dist/ir/ir.js +77 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +23 -2
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +4 -0
- package/dist/ir/js-ic.js +17 -1
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +46 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +34 -13
- package/dist/ir/runtime-features.js +177 -39
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +18 -6
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +167 -40
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +21 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +4 -2
- package/dist/native/prepare.js +130 -32
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +96 -20
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +2 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/surface-manifest.json +27 -7
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) {
|
|
@@ -351,6 +379,7 @@ const DYN_READ_ONLY = new Set([
|
|
|
351
379
|
"dyn.forInStable",
|
|
352
380
|
"dyn.getOwnPropertyNames",
|
|
353
381
|
"dyn.getPrototype",
|
|
382
|
+
"dyn.getPrototypeForIdentity",
|
|
354
383
|
"dyn.hasKey",
|
|
355
384
|
"dyn.hasOwn",
|
|
356
385
|
"dyn.in",
|
|
@@ -391,6 +420,13 @@ const DYN_READ_ONLY = new Set([
|
|
|
391
420
|
"error.new",
|
|
392
421
|
"error.newOptions",
|
|
393
422
|
"fs.utimesSync",
|
|
423
|
+
// Buffer.prototype members read as values: a lookup by key.
|
|
424
|
+
"buffer.prototypeMember",
|
|
425
|
+
// Buffer.from(value, offset[, length]) over checked values: an
|
|
426
|
+
// ArrayBuffer's view after Node's offset and length conversions, or a copy
|
|
427
|
+
// of a string, array-like or typed array's values.
|
|
428
|
+
"buffer.poolFromDynOffset",
|
|
429
|
+
"buffer.poolFromDynRange",
|
|
394
430
|
"insp.dyn",
|
|
395
431
|
"insp.dynS",
|
|
396
432
|
// The dynamic-tier operators run their dyn twins (scr_js_value.c); the
|
|
@@ -426,7 +462,58 @@ const DYN_READ_ONLY = new Set([
|
|
|
426
462
|
"text.decodeStream",
|
|
427
463
|
"worker.new",
|
|
428
464
|
]);
|
|
429
|
-
|
|
465
|
+
/** The node kinds each walk below reads. */
|
|
466
|
+
const LIB_CALL_KINDS = ["libCall"];
|
|
467
|
+
const CALL_FACT_KINDS = [
|
|
468
|
+
...FUNCTION_REFERENCE_KINDS,
|
|
469
|
+
"virtualCall",
|
|
470
|
+
"instanceOfValue",
|
|
471
|
+
"varRef",
|
|
472
|
+
"assignExpr",
|
|
473
|
+
"incDec",
|
|
474
|
+
"classRef",
|
|
475
|
+
"varDecl",
|
|
476
|
+
"assign",
|
|
477
|
+
"forOf",
|
|
478
|
+
];
|
|
479
|
+
const CENSUS_KINDS = [
|
|
480
|
+
"call",
|
|
481
|
+
"new",
|
|
482
|
+
"varRef",
|
|
483
|
+
"fieldGet",
|
|
484
|
+
"fieldIncDec",
|
|
485
|
+
"closure",
|
|
486
|
+
"classRef",
|
|
487
|
+
"incDec",
|
|
488
|
+
"forOf",
|
|
489
|
+
"tryCatch",
|
|
490
|
+
];
|
|
491
|
+
const DECLARATION_KINDS = ["varDecl"];
|
|
492
|
+
const CANDIDATE_WRITE_KINDS = [
|
|
493
|
+
"assign",
|
|
494
|
+
"varDecl",
|
|
495
|
+
"fieldSet",
|
|
496
|
+
"return",
|
|
497
|
+
"call",
|
|
498
|
+
"new",
|
|
499
|
+
"assignExpr",
|
|
500
|
+
];
|
|
501
|
+
const CALL_KINDS = ["call", "new"];
|
|
502
|
+
const SLOT_WRITE_KINDS = ["return", "call", "new"];
|
|
503
|
+
const NARROW_WRITE_KINDS = ["assign", "varDecl", "fieldSet", "assignExpr"];
|
|
504
|
+
/** Visits the nodes of `fn` in walk order; with `scan`, only those of its
|
|
505
|
+
* kinds, read from the module's node index (the visitors must ignore the
|
|
506
|
+
* other kinds). */
|
|
507
|
+
function walkFunction(fn, scan, visit) {
|
|
508
|
+
if (scan !== undefined) {
|
|
509
|
+
eachNodeOfKinds(fn, scan, (node, statement) => {
|
|
510
|
+
if (statement)
|
|
511
|
+
visit.stmt?.(node);
|
|
512
|
+
else
|
|
513
|
+
visit.expr?.(node);
|
|
514
|
+
});
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
430
517
|
const expr = (e) => {
|
|
431
518
|
visit.expr?.(e);
|
|
432
519
|
return everyExprChild(e, expr, stmt);
|
|
@@ -440,7 +527,7 @@ function walkFunction(fn, visit) {
|
|
|
440
527
|
}
|
|
441
528
|
/** Computes DynamicFieldStores with one walk of every function. Analyses of
|
|
442
529
|
* the same module accept the result so the emitter walks the module once. */
|
|
443
|
-
export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).map((r) => [r.id, r])), unions = new Map((mod.unions ?? []).map((u) => [u.id, u]))) {
|
|
530
|
+
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) {
|
|
444
531
|
const dynTypes = new Map();
|
|
445
532
|
const dynNamed = new Map();
|
|
446
533
|
const dynish = (type) => {
|
|
@@ -480,8 +567,13 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
|
|
|
480
567
|
};
|
|
481
568
|
const dynWritten = new Set();
|
|
482
569
|
let dynWritesAll = false;
|
|
483
|
-
|
|
484
|
-
|
|
570
|
+
// A store whose key is not a literal names every field: later stores add
|
|
571
|
+
// nothing, so the walk stops there.
|
|
572
|
+
const scan = nodes?.scan(LIB_CALL_KINDS);
|
|
573
|
+
for (const fn of mod.functions) {
|
|
574
|
+
if (dynWritesAll)
|
|
575
|
+
break;
|
|
576
|
+
walkFunction(fn, scan, {
|
|
485
577
|
expr: (e) => {
|
|
486
578
|
if (dynWritesAll)
|
|
487
579
|
return;
|
|
@@ -496,6 +588,7 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
|
|
|
496
588
|
}
|
|
497
589
|
},
|
|
498
590
|
});
|
|
591
|
+
}
|
|
499
592
|
return { all: dynWritesAll, names: dynWritten };
|
|
500
593
|
}
|
|
501
594
|
/** The f64 class field families a runtime store through a live dynamic view
|
|
@@ -503,6 +596,21 @@ export function dynamicFieldStores(mod, records = new Map((mod.records ?? []).ma
|
|
|
503
596
|
* another exposed type), and some dynamic store in the program can name the
|
|
504
597
|
* field. */
|
|
505
598
|
export function dynamicallyStoredFamilies(mod, slots, stores) {
|
|
599
|
+
const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
|
|
600
|
+
const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
|
|
601
|
+
// A live dyn view (typed-ref capsule) of an instance writes back into
|
|
602
|
+
// its fields only after a runtime store into the capsule; the commit then
|
|
603
|
+
// writes every field from the view, which holds the exact snapshot value
|
|
604
|
+
// of any property no store named. So reaching dynamic code disqualifies
|
|
605
|
+
// exactly the field names some dynamic store in the program can name.
|
|
606
|
+
const { all: dynWritesAll, names: dynWritten } = stores ?? dynamicFieldStores(mod, records, unions);
|
|
607
|
+
const storable = (field) => field.type.kind === "f64" &&
|
|
608
|
+
!field.name.startsWith("%") &&
|
|
609
|
+
(dynWritesAll || dynWritten.has(field.name));
|
|
610
|
+
const families = new Set();
|
|
611
|
+
// Without a field some store can name, no class is worth exposing.
|
|
612
|
+
if (!(mod.classes ?? []).some((cls) => cls.fields.some(storable)))
|
|
613
|
+
return families;
|
|
506
614
|
const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
|
|
507
615
|
const children = new Map();
|
|
508
616
|
for (const cls of classes.values())
|
|
@@ -524,8 +632,6 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
|
|
|
524
632
|
}
|
|
525
633
|
return out;
|
|
526
634
|
};
|
|
527
|
-
const records = new Map((mod.records ?? []).map((r) => [r.id, r]));
|
|
528
|
-
const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
|
|
529
635
|
const exposedClasses = new Set();
|
|
530
636
|
const seenNamed = new Set();
|
|
531
637
|
let exposeAll = false;
|
|
@@ -574,14 +680,8 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
|
|
|
574
680
|
});
|
|
575
681
|
}
|
|
576
682
|
};
|
|
577
|
-
// A live dyn view (typed-ref capsule) of an instance writes back into
|
|
578
|
-
// its fields only after a runtime store into the capsule; the commit then
|
|
579
|
-
// writes every field from the view, which holds the exact snapshot value
|
|
580
|
-
// of any property no store named. So reaching dynamic code disqualifies
|
|
581
|
-
// exactly the field names some dynamic store in the program can name.
|
|
582
|
-
const { all: dynWritesAll, names: dynWritten } = stores ?? dynamicFieldStores(mod, records, unions);
|
|
583
683
|
for (const fn of mod.functions)
|
|
584
|
-
walkFunction(fn, {
|
|
684
|
+
walkFunction(fn, undefined, {
|
|
585
685
|
expr: (e) => {
|
|
586
686
|
const dynResult = DYN_KINDS.has(e.type.kind);
|
|
587
687
|
const boundary = BOUNDARY_KINDS.has(e.kind);
|
|
@@ -604,14 +704,11 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
|
|
|
604
704
|
expose(s.value.type);
|
|
605
705
|
},
|
|
606
706
|
});
|
|
607
|
-
const families = new Set();
|
|
608
707
|
for (const cls of classes.values()) {
|
|
609
708
|
if (!exposeAll && !exposedClasses.has(cls.name))
|
|
610
709
|
continue;
|
|
611
710
|
for (const field of cls.fields)
|
|
612
|
-
if (field
|
|
613
|
-
!field.name.startsWith("%") &&
|
|
614
|
-
(dynWritesAll || dynWritten.has(field.name)))
|
|
711
|
+
if (storable(field))
|
|
615
712
|
families.add(slots.family(cls.name, field.name));
|
|
616
713
|
}
|
|
617
714
|
return families;
|
|
@@ -620,7 +717,7 @@ export function dynamicallyStoredFamilies(mod, slots, stores) {
|
|
|
620
717
|
* the entry, constructors behind class values: `valueEscaped`), through
|
|
621
718
|
* virtual dispatch (`virtualTargets`), or as vtable entries the runtime
|
|
622
719
|
* calls (`runtimeVirtual`: methods of runtime-rooted hierarchies). */
|
|
623
|
-
export function functionCallFacts(mod, classes, subtree) {
|
|
720
|
+
export function functionCallFacts(mod, classes, subtree, nodes) {
|
|
624
721
|
const escaped = new Set(moduleFunctionReferences(mod));
|
|
625
722
|
const virtualTargets = new Set();
|
|
626
723
|
// Virtual dispatch: a `virtualCall` can reach the method's implementation
|
|
@@ -652,7 +749,7 @@ export function functionCallFacts(mod, classes, subtree) {
|
|
|
652
749
|
const count = (map, id) => {
|
|
653
750
|
map.set(id, (map.get(id) ?? 0) + 1);
|
|
654
751
|
};
|
|
655
|
-
walkFunction(fn, {
|
|
752
|
+
walkFunction(fn, nodes?.scan(CALL_FACT_KINDS), {
|
|
656
753
|
expr: (e) => {
|
|
657
754
|
const referenced = exprFunctionReference(e);
|
|
658
755
|
if (referenced !== undefined)
|
|
@@ -695,6 +792,7 @@ export function functionCallFacts(mod, classes, subtree) {
|
|
|
695
792
|
return { valueEscaped: escaped, virtualTargets, runtimeVirtual };
|
|
696
793
|
}
|
|
697
794
|
export function analyzeInt32Slots(mod, inputs = {}) {
|
|
795
|
+
const nodes = inputs.nodes;
|
|
698
796
|
const classes = new Map((mod.classes ?? []).map((c) => [c.name, c]));
|
|
699
797
|
const slots = new Int32Slots(classes);
|
|
700
798
|
if (mod.lib)
|
|
@@ -723,6 +821,32 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
723
821
|
slots.addInt32Local(key);
|
|
724
822
|
for (const key of contracts?.int32Elements ?? [])
|
|
725
823
|
slots.addInt32Elements(key);
|
|
824
|
+
// Int32 array candidates (ir/int32-arrays.ts): assumed to hold int32
|
|
825
|
+
// elements until a store the fixpoint cannot prove drops one, with every
|
|
826
|
+
// candidate the same array can reach (its group).
|
|
827
|
+
const arrayCandidates = new Map();
|
|
828
|
+
const globalArrays = new Set();
|
|
829
|
+
const arrayKeys = new Set(mod.int32ArrayCandidates ?? []);
|
|
830
|
+
slots.narrowedReads = arrayKeys.size > 0;
|
|
831
|
+
for (const key of arrayKeys) {
|
|
832
|
+
const cut = key.indexOf("\0");
|
|
833
|
+
if (cut === 0)
|
|
834
|
+
globalArrays.add(key.slice(1));
|
|
835
|
+
else {
|
|
836
|
+
const fnName = key.slice(0, cut);
|
|
837
|
+
const set = arrayCandidates.get(fnName) ?? new Set();
|
|
838
|
+
set.add(key.slice(cut + 1));
|
|
839
|
+
arrayCandidates.set(fnName, set);
|
|
840
|
+
}
|
|
841
|
+
slots.addInt32Elements(int32ArraySlot(key));
|
|
842
|
+
}
|
|
843
|
+
const arrayGroups = arrayKeys.size > 0 ? int32ArrayGroups(mod, arrayKeys) : null;
|
|
844
|
+
// Functions that read or write a candidate global.
|
|
845
|
+
const globalArrayFunctions = new Set();
|
|
846
|
+
if (arrayGroups)
|
|
847
|
+
for (const names of arrayGroups.globalReaders.values())
|
|
848
|
+
for (const name of names)
|
|
849
|
+
globalArrayFunctions.add(name);
|
|
726
850
|
/* ── candidate fields ── */
|
|
727
851
|
const children = new Map();
|
|
728
852
|
for (const cls of classes.values())
|
|
@@ -783,7 +907,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
783
907
|
}
|
|
784
908
|
/* ── functions: escapes, parameter and return candidates ── */
|
|
785
909
|
const functions = new Map(mod.functions.map((fn) => [fn.name, fn]));
|
|
786
|
-
const calls = functionCallFacts(mod, classes, subtree);
|
|
910
|
+
const calls = functionCallFacts(mod, classes, subtree, nodes);
|
|
787
911
|
const escaped = new Set([...calls.valueEscaped, ...calls.virtualTargets]);
|
|
788
912
|
const virtual = calls.runtimeVirtual;
|
|
789
913
|
const paramKey = (fnName, localId) => `param:${fnName}\0${localId}`;
|
|
@@ -846,7 +970,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
846
970
|
for (const capture of fn.classCaptures ?? [])
|
|
847
971
|
unstableBoxes.add(boxKey(fn.name, capture.localId));
|
|
848
972
|
const read = new Set();
|
|
849
|
-
walkFunction(fn, {
|
|
973
|
+
walkFunction(fn, nodes?.scan(CENSUS_KINDS), {
|
|
850
974
|
expr: (e) => {
|
|
851
975
|
if (e.kind === "call") {
|
|
852
976
|
called.add(e.callee);
|
|
@@ -958,7 +1082,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
958
1082
|
let ids = initializedDeclarations.get(fn.name);
|
|
959
1083
|
if (ids === undefined) {
|
|
960
1084
|
const found = new Set();
|
|
961
|
-
walkFunction(fn, {
|
|
1085
|
+
walkFunction(fn, nodes?.scan(DECLARATION_KINDS), {
|
|
962
1086
|
stmt: (s) => {
|
|
963
1087
|
if (s.kind === "varDecl" && s.init)
|
|
964
1088
|
found.add(s.localId);
|
|
@@ -1032,31 +1156,44 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
1032
1156
|
}
|
|
1033
1157
|
return false;
|
|
1034
1158
|
};
|
|
1159
|
+
const candidateWrites = nodes?.scan(CANDIDATE_WRITE_KINDS);
|
|
1035
1160
|
const hasCandidateWrite = (fn) => {
|
|
1161
|
+
if (arrayCandidates.has(fn.name))
|
|
1162
|
+
return true;
|
|
1163
|
+
if (globalArrayFunctions.has(fn.name))
|
|
1164
|
+
return true;
|
|
1036
1165
|
const box = (localId) => slots.hasBox(slots.boxGroup(fn.name, localId));
|
|
1037
1166
|
const returns = slots.hasReturn(fn.name);
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1167
|
+
let found = false;
|
|
1168
|
+
eachNodeOfKinds(fn, candidateWrites, (node) => {
|
|
1169
|
+
switch (node.kind) {
|
|
1170
|
+
case "assign":
|
|
1171
|
+
found = box(node.localId);
|
|
1172
|
+
break;
|
|
1173
|
+
case "varDecl":
|
|
1174
|
+
found = node.init !== null && box(node.localId);
|
|
1175
|
+
break;
|
|
1176
|
+
case "fieldSet": {
|
|
1177
|
+
const family = slots.family(node.className, node.field);
|
|
1178
|
+
found = !!family && slots.hasFamily(family);
|
|
1179
|
+
break;
|
|
1047
1180
|
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1181
|
+
case "return":
|
|
1182
|
+
found = returns;
|
|
1183
|
+
break;
|
|
1184
|
+
case "call":
|
|
1185
|
+
found = candidateArgs(functions.get(node.callee), node.args.length, 0);
|
|
1186
|
+
break;
|
|
1187
|
+
case "new":
|
|
1188
|
+
found = candidateArgs(functions.get(`%${node.className}.constructor`), node.args.length, 1);
|
|
1189
|
+
break;
|
|
1190
|
+
case "assignExpr":
|
|
1191
|
+
found = box(node.localId);
|
|
1192
|
+
break;
|
|
1193
|
+
}
|
|
1194
|
+
return !found;
|
|
1059
1195
|
});
|
|
1196
|
+
return found;
|
|
1060
1197
|
};
|
|
1061
1198
|
const provenByFunction = new Map();
|
|
1062
1199
|
// Each function's parameter and result writes under its latest analysis:
|
|
@@ -1071,15 +1208,84 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
1071
1208
|
reads(`param:${fn.name}\0${id}`, fn.name);
|
|
1072
1209
|
// Range facts are consulted only at writes into candidate slots; slots
|
|
1073
1210
|
// are only ever dropped, so a body without such a write needs none.
|
|
1074
|
-
const
|
|
1211
|
+
const candidate = hasCandidateWrite(fn);
|
|
1212
|
+
const ranges = candidate
|
|
1075
1213
|
? analyzeIntegerRanges(numeric(fn), slots.facts(fn.name))
|
|
1076
1214
|
: new Map();
|
|
1077
1215
|
if (ranges.size > 0)
|
|
1078
|
-
lastWrites.set(fn.name, slotWrites(fn, ranges, functions));
|
|
1216
|
+
lastWrites.set(fn.name, slotWrites(fn, ranges, functions, nodes));
|
|
1079
1217
|
else
|
|
1080
1218
|
lastWrites.delete(fn.name);
|
|
1081
1219
|
const proven = [];
|
|
1220
|
+
// The walk below acts only at writes into candidate slots.
|
|
1221
|
+
if (!candidate) {
|
|
1222
|
+
provenByFunction.set(fn.name, proven);
|
|
1223
|
+
continue;
|
|
1224
|
+
}
|
|
1082
1225
|
const int32 = (e) => withinInt32(ranges.get(e));
|
|
1226
|
+
// Every element stored into an int32 array candidate must be an int32
|
|
1227
|
+
// under the facts that assume the candidates' own elements are; a
|
|
1228
|
+
// failing store drops its array's element facts, and the function is
|
|
1229
|
+
// analyzed again without them. When every failing store is still an
|
|
1230
|
+
// exact integer under those facts (a counter, `a[i]! + 1`) and the array
|
|
1231
|
+
// is only ever allocated by a fill that may be long
|
|
1232
|
+
// (checkableInt32Allocations), it keeps int32 slots with checked stores
|
|
1233
|
+
// (checkedInt32Arrays), which widen it to doubles in place at the first
|
|
1234
|
+
// store that is not an int32.
|
|
1235
|
+
const locals = arrayCandidates.get(fn.name);
|
|
1236
|
+
let arrays = locals;
|
|
1237
|
+
if (globalArrayFunctions.has(fn.name)) {
|
|
1238
|
+
const both = new Set();
|
|
1239
|
+
if (locals)
|
|
1240
|
+
for (const id of locals)
|
|
1241
|
+
both.add(id);
|
|
1242
|
+
for (const id of globalArrays)
|
|
1243
|
+
both.add(id);
|
|
1244
|
+
arrays = both;
|
|
1245
|
+
}
|
|
1246
|
+
if (arrays && arrayGroups) {
|
|
1247
|
+
const requeue = (name) => {
|
|
1248
|
+
if (queued.has(name))
|
|
1249
|
+
return;
|
|
1250
|
+
queued.add(name);
|
|
1251
|
+
queue.push(name);
|
|
1252
|
+
};
|
|
1253
|
+
const params = new Set(fn.params.map((param) => param.localId));
|
|
1254
|
+
for (const [id, values] of int32ArrayStores(fn, arrays)) {
|
|
1255
|
+
const key = int32ArrayKey(fn.name, id);
|
|
1256
|
+
if (!slots.hasInt32ElementSlot(int32ArraySlot(key)) || values.every(int32))
|
|
1257
|
+
continue;
|
|
1258
|
+
// The array's group drops together: every function reading a
|
|
1259
|
+
// member is analyzed again without its facts.
|
|
1260
|
+
const group = arrayGroups.group.get(key) ?? [key];
|
|
1261
|
+
for (const member of group) {
|
|
1262
|
+
slots.dropInt32Elements(int32ArraySlot(member));
|
|
1263
|
+
if (member.startsWith("\0")) {
|
|
1264
|
+
const names = arrayGroups.globalReaders.get(member);
|
|
1265
|
+
if (names)
|
|
1266
|
+
for (const name of names)
|
|
1267
|
+
requeue(name);
|
|
1268
|
+
}
|
|
1269
|
+
else
|
|
1270
|
+
requeue(member.slice(0, member.indexOf("\0")));
|
|
1271
|
+
}
|
|
1272
|
+
// Checked stores serve a lone local: its allocations are the only
|
|
1273
|
+
// arrays it holds.
|
|
1274
|
+
const checkable = (value) => {
|
|
1275
|
+
const range = ranges.get(value);
|
|
1276
|
+
return int32(value) || range != null;
|
|
1277
|
+
};
|
|
1278
|
+
if (group.length === 1 &&
|
|
1279
|
+
!key.startsWith("\0") &&
|
|
1280
|
+
!params.has(id) &&
|
|
1281
|
+
values.every(checkable) &&
|
|
1282
|
+
checkableInt32Allocations(fn, id))
|
|
1283
|
+
slots.checkedInt32Arrays.add(key);
|
|
1284
|
+
else
|
|
1285
|
+
for (const member of group)
|
|
1286
|
+
reason(`array:${member}`, "an element store is not int32");
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1083
1289
|
// An int32 written into a slot still assumed non-negative: widen the
|
|
1084
1290
|
// assumption when the value may be negative, and reanalyze its readers.
|
|
1085
1291
|
const settle = (slot, e) => {
|
|
@@ -1125,7 +1331,7 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
1125
1331
|
else if (dropBox(group, `write in ${fn.name} is not int32`))
|
|
1126
1332
|
invalidate(`box:${group}`);
|
|
1127
1333
|
};
|
|
1128
|
-
walkFunction(fn, {
|
|
1334
|
+
walkFunction(fn, nodes?.scan(CANDIDATE_WRITE_KINDS), {
|
|
1129
1335
|
stmt: (s) => {
|
|
1130
1336
|
if (s.kind === "assign")
|
|
1131
1337
|
boxWrite(s.localId, s.value);
|
|
@@ -1166,8 +1372,11 @@ export function analyzeInt32Slots(mod, inputs = {}) {
|
|
|
1166
1372
|
for (const proven of provenByFunction.values())
|
|
1167
1373
|
for (const value of proven)
|
|
1168
1374
|
slots.provenWrites.add(value);
|
|
1169
|
-
|
|
1170
|
-
|
|
1375
|
+
for (const key of arrayKeys)
|
|
1376
|
+
if (slots.hasInt32ElementSlot(int32ArraySlot(key)))
|
|
1377
|
+
slots.int32Arrays.add(key);
|
|
1378
|
+
const ranged = rangedParameters(slots, functions, retry, numeric, (callee) => readers.get(`ret:${callee}`), nodes);
|
|
1379
|
+
narrowSlotRanges(slots, functions, numeric, lastWrites, ranged, (slot) => readers.get(slot), nodes);
|
|
1171
1380
|
return slots;
|
|
1172
1381
|
}
|
|
1173
1382
|
/** Bounds a widened parameter range jumps to: the int32 limits, and the
|
|
@@ -1194,7 +1403,7 @@ const widenMax = (max) => WIDEN_MAX.find((bound) => bound >= max) ?? Infinity;
|
|
|
1194
1403
|
* other waiting functions) fail their parameters and are analyzed too, so
|
|
1195
1404
|
* every call site is checked under the final ranges. The facts the main
|
|
1196
1405
|
* fixpoint proved are fixed here: these ranges only add precision. */
|
|
1197
|
-
function rangedParameters(slots, functions, retry, numeric, callersOf) {
|
|
1406
|
+
function rangedParameters(slots, functions, retry, numeric, callersOf, nodes) {
|
|
1198
1407
|
const changed = new Set();
|
|
1199
1408
|
if (retry.size === 0)
|
|
1200
1409
|
return changed;
|
|
@@ -1277,7 +1486,7 @@ function rangedParameters(slots, functions, retry, numeric, callersOf) {
|
|
|
1277
1486
|
contribute(callee, param.localId, ranges.get(arg) ?? null);
|
|
1278
1487
|
});
|
|
1279
1488
|
};
|
|
1280
|
-
walkFunction(fn, {
|
|
1489
|
+
walkFunction(fn, nodes?.scan(CALL_KINDS), {
|
|
1281
1490
|
expr: (e) => {
|
|
1282
1491
|
if (e.kind === "call")
|
|
1283
1492
|
args(functions.get(e.callee), e.args, 0);
|
|
@@ -1320,7 +1529,7 @@ const sameRange = (a, b) => a.min === b.min && a.max === b.max;
|
|
|
1320
1529
|
/** The values one analysis of a function writes into parameter slots of
|
|
1321
1530
|
* its direct callees and into its own result slot (`param:` and `ret:`
|
|
1322
1531
|
* keys), joined per slot; null when some write has no proven range. */
|
|
1323
|
-
function slotWrites(fn, ranges, functions) {
|
|
1532
|
+
function slotWrites(fn, ranges, functions, nodes) {
|
|
1324
1533
|
const writes = new Map();
|
|
1325
1534
|
const write = (key, value) => {
|
|
1326
1535
|
const range = value ? (ranges.get(value) ?? null) : null;
|
|
@@ -1336,7 +1545,7 @@ function slotWrites(fn, ranges, functions) {
|
|
|
1336
1545
|
write(`param:${callee.name}\0${param.localId}`, arg);
|
|
1337
1546
|
});
|
|
1338
1547
|
};
|
|
1339
|
-
walkFunction(fn, {
|
|
1548
|
+
walkFunction(fn, nodes?.scan(SLOT_WRITE_KINDS), {
|
|
1340
1549
|
stmt: (s) => {
|
|
1341
1550
|
if (s.kind === "return")
|
|
1342
1551
|
write(`ret:${fn.name}`, s.value);
|
|
@@ -1373,7 +1582,7 @@ const NARROW_ROUNDS = 6;
|
|
|
1373
1582
|
* function must still prove every write into a field or box slot (whose
|
|
1374
1583
|
* facts do not change here), or the narrowing is abandoned. Pinned
|
|
1375
1584
|
* (contract) slots keep their contract range. */
|
|
1376
|
-
function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf) {
|
|
1585
|
+
function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, readersOf, nodes) {
|
|
1377
1586
|
// Every parameter and result slot with a fact, and that fact.
|
|
1378
1587
|
const proven = new Map();
|
|
1379
1588
|
const fixed = new Set();
|
|
@@ -1434,7 +1643,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
|
|
|
1434
1643
|
if (!rangeWithin(range, level))
|
|
1435
1644
|
sound = false;
|
|
1436
1645
|
};
|
|
1437
|
-
walkFunction(fn, {
|
|
1646
|
+
walkFunction(fn, nodes?.scan(NARROW_WRITE_KINDS), {
|
|
1438
1647
|
stmt: (s) => {
|
|
1439
1648
|
if (s.kind === "assign")
|
|
1440
1649
|
box(s.localId, s.value);
|
|
@@ -1449,7 +1658,7 @@ function narrowSlotRanges(slots, functions, numeric, lastWrites, changed, reader
|
|
|
1449
1658
|
box(e.localId, e.value);
|
|
1450
1659
|
},
|
|
1451
1660
|
});
|
|
1452
|
-
return { writes: slotWrites(fn, ranges, functions), sound };
|
|
1661
|
+
return { writes: slotWrites(fn, ranges, functions, nodes), sound };
|
|
1453
1662
|
};
|
|
1454
1663
|
const writesByFunction = new Map(lastWrites);
|
|
1455
1664
|
const join = () => {
|