@scriptc/compiler 0.4.2 → 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 +397 -37
- 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 +473 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +258 -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/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 +26 -0
- package/dist/backend/llvm/dyn.js +352 -61
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +11 -20
- 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 +195 -27
- 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 +176 -37
- package/dist/backend/llvm/emitter.js +724 -85
- 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-bytes.js +34 -12
- 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 +129 -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 +100 -28
- 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 +194 -65
- 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 +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 +80 -2
- 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-shared.js +73 -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 +12 -0
- 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-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 +222 -33
- 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-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/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/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-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-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/usage.d.ts +1 -1
- package/dist/cli/usage.js +3 -3
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- 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.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 +2 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -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 +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/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/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 +84 -9
- package/dist/frontend/lowering/builtins/crypto.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/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +88 -2
- 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/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 +39 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -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 +32 -9
- package/dist/frontend/lowering/class-method-mutations.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/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.js +338 -18
- 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-methods.js +15 -0
- 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.js +2 -1
- 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/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 +47 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +36 -2
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +90 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +33 -4
- 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 +113 -11
- 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/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +22 -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 +49 -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/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 +770 -22
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +428 -8
- package/dist/frontend/lowering/key-order-witness.test.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 +443 -41
- 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 +302 -22
- 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 +10 -2
- 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 +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 +18 -6
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +32 -0
- 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 +454 -48
- 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 +77 -6
- package/dist/frontend/lowering/lowerer.js +313 -29
- 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/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +18 -6
- 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 +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 +8 -1
- package/dist/frontend/program.js +484 -69
- 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/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 +191 -11
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +34 -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 +52 -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 +166 -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 +259 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +14 -6
- 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 +70 -7
- package/dist/ir/ir.js +58 -1
- 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 +34 -13
- package/dist/ir/runtime-features.js +152 -38
- 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 +122 -36
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +2 -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 +3 -1
- package/dist/native/prepare.js +119 -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 +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 +26 -4
|
@@ -11,17 +11,20 @@ import { allocateLocalUnion, storeLocalUnion } from "./local-union-storage.js";
|
|
|
11
11
|
import { boxAccess, boxNewCall, elemAccess } from "./shapes.js";
|
|
12
12
|
import { dynHoleRead } from "./loop-array-borrows.js";
|
|
13
13
|
import { endsWithJump, matchStringSelfConcat } from "../../ir/analysis.js";
|
|
14
|
-
import { emitDiscardedSplice } from "./expr-containers.js";
|
|
14
|
+
import { charAtUnitRead, emitDiscardedSplice } from "./expr-containers.js";
|
|
15
15
|
import { InternalCompilerError } from "../../errors.js";
|
|
16
|
-
import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet } from "./dense-array-access.js";
|
|
16
|
+
import { emitDenseArrayGet, emitDenseArrayPop, emitDenseArraySet, SCR_ELEM_I32, } from "./dense-array-access.js";
|
|
17
17
|
import { emitBorrowedInput } from "./borrowed-inputs.js";
|
|
18
|
-
import { f64Lit, llvmCommentText, loadArrCount, sizeToDouble } from "./common.js";
|
|
19
|
-
import {
|
|
18
|
+
import { f64Lit, llvmCommentText, loadArrCount, SCR_ARR_FIELD, sizeToDouble } from "./common.js";
|
|
19
|
+
import { planInt32KindLoop } from "./int32-kind-loops.js";
|
|
20
|
+
import { withinInt32 } from "../../ir/integer-ranges.js";
|
|
21
|
+
import { resultSlotStore } from "../result-slots.js";
|
|
20
22
|
import { matchIntegerArrayForLoop, matchIntegerBytesForLoop, matchIntegerCountedForLoop, matchIntegerPairedForLoop, } from "../../ir/integer-loops.js";
|
|
21
23
|
import { emitByteWindowGuard, matchByteWindow } from "./byte-windows.js";
|
|
22
|
-
import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop } from "./dense-array-loops.js";
|
|
24
|
+
import { countedDenseShape, emitDenseLoopGuard, matchDenseArrayLoop, pairedDenseShape, } from "./dense-array-loops.js";
|
|
23
25
|
import { emitCountedLoopLimit, emitCountedLoopSafety, emitPairedLoopSafety, } from "./counted-loops.js";
|
|
24
26
|
import { emitBytesLoopVersionGuard } from "./bytes-loop-versions.js";
|
|
27
|
+
import { bytesHeaderAlias } from "./bytes-alias.js";
|
|
25
28
|
import { mangleLocal } from "../mangle.js";
|
|
26
29
|
import { LlvmUnsupportedError } from "./unsupported.js";
|
|
27
30
|
import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
|
|
@@ -31,6 +34,7 @@ import { emitLiteralSwitch } from "./switch-dispatch.js";
|
|
|
31
34
|
import { SPECULATIVE_RANGE, emitSafeIntegerCheck, emitSpeculativeInteger, planProvenIntegerLoop, planSpeculativeLoop, speculativeReads, speculativeWriteTarget, } from "./speculative-integers.js";
|
|
32
35
|
import { emitConcatInputs, emitMixedConcat, numberPart, stringParts, } from "./string-construction.js";
|
|
33
36
|
import { emitStringInputs } from "./string-lifetimes.js";
|
|
37
|
+
import { LOOPS } from "./loop-state.js";
|
|
34
38
|
/** A callback loop version copies the loop; keep the copies small. */
|
|
35
39
|
const MAX_CALLBACK_VERSION_COST = 400;
|
|
36
40
|
export function emitStmtBody(emitter, s) {
|
|
@@ -362,11 +366,26 @@ export function emitStmtBody(emitter, s) {
|
|
|
362
366
|
const v = emitter.emitExpr(s.value);
|
|
363
367
|
if (s.arr.type.kind !== "array")
|
|
364
368
|
throw new InternalCompilerError("llvm emitter bug: arraySet on non-array");
|
|
365
|
-
|
|
369
|
+
if (emitter.checkedInt32Array(s.arr)) {
|
|
370
|
+
// An int32 array with checked stores: the int32 arm stores an int32
|
|
371
|
+
// value, and widens the array for any other first.
|
|
372
|
+
emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
|
|
373
|
+
const elem = s.arr.type.elem;
|
|
374
|
+
const proven = emitter.provenDenseIndex(s.arr, s.index);
|
|
375
|
+
emitter.emitByElementKind(arr.name, null, (acc, widened) => {
|
|
376
|
+
if (acc === "i32")
|
|
377
|
+
emitter.emitCheckedInt32Store(arr.name, v.name, s.value, widened);
|
|
378
|
+
emitDenseArraySet(emitter, arr.name, idx, s.index, acc, elem, v.name, proven);
|
|
379
|
+
return null;
|
|
380
|
+
});
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
const acc = emitter.arrayAccess(s.arr, s.arr.type.elem);
|
|
384
|
+
const int32 = emitter.emitInt32KindStoreCheck(s.arr, v, s.value);
|
|
366
385
|
emitter.emitPublishedArrayGuard(arr.name, s.arr.type, 0, idx.name);
|
|
367
386
|
if (acc === "ref")
|
|
368
387
|
emitter.toHeap(v);
|
|
369
|
-
emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index));
|
|
388
|
+
emitDenseArraySet(emitter, arr.name, idx, s.index, acc, s.arr.type.elem, v.name, emitter.provenDenseIndex(s.arr, s.index), int32);
|
|
370
389
|
break;
|
|
371
390
|
}
|
|
372
391
|
case "arraySetLength": {
|
|
@@ -381,6 +400,11 @@ export function emitStmtBody(emitter, s) {
|
|
|
381
400
|
const length = emitter.emitExpr(s.length);
|
|
382
401
|
if (s.arr.type.kind !== "array")
|
|
383
402
|
throw new InternalCompilerError("llvm emitter bug: arraySetLength on non-array");
|
|
403
|
+
if (s.reserve === true) {
|
|
404
|
+
emitter.declare(`declare void @scr_arr_reserve_len(ptr, double)`);
|
|
405
|
+
B.line(`call void @scr_arr_reserve_len(ptr ${arr.name}, double ${length.name})`);
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
384
408
|
emitter.emitPublishedArrayGuard(arr.name, s.arr.type, s.pop === true ? 2 : 3);
|
|
385
409
|
emitter.declare(`declare void @scr_arr_set_len(ptr, double)`);
|
|
386
410
|
// Assigning the current length (a reused work array reset to where
|
|
@@ -406,12 +430,20 @@ export function emitStmtBody(emitter, s) {
|
|
|
406
430
|
B.condBr(dropsLast, pop, call);
|
|
407
431
|
B.startBlock(pop);
|
|
408
432
|
const elem = s.arr.type.elem;
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
433
|
+
if (emitter.checkedInt32Array(s.arr)) {
|
|
434
|
+
emitter.emitByElementKind(arr.name, null, (acc) => {
|
|
435
|
+
emitDenseArrayPop(emitter, arr.name, acc, elem, call, call);
|
|
436
|
+
return null;
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
const acc = emitter.arrayAccess(s.arr, elem);
|
|
441
|
+
const raw = emitDenseArrayPop(emitter, arr.name, acc, elem, call, call);
|
|
442
|
+
if (acc === "ref" && isRefCounted(elem)) {
|
|
443
|
+
const old = B.tmp();
|
|
444
|
+
B.line(`${old} = inttoptr i64 ${raw} to ptr`);
|
|
445
|
+
emitter.releaseHeap(old, elem);
|
|
446
|
+
}
|
|
415
447
|
}
|
|
416
448
|
B.br(done);
|
|
417
449
|
B.startBlock(call);
|
|
@@ -489,10 +521,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
489
521
|
? emitter.classFieldPtr(obj.name, s.className, s.field, "compressed")
|
|
490
522
|
: emitter.recordFieldPtr(obj.name, s.shapeId, s.field);
|
|
491
523
|
// A result-slot entry fills zeroed caller storage, each field once.
|
|
492
|
-
if (
|
|
493
|
-
s.obj.kind === "varRef" &&
|
|
494
|
-
s.obj.localId === RESULT_DST_ID &&
|
|
495
|
-
emitter.currentFunctionName.startsWith(RESULT_ENTRY_PREFIX))
|
|
524
|
+
if (resultSlotStore(emitter.currentFunctionName, s))
|
|
496
525
|
emitter.initField(ptr, type, inline, v);
|
|
497
526
|
else
|
|
498
527
|
emitter.replaceField(ptr, type, inline, v);
|
|
@@ -696,7 +725,12 @@ export function emitStmtBody(emitter, s) {
|
|
|
696
725
|
const trueLabel = B.newLabel("if.t");
|
|
697
726
|
const joinLabel = B.newLabel("if.j");
|
|
698
727
|
const falseLabel = s.else_ ? B.newLabel("if.f") : joinLabel;
|
|
699
|
-
|
|
728
|
+
// A running maximum or minimum is rarely updated; the weights keep
|
|
729
|
+
// the branch, where a select would make each element wait on the last.
|
|
730
|
+
const weights = emitter.runningExtrema.has(s)
|
|
731
|
+
? `, !prof !{!"branch_weights", i32 1, i32 1000}`
|
|
732
|
+
: "";
|
|
733
|
+
B.condBr(cond, trueLabel, falseLabel, weights);
|
|
700
734
|
B.startBlock(trueLabel);
|
|
701
735
|
emitter.emitBlock(s.then);
|
|
702
736
|
B.br(joinLabel);
|
|
@@ -714,6 +748,15 @@ export function emitStmtBody(emitter, s) {
|
|
|
714
748
|
emitCallbackVersionedLoop(emitter, s, callbacks);
|
|
715
749
|
break;
|
|
716
750
|
}
|
|
751
|
+
const version = LOOPS.of(emitter).bytesLoopVersionsEnabled &&
|
|
752
|
+
LOOPS.of(emitter).bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
|
|
753
|
+
!LOOPS.of(emitter).bytesLoopVersioning.has(s)
|
|
754
|
+
? emitter.matchBytesLoopVersion(s, null)
|
|
755
|
+
: null;
|
|
756
|
+
if (version) {
|
|
757
|
+
emitVersionedLoop(emitter, s, version);
|
|
758
|
+
break;
|
|
759
|
+
}
|
|
717
760
|
const workerBudget = emitter.workerLoopBudget(s);
|
|
718
761
|
const le = B.newLabel("loop.e");
|
|
719
762
|
emitter.emitLoopCopies(s, true, le, (exit) => {
|
|
@@ -793,19 +836,19 @@ export function emitStmtBody(emitter, s) {
|
|
|
793
836
|
: null;
|
|
794
837
|
const integerLoop = integerArrayLoop ??
|
|
795
838
|
(emitter.debug === null ? matchIntegerBytesForLoop(s, emitter.numericLocals) : null);
|
|
796
|
-
const countedLoop = !integerLoop && emitter.countedLoopsEnabled
|
|
797
|
-
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, emitter.unaliasedArrays)
|
|
839
|
+
const countedLoop = !integerLoop && LOOPS.of(emitter).countedLoopsEnabled
|
|
840
|
+
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
|
|
798
841
|
: null;
|
|
799
842
|
// Two counters closing in on each other (`lo++, hi--`) take the same
|
|
800
843
|
// integer storage as a counted loop's one.
|
|
801
|
-
const pairedLoop = !integerLoop && !countedLoop && emitter.countedLoopsEnabled
|
|
844
|
+
const pairedLoop = !integerLoop && !countedLoop && LOOPS.of(emitter).countedLoopsEnabled
|
|
802
845
|
? matchIntegerPairedForLoop(s, emitter.numericLocals, emitter.integerRanges)
|
|
803
846
|
: null;
|
|
804
847
|
// Byte windows and dense loops reason about one counter.
|
|
805
|
-
const window = countedLoop && countedLoop.followers.length === 0 && emitter.byteWindowsEnabled
|
|
806
|
-
? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, emitter.byteWindowEntries.get(s) ?? new Set())
|
|
848
|
+
const window = countedLoop && countedLoop.followers.length === 0 && LOOPS.of(emitter).byteWindowsEnabled
|
|
849
|
+
? matchByteWindow(s, countedLoop, emitter.numericLocals, emitter.captureIds, emitter.integerRanges, LOOPS.of(emitter).byteWindowEntries.get(s) ?? new Set())
|
|
807
850
|
: null;
|
|
808
|
-
const denseShape = !emitter.denseLoopsEnabled
|
|
851
|
+
const denseShape = !LOOPS.of(emitter).denseLoopsEnabled
|
|
809
852
|
? null
|
|
810
853
|
: integerArrayLoop
|
|
811
854
|
? {
|
|
@@ -815,27 +858,29 @@ export function emitStmtBody(emitter, s) {
|
|
|
815
858
|
}
|
|
816
859
|
: countedLoop && !countedLoop.guarded && countedLoop.followers.length === 0
|
|
817
860
|
? countedDenseShape(s, countedLoop)
|
|
818
|
-
:
|
|
861
|
+
: pairedLoop
|
|
862
|
+
? pairedDenseShape(pairedLoop)
|
|
863
|
+
: null;
|
|
819
864
|
const dense = denseShape && !window
|
|
820
|
-
? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, emitter.unaliasedArrays, emitter.denseLoopEntries.get(s) ?? new Set())
|
|
865
|
+
? matchDenseArrayLoop(s, denseShape, emitter.numericLocals, LOOPS.of(emitter).unaliasedArrays, LOOPS.of(emitter).denseLoopEntries.get(s) ?? new Set())
|
|
821
866
|
: null;
|
|
822
867
|
if (dense) {
|
|
823
868
|
const valid = emitDenseLoopGuard(emitter, dense);
|
|
824
869
|
const fast = B.newLabel("dense.loop.fast"), slow = B.newLabel("dense.loop.slow"), done = B.newLabel("dense.loop.done");
|
|
825
870
|
B.condBr(valid, fast, slow);
|
|
826
|
-
emitter.denseLoopsEnabled = false;
|
|
871
|
+
LOOPS.of(emitter).denseLoopsEnabled = false;
|
|
827
872
|
try {
|
|
828
873
|
B.startBlock(slow);
|
|
829
874
|
emitter.emitStmt(s);
|
|
830
875
|
B.br(done);
|
|
831
876
|
B.startBlock(fast);
|
|
832
|
-
emitter.denseLoop = dense;
|
|
877
|
+
LOOPS.of(emitter).denseLoop = dense;
|
|
833
878
|
emitter.emitStmt(s);
|
|
834
879
|
B.br(done);
|
|
835
880
|
}
|
|
836
881
|
finally {
|
|
837
|
-
emitter.denseLoop = null;
|
|
838
|
-
emitter.denseLoopsEnabled = true;
|
|
882
|
+
LOOPS.of(emitter).denseLoop = null;
|
|
883
|
+
LOOPS.of(emitter).denseLoopsEnabled = true;
|
|
839
884
|
}
|
|
840
885
|
B.startBlock(done);
|
|
841
886
|
break;
|
|
@@ -845,7 +890,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
845
890
|
const fast = B.newLabel("bytes.window.fast"), slow = B.newLabel("bytes.window.slow"), done = B.newLabel("bytes.window.done");
|
|
846
891
|
B.condBr(valid, fast, slow);
|
|
847
892
|
const originalRanges = emitter.integerRanges, originalBounds = emitter.bytesBounds;
|
|
848
|
-
emitter.byteWindowsEnabled = false;
|
|
893
|
+
LOOPS.of(emitter).byteWindowsEnabled = false;
|
|
849
894
|
try {
|
|
850
895
|
B.startBlock(slow);
|
|
851
896
|
emitter.emitStmt(s);
|
|
@@ -859,55 +904,32 @@ export function emitStmtBody(emitter, s) {
|
|
|
859
904
|
finally {
|
|
860
905
|
emitter.integerRanges = originalRanges;
|
|
861
906
|
emitter.bytesBounds = originalBounds;
|
|
862
|
-
emitter.byteWindowsEnabled = true;
|
|
907
|
+
LOOPS.of(emitter).byteWindowsEnabled = true;
|
|
863
908
|
}
|
|
864
909
|
B.startBlock(done);
|
|
865
910
|
break;
|
|
866
911
|
}
|
|
867
|
-
const versionable = emitter.bytesLoopVersionsEnabled &&
|
|
868
|
-
emitter.bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
|
|
869
|
-
!emitter.bytesLoopVersioning.has(s);
|
|
912
|
+
const versionable = LOOPS.of(emitter).bytesLoopVersionsEnabled &&
|
|
913
|
+
LOOPS.of(emitter).bytesLoopVersioning.size < MAX_BYTES_LOOP_VERSION_DEPTH &&
|
|
914
|
+
!LOOPS.of(emitter).bytesLoopVersioning.has(s);
|
|
870
915
|
// A loop to a typed array's or an array's length keeps its integer
|
|
871
916
|
// induction. Its counted form only gives the version guard the
|
|
872
917
|
// counter's iteration space, so the guard also covers accesses of
|
|
873
918
|
// other typed arrays at the counter, such as `x[i]` and `y[i]` in
|
|
874
919
|
// `for (let i = 0; i < out.length; i++) out[i] = x[i] * y[i]`.
|
|
875
|
-
const versionCounted = versionable && !countedLoop && integerLoop && emitter.countedLoopsEnabled
|
|
876
|
-
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, emitter.unaliasedArrays)
|
|
920
|
+
const versionCounted = versionable && !countedLoop && integerLoop && LOOPS.of(emitter).countedLoopsEnabled
|
|
921
|
+
? matchIntegerCountedForLoop(s, emitter.numericLocals, emitter.integerRanges, LOOPS.of(emitter).unaliasedArrays)
|
|
877
922
|
: countedLoop;
|
|
878
|
-
const version = versionable
|
|
923
|
+
const version = versionable
|
|
924
|
+
? emitter.matchBytesLoopVersion(s, versionCounted, versionCounted ? null : pairedLoop)
|
|
925
|
+
: null;
|
|
879
926
|
if (version) {
|
|
880
|
-
|
|
881
|
-
emitBytesLoopVersionGuard(emitter, version, fast, slow);
|
|
882
|
-
const originalBounds = emitter.bytesBounds, originalOwned = emitter.bytesOwned, originalRanges = emitter.integerRanges;
|
|
883
|
-
emitter.bytesLoopVersioning.add(s);
|
|
884
|
-
try {
|
|
885
|
-
B.startBlock(slow);
|
|
886
|
-
emitter.emitStmt(s);
|
|
887
|
-
B.br(done);
|
|
888
|
-
B.startBlock(fast);
|
|
889
|
-
emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
|
|
890
|
-
if (version.owned.size > 0)
|
|
891
|
-
emitter.bytesOwned = new Set([...originalOwned, ...version.owned]);
|
|
892
|
-
if (version.ranges.size > 0)
|
|
893
|
-
emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
|
|
894
|
-
if (version.counted?.guarded)
|
|
895
|
-
emitter.provenCountedGuards.add(s);
|
|
896
|
-
emitter.emitStmt(s);
|
|
897
|
-
B.br(done);
|
|
898
|
-
}
|
|
899
|
-
finally {
|
|
900
|
-
emitter.bytesBounds = originalBounds;
|
|
901
|
-
emitter.bytesOwned = originalOwned;
|
|
902
|
-
emitter.integerRanges = originalRanges;
|
|
903
|
-
emitter.provenCountedGuards.delete(s);
|
|
904
|
-
emitter.bytesLoopVersioning.delete(s);
|
|
905
|
-
}
|
|
906
|
-
B.startBlock(done);
|
|
927
|
+
emitVersionedLoop(emitter, s, version);
|
|
907
928
|
break;
|
|
908
929
|
}
|
|
909
930
|
let countedJoin = null;
|
|
910
|
-
if ((countedLoop?.guarded
|
|
931
|
+
if ((countedLoop?.guarded || pairedLoop?.guarded) &&
|
|
932
|
+
!LOOPS.of(emitter).provenCountedGuards.has(s)) {
|
|
911
933
|
const safe = countedLoop
|
|
912
934
|
? emitCountedLoopSafety(emitter, countedLoop)
|
|
913
935
|
: emitPairedLoopSafety(emitter, pairedLoop);
|
|
@@ -916,9 +938,9 @@ export function emitStmtBody(emitter, s) {
|
|
|
916
938
|
countedJoin = B.newLabel("counted.done");
|
|
917
939
|
B.condBr(safe, fast, slow);
|
|
918
940
|
B.startBlock(slow);
|
|
919
|
-
emitter.countedLoopsEnabled = false;
|
|
941
|
+
LOOPS.of(emitter).countedLoopsEnabled = false;
|
|
920
942
|
emitter.emitStmt(s);
|
|
921
|
-
emitter.countedLoopsEnabled = true;
|
|
943
|
+
LOOPS.of(emitter).countedLoopsEnabled = true;
|
|
922
944
|
B.br(countedJoin);
|
|
923
945
|
B.startBlock(fast);
|
|
924
946
|
}
|
|
@@ -945,8 +967,8 @@ export function emitStmtBody(emitter, s) {
|
|
|
945
967
|
emitter.integerLoopBindings.set(integerLoop.localId, {
|
|
946
968
|
slot: integerSlot,
|
|
947
969
|
type: emitter.sizeType,
|
|
948
|
-
range: emitter.denseLoop?.counter === integerLoop.localId
|
|
949
|
-
? emitter.denseLoop.range
|
|
970
|
+
range: LOOPS.of(emitter).denseLoop?.counter === integerLoop.localId
|
|
971
|
+
? LOOPS.of(emitter).denseLoop.range
|
|
950
972
|
: { min: 0, max: integerArrayLoop ? 4294967294 : Number.MAX_SAFE_INTEGER - 1 },
|
|
951
973
|
});
|
|
952
974
|
}
|
|
@@ -961,8 +983,8 @@ export function emitStmtBody(emitter, s) {
|
|
|
961
983
|
slot: integerSlot,
|
|
962
984
|
type: "i64",
|
|
963
985
|
signed: true,
|
|
964
|
-
range: emitter.denseLoop?.counter === countedLoop.localId
|
|
965
|
-
? emitter.denseLoop.range
|
|
986
|
+
range: LOOPS.of(emitter).denseLoop?.counter === countedLoop.localId
|
|
987
|
+
? LOOPS.of(emitter).denseLoop.range
|
|
966
988
|
: countedLoop.range,
|
|
967
989
|
});
|
|
968
990
|
for (const follower of countedLoop.followers) {
|
|
@@ -991,11 +1013,14 @@ export function emitStmtBody(emitter, s) {
|
|
|
991
1013
|
B.line(`${start} = fptosi double ${value.name} to i64`);
|
|
992
1014
|
B.line(`store i64 ${start}, ptr ${slot}`);
|
|
993
1015
|
pairedSlots.push(slot);
|
|
1016
|
+
const dense = LOOPS.of(emitter).denseLoop;
|
|
994
1017
|
emitter.integerLoopBindings.set(counter.localId, {
|
|
995
1018
|
slot,
|
|
996
1019
|
type: "i64",
|
|
997
1020
|
signed: true,
|
|
998
|
-
range: pairedLoop.
|
|
1021
|
+
range: dense?.pair && dense.counter === pairedLoop.low.localId
|
|
1022
|
+
? dense.range
|
|
1023
|
+
: pairedLoop.range,
|
|
999
1024
|
});
|
|
1000
1025
|
}
|
|
1001
1026
|
}
|
|
@@ -1063,8 +1088,7 @@ export function emitStmtBody(emitter, s) {
|
|
|
1063
1088
|
B.line(`${inBounds} = icmp ult i32 ${narrow}, ${len}`);
|
|
1064
1089
|
}
|
|
1065
1090
|
else {
|
|
1066
|
-
emitter.
|
|
1067
|
-
B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${emitter.fieldAliasAttachment(lenPtr)}`);
|
|
1091
|
+
B.line(`${len} = load ${emitter.sizeType}, ptr ${lenPtr}${bytesHeaderAlias(emitter)}`);
|
|
1068
1092
|
B.line(`${inBounds} = icmp ult ${emitter.sizeType} ${index}, ${len}`);
|
|
1069
1093
|
}
|
|
1070
1094
|
B.condBr(inBounds, lb, exit);
|
|
@@ -1701,7 +1725,7 @@ export function emitTryCatch(emitter, s) {
|
|
|
1701
1725
|
* case, refcounted/boxed case-body locals are NULL-reset up front and
|
|
1702
1726
|
* the scope-exit releases rely on NULL tolerance. */
|
|
1703
1727
|
export function emitSwitch(emitter, s) {
|
|
1704
|
-
const unitSwitch = charAtUnitSwitch(s);
|
|
1728
|
+
const unitSwitch = charAtUnitSwitch(emitter, s);
|
|
1705
1729
|
if (unitSwitch !== null)
|
|
1706
1730
|
return emitSwitch(emitter, unitSwitch);
|
|
1707
1731
|
const B = emitter.B;
|
|
@@ -1904,6 +1928,39 @@ const SPECULATION_BAILS = 8;
|
|
|
1904
1928
|
* when speculative-integers.ts plans a fast integer copy. Both copies
|
|
1905
1929
|
* share the loop's setup and exit; the ordinary copy comes first so the
|
|
1906
1930
|
* fast copy is only emitted when every resume point exists. */
|
|
1931
|
+
/** A typed-array loop version: the guard, then the checked copy, which
|
|
1932
|
+
* runs whenever the guard fails, and the copy whose accesses the guard
|
|
1933
|
+
* proves in bounds (or thread-owned). */
|
|
1934
|
+
function emitVersionedLoop(emitter, s, version) {
|
|
1935
|
+
const B = emitter.B;
|
|
1936
|
+
const fast = B.newLabel("bytes.version.fast"), slow = B.newLabel("bytes.version.slow"), done = B.newLabel("bytes.version.done");
|
|
1937
|
+
emitBytesLoopVersionGuard(emitter, version, fast, slow);
|
|
1938
|
+
const originalBounds = emitter.bytesBounds, originalOwned = emitter.bytesOwned, originalRanges = emitter.integerRanges;
|
|
1939
|
+
LOOPS.of(emitter).bytesLoopVersioning.add(s);
|
|
1940
|
+
try {
|
|
1941
|
+
B.startBlock(slow);
|
|
1942
|
+
emitter.emitStmt(s);
|
|
1943
|
+
B.br(done);
|
|
1944
|
+
B.startBlock(fast);
|
|
1945
|
+
emitter.bytesBounds = new Set([...originalBounds, ...version.bounds]);
|
|
1946
|
+
if (version.owned.size > 0)
|
|
1947
|
+
emitter.bytesOwned = new Set([...originalOwned, ...version.owned]);
|
|
1948
|
+
if (version.ranges.size > 0)
|
|
1949
|
+
emitter.integerRanges = new Map([...originalRanges, ...version.ranges]);
|
|
1950
|
+
if (version.counted?.guarded || version.paired?.loop.guarded)
|
|
1951
|
+
LOOPS.of(emitter).provenCountedGuards.add(s);
|
|
1952
|
+
emitter.emitStmt(s);
|
|
1953
|
+
B.br(done);
|
|
1954
|
+
}
|
|
1955
|
+
finally {
|
|
1956
|
+
emitter.bytesBounds = originalBounds;
|
|
1957
|
+
emitter.bytesOwned = originalOwned;
|
|
1958
|
+
emitter.integerRanges = originalRanges;
|
|
1959
|
+
LOOPS.of(emitter).provenCountedGuards.delete(s);
|
|
1960
|
+
LOOPS.of(emitter).bytesLoopVersioning.delete(s);
|
|
1961
|
+
}
|
|
1962
|
+
B.startBlock(done);
|
|
1963
|
+
}
|
|
1907
1964
|
export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
1908
1965
|
const plan = allowed &&
|
|
1909
1966
|
emitter.speculativeLoopsEnabled &&
|
|
@@ -1918,11 +1975,25 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
1918
1975
|
}, (id) => emitter.speculativeLocal(id) || emitter.speculativeInvariantGlobal(id))
|
|
1919
1976
|
: null;
|
|
1920
1977
|
if (!plan) {
|
|
1921
|
-
const
|
|
1922
|
-
|
|
1923
|
-
|
|
1978
|
+
const ordinary = (exit) => {
|
|
1979
|
+
const proven = allowed ? planProvenLoop(emitter, loop) : null;
|
|
1980
|
+
if (proven)
|
|
1981
|
+
emitProvenLoop(emitter, proven, exit, emitCopy);
|
|
1982
|
+
else
|
|
1983
|
+
emitCopy(exit);
|
|
1984
|
+
};
|
|
1985
|
+
const kinds = allowed &&
|
|
1986
|
+
emitter.speculativeLoopsEnabled &&
|
|
1987
|
+
emitter.int32Slots.checkedInt32Arrays.size > 0 &&
|
|
1988
|
+
emitter.int32Kinds === null &&
|
|
1989
|
+
emitter.speculation === null &&
|
|
1990
|
+
emitter.speculationResume === null
|
|
1991
|
+
? planInt32KindLoop(loop, (id) => emitter.checkedInt32Local(id), (e) => withinInt32(emitter.integerRanges.get(e)))
|
|
1992
|
+
: null;
|
|
1993
|
+
if (kinds)
|
|
1994
|
+
emitInt32KindLoop(emitter, kinds, exit, kinds.writes.size > 0 ? emitCopy : ordinary);
|
|
1924
1995
|
else
|
|
1925
|
-
|
|
1996
|
+
ordinary(exit);
|
|
1926
1997
|
return;
|
|
1927
1998
|
}
|
|
1928
1999
|
const B = emitter.B;
|
|
@@ -1948,8 +2019,7 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
1948
2019
|
// count. After SPECULATION_BAILS bailing entries in a row, the site runs
|
|
1949
2020
|
// the ordinary copy only. The count is a hint: both copies give the same
|
|
1950
2021
|
// results, and a race between workers loses at most an update.
|
|
1951
|
-
const bails =
|
|
1952
|
-
emitter.declare(`${bails} = internal global i8 0`);
|
|
2022
|
+
const bails = emitter.speculativeLoopSite();
|
|
1953
2023
|
const count = B.tmp(), trying = B.tmp();
|
|
1954
2024
|
B.line(`${count} = load atomic i8, ptr ${bails} unordered, align 1`);
|
|
1955
2025
|
B.line(`${trying} = icmp ult i8 ${count}, ${SPECULATION_BAILS}`);
|
|
@@ -2068,6 +2138,120 @@ export function emitLoopCopies(emitter, loop, allowed, exit, emitCopy) {
|
|
|
2068
2138
|
emitter.integerLoopBindings.delete(id);
|
|
2069
2139
|
}
|
|
2070
2140
|
}
|
|
2141
|
+
/** An int32 kind loop (int32-kind-loops.ts). The entry test reads the kind
|
|
2142
|
+
* of each of the plan's arrays: when every one holds int32 slots the fast
|
|
2143
|
+
* copy runs, when every one holds doubles the wide copy, which reads and
|
|
2144
|
+
* writes them as double arrays, and otherwise (a plan with several arrays)
|
|
2145
|
+
* the mixed copy, which tests their kinds at each access. A failed store of
|
|
2146
|
+
* the fast copy re-executes in the third copy, which finishes its
|
|
2147
|
+
* iteration with kind tests and then enters the mixed copy, or the wide
|
|
2148
|
+
* copy when the plan has one array (it just widened). Each copy is emitted
|
|
2149
|
+
* by `ordinary`: the loop's plain copy when a store may fail, since a
|
|
2150
|
+
* proven integer loop keeps locals in shadows of its own copy that another
|
|
2151
|
+
* copy cannot resume from. */
|
|
2152
|
+
function emitInt32KindLoop(emitter, plan, exit, ordinary) {
|
|
2153
|
+
const B = emitter.B;
|
|
2154
|
+
const fn = emitter.currentFunctionName;
|
|
2155
|
+
const keys = new Set([...plan.arrays.keys()].map((id) => `${fn}\0${id}`));
|
|
2156
|
+
const several = keys.size > 1;
|
|
2157
|
+
let allInt32 = "true", allWide = "true";
|
|
2158
|
+
const and = (all, next) => {
|
|
2159
|
+
if (all === "true")
|
|
2160
|
+
return next;
|
|
2161
|
+
const both = B.tmp();
|
|
2162
|
+
B.line(`${both} = and i1 ${all}, ${next}`);
|
|
2163
|
+
return both;
|
|
2164
|
+
};
|
|
2165
|
+
for (const ref of plan.arrays.values()) {
|
|
2166
|
+
const arr = emitter.emitStableReceiver(ref, []);
|
|
2167
|
+
const kindPtr = B.tmp(), kind = B.tmp(), isInt32 = B.tmp();
|
|
2168
|
+
B.line(`${kindPtr} = getelementptr inbounds %ScrArr, ptr ${arr.name}, i32 0, i32 ${SCR_ARR_FIELD.elem}`);
|
|
2169
|
+
emitter.markMemoryPointer(kindPtr, "array:header");
|
|
2170
|
+
B.line(`${kind} = load i8, ptr ${kindPtr}${emitter.fieldAliasAttachment(kindPtr)}`);
|
|
2171
|
+
B.line(`${isInt32} = icmp eq i8 ${kind}, ${SCR_ELEM_I32}`);
|
|
2172
|
+
allInt32 = and(allInt32, isInt32);
|
|
2173
|
+
if (several) {
|
|
2174
|
+
const isWide = B.tmp();
|
|
2175
|
+
B.line(`${isWide} = xor i1 ${isInt32}, true`);
|
|
2176
|
+
allWide = and(allWide, isWide);
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
const fast = B.newLabel("kind.fast"), wide = B.newLabel("kind.wide"), mixed = several ? B.newLabel("kind.mixed") : null;
|
|
2180
|
+
if (mixed === null)
|
|
2181
|
+
B.condBr(allInt32, fast, wide);
|
|
2182
|
+
else {
|
|
2183
|
+
const other = B.newLabel("kind.other");
|
|
2184
|
+
B.condBr(allInt32, fast, other);
|
|
2185
|
+
B.startBlock(other);
|
|
2186
|
+
B.condBr(allWide, wide, mixed);
|
|
2187
|
+
}
|
|
2188
|
+
const resume = new Map();
|
|
2189
|
+
for (const s of plan.writes)
|
|
2190
|
+
resume.set(s, { label: B.newLabel("kind.resume"), placed: false });
|
|
2191
|
+
// The header the third copy enters: the mixed copy's, or the wide copy's.
|
|
2192
|
+
let header = null;
|
|
2193
|
+
const capture = (label) => {
|
|
2194
|
+
header = label;
|
|
2195
|
+
};
|
|
2196
|
+
B.startBlock(wide);
|
|
2197
|
+
if (resume.size > 0 && mixed === null)
|
|
2198
|
+
emitter.speculationHeader = capture;
|
|
2199
|
+
emitter.int32Kinds = { int32: new Set(), wide: keys, resume: new Map() };
|
|
2200
|
+
try {
|
|
2201
|
+
ordinary(exit);
|
|
2202
|
+
}
|
|
2203
|
+
finally {
|
|
2204
|
+
emitter.speculationHeader = null;
|
|
2205
|
+
emitter.int32Kinds = null;
|
|
2206
|
+
}
|
|
2207
|
+
if (mixed !== null) {
|
|
2208
|
+
B.startBlock(mixed);
|
|
2209
|
+
if (resume.size > 0)
|
|
2210
|
+
emitter.speculationHeader = capture;
|
|
2211
|
+
try {
|
|
2212
|
+
ordinary(exit);
|
|
2213
|
+
}
|
|
2214
|
+
finally {
|
|
2215
|
+
emitter.speculationHeader = null;
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
if (resume.size > 0) {
|
|
2219
|
+
if (header === null)
|
|
2220
|
+
throw new InternalCompilerError("llvm emitter bug: int32 kind loop copy without a header");
|
|
2221
|
+
// A failed store finishes its iteration here, as in a speculative
|
|
2222
|
+
// integer loop's third copy.
|
|
2223
|
+
B.startBlock(B.newLabel("kind.tail"));
|
|
2224
|
+
emitter.speculationResume = resume;
|
|
2225
|
+
emitter.speculationHeader = () => {
|
|
2226
|
+
B.br(header);
|
|
2227
|
+
B.startBlock(B.newLabel("kind.unused"));
|
|
2228
|
+
};
|
|
2229
|
+
try {
|
|
2230
|
+
ordinary(exit);
|
|
2231
|
+
}
|
|
2232
|
+
finally {
|
|
2233
|
+
emitter.speculationResume = null;
|
|
2234
|
+
emitter.speculationHeader = null;
|
|
2235
|
+
}
|
|
2236
|
+
}
|
|
2237
|
+
B.startBlock(fast);
|
|
2238
|
+
if (![...resume.values()].every((r) => r.placed)) {
|
|
2239
|
+
// A write the third copy never reached: this copy tests the kinds.
|
|
2240
|
+
ordinary(exit);
|
|
2241
|
+
return;
|
|
2242
|
+
}
|
|
2243
|
+
emitter.int32Kinds = {
|
|
2244
|
+
int32: keys,
|
|
2245
|
+
wide: new Set(),
|
|
2246
|
+
resume: new Map([...resume].map(([s, r]) => [s, r.label])),
|
|
2247
|
+
};
|
|
2248
|
+
try {
|
|
2249
|
+
ordinary(exit);
|
|
2250
|
+
}
|
|
2251
|
+
finally {
|
|
2252
|
+
emitter.int32Kinds = null;
|
|
2253
|
+
}
|
|
2254
|
+
}
|
|
2071
2255
|
/** At the top of a loop copy's header: lets a speculative loop find its
|
|
2072
2256
|
* ordinary copy's header, and keeps its third copy out of the loop. */
|
|
2073
2257
|
function enterLoopHeader(emitter, header) {
|
|
@@ -2319,7 +2503,7 @@ function nullableStringSwitch(emitter, s) {
|
|
|
2319
2503
|
* one-unit string literals, as a switch on `s.charCodeAt(i)` with the units
|
|
2320
2504
|
* as cases: no character string is built. An index out of range answers
|
|
2321
2505
|
* NaN, which matches no case, as "" matches no one-unit literal. */
|
|
2322
|
-
function charAtUnitSwitch(s) {
|
|
2506
|
+
function charAtUnitSwitch(emitter, s) {
|
|
2323
2507
|
const disc = s.disc;
|
|
2324
2508
|
if (disc.kind !== "strIntrinsic" || disc.method !== "charAt" || disc.args.length !== 1)
|
|
2325
2509
|
return null;
|
|
@@ -2329,7 +2513,7 @@ function charAtUnitSwitch(s) {
|
|
|
2329
2513
|
return null;
|
|
2330
2514
|
return {
|
|
2331
2515
|
...s,
|
|
2332
|
-
disc:
|
|
2516
|
+
disc: charAtUnitRead(emitter, disc),
|
|
2333
2517
|
cases: s.cases.map((c) => c.test?.kind === "strLit"
|
|
2334
2518
|
? {
|
|
2335
2519
|
...c,
|