@scriptc/compiler 0.4.3 → 0.4.5
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 +270 -72
- package/ambient/scriptc-overrides.d.ts +21 -0
- package/dist/backend/executable-features.js +3 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +2 -1
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.js +11 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +9 -0
- package/dist/backend/lld.js +48 -0
- package/dist/backend/lld.js.map +1 -0
- package/dist/backend/lld.test.d.ts +1 -0
- package/dist/backend/lld.test.js +53 -0
- package/dist/backend/lld.test.js.map +1 -0
- package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
- package/dist/backend/llvm/appended-array-literals.js +29 -0
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/blocks.js +10 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +13 -4
- package/dist/backend/llvm/bytes-alias.js +16 -5
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
- package/dist/backend/llvm/bytes-bounds.js +199 -2
- package/dist/backend/llvm/bytes-bounds.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
- package/dist/backend/llvm/bytes-loop-versions.js +244 -20
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +18 -6
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
- package/dist/backend/llvm/call-lifetimes.js +87 -18
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +132 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +3 -2
- package/dist/backend/llvm/classes.js +4 -4
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +14 -2
- package/dist/backend/llvm/counted-loops.js +54 -5
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +42 -1
- package/dist/backend/llvm/debug-info.js +72 -6
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.js +2 -2
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +1 -0
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +69 -8
- package/dist/backend/llvm/dyn.js +396 -49
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +30 -16
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +8 -4
- package/dist/backend/llvm/emit-journal.js +75 -5
- package/dist/backend/llvm/emit-journal.js.map +1 -1
- package/dist/backend/llvm/emit-module.d.ts +4 -0
- package/dist/backend/llvm/emit-module.js +74 -29
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.js +297 -28
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +144 -13
- package/dist/backend/llvm/emitter.js +523 -92
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +11 -2
- 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.d.ts +6 -4
- package/dist/backend/llvm/expr-bytes.js +45 -16
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +13 -11
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +11 -0
- package/dist/backend/llvm/expr-containers.js +101 -9
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +3 -0
- package/dist/backend/llvm/expr-control.js +83 -0
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
- package/dist/backend/llvm/expr-dynamic.js +22 -4
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +121 -14
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +111 -26
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/forked-analysis.d.ts +8 -0
- package/dist/backend/llvm/forked-analysis.js +43 -0
- package/dist/backend/llvm/forked-analysis.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +12 -0
- package/dist/backend/llvm/integer-values.js +69 -5
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/integer-views.d.ts +2 -1
- package/dist/backend/llvm/integer-views.js +12 -1
- package/dist/backend/llvm/integer-views.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +4 -0
- package/dist/backend/llvm/js-ic.js +133 -15
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +1 -0
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +6 -1
- package/dist/backend/llvm/lazy-captures.js +10 -5
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lib-abi.d.ts +5 -0
- package/dist/backend/llvm/lib-abi.js +19 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +249 -33
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
- package/dist/backend/llvm/lib-filesystem.js +32 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +2 -2
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +2 -0
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +48 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +64 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +28 -3
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +2 -1
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
- package/dist/backend/llvm/loop-array-borrows.js +11 -5
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
- package/dist/backend/llvm/map-entry-fusion.js +20 -11
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
- package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
- package/dist/backend/llvm/map-number-lookup.js +41 -9
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +70 -2
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
- package/dist/backend/llvm/map-read-lifetimes.js +136 -6
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +5 -0
- package/dist/backend/llvm/nullable-unions.js +29 -2
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.js +25 -1
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
- package/dist/backend/llvm/publish.js +3 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
- package/dist/backend/llvm/record-union-keys.test.js +161 -0
- package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +4 -5
- package/dist/backend/llvm/shapes.js +106 -58
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +14 -2
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +50 -3
- package/dist/backend/llvm/speculative-integers.js +411 -24
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +103 -1
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
- package/dist/backend/llvm/split.d.ts +10 -1
- package/dist/backend/llvm/split.js +243 -59
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +92 -13
- package/dist/backend/llvm/split.test.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.test.js +3 -2
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +13 -0
- package/dist/backend/llvm/string-reads.js +22 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +36 -2
- package/dist/backend/llvm/string-slices.js +308 -12
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/string-slices.test.js +182 -3
- package/dist/backend/llvm/string-slices.test.js.map +1 -1
- package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
- package/dist/backend/llvm/string-unit-versions.js +191 -0
- package/dist/backend/llvm/string-unit-versions.js.map +1 -0
- package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
- package/dist/backend/llvm/string-unit-versions.test.js +117 -0
- package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
- package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
- package/dist/backend/llvm/test-boxed-unions.js +24 -8
- package/dist/backend/llvm/test-boxed-unions.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/unwind-abi.d.ts +52 -0
- package/dist/backend/llvm/unwind-abi.js +498 -0
- package/dist/backend/llvm/unwind-abi.js.map +1 -0
- package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
- package/dist/backend/llvm/unwind-abi.test.js +255 -0
- package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
- package/dist/backend/llvm/walkers.js +13 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
- package/dist/backend/llvm/wrapping-sums.js +31 -14
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/loop-polls.d.ts +6 -0
- package/dist/backend/loop-polls.js +24 -0
- package/dist/backend/loop-polls.js.map +1 -1
- package/dist/backend/may-throw.js +8 -8
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +12 -2
- package/dist/backend/native/executable.js +48 -6
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +4 -3
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/program-shards.d.ts +2 -2
- package/dist/backend/native/program-shards.js +2 -2
- package/dist/backend/native/program-shards.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +4 -1
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.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.d.ts +3 -1
- package/dist/backend/native-codegen.js +4 -3
- package/dist/backend/native-codegen.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 +8 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +14 -0
- package/dist/backend/native-profile.js +28 -0
- package/dist/backend/native-profile.js.map +1 -1
- package/dist/backend/native-profile.test.js +8 -1
- package/dist/backend/native-profile.test.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +11 -11
- package/dist/backend/native-toolchain.test.js.map +1 -1
- 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 +3 -1
- package/dist/backend/runtime-pack-core.js +2 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +17 -5
- package/dist/backend/runtime-pack-native.js +186 -14
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.js +160 -3
- package/dist/backend/runtime-pack-native.test.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/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/vendor-archives.d.ts +4 -1
- package/dist/backend/vendor-archives.js +78 -4
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +3 -1
- package/dist/backend/vendor-inputs.js +3 -1
- package/dist/backend/vendor-inputs.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 +98 -12
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +25 -1
- package/dist/cli/usage.js +40 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +15 -6
- package/dist/compat/fetch-profile.js +519 -498
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +14 -0
- package/dist/contracts/int32-elements.js +2 -1
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.d.ts +14 -3
- package/dist/coverage/report.js +216 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +25 -25
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +2 -0
- package/dist/coverage/verdict-cache.js +10 -1
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +19 -0
- package/dist/diagnostics/diagnostic.js +53 -2
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +54 -0
- package/dist/diagnostics/envelope.js +7 -1
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/render.d.ts +7 -0
- package/dist/diagnostics/render.js +15 -4
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +6 -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/executable/prepare.js +5 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +26 -2
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/decl-projection.js +105 -10
- package/dist/frontend/decl-projection.js.map +1 -1
- package/dist/frontend/fork-target.js +67 -1
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.js +43 -0
- package/dist/frontend/fork-target.test.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +4 -1
- package/dist/frontend/input-tracker.js +42 -4
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +45 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +38 -1
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/argument-counts.d.ts +36 -0
- package/dist/frontend/lowering/argument-counts.js +201 -0
- package/dist/frontend/lowering/argument-counts.js.map +1 -0
- package/dist/frontend/lowering/array-values.d.ts +27 -0
- package/dist/frontend/lowering/array-values.js +112 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
- package/dist/frontend/lowering/binding-analysis.js +9 -3
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
- package/dist/frontend/lowering/builtin-namespaces.js +238 -0
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
- 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/compression.d.ts +4 -3
- package/dist/frontend/lowering/builtins/compression.js +86 -5
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +3 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.js +17 -1
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
- package/dist/frontend/lowering/builtins/dates.js +163 -9
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +29 -4
- 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/fs-streams.d.ts +4 -0
- package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.d.ts +4 -1
- package/dist/frontend/lowering/builtins/json.js +9 -3
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
- 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/module-resolution.d.ts +5 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
- package/dist/frontend/lowering/builtins/promises.js +293 -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 +22 -11
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
- package/dist/frontend/lowering/builtins/reflection.js +41 -1
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +4 -1
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
- package/dist/frontend/lowering/builtins/x509.js +431 -0
- package/dist/frontend/lowering/builtins/x509.js.map +1 -0
- package/dist/frontend/lowering/call-arguments.js +44 -0
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +1 -2
- 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 +308 -5
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-attributes.d.ts +7 -0
- package/dist/frontend/lowering/class-attributes.js +52 -10
- package/dist/frontend/lowering/class-attributes.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +23 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +288 -9
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +97 -26
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +71 -1
- package/dist/frontend/lowering/class-method-values.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.d.ts +8 -0
- package/dist/frontend/lowering/class-prototypes.js +83 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
- package/dist/frontend/lowering/class-to-primitive.js +79 -7
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +1 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +89 -10
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
- package/dist/frontend/lowering/coercions/unions.js +13 -6
- package/dist/frontend/lowering/coercions/unions.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-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +58 -21
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
- package/dist/frontend/lowering/containers/array-construction.js +107 -9
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +96 -8
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
- 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 +453 -45
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +12 -0
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
- package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
- package/dist/frontend/lowering/containers/replacer-params.js +294 -0
- package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
- package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
- package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
- package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +7 -3
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
- package/dist/frontend/lowering/cycle-initialization.js +4 -1
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +14 -0
- package/dist/frontend/lowering/date-values.js +254 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.js +1 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
- package/dist/frontend/lowering/expressions/array-literals.js +125 -26
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +102 -26
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +129 -6
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +66 -4
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
- package/dist/frontend/lowering/expressions/narrowing.js +8 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +8 -2
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +121 -34
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +76 -11
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +12 -1
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +37 -11
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/f64-handles.d.ts +8 -0
- package/dist/frontend/lowering/f64-handles.js +16 -0
- package/dist/frontend/lowering/f64-handles.js.map +1 -0
- package/dist/frontend/lowering/frozen-records.d.ts +5 -0
- package/dist/frontend/lowering/frozen-records.js +12 -4
- package/dist/frontend/lowering/frozen-records.js.map +1 -1
- package/dist/frontend/lowering/function-context.d.ts +3 -0
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +30 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +17 -6
- 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/instantiation-path.d.ts +3 -2
- package/dist/frontend/lowering/instantiation-path.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.test.js +6 -4
- package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
- package/dist/frontend/lowering/iterator-adapters.js +26 -33
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
- package/dist/frontend/lowering/js-collection-types.js +490 -0
- package/dist/frontend/lowering/js-collection-types.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.js +210 -32
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +104 -4
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +2 -2
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.d.ts +14 -0
- package/dist/frontend/lowering/lower-assert.js +298 -29
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +3 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +116 -10
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +59 -7
- package/dist/frontend/lowering/lower-classes.js +668 -222
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-console.js +2 -1
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
- package/dist/frontend/lowering/lower-exprs.js +254 -3
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +7 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +5 -4
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +299 -57
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +49 -22
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
- package/dist/frontend/lowering/lower-namespaces.js +44 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.js +1 -1
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +126 -32
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
- package/dist/frontend/lowering/lower-stdlib.js +51 -37
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +393 -79
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +515 -121
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +82 -12
- package/dist/frontend/lowering/lowerer.js +317 -44
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +1 -1
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
- package/dist/frontend/lowering/module-namespace-elements.js +118 -1
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- 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/private-brands.d.ts +5 -0
- package/dist/frontend/lowering/private-brands.js +39 -0
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.js +2 -0
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
- package/dist/frontend/lowering/site-dependencies.js +0 -15
- package/dist/frontend/lowering/site-dependencies.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.test.js +7 -5
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
- package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
- package/dist/frontend/lowering/string-index-bounds.js +21 -7
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +12 -3
- package/dist/frontend/lowering/surfaces.js +1630 -1540
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
- package/dist/frontend/lowering/symbol-fields.js +45 -2
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.d.ts +5 -2
- package/dist/frontend/lowering/union-narrow.js +6 -3
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.test.js +10 -0
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
- package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
- package/dist/frontend/npm-static-namespace-defaults.js +163 -0
- package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
- package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
- package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
- package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
- package/dist/frontend/npm-static-prune.js +152 -111
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static.js +35 -32
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +7 -4
- package/dist/frontend/package-shims.js +39 -40
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline-native.d.ts +2 -2
- package/dist/frontend/pipeline-native.js +2 -2
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +19 -2
- package/dist/frontend/pipeline.js +103 -12
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +7 -1
- package/dist/frontend/program-analysis.js +8 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +28 -5
- package/dist/frontend/program.js +422 -76
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +2 -0
- package/dist/frontend/resolve.js +5 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/services.d.ts +3 -0
- package/dist/frontend/services.js +31 -4
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/shape-inference/analyze.d.ts +93 -0
- package/dist/frontend/shape-inference/analyze.js +3138 -0
- package/dist/frontend/shape-inference/analyze.js.map +1 -0
- package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
- package/dist/frontend/shape-inference/constant-graphs.js +357 -0
- package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
- package/dist/frontend/shape-inference/domain.d.ts +32 -0
- package/dist/frontend/shape-inference/domain.js +104 -0
- package/dist/frontend/shape-inference/domain.js.map +1 -0
- package/dist/frontend/shape-inference/index.d.ts +7 -0
- package/dist/frontend/shape-inference/index.js +19 -0
- package/dist/frontend/shape-inference/index.js.map +1 -0
- package/dist/frontend/shape-inference/report.d.ts +21 -0
- package/dist/frontend/shape-inference/report.js +348 -0
- package/dist/frontend/shape-inference/report.js.map +1 -0
- package/dist/frontend/token-equivalence.d.ts +6 -0
- package/dist/frontend/token-equivalence.js +66 -9
- package/dist/frontend/token-equivalence.js.map +1 -1
- package/dist/frontend/token-equivalence.test.js +33 -1
- package/dist/frontend/token-equivalence.test.js.map +1 -1
- package/dist/frontend/ts7/checker-features.d.ts +15 -0
- package/dist/frontend/ts7/checker-features.js +45 -0
- package/dist/frontend/ts7/checker-features.js.map +1 -0
- package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-features.test.js +40 -0
- package/dist/frontend/ts7/checker-features.test.js.map +1 -0
- package/dist/frontend/ts7/checker-server.d.ts +19 -0
- package/dist/frontend/ts7/checker-server.js +46 -0
- package/dist/frontend/ts7/checker-server.js.map +1 -0
- package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-server.test.js +38 -0
- package/dist/frontend/ts7/checker-server.test.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.js +39 -13
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
- package/dist/frontend/ts7/native-api.d.ts +1 -0
- package/dist/frontend/ts7/native-api.js +25 -2
- package/dist/frontend/ts7/native-api.js.map +1 -1
- package/dist/frontend/ts7/native-process.d.ts +9 -2
- package/dist/frontend/ts7/native-process.js +22 -4
- package/dist/frontend/ts7/native-process.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +11 -0
- package/dist/frontend/ts7/program-host.js +36 -22
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +9 -0
- package/dist/frontend/ts7/semantic-json.js +25 -5
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +8 -1
- 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/source-parser.js +3 -1
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/tsc-codes.js +10 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +18 -6
- package/dist/frontend/type-mapper.js +205 -44
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +44 -3
- package/dist/index.js +39 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +37 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -2
- package/dist/ir/builtin-signatures.js +5104 -4894
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +4 -2
- package/dist/ir/callback-specialization.js +24 -9
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/capture-values.js +4 -2
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +12 -2
- package/dist/ir/char-unit-locals.js +400 -58
- package/dist/ir/char-unit-locals.js.map +1 -1
- package/dist/ir/char-unit-locals.test.js +111 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -1
- package/dist/ir/constant-globals.js +18 -4
- package/dist/ir/constant-globals.js.map +1 -1
- package/dist/ir/expression-inlining.d.ts +15 -0
- package/dist/ir/expression-inlining.js +166 -0
- package/dist/ir/expression-inlining.js.map +1 -0
- package/dist/ir/expression-inlining.test.d.ts +1 -0
- package/dist/ir/expression-inlining.test.js +123 -0
- package/dist/ir/expression-inlining.test.js.map +1 -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 +6 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +27 -6
- package/dist/ir/int32-arrays.js +106 -18
- package/dist/ir/int32-arrays.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +26 -1
- package/dist/ir/int32-slots.js +291 -5
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +38 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +5 -0
- package/dist/ir/integer-loop-facts.js +90 -1
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +14 -1
- package/dist/ir/integer-loops.js +107 -11
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +70 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.js +18 -2
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +64 -4
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +63 -11
- package/dist/ir/ir.js +47 -7
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +2 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +10 -3
- package/dist/ir/js-ic.js +14 -2
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +11 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +7 -0
- package/dist/ir/node-index.js +32 -0
- package/dist/ir/node-index.js.map +1 -1
- package/dist/ir/receiver-readers.d.ts +6 -1
- package/dist/ir/receiver-readers.js +53 -28
- package/dist/ir/receiver-readers.js.map +1 -1
- package/dist/ir/row-pairs.d.ts +15 -0
- package/dist/ir/row-pairs.js +373 -0
- package/dist/ir/row-pairs.js.map +1 -0
- package/dist/ir/row-pairs.test.d.ts +1 -0
- package/dist/ir/row-pairs.test.js +129 -0
- package/dist/ir/row-pairs.test.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +17 -4
- package/dist/ir/runtime-features.js +94 -13
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +15 -0
- package/dist/ir/scalar-records.js +301 -1
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +181 -1
- package/dist/ir/scalar-records.test.js.map +1 -1
- package/dist/ir/self-captures.js +8 -0
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/validate.js +78 -28
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/fence-eval.js +4 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/ir-policy.js +5 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +13 -0
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/native/cache.d.ts +5 -1
- package/dist/native/cache.js +15 -3
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +6 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.d.ts +3 -0
- package/dist/native/compiler.js +72 -26
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +87 -2
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/executable-cache-open.test.d.ts +1 -0
- package/dist/native/executable-cache-open.test.js +80 -0
- package/dist/native/executable-cache-open.test.js.map +1 -0
- package/dist/native/executable-cache.d.ts +43 -3
- package/dist/native/executable-cache.js +177 -36
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/executable-cache.test.js +103 -0
- package/dist/native/executable-cache.test.js.map +1 -1
- package/dist/native/prepare.d.ts +1 -1
- package/dist/native/prepare.js +49 -17
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +69 -3
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.d.ts +1 -1
- package/dist/native/sanitizer.js +17 -3
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +4 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/node-islands/classify.d.ts +14 -0
- package/dist/node-islands/classify.js +114 -0
- package/dist/node-islands/classify.js.map +1 -0
- package/dist/node-islands/detect.d.ts +13 -0
- package/dist/node-islands/detect.js +805 -0
- package/dist/node-islands/detect.js.map +1 -0
- package/dist/node-islands/detect.test.d.ts +1 -0
- package/dist/node-islands/detect.test.js +136 -0
- package/dist/node-islands/detect.test.js.map +1 -0
- package/dist/node-islands/origin.d.ts +21 -0
- package/dist/node-islands/origin.js +60 -0
- package/dist/node-islands/origin.js.map +1 -0
- package/dist/node-islands/policy.d.ts +49 -0
- package/dist/node-islands/policy.js +130 -0
- package/dist/node-islands/policy.js.map +1 -0
- package/dist/node-islands/report.d.ts +22 -0
- package/dist/node-islands/report.js +326 -0
- package/dist/node-islands/report.js.map +1 -0
- package/dist/node-islands/report.test.d.ts +1 -0
- package/dist/node-islands/report.test.js +228 -0
- package/dist/node-islands/report.test.js.map +1 -0
- package/dist/node-islands/rules.d.ts +20 -0
- package/dist/node-islands/rules.js +91 -0
- package/dist/node-islands/rules.js.map +1 -0
- package/dist/node-islands/scan.d.ts +53 -0
- package/dist/node-islands/scan.js +104 -0
- package/dist/node-islands/scan.js.map +1 -0
- package/dist/node-islands/summary.d.ts +78 -0
- package/dist/node-islands/summary.js +26 -0
- package/dist/node-islands/summary.js.map +1 -0
- package/dist/project-config.d.ts +50 -0
- package/dist/project-config.js +372 -0
- package/dist/project-config.js.map +1 -0
- package/dist/project-config.test.d.ts +1 -0
- package/dist/project-config.test.js +154 -0
- package/dist/project-config.test.js.map +1 -0
- package/dist/wasm/discover.js +6 -31
- package/dist/wasm/discover.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +21 -38
|
@@ -1,7 +1,292 @@
|
|
|
1
|
-
import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
|
|
1
|
+
import { everyExpr, everyExprChild, everyStmtChild } from "../../ir/traverse.js";
|
|
2
|
+
import { InternalCompilerError } from "../../errors.js";
|
|
2
3
|
import { f64Lit } from "./common.js";
|
|
3
4
|
import { exactInteger, widenInteger } from "./integer-values.js";
|
|
4
5
|
import { withinInt32 } from "../../ir/integer-ranges.js";
|
|
6
|
+
/** `s` (a speculated write) writing `value` instead. */
|
|
7
|
+
export function withSpeculativeValue(s, value) {
|
|
8
|
+
switch (s.kind) {
|
|
9
|
+
case "assign":
|
|
10
|
+
return { ...s, value };
|
|
11
|
+
case "varDecl":
|
|
12
|
+
return { ...s, init: value };
|
|
13
|
+
case "exprStmt":
|
|
14
|
+
if (s.expr.kind === "assignExpr")
|
|
15
|
+
return { ...s, expr: { ...s.expr, value } };
|
|
16
|
+
break;
|
|
17
|
+
default:
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
throw new InternalCompilerError(`llvm emitter bug: speculated ${s.kind} with a rewritten value`);
|
|
21
|
+
}
|
|
22
|
+
/** Calls nest at most this deep in one expansion. */
|
|
23
|
+
const MAX_INLINE_DEPTH = 4;
|
|
24
|
+
/** An expansion larger than this stays a call. */
|
|
25
|
+
const MAX_INLINE_NODES = 64;
|
|
26
|
+
/** A function that only returns arithmetic over its number parameters:
|
|
27
|
+
* `function trim(v, n) { return v - Math.floor(v / Math.pow(2, n)) * Math.pow(2, n); }`.
|
|
28
|
+
* Its call evaluates nothing but its arguments, so a speculated write may
|
|
29
|
+
* expand it in place. A call in its body must be of another such function
|
|
30
|
+
* (`resolve`): any other call could change what the expansion reads. */
|
|
31
|
+
export function inlinableNumberFunction(fn, resolve) {
|
|
32
|
+
if (fn.async ||
|
|
33
|
+
fn.generator ||
|
|
34
|
+
(fn.captures?.length ?? 0) > 0 ||
|
|
35
|
+
(fn.classCaptures?.length ?? 0) > 0 ||
|
|
36
|
+
fn.returnType.kind !== "f64" ||
|
|
37
|
+
fn.params.some((p) => p.type.kind !== "f64" && p.type.kind !== "union") ||
|
|
38
|
+
fn.body.length !== 1 ||
|
|
39
|
+
fn.body[0].kind !== "return" ||
|
|
40
|
+
fn.body[0].value === undefined)
|
|
41
|
+
return undefined;
|
|
42
|
+
const params = fn.params.map((p) => p.localId);
|
|
43
|
+
const known = new Set(params);
|
|
44
|
+
let nodes = 0;
|
|
45
|
+
// A parameter of a union type (`number | undefined`) is read only
|
|
46
|
+
// through its tag test and narrowing, which a wrapped argument folds.
|
|
47
|
+
const union = (e) => e.kind === "varRef" && known.has(e.localId);
|
|
48
|
+
const pure = (e) => {
|
|
49
|
+
if (++nodes > MAX_INLINE_NODES)
|
|
50
|
+
return false;
|
|
51
|
+
if (e.kind === "boolLit")
|
|
52
|
+
return true;
|
|
53
|
+
if (e.kind === "unionIsTag")
|
|
54
|
+
return union(e.value);
|
|
55
|
+
if (e.kind === "unionNarrow")
|
|
56
|
+
return e.type.kind === "f64" && union(e.value);
|
|
57
|
+
if (e.type.kind !== "f64")
|
|
58
|
+
return false;
|
|
59
|
+
switch (e.kind) {
|
|
60
|
+
case "numLit":
|
|
61
|
+
return true;
|
|
62
|
+
case "varRef":
|
|
63
|
+
return known.has(e.localId);
|
|
64
|
+
case "ternary":
|
|
65
|
+
return pure(e.cond) && pure(e.then) && pure(e.else_);
|
|
66
|
+
case "bin":
|
|
67
|
+
return (INTEGER_OPS.has(e.op) || e.op === "/") && pure(e.left) && pure(e.right);
|
|
68
|
+
case "unary":
|
|
69
|
+
return e.op === "-" && pure(e.operand);
|
|
70
|
+
case "libCall":
|
|
71
|
+
return (e.fn === "math.floor" || e.fn === "math.pow") && e.args.every(pure);
|
|
72
|
+
case "call":
|
|
73
|
+
return resolve?.(e.callee) !== undefined && e.args.every(pure);
|
|
74
|
+
default:
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const body = fn.body[0].value;
|
|
79
|
+
return pure(body) ? { params, body } : undefined;
|
|
80
|
+
}
|
|
81
|
+
/** `e` with each parameter reference replaced by its argument. A tag test
|
|
82
|
+
* or narrowing of a wrapped argument folds, and so does a ternary over a
|
|
83
|
+
* folded test. */
|
|
84
|
+
function substitute(e, args) {
|
|
85
|
+
switch (e.kind) {
|
|
86
|
+
case "varRef":
|
|
87
|
+
return args.get(e.localId) ?? e;
|
|
88
|
+
case "unionIsTag": {
|
|
89
|
+
const value = substitute(e.value, args);
|
|
90
|
+
if (value.kind !== "unionWrap" || value.unionId !== e.unionId)
|
|
91
|
+
return { ...e, value };
|
|
92
|
+
return {
|
|
93
|
+
kind: "boolLit",
|
|
94
|
+
value: (value.tag === e.tag) !== (e.negated === true),
|
|
95
|
+
type: e.type,
|
|
96
|
+
loc: e.loc,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
case "unionNarrow": {
|
|
100
|
+
const value = substitute(e.value, args);
|
|
101
|
+
return value.kind === "unionWrap" && value.unionId === e.unionId && value.tag === e.tag
|
|
102
|
+
? value.value
|
|
103
|
+
: { ...e, value };
|
|
104
|
+
}
|
|
105
|
+
case "ternary": {
|
|
106
|
+
const cond = substitute(e.cond, args);
|
|
107
|
+
if (cond.kind === "boolLit")
|
|
108
|
+
return substitute(cond.value ? e.then : e.else_, args);
|
|
109
|
+
return { ...e, cond, then: substitute(e.then, args), else_: substitute(e.else_, args) };
|
|
110
|
+
}
|
|
111
|
+
case "bin":
|
|
112
|
+
return { ...e, left: substitute(e.left, args), right: substitute(e.right, args) };
|
|
113
|
+
case "unary":
|
|
114
|
+
return { ...e, operand: substitute(e.operand, args) };
|
|
115
|
+
case "libCall":
|
|
116
|
+
case "call":
|
|
117
|
+
return { ...e, args: e.args.map((a) => substitute(a, args)) };
|
|
118
|
+
default:
|
|
119
|
+
return e;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** k when `value` is exactly 2^k with k in [0, 52], else null.
|
|
123
|
+
* Math.log2 rounds: 2^52 + 1 gives 52, so the power is compared back. */
|
|
124
|
+
function exactPowerOfTwo(value) {
|
|
125
|
+
if (!(value >= 1))
|
|
126
|
+
return null;
|
|
127
|
+
const k = Math.round(Math.log2(value));
|
|
128
|
+
return k >= 0 && k <= 52 && 2 ** k === value ? k : null;
|
|
129
|
+
}
|
|
130
|
+
/** The same speculated operand written twice: a local, a literal, or a
|
|
131
|
+
* power of two of the same exponent. */
|
|
132
|
+
function sameOperand(a, b) {
|
|
133
|
+
if (a.kind === "varRef")
|
|
134
|
+
return b.kind === "varRef" && a.localId === b.localId;
|
|
135
|
+
if (a.kind === "numLit")
|
|
136
|
+
return b.kind === "numLit" && Object.is(a.value, b.value);
|
|
137
|
+
return (a.kind === "libCall" &&
|
|
138
|
+
b.kind === "libCall" &&
|
|
139
|
+
a.fn === "math.pow" &&
|
|
140
|
+
b.fn === "math.pow" &&
|
|
141
|
+
powerOfTwo(a) &&
|
|
142
|
+
powerOfTwo(b) &&
|
|
143
|
+
sameOperand(a.args[1], b.args[1]));
|
|
144
|
+
}
|
|
145
|
+
/** `a - Math.floor(a / p) * p` (either factor order) with p a power of two
|
|
146
|
+
* and `a` a local or literal: the floor-mod of `a` by p. */
|
|
147
|
+
function floorModPowerOfTwo(e) {
|
|
148
|
+
if (e.kind !== "bin" || e.op !== "-" || e.right.kind !== "bin" || e.right.op !== "*")
|
|
149
|
+
return null;
|
|
150
|
+
const { left, right } = e.right;
|
|
151
|
+
const [floor, power] = left.kind === "libCall" && left.fn === "math.floor" ? [left, right] : [right, left];
|
|
152
|
+
if (floor.kind !== "libCall" || floor.fn !== "math.floor" || floor.args.length !== 1)
|
|
153
|
+
return null;
|
|
154
|
+
const quotient = floor.args[0];
|
|
155
|
+
if (quotient.kind !== "bin" || quotient.op !== "/")
|
|
156
|
+
return null;
|
|
157
|
+
if (!powerOfTwo(power) || !sameOperand(quotient.right, power))
|
|
158
|
+
return null;
|
|
159
|
+
if (e.left.kind !== "varRef" && e.left.kind !== "numLit")
|
|
160
|
+
return null;
|
|
161
|
+
return sameOperand(quotient.left, e.left) ? { value: e.left, power } : null;
|
|
162
|
+
}
|
|
163
|
+
/** Whether `e` is a power of two speculation can shift by:
|
|
164
|
+
* `Math.pow(2, n)` or a literal 2^k with k in [0, 52]. */
|
|
165
|
+
function powerOfTwo(e) {
|
|
166
|
+
if (e.kind === "numLit")
|
|
167
|
+
return exactPowerOfTwo(e.value) !== null;
|
|
168
|
+
return (e.kind === "libCall" &&
|
|
169
|
+
e.fn === "math.pow" &&
|
|
170
|
+
e.args.length === 2 &&
|
|
171
|
+
e.args[0].kind === "numLit" &&
|
|
172
|
+
e.args[0].value === 2);
|
|
173
|
+
}
|
|
174
|
+
/** Typed-array element kinds whose elements are integers. */
|
|
175
|
+
const INTEGER_ELEMENTS = new Set(["u8", "u8c", "i8", "u16", "i16", "u32", "i32"]);
|
|
176
|
+
/** A typed-array element read of an integer kind with no effect: an
|
|
177
|
+
* out-of-range read gives NaN, which fails its check. Float elements would
|
|
178
|
+
* only bail. */
|
|
179
|
+
function isSpeculativeByteRead(e) {
|
|
180
|
+
return (e.kind === "bytesIntrinsic" &&
|
|
181
|
+
e.method === "get" &&
|
|
182
|
+
e.type.kind === "f64" &&
|
|
183
|
+
e.receiver.type.kind === "bytes" &&
|
|
184
|
+
INTEGER_ELEMENTS.has(e.receiver.type.elem) &&
|
|
185
|
+
e.args.length === 1 &&
|
|
186
|
+
isEffectFree(e.receiver) &&
|
|
187
|
+
isEffectFree(e.args[0]));
|
|
188
|
+
}
|
|
189
|
+
/** Whether evaluating `e` assigns no binding: no `++`/`--`, no assignment
|
|
190
|
+
* expression, and no statement inside it. */
|
|
191
|
+
function writesNoLocal(e) {
|
|
192
|
+
return everyExpr(e, {
|
|
193
|
+
expr: (node) => node.kind !== "incDec" && node.kind !== "assignExpr",
|
|
194
|
+
stmt: () => false,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/** Rewrite a write's value that isSpeculableValue refuses into one it can
|
|
198
|
+
* speculate (SpeculativeValue), or null. Expansion and the new operations
|
|
199
|
+
* (`Math.pow(2, n)`, `Math.floor(a / 2^n)`, byte reads) evaluate nothing
|
|
200
|
+
* but numbers, so the fast copy may evaluate them in any order. Hoisted
|
|
201
|
+
* leaves run in the write's evaluation order before the arithmetic; that
|
|
202
|
+
* reorders nothing only when the write reads no heap and every local it
|
|
203
|
+
* reads is one no call can write. */
|
|
204
|
+
export function rewriteSpeculable(value, context) {
|
|
205
|
+
const leaves = [];
|
|
206
|
+
let reads = false;
|
|
207
|
+
const locals = [];
|
|
208
|
+
const rewrite = (e, depth) => {
|
|
209
|
+
if (e.type.kind !== "f64")
|
|
210
|
+
return null;
|
|
211
|
+
switch (e.kind) {
|
|
212
|
+
case "numLit":
|
|
213
|
+
return Number.isSafeInteger(e.value) && !Object.is(e.value, -0) ? e : null;
|
|
214
|
+
case "varRef":
|
|
215
|
+
locals.push(e.localId);
|
|
216
|
+
return e;
|
|
217
|
+
case "bin": {
|
|
218
|
+
if (!ARITHMETIC_OPS.has(e.op))
|
|
219
|
+
break;
|
|
220
|
+
const left = rewrite(e.left, depth);
|
|
221
|
+
const right = left && rewrite(e.right, depth);
|
|
222
|
+
return left && right ? { ...e, left, right } : null;
|
|
223
|
+
}
|
|
224
|
+
case "unary": {
|
|
225
|
+
if (e.op !== "-")
|
|
226
|
+
break;
|
|
227
|
+
const operand = rewrite(e.operand, depth);
|
|
228
|
+
return operand ? { ...e, operand } : null;
|
|
229
|
+
}
|
|
230
|
+
case "libCall": {
|
|
231
|
+
if (powerOfTwo(e) && e.kind === "libCall") {
|
|
232
|
+
const exponent = rewrite(e.args[1], depth);
|
|
233
|
+
return exponent ? { ...e, args: [e.args[0], exponent] } : null;
|
|
234
|
+
}
|
|
235
|
+
const quotient = e.args[0];
|
|
236
|
+
if (e.fn === "math.floor" &&
|
|
237
|
+
e.args.length === 1 &&
|
|
238
|
+
quotient?.kind === "bin" &&
|
|
239
|
+
quotient.op === "/" &&
|
|
240
|
+
powerOfTwo(quotient.right)) {
|
|
241
|
+
const left = rewrite(quotient.left, depth);
|
|
242
|
+
const right = left && rewrite(quotient.right, depth);
|
|
243
|
+
return left && right ? { ...e, args: [{ ...quotient, left, right }] } : null;
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case "call": {
|
|
248
|
+
const fn = depth < MAX_INLINE_DEPTH ? context.inlinable?.(e.callee) : undefined;
|
|
249
|
+
// Arguments are evaluated before the body: an expansion may read
|
|
250
|
+
// them in another order, or twice, only when they are pure.
|
|
251
|
+
const plain = (a) => isSpeculableValue(a, false) ||
|
|
252
|
+
(a.kind === "unionWrap" && isSpeculableValue(a.value, false));
|
|
253
|
+
if (fn !== undefined && fn.params.length === e.args.length && e.args.every(plain)) {
|
|
254
|
+
const args = new Map(fn.params.map((id, i) => [id, e.args[i]]));
|
|
255
|
+
return rewrite(substitute(fn.body, args), depth + 1);
|
|
256
|
+
}
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
default:
|
|
260
|
+
if (isSpeculativeRead(e) || isSpeculativeByteRead(e)) {
|
|
261
|
+
reads = true;
|
|
262
|
+
return e;
|
|
263
|
+
}
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
// Only calls of program functions are hoisted: other leaves (a string's
|
|
267
|
+
// length, a Map read) are cheap where they stand, and would turn every
|
|
268
|
+
// loop that adds one into a second copy.
|
|
269
|
+
if (context.leafId === undefined || e.kind !== "call")
|
|
270
|
+
return null;
|
|
271
|
+
// Hoisting runs the arguments before the rest of the write: one that
|
|
272
|
+
// assigns a local would move that write ahead of the write's earlier
|
|
273
|
+
// reads of it.
|
|
274
|
+
if (!e.args.every(writesNoLocal))
|
|
275
|
+
return null;
|
|
276
|
+
const ref = { kind: "varRef", localId: context.leafId(), type: e.type, loc: e.loc };
|
|
277
|
+
leaves.push({ localId: ref.localId, expr: e, ref });
|
|
278
|
+
return ref;
|
|
279
|
+
};
|
|
280
|
+
const rewritten = rewrite(value, 0);
|
|
281
|
+
if (rewritten === null)
|
|
282
|
+
return null;
|
|
283
|
+
if (leaves.length > 0) {
|
|
284
|
+
const leafIds = new Set(leaves.map((leaf) => leaf.localId));
|
|
285
|
+
if (reads || !locals.every((id) => leafIds.has(id) || context.unaliased?.(id) === true))
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
return { value: rewritten, leaves };
|
|
289
|
+
}
|
|
5
290
|
/** The fast copy duplicates the loop; keep the duplicated code small. */
|
|
6
291
|
export const MAX_LOOP_NODES = 400;
|
|
7
292
|
/** Statements whose emission is plain control flow or a single write.
|
|
@@ -131,15 +416,19 @@ function isEffectFree(e) {
|
|
|
131
416
|
return false;
|
|
132
417
|
}
|
|
133
418
|
}
|
|
134
|
-
/** The speculative reads of a speculable value in evaluation order
|
|
419
|
+
/** The speculative reads of a speculable value in evaluation order, those
|
|
420
|
+
* of a rewritten value (rewriteSpeculable) included. */
|
|
135
421
|
export function speculativeReads(e, out = []) {
|
|
136
|
-
if (e.kind === "bin" && ARITHMETIC_OPS.has(e.op)) {
|
|
422
|
+
if (e.kind === "bin" && (ARITHMETIC_OPS.has(e.op) || e.op === "/")) {
|
|
137
423
|
speculativeReads(e.left, out);
|
|
138
424
|
speculativeReads(e.right, out);
|
|
139
425
|
}
|
|
140
426
|
else if (e.kind === "unary" && e.op === "-")
|
|
141
427
|
speculativeReads(e.operand, out);
|
|
142
|
-
else if (
|
|
428
|
+
else if (e.kind === "libCall" && (e.fn === "math.floor" || e.fn === "math.pow"))
|
|
429
|
+
for (const arg of e.args)
|
|
430
|
+
speculativeReads(arg, out);
|
|
431
|
+
else if (isSpeculativeRead(e) || isSpeculativeByteRead(e))
|
|
143
432
|
out.push(e);
|
|
144
433
|
return out;
|
|
145
434
|
}
|
|
@@ -159,6 +448,9 @@ function hasProduct(e) {
|
|
|
159
448
|
return e.op === "*" || e.op === "%" || hasProduct(e.left) || hasProduct(e.right);
|
|
160
449
|
if (e.kind === "unary")
|
|
161
450
|
return hasProduct(e.operand);
|
|
451
|
+
// Math.floor(a / 2^n) and Math.pow(2, n) replace a division and a call.
|
|
452
|
+
if (e.kind === "libCall")
|
|
453
|
+
return e.fn === "math.floor" || e.fn === "math.pow";
|
|
162
454
|
return false;
|
|
163
455
|
}
|
|
164
456
|
function hasArithmetic(e) {
|
|
@@ -166,6 +458,8 @@ function hasArithmetic(e) {
|
|
|
166
458
|
return ARITHMETIC_OPS.has(e.op) || hasArithmetic(e.left) || hasArithmetic(e.right);
|
|
167
459
|
if (e.kind === "unary")
|
|
168
460
|
return e.op === "-" || hasArithmetic(e.operand);
|
|
461
|
+
if (e.kind === "libCall")
|
|
462
|
+
return e.fn === "math.floor" || e.fn === "math.pow";
|
|
169
463
|
return false;
|
|
170
464
|
}
|
|
171
465
|
/** The written local and value of a statement-level write, or null. A
|
|
@@ -191,8 +485,10 @@ export function speculativeWriteTarget(s) {
|
|
|
191
485
|
* expressions the static range analysis already proves integral. Static
|
|
192
486
|
* proofs come first: a local whose reads are all proven is never shadowed
|
|
193
487
|
* or checked, and a loop with nothing unproven is never duplicated. */
|
|
194
|
-
export function planSpeculativeLoop(loop, eligible, integral = () => false, proven = () => false, invariantEligible = eligible) {
|
|
488
|
+
export function planSpeculativeLoop(loop, eligible, integral = () => false, proven = () => false, invariantEligible = eligible, context = {}) {
|
|
195
489
|
const writes = new Map();
|
|
490
|
+
const values = new Map();
|
|
491
|
+
const leafIds = new Set();
|
|
196
492
|
const unspeculable = new Set();
|
|
197
493
|
const reads = new Set();
|
|
198
494
|
// Locals with at least one read the static analysis does not prove.
|
|
@@ -218,12 +514,9 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
218
514
|
// A product in the condition alone (`i < Math.floor(n * scale)`) does not
|
|
219
515
|
// make the body's work integer.
|
|
220
516
|
let inCondition = false;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
nodes++;
|
|
225
|
-
if (!OBSERVER_FREE_EXPRESSIONS.has(e.kind) || (e.kind === "bin" && e.left.type.kind !== "f64"))
|
|
226
|
-
observerFree = false;
|
|
517
|
+
// What the integer writes read and consume. A rewritten value is noted
|
|
518
|
+
// here alone: its original, which `expr` walks, has its effects.
|
|
519
|
+
const note = (e) => {
|
|
227
520
|
if (e.kind === "varRef") {
|
|
228
521
|
reads.add(e.localId);
|
|
229
522
|
if (!proven(e))
|
|
@@ -243,6 +536,21 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
243
536
|
consume(e.index);
|
|
244
537
|
else if (e.kind === "bytesIntrinsic" || e.kind === "strIntrinsic")
|
|
245
538
|
e.args.forEach(consume);
|
|
539
|
+
};
|
|
540
|
+
// An expanded call is emitted in the fast copy: it counts toward the
|
|
541
|
+
// duplicated code.
|
|
542
|
+
const noteAll = (e) => {
|
|
543
|
+
nodes++;
|
|
544
|
+
note(e);
|
|
545
|
+
return everyExprChild(e, noteAll, () => true);
|
|
546
|
+
};
|
|
547
|
+
const expr = (e) => {
|
|
548
|
+
if (rejected)
|
|
549
|
+
return false;
|
|
550
|
+
nodes++;
|
|
551
|
+
if (!OBSERVER_FREE_EXPRESSIONS.has(e.kind) || (e.kind === "bin" && e.left.type.kind !== "f64"))
|
|
552
|
+
observerFree = false;
|
|
553
|
+
note(e);
|
|
246
554
|
return everyExprChild(e, expr, nested);
|
|
247
555
|
};
|
|
248
556
|
// Statements inside expressions (sequence expressions) run mid-expression,
|
|
@@ -271,7 +579,10 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
271
579
|
consume(s.index);
|
|
272
580
|
const target = speculativeWriteTarget(s);
|
|
273
581
|
if (target) {
|
|
274
|
-
|
|
582
|
+
const rewritten = target.value === null || isSpeculableValue(target.value)
|
|
583
|
+
? null
|
|
584
|
+
: rewriteSpeculable(target.value, context);
|
|
585
|
+
if (target.value === null || isSpeculableValue(target.value) || rewritten !== null) {
|
|
275
586
|
const list = writes.get(target.localId) ?? [];
|
|
276
587
|
list.push(s);
|
|
277
588
|
writes.set(target.localId, list);
|
|
@@ -282,6 +593,12 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
282
593
|
}
|
|
283
594
|
else
|
|
284
595
|
expr(target.value);
|
|
596
|
+
if (rewritten !== null) {
|
|
597
|
+
values.set(s, rewritten);
|
|
598
|
+
for (const leaf of rewritten.leaves)
|
|
599
|
+
leafIds.add(leaf.localId);
|
|
600
|
+
noteAll(rewritten.value);
|
|
601
|
+
}
|
|
285
602
|
return !rejected;
|
|
286
603
|
}
|
|
287
604
|
unspeculable.add(target.localId);
|
|
@@ -310,15 +627,17 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
310
627
|
// write runs: speculated itself, already an integer, or loop-invariant
|
|
311
628
|
// (checked on entry). A value computed from doubles the loop writes
|
|
312
629
|
// would only fail its check on every entry.
|
|
630
|
+
const valueOf = (s) => values.get(s)?.value ?? speculativeWriteTarget(s).value;
|
|
313
631
|
const grounded = (e) => {
|
|
314
632
|
if (e.kind === "varRef") {
|
|
315
633
|
const id = e.localId;
|
|
316
|
-
return (
|
|
634
|
+
return (leafIds.has(id) ||
|
|
635
|
+
proven(e) ||
|
|
317
636
|
locals.has(id) ||
|
|
318
637
|
integral(id) ||
|
|
319
638
|
(!writes.has(id) && !unspeculable.has(id) && invariantEligible(id)));
|
|
320
639
|
}
|
|
321
|
-
if (isSpeculativeRead(e))
|
|
640
|
+
if (isSpeculativeRead(e) || isSpeculativeByteRead(e))
|
|
322
641
|
return true;
|
|
323
642
|
return everyExprChild(e, grounded, () => false);
|
|
324
643
|
};
|
|
@@ -326,8 +645,8 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
326
645
|
changed = false;
|
|
327
646
|
for (const id of [...locals.keys()]) {
|
|
328
647
|
for (const s of writes.get(id)) {
|
|
329
|
-
const
|
|
330
|
-
if (
|
|
648
|
+
const value = valueOf(s);
|
|
649
|
+
if (value !== null && !grounded(value)) {
|
|
331
650
|
locals.delete(id);
|
|
332
651
|
changed = true;
|
|
333
652
|
break;
|
|
@@ -346,7 +665,8 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
346
665
|
const invariant = (e) => {
|
|
347
666
|
if (e.kind === "varRef") {
|
|
348
667
|
const id = e.localId;
|
|
349
|
-
if (!
|
|
668
|
+
if (!leafIds.has(id) &&
|
|
669
|
+
!proven(e) &&
|
|
350
670
|
!locals.has(id) &&
|
|
351
671
|
!writes.has(id) &&
|
|
352
672
|
!unspeculable.has(id) &&
|
|
@@ -357,13 +677,13 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
357
677
|
return everyExprChild(e, invariant, () => true);
|
|
358
678
|
};
|
|
359
679
|
for (const s of speculated) {
|
|
360
|
-
const
|
|
361
|
-
if (
|
|
680
|
+
const value = valueOf(s);
|
|
681
|
+
if (value === null)
|
|
362
682
|
arithmetic = true;
|
|
363
683
|
else {
|
|
364
|
-
if (hasArithmetic(
|
|
684
|
+
if (hasArithmetic(value))
|
|
365
685
|
arithmetic = true;
|
|
366
|
-
invariant(
|
|
686
|
+
invariant(value);
|
|
367
687
|
}
|
|
368
688
|
}
|
|
369
689
|
if (!arithmetic)
|
|
@@ -373,12 +693,15 @@ export function planSpeculativeLoop(loop, eligible, integral = () => false, prov
|
|
|
373
693
|
const heavy = [...locals.keys()].some((id) => multiplied.has(id)) ||
|
|
374
694
|
[...speculated].some((s) => {
|
|
375
695
|
const target = speculativeWriteTarget(s);
|
|
376
|
-
|
|
377
|
-
|
|
696
|
+
const value = valueOf(s);
|
|
697
|
+
return value !== null && (hasProduct(value) || isVariableStep(target.localId, value));
|
|
378
698
|
});
|
|
379
699
|
if (!heavy)
|
|
380
700
|
return null;
|
|
381
|
-
|
|
701
|
+
for (const s of values.keys())
|
|
702
|
+
if (!speculated.has(s))
|
|
703
|
+
values.delete(s);
|
|
704
|
+
return { locals, writes: speculated, observerFree, values };
|
|
382
705
|
}
|
|
383
706
|
/** Plan a proven integer loop. `cursors` are the loop's bounded bindings,
|
|
384
707
|
* `eligible` the locals a shadow may stand for, `integral` those the emitter
|
|
@@ -568,6 +891,33 @@ export function emitSpeculativeInteger(host, e, bail, reads = new Map(), integra
|
|
|
568
891
|
case "bin": {
|
|
569
892
|
if (e.op !== "+" && e.op !== "-" && e.op !== "*" && e.op !== "%")
|
|
570
893
|
break;
|
|
894
|
+
// The floor-mod of a safe integer by 2^n (n in [0, 52]) is its low n
|
|
895
|
+
// bits, also for a negative value: in [0, 2^n), and never -0.
|
|
896
|
+
const mod = floorModPowerOfTwo(e);
|
|
897
|
+
if (mod) {
|
|
898
|
+
const value = emitSpeculativeInteger(host, mod.value, bail, reads, integral);
|
|
899
|
+
const n = exponentOf(host, mod.power, bail, reads, integral);
|
|
900
|
+
const mask = B.tmp(), low = B.tmp();
|
|
901
|
+
B.line(`${mask} = sub i64 ${shiftOne(host, n)}, 1`);
|
|
902
|
+
B.line(`${low} = and i64 ${value}, ${mask}`);
|
|
903
|
+
return low;
|
|
904
|
+
}
|
|
905
|
+
// A product with 2^n shifts: it is safe iff the other factor's
|
|
906
|
+
// magnitude is at most (2^53 - 1) >> n, and a zero product of a safe
|
|
907
|
+
// integer and a positive power is +0.
|
|
908
|
+
if (e.op === "*" && (powerOfTwo(e.right) || powerOfTwo(e.left))) {
|
|
909
|
+
const [factor, power] = powerOfTwo(e.right) ? [e.left, e.right] : [e.right, e.left];
|
|
910
|
+
const value = emitSpeculativeInteger(host, factor, bail, reads, integral);
|
|
911
|
+
const n = exponentOf(host, power, bail, reads, integral);
|
|
912
|
+
const limit = B.tmp(), magnitude = B.tmp(), outside = B.tmp(), product = B.tmp();
|
|
913
|
+
B.line(`${limit} = ashr i64 ${SAFE}, ${n}`);
|
|
914
|
+
host.declare("declare i64 @llvm.abs.i64(i64, i1)");
|
|
915
|
+
B.line(`${magnitude} = call i64 @llvm.abs.i64(i64 ${value}, i1 true)`);
|
|
916
|
+
B.line(`${outside} = icmp ugt i64 ${magnitude}, ${limit}`);
|
|
917
|
+
bail(outside);
|
|
918
|
+
B.line(`${product} = shl nsw i64 ${value}, ${n}`);
|
|
919
|
+
return product;
|
|
920
|
+
}
|
|
571
921
|
const a = emitSpeculativeInteger(host, e.left, bail, reads, integral);
|
|
572
922
|
const b = emitSpeculativeInteger(host, e.right, bail, reads, integral);
|
|
573
923
|
const result = B.tmp();
|
|
@@ -619,6 +969,21 @@ export function emitSpeculativeInteger(host, e, bail, reads = new Map(), integra
|
|
|
619
969
|
bail(negativeZero);
|
|
620
970
|
return result;
|
|
621
971
|
}
|
|
972
|
+
case "libCall": {
|
|
973
|
+
// A rewritten value's Math.pow(2, n) and Math.floor(a / 2^n)
|
|
974
|
+
// (rewriteSpeculable): with n an integer in [0, 52], 2^n is exact and
|
|
975
|
+
// so is a / 2^n for a safe integer a, whose floor the arithmetic shift
|
|
976
|
+
// computes, also for negative a. No result is -0.
|
|
977
|
+
if (e.fn === "math.pow")
|
|
978
|
+
return shiftOne(host, exponentOf(host, e, bail, reads, integral));
|
|
979
|
+
if (e.fn !== "math.floor" || e.args[0]?.kind !== "bin")
|
|
980
|
+
break;
|
|
981
|
+
const a = emitSpeculativeInteger(host, e.args[0].left, bail, reads, integral);
|
|
982
|
+
const n = exponentOf(host, e.args[0].right, bail, reads, integral);
|
|
983
|
+
const result = B.tmp();
|
|
984
|
+
B.line(`${result} = ashr i64 ${a}, ${n}`);
|
|
985
|
+
return result;
|
|
986
|
+
}
|
|
622
987
|
case "unary": {
|
|
623
988
|
if (e.op !== "-")
|
|
624
989
|
break;
|
|
@@ -635,6 +1000,28 @@ export function emitSpeculativeInteger(host, e, bail, reads = new Map(), integra
|
|
|
635
1000
|
}
|
|
636
1001
|
return speculativeLeaf(host, reads.get(e) ?? host.emitExpr(e), e, bail);
|
|
637
1002
|
}
|
|
1003
|
+
/** The exponent of a power of two (Math.pow(2, n) or a literal 2^k) as an
|
|
1004
|
+
* i64 in [0, 52]; other exponents bail. */
|
|
1005
|
+
function exponentOf(host, e, bail, reads, integral) {
|
|
1006
|
+
if (e.kind === "numLit") {
|
|
1007
|
+
const k = exactPowerOfTwo(e.value);
|
|
1008
|
+
if (k === null)
|
|
1009
|
+
throw new InternalCompilerError("llvm emitter bug: speculative power of two");
|
|
1010
|
+
return String(k);
|
|
1011
|
+
}
|
|
1012
|
+
if (e.kind !== "libCall")
|
|
1013
|
+
throw new InternalCompilerError("llvm emitter bug: speculative power of two");
|
|
1014
|
+
const n = emitSpeculativeInteger(host, e.args[1], bail, reads, integral);
|
|
1015
|
+
const outside = host.B.tmp();
|
|
1016
|
+
host.B.line(`${outside} = icmp ugt i64 ${n}, 52`);
|
|
1017
|
+
bail(outside);
|
|
1018
|
+
return n;
|
|
1019
|
+
}
|
|
1020
|
+
function shiftOne(host, n) {
|
|
1021
|
+
const result = host.B.tmp();
|
|
1022
|
+
host.B.line(`${result} = shl i64 1, ${n}`);
|
|
1023
|
+
return result;
|
|
1024
|
+
}
|
|
638
1025
|
/** The safe i64 of an evaluated number: its proven integer, or a checked
|
|
639
1026
|
* conversion. */
|
|
640
1027
|
function speculativeLeaf(host, value, e, bail) {
|