@scriptc/compiler 0.4.4 → 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 +198 -44
- 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 +238 -20
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +11 -4
- 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 +70 -1
- 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 +65 -8
- package/dist/backend/llvm/dyn.js +375 -40
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +28 -8
- 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 +58 -23
- 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 +134 -13
- package/dist/backend/llvm/emitter.js +514 -87
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +6 -4
- package/dist/backend/llvm/expr-bytes.js +31 -8
- 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 +87 -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 +107 -9
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +95 -22
- 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 +7 -0
- package/dist/backend/llvm/integer-values.js +42 -2
- 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 +128 -42
- 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 +11 -0
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +43 -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/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/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 +104 -51
- 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-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/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/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.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-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/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 +78 -11
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +22 -1
- package/dist/cli/usage.js +33 -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 +7 -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 +52 -1
- 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 +3 -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/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/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/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/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 +159 -8
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +26 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.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-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.js +144 -1
- 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 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.js +1 -1
- 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 +13 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +174 -9
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +43 -8
- 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-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/containers/array-callbacks.js +51 -15
- 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 +102 -9
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +85 -5
- 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/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 +9 -6
- package/dist/frontend/lowering/date-values.js +63 -16
- package/dist/frontend/lowering/date-values.js.map +1 -1
- 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 +119 -26
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +38 -0
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +50 -6
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +35 -3
- 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 +65 -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 +6 -1
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +20 -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 +15 -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/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/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 +283 -26
- 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 +97 -7
- 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 +647 -176
- 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 +52 -5
- 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 +4 -3
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +264 -46
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +28 -17
- 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 +294 -46
- 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 +52 -10
- package/dist/frontend/lowering/lowerer.js +249 -37
- 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/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 +1576 -1539
- 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 +102 -11
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +2 -0
- package/dist/frontend/program-analysis.js +3 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +15 -0
- package/dist/frontend/program.js +227 -64
- 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.js +3 -1
- package/dist/frontend/ts7/semantic-model.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 +160 -28
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +44 -3
- package/dist/index.js +27 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +29 -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 -4950
- 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 +284 -5
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +5 -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 +93 -7
- 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 +50 -8
- package/dist/ir/ir.js +38 -12
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +25 -5
- package/dist/ir/js-ic.js +93 -13
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +153 -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 +69 -12
- 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 +37 -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 +4 -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.js +38 -16
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +51 -1
- 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 +20 -35
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import * as ts from "../../ts7/adapter.js";
|
|
2
|
+
import { CONTRACT_TYPES_MODULE } from "../../contract-types.js";
|
|
1
3
|
import { keyedHelperName } from "../stable-names.js";
|
|
4
|
+
import { writtenLocals } from "../../../ir/callback-specialization.js";
|
|
5
|
+
import { AmbientReceiverReaders } from "../../../ir/receiver-readers.js";
|
|
2
6
|
import { boolLit, countedFor, numLit, varRef } from "../../../ir/build.js";
|
|
3
7
|
import { BOOL, F64, VOID, typeEquals, typeKey, } from "../../../ir/ir.js";
|
|
4
|
-
import { everyExprChild, everyStmtChild, everyStmtList, transformStmtList, } from "../../../ir/traverse.js";
|
|
8
|
+
import { everyExpr, everyExprChild, everyStmt, everyStmtChild, everyStmtList, transformExpr, transformStmtList, } from "../../../ir/traverse.js";
|
|
5
9
|
import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, } from "../array-values.js";
|
|
6
10
|
const PRODUCERS = new Set(["map", "filter", "flatMap", "flatMapArray"]);
|
|
7
11
|
const TERMINALS = new Set([
|
|
@@ -454,6 +458,70 @@ function matchChain(lowerer, e) {
|
|
|
454
458
|
loc: e.loc,
|
|
455
459
|
};
|
|
456
460
|
}
|
|
461
|
+
/** The outermost array-HOF call of `e` on its own, over its receiver. */
|
|
462
|
+
function loneChain(lowerer, e) {
|
|
463
|
+
const top = stageOf(lowerer, e);
|
|
464
|
+
if (!top)
|
|
465
|
+
return null;
|
|
466
|
+
const { stage, receiver } = top;
|
|
467
|
+
if (receiver.type.kind !== "array")
|
|
468
|
+
return null;
|
|
469
|
+
const stages = [];
|
|
470
|
+
let terminal;
|
|
471
|
+
if (TERMINALS.has(stage.info.method)) {
|
|
472
|
+
const init = stage.info.method === "reduce" && stage.info.hasInit && e.kind === "call" ? e.args[2] : null;
|
|
473
|
+
terminal = { kind: "call", stage, init };
|
|
474
|
+
}
|
|
475
|
+
else if (PRODUCERS.has(stage.info.method)) {
|
|
476
|
+
terminal = { kind: "collect" };
|
|
477
|
+
stages.push(stage);
|
|
478
|
+
}
|
|
479
|
+
else
|
|
480
|
+
return null;
|
|
481
|
+
return {
|
|
482
|
+
source: receiver,
|
|
483
|
+
sourceType: receiver.type,
|
|
484
|
+
slice: null,
|
|
485
|
+
stages,
|
|
486
|
+
terminal,
|
|
487
|
+
type: e.type,
|
|
488
|
+
loc: e.loc,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
/** The callbacks of `chain` in order, or null when its stages cannot run
|
|
492
|
+
* in one loop: element types that do not line up, an array argument past
|
|
493
|
+
* the first stage, reduce without a seed, or findIndex over holes. */
|
|
494
|
+
function chainCallbacks(chain) {
|
|
495
|
+
const { stages, terminal } = chain;
|
|
496
|
+
const terminalStage = terminal.kind === "call" ? terminal.stage : null;
|
|
497
|
+
const callbacks = terminalStage ? [...stages, terminalStage] : stages;
|
|
498
|
+
// Element types must line up stage to stage.
|
|
499
|
+
let elem = chain.sourceType.elem;
|
|
500
|
+
for (const stage of callbacks) {
|
|
501
|
+
if (!typeEquals(stage.info.elem, elem))
|
|
502
|
+
return null;
|
|
503
|
+
if (stage.info.method === "filter" && !typeEquals(stage.info.outElem, stage.info.elem))
|
|
504
|
+
return null;
|
|
505
|
+
if ((stage.info.method === "map" || stage.info.method === "flatMap") &&
|
|
506
|
+
!typeEquals(stage.info.outElem, stage.info.fnRet))
|
|
507
|
+
return null;
|
|
508
|
+
elem = stage.info.outElem;
|
|
509
|
+
}
|
|
510
|
+
// Index arguments are reproduced; an array argument only names the source.
|
|
511
|
+
for (let k = 0; k < callbacks.length; k++) {
|
|
512
|
+
const stage = callbacks[k];
|
|
513
|
+
const lead = stage.info.method === "reduce" ? 1 : 0;
|
|
514
|
+
if (stage.info.arity > lead + 3)
|
|
515
|
+
return null;
|
|
516
|
+
if (stage.info.arity === lead + 3 && (k !== 0 || chain.slice))
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
if (terminalStage?.info.method === "reduce" && !terminalStage.info.hasInit)
|
|
520
|
+
return null;
|
|
521
|
+
if (terminalStage?.info.method === "findIndex" && holeCarrying(chain))
|
|
522
|
+
return null;
|
|
523
|
+
return callbacks;
|
|
524
|
+
}
|
|
457
525
|
/** Fuse chains of array-HOF helper calls into one loop.
|
|
458
526
|
*
|
|
459
527
|
* `xs.filter(f).map(g).reduce(h, z)` lowers to nested helper calls, each
|
|
@@ -500,9 +568,27 @@ class PipelineFusion {
|
|
|
500
568
|
added = [];
|
|
501
569
|
effects;
|
|
502
570
|
helpers = new Map();
|
|
571
|
+
/** Bindings each function, or a closure it creates, writes after their
|
|
572
|
+
* declaration. */
|
|
573
|
+
written;
|
|
574
|
+
/** classCaptured's answers by function name. */
|
|
575
|
+
classCaptures = new Map();
|
|
576
|
+
/** Whether a module imports or re-exports the contract types. */
|
|
577
|
+
contractTypes;
|
|
578
|
+
/** Bindings of the function being fused that inlined callbacks captured. */
|
|
579
|
+
inlinedCaptures = new Set();
|
|
580
|
+
/** The helper calls each callback with an undefined receiver; a copied
|
|
581
|
+
* body runs under the receiver around the array call instead. */
|
|
582
|
+
receivers;
|
|
503
583
|
constructor(lowerer, functions) {
|
|
504
584
|
this.lowerer = lowerer;
|
|
505
585
|
this.effects = new CallbackEffects(functions, lowerer.globalsList);
|
|
586
|
+
this.written = writtenLocals({ functions });
|
|
587
|
+
this.receivers = new AmbientReceiverReaders(new Map(functions.map((fn) => [fn.name, fn])));
|
|
588
|
+
this.contractTypes = lowerer.moduleOrder.some((sf) => sf.statements.nodes.some((st) => (ts.isImportDeclaration(st) || ts.isExportDeclaration(st)) &&
|
|
589
|
+
st.moduleSpecifier !== undefined &&
|
|
590
|
+
ts.isStringLiteral(st.moduleSpecifier) &&
|
|
591
|
+
st.moduleSpecifier.text === CONTRACT_TYPES_MODULE));
|
|
506
592
|
}
|
|
507
593
|
run(fn) {
|
|
508
594
|
const infos = this.lowerer.arrHofInfo;
|
|
@@ -513,6 +599,7 @@ class PipelineFusion {
|
|
|
513
599
|
if (!candidate)
|
|
514
600
|
return;
|
|
515
601
|
const removed = new Set();
|
|
602
|
+
this.inlinedCaptures = new Set();
|
|
516
603
|
let body = this.lists(fn.body, fn, removed);
|
|
517
604
|
body = transformStmtList(body, {
|
|
518
605
|
stmt: (s) => s,
|
|
@@ -521,6 +608,8 @@ class PipelineFusion {
|
|
|
521
608
|
fn.body = body;
|
|
522
609
|
if (removed.size > 0)
|
|
523
610
|
fn.locals = fn.locals.filter((l) => !removed.has(l.id));
|
|
611
|
+
if (this.inlinedCaptures.size > 0)
|
|
612
|
+
unboxUncaptured(fn, this.inlinedCaptures);
|
|
524
613
|
}
|
|
525
614
|
/* ── statement lists: fold single-use chain bindings ── */
|
|
526
615
|
lists(list, fn, removed) {
|
|
@@ -645,43 +734,55 @@ class PipelineFusion {
|
|
|
645
734
|
}
|
|
646
735
|
/* ── expressions ── */
|
|
647
736
|
fuse(e, fn) {
|
|
648
|
-
const plan = this.plan(e, fn);
|
|
737
|
+
const plan = this.plan(e, fn) ?? this.lonePlan(e, fn);
|
|
649
738
|
return plan ? this.emit(plan) : null;
|
|
650
739
|
}
|
|
740
|
+
/** One array-HOF call on its own (or the last call of a chain that does
|
|
741
|
+
* not fuse), when every callback is a closure literal whose body can be
|
|
742
|
+
* copied into the loop. A single stage reorders nothing, so the
|
|
743
|
+
* callbacks' effects need no model; their captured bindings must keep
|
|
744
|
+
* one value while the loop runs (stableTarget), since the loop reads
|
|
745
|
+
* them once, when it starts. The loop keeps the helper's order: the
|
|
746
|
+
* length read once, each element read when it is visited, holes
|
|
747
|
+
* skipped (and kept by map). */
|
|
748
|
+
lonePlan(e, fn) {
|
|
749
|
+
const chain = loneChain(this.lowerer, e);
|
|
750
|
+
if (!chain)
|
|
751
|
+
return null;
|
|
752
|
+
const callbacks = chainCallbacks(chain);
|
|
753
|
+
if (!callbacks)
|
|
754
|
+
return null;
|
|
755
|
+
const inline = this.stableTarget(fn);
|
|
756
|
+
let frame;
|
|
757
|
+
for (const stage of callbacks) {
|
|
758
|
+
for (const arg of [stage.slow, stage.fast]) {
|
|
759
|
+
if (!arg)
|
|
760
|
+
continue;
|
|
761
|
+
const target = inline(arg);
|
|
762
|
+
if (!target)
|
|
763
|
+
return null;
|
|
764
|
+
frame ??= target.sourceName;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
return {
|
|
768
|
+
chain,
|
|
769
|
+
callbacks,
|
|
770
|
+
writes: new Set(),
|
|
771
|
+
risky: true,
|
|
772
|
+
inline,
|
|
773
|
+
...(frame === undefined ? {} : { frame }),
|
|
774
|
+
};
|
|
775
|
+
}
|
|
651
776
|
/** Decide whether `e` is a fusable chain; null when it is not. */
|
|
652
777
|
plan(e, fn) {
|
|
653
778
|
const chain = matchChain(this.lowerer, e);
|
|
654
779
|
if (!chain)
|
|
655
780
|
return null;
|
|
781
|
+
const callbacks = chainCallbacks(chain);
|
|
782
|
+
if (!callbacks)
|
|
783
|
+
return null;
|
|
656
784
|
const { stages, terminal } = chain;
|
|
657
785
|
const terminalStage = terminal.kind === "call" ? terminal.stage : null;
|
|
658
|
-
const callbacks = terminalStage ? [...stages, terminalStage] : stages;
|
|
659
|
-
// Element types must line up stage to stage.
|
|
660
|
-
let elem = chain.sourceType.elem;
|
|
661
|
-
for (const stage of callbacks) {
|
|
662
|
-
if (!typeEquals(stage.info.elem, elem))
|
|
663
|
-
return null;
|
|
664
|
-
if (stage.info.method === "filter" && !typeEquals(stage.info.outElem, stage.info.elem))
|
|
665
|
-
return null;
|
|
666
|
-
if ((stage.info.method === "map" || stage.info.method === "flatMap") &&
|
|
667
|
-
!typeEquals(stage.info.outElem, stage.info.fnRet))
|
|
668
|
-
return null;
|
|
669
|
-
elem = stage.info.outElem;
|
|
670
|
-
}
|
|
671
|
-
// Index arguments are reproduced; an array argument only names the source.
|
|
672
|
-
for (let k = 0; k < callbacks.length; k++) {
|
|
673
|
-
const stage = callbacks[k];
|
|
674
|
-
const lead = stage.info.method === "reduce" ? 1 : 0;
|
|
675
|
-
if (stage.info.arity > lead + 3)
|
|
676
|
-
return null;
|
|
677
|
-
if (stage.info.arity === lead + 3 && (k !== 0 || chain.slice))
|
|
678
|
-
return null;
|
|
679
|
-
}
|
|
680
|
-
if (terminalStage?.info.method === "reduce" && !terminalStage.info.hasInit)
|
|
681
|
-
return null;
|
|
682
|
-
const holes = holeCarrying(chain);
|
|
683
|
-
if (terminalStage?.info.method === "findIndex" && holes)
|
|
684
|
-
return null;
|
|
685
786
|
// Effects of each callback, in chain order.
|
|
686
787
|
const scope = this.effects.scope(fn, true);
|
|
687
788
|
const summaries = [];
|
|
@@ -758,35 +859,90 @@ class PipelineFusion {
|
|
|
758
859
|
* are passed in by value, read when the fused call starts; no callback
|
|
759
860
|
* in the chain assigns a binding another one reads). */
|
|
760
861
|
inlineTarget = (arg) => {
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
const fn = this.effects.fn(arg.fnName);
|
|
764
|
-
if (!fn || fn.async || fn.generator || fn.classCaptures?.length)
|
|
862
|
+
const fn = this.closureTarget(arg);
|
|
863
|
+
if (!fn)
|
|
765
864
|
return null;
|
|
766
865
|
const captures = new Set((fn.captures ?? []).map((c) => c.localId));
|
|
767
|
-
if (captures.size !== arg.captures.length)
|
|
768
|
-
return null;
|
|
769
866
|
const effects = this.effects.ofFunction(fn);
|
|
770
867
|
if (!effects || intersects(effects.writes, captures))
|
|
771
868
|
return null;
|
|
772
|
-
|
|
773
|
-
return null;
|
|
774
|
-
let size = 0;
|
|
775
|
-
const small = everyStmtList(fn.body, {
|
|
776
|
-
expr: (e) => ++size <= MAX_INLINE_NODES && e.kind !== "closure" && e.kind !== "selfRef",
|
|
777
|
-
stmt: (s) => ++size <= MAX_INLINE_NODES && s.kind !== "tryCatch",
|
|
778
|
-
});
|
|
779
|
-
return small ? fn : null;
|
|
869
|
+
return inlinableBody(fn, captures) ? fn : null;
|
|
780
870
|
};
|
|
871
|
+
/** inlineTarget for a callback created in `fn` whose captured bindings
|
|
872
|
+
* nothing assigns after their declaration: `fn`'s own locals and
|
|
873
|
+
* parameters, written neither by `fn` nor by any closure that shares
|
|
874
|
+
* them, and not by the callback body. A binding a local class captures
|
|
875
|
+
* counts as written, since its methods may assign it; so does a binding
|
|
876
|
+
* a method reads through its class's captures. The callback must
|
|
877
|
+
* not observe the ambient receiver (AmbientReceiverReaders). */
|
|
878
|
+
stableTarget(fn) {
|
|
879
|
+
const locals = new Map(fn.locals.map((l) => [l.id, l]));
|
|
880
|
+
const inherited = new Set([...(fn.captures ?? []), ...(fn.classCaptures ?? [])].map((c) => c.localId));
|
|
881
|
+
const written = this.written.get(fn.name);
|
|
882
|
+
const classCaptured = this.classCaptured(fn);
|
|
883
|
+
return (arg) => {
|
|
884
|
+
const target = this.closureTarget(arg);
|
|
885
|
+
if (!target || !written || arg.kind !== "closure")
|
|
886
|
+
return null;
|
|
887
|
+
if (!this.receivers.ignores(target))
|
|
888
|
+
return null;
|
|
889
|
+
for (const id of arg.captures) {
|
|
890
|
+
const local = locals.get(id);
|
|
891
|
+
if (!local || local.tdz || inherited.has(id) || written.has(id) || classCaptured.has(id))
|
|
892
|
+
return null;
|
|
893
|
+
}
|
|
894
|
+
const captures = new Set((target.captures ?? []).map((c) => c.localId));
|
|
895
|
+
const assigns = !everyStmtList(target.body, {
|
|
896
|
+
stmt: (st) => !((st.kind === "assign" || st.kind === "forOf") && captures.has(st.localId)),
|
|
897
|
+
expr: (ex) => !((ex.kind === "assignExpr" || ex.kind === "incDec") && captures.has(ex.localId)),
|
|
898
|
+
});
|
|
899
|
+
return !assigns && inlinableBody(target, captures) ? target : null;
|
|
900
|
+
};
|
|
901
|
+
}
|
|
902
|
+
/** The bindings of `fn` that a local class it creates captures. */
|
|
903
|
+
classCaptured(fn) {
|
|
904
|
+
const known = this.classCaptures.get(fn.name);
|
|
905
|
+
if (known)
|
|
906
|
+
return known;
|
|
907
|
+
const ids = new Set();
|
|
908
|
+
everyStmtList(fn.body, {
|
|
909
|
+
expr: (e) => {
|
|
910
|
+
if (e.kind === "classRef")
|
|
911
|
+
for (const id of e.captures ?? [])
|
|
912
|
+
ids.add(id);
|
|
913
|
+
return true;
|
|
914
|
+
},
|
|
915
|
+
stmt: () => true,
|
|
916
|
+
});
|
|
917
|
+
this.classCaptures.set(fn.name, ids);
|
|
918
|
+
return ids;
|
|
919
|
+
}
|
|
920
|
+
/** The function behind a closure-literal callback the loop can inline. */
|
|
921
|
+
closureTarget(arg) {
|
|
922
|
+
if (arg.kind !== "closure" || arg.adapts)
|
|
923
|
+
return null;
|
|
924
|
+
const fn = this.effects.fn(arg.fnName);
|
|
925
|
+
if (!fn || fn.async || fn.generator || fn.classCaptures?.length)
|
|
926
|
+
return null;
|
|
927
|
+
if ((fn.captures ?? []).length !== arg.captures.length)
|
|
928
|
+
return null;
|
|
929
|
+
return fn;
|
|
930
|
+
}
|
|
781
931
|
emit(plan) {
|
|
782
|
-
const built = new FusedLoop(this.lowerer, plan.chain, this.inlineTarget).build();
|
|
932
|
+
const built = new FusedLoop(this.lowerer, plan.chain, plan.inline ?? this.inlineTarget, this.contractTypes).build();
|
|
783
933
|
if (!built)
|
|
784
934
|
return null;
|
|
935
|
+
for (const id of built.inlinedCaptures)
|
|
936
|
+
this.inlinedCaptures.add(id);
|
|
785
937
|
let name = this.helpers.get(built.key);
|
|
786
938
|
if (!name) {
|
|
787
|
-
name = keyedHelperName(this.lowerer, "%arr.fused", built.key);
|
|
939
|
+
name = keyedHelperName(this.lowerer, plan.inline ? "%arr.loop" : "%arr.fused", built.key);
|
|
788
940
|
this.helpers.set(built.key, name);
|
|
789
|
-
|
|
941
|
+
const helper = { ...built.fn, name };
|
|
942
|
+
// A lone call's loop stands in the inlined callback's stack frame.
|
|
943
|
+
if (plan.frame !== undefined)
|
|
944
|
+
helper.sourceName = plan.frame;
|
|
945
|
+
this.added.push(helper);
|
|
790
946
|
}
|
|
791
947
|
return {
|
|
792
948
|
kind: "call",
|
|
@@ -797,6 +953,47 @@ class PipelineFusion {
|
|
|
797
953
|
};
|
|
798
954
|
}
|
|
799
955
|
}
|
|
956
|
+
/** Whether a statement inside `e` (a sequence expression's) returns. */
|
|
957
|
+
function returns(e) {
|
|
958
|
+
return !everyExpr(e, { expr: () => true, stmt: (s) => s.kind !== "return" });
|
|
959
|
+
}
|
|
960
|
+
/** Drops the box of each binding in `inlined` that no closure or class
|
|
961
|
+
* created in `fn` captures any more: the callbacks that captured it were
|
|
962
|
+
* copied into loops, which receive its value. A dead-zone binding keeps the
|
|
963
|
+
* box that represents its uninitialized state, and bindings `fn` itself
|
|
964
|
+
* captures keep theirs. */
|
|
965
|
+
function unboxUncaptured(fn, inlined) {
|
|
966
|
+
const captured = new Set();
|
|
967
|
+
everyStmtList(fn.body, {
|
|
968
|
+
expr: (e) => {
|
|
969
|
+
if (e.kind === "closure" || e.kind === "classRef")
|
|
970
|
+
for (const id of e.captures ?? [])
|
|
971
|
+
captured.add(id);
|
|
972
|
+
return true;
|
|
973
|
+
},
|
|
974
|
+
stmt: () => true,
|
|
975
|
+
});
|
|
976
|
+
const inherited = new Set([...(fn.captures ?? []), ...(fn.classCaptures ?? [])].map((c) => c.localId));
|
|
977
|
+
fn.locals = fn.locals.map((local) => {
|
|
978
|
+
if (local.boxed !== true || local.tdz === true || !inlined.has(local.id))
|
|
979
|
+
return local;
|
|
980
|
+
if (captured.has(local.id) || inherited.has(local.id))
|
|
981
|
+
return local;
|
|
982
|
+
const { boxed: _boxed, ...plain } = local;
|
|
983
|
+
return plain;
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
/** A callback body the loop can copy: small, no nested closures, recursion
|
|
987
|
+
* or try statements, and no boxed locals besides its captures. */
|
|
988
|
+
function inlinableBody(fn, captures) {
|
|
989
|
+
if (fn.locals.some((l) => l.tdz || (l.boxed && !captures.has(l.id))))
|
|
990
|
+
return false;
|
|
991
|
+
let size = 0;
|
|
992
|
+
return everyStmtList(fn.body, {
|
|
993
|
+
expr: (e) => ++size <= MAX_INLINE_NODES && e.kind !== "closure" && e.kind !== "selfRef",
|
|
994
|
+
stmt: (s) => ++size <= MAX_INLINE_NODES && s.kind !== "tryCatch",
|
|
995
|
+
});
|
|
996
|
+
}
|
|
800
997
|
function intersects(a, b) {
|
|
801
998
|
for (const id of a)
|
|
802
999
|
if (b.has(id))
|
|
@@ -889,6 +1086,7 @@ class FusedLoop {
|
|
|
889
1086
|
lowerer;
|
|
890
1087
|
chain;
|
|
891
1088
|
inlineTarget;
|
|
1089
|
+
contractTypes;
|
|
892
1090
|
params = [];
|
|
893
1091
|
locals = [];
|
|
894
1092
|
args = [];
|
|
@@ -897,18 +1095,21 @@ class FusedLoop {
|
|
|
897
1095
|
loc;
|
|
898
1096
|
next = 0;
|
|
899
1097
|
failed = false;
|
|
900
|
-
|
|
1098
|
+
/** `contractTypes`: the program writes contract types, which the
|
|
1099
|
+
* contract checker binds to source bindings. */
|
|
1100
|
+
constructor(lowerer, chain, inlineTarget, contractTypes) {
|
|
901
1101
|
this.lowerer = lowerer;
|
|
902
1102
|
this.chain = chain;
|
|
903
1103
|
this.inlineTarget = inlineTarget;
|
|
1104
|
+
this.contractTypes = contractTypes;
|
|
904
1105
|
this.loc = chain.loc;
|
|
905
1106
|
}
|
|
906
1107
|
fresh(name) {
|
|
907
1108
|
return `${name}.${this.next++}`;
|
|
908
1109
|
}
|
|
909
|
-
local(name, type, mutable = false) {
|
|
1110
|
+
local(name, type, mutable = false, source) {
|
|
910
1111
|
const id = this.fresh(name);
|
|
911
|
-
this.locals.push({ id, name, type, mutable });
|
|
1112
|
+
this.locals.push(source ? { id, name, type, mutable, source } : { id, name, type, mutable });
|
|
912
1113
|
return id;
|
|
913
1114
|
}
|
|
914
1115
|
param(name, value, key) {
|
|
@@ -924,7 +1125,9 @@ class FusedLoop {
|
|
|
924
1125
|
const known = this.callees.find((c) => c.arg === arg);
|
|
925
1126
|
if (known)
|
|
926
1127
|
return known;
|
|
927
|
-
|
|
1128
|
+
// Called as a plain function: the loop is not the target's receiver.
|
|
1129
|
+
const inlineTarget = this.inlineTarget;
|
|
1130
|
+
const target = inlineTarget(arg);
|
|
928
1131
|
let callee;
|
|
929
1132
|
if (target && arg.kind === "closure") {
|
|
930
1133
|
const captures = new Map();
|
|
@@ -974,10 +1177,18 @@ class FusedLoop {
|
|
|
974
1177
|
return true;
|
|
975
1178
|
},
|
|
976
1179
|
});
|
|
1180
|
+
// Copies keep their source bindings, so contract types written on
|
|
1181
|
+
// them are checked against what the loop stores. In a program that
|
|
1182
|
+
// writes contract types, a parameter with a source binding keeps its
|
|
1183
|
+
// own local for the same reason.
|
|
1184
|
+
const sources = new Map(fn.locals.map((l) => [l.id, l.source]));
|
|
977
1185
|
const aliased = new Set();
|
|
978
1186
|
fn.params.forEach((p, index) => {
|
|
979
1187
|
const arg = args[index];
|
|
980
|
-
if (arg.kind === "varRef" &&
|
|
1188
|
+
if (arg.kind === "varRef" &&
|
|
1189
|
+
!assigned.has(p.localId) &&
|
|
1190
|
+
typeEquals(arg.type, p.type) &&
|
|
1191
|
+
!(this.contractTypes && sources.get(p.localId) !== undefined)) {
|
|
981
1192
|
renamed.set(p.localId, arg.localId);
|
|
982
1193
|
aliased.add(p.localId);
|
|
983
1194
|
}
|
|
@@ -985,11 +1196,31 @@ class FusedLoop {
|
|
|
985
1196
|
for (const l of fn.locals) {
|
|
986
1197
|
if (renamed.has(l.id))
|
|
987
1198
|
continue;
|
|
988
|
-
const id = this.local(l.name, l.type, true);
|
|
1199
|
+
const id = this.local(l.name, l.type, true, l.source);
|
|
989
1200
|
renamed.set(l.id, id);
|
|
990
1201
|
}
|
|
1202
|
+
const rename = (id) => renamed.get(id) ?? id;
|
|
1203
|
+
const renameExpr = (e) => {
|
|
1204
|
+
switch (e.kind) {
|
|
1205
|
+
case "varRef":
|
|
1206
|
+
case "incDec":
|
|
1207
|
+
case "assignExpr":
|
|
1208
|
+
return { ...e, localId: rename(e.localId) };
|
|
1209
|
+
default:
|
|
1210
|
+
return e;
|
|
1211
|
+
}
|
|
1212
|
+
};
|
|
1213
|
+
// A bound parameter's value is an element or index with no source text
|
|
1214
|
+
// of its own; it is located at the parameter, without a span.
|
|
1215
|
+
const bind = fn.params.flatMap((p, index) => {
|
|
1216
|
+
if (aliased.has(p.localId))
|
|
1217
|
+
return [];
|
|
1218
|
+
const source = sources.get(p.localId);
|
|
1219
|
+
const arg = args[index];
|
|
1220
|
+
const init = source ? { ...arg, loc: { ...source.loc, end: source.loc.start } } : arg;
|
|
1221
|
+
return [{ kind: "varDecl", localId: rename(p.localId), init, loc }];
|
|
1222
|
+
});
|
|
991
1223
|
const labels = new Map();
|
|
992
|
-
const exit = this.fresh("%fused.exit");
|
|
993
1224
|
const label = (name) => {
|
|
994
1225
|
let id = labels.get(name);
|
|
995
1226
|
if (!id) {
|
|
@@ -998,19 +1229,51 @@ class FusedLoop {
|
|
|
998
1229
|
}
|
|
999
1230
|
return id;
|
|
1000
1231
|
};
|
|
1232
|
+
/** Locals and labels of a copied statement; returns are the caller's. */
|
|
1233
|
+
const renameStmt = (st) => {
|
|
1234
|
+
switch (st.kind) {
|
|
1235
|
+
case "varDecl":
|
|
1236
|
+
case "assign":
|
|
1237
|
+
return { ...st, localId: rename(st.localId) };
|
|
1238
|
+
case "break":
|
|
1239
|
+
case "continue":
|
|
1240
|
+
return st.label ? { ...st, label: label(st.label) } : st;
|
|
1241
|
+
case "forOf": {
|
|
1242
|
+
const renamedFor = { ...st, localId: rename(st.localId) };
|
|
1243
|
+
return st.labels ? { ...renamedFor, labels: st.labels.map(label) } : renamedFor;
|
|
1244
|
+
}
|
|
1245
|
+
case "while":
|
|
1246
|
+
case "doWhile":
|
|
1247
|
+
case "for":
|
|
1248
|
+
case "switch":
|
|
1249
|
+
case "block":
|
|
1250
|
+
return st.labels ? { ...st, labels: st.labels.map(label) } : st;
|
|
1251
|
+
default:
|
|
1252
|
+
return st;
|
|
1253
|
+
}
|
|
1254
|
+
};
|
|
1255
|
+
// A body whose only return is its last statement (`(x) => x * k`,
|
|
1256
|
+
// `{ const y = x * 2; return y > 4; }`) needs no exit block: its other
|
|
1257
|
+
// statements run after the bindings, and the call's value is the
|
|
1258
|
+
// returned expression.
|
|
1259
|
+
const last = fn.body[fn.body.length - 1];
|
|
1260
|
+
const prefix = fn.body.slice(0, -1);
|
|
1261
|
+
if (last !== undefined &&
|
|
1262
|
+
last.kind === "return" &&
|
|
1263
|
+
last.value !== null &&
|
|
1264
|
+
typeEquals(last.value.type, fn.returnType) &&
|
|
1265
|
+
!returns(last.value) &&
|
|
1266
|
+
prefix.every((st) => everyStmt(st, { expr: () => true, stmt: (x) => x.kind !== "return" }))) {
|
|
1267
|
+
const copy = { expr: renameExpr, stmt: renameStmt };
|
|
1268
|
+
return {
|
|
1269
|
+
pre: [...bind, ...transformStmtList(prefix, copy)],
|
|
1270
|
+
value: transformExpr(last.value, copy),
|
|
1271
|
+
};
|
|
1272
|
+
}
|
|
1273
|
+
const exit = this.fresh("%fused.exit");
|
|
1001
1274
|
const result = fn.returnType.kind === "void" ? null : this.local("ret", fn.returnType, true);
|
|
1002
|
-
const rename = (id) => renamed.get(id) ?? id;
|
|
1003
1275
|
const body = transformStmtList(fn.body, {
|
|
1004
|
-
expr:
|
|
1005
|
-
switch (e.kind) {
|
|
1006
|
-
case "varRef":
|
|
1007
|
-
case "incDec":
|
|
1008
|
-
case "assignExpr":
|
|
1009
|
-
return { ...e, localId: rename(e.localId) };
|
|
1010
|
-
default:
|
|
1011
|
-
return e;
|
|
1012
|
-
}
|
|
1013
|
-
},
|
|
1276
|
+
expr: renameExpr,
|
|
1014
1277
|
stmt: (s) => {
|
|
1015
1278
|
switch (s.kind) {
|
|
1016
1279
|
case "return": {
|
|
@@ -1030,25 +1293,14 @@ class FusedLoop {
|
|
|
1030
1293
|
loc: s.loc,
|
|
1031
1294
|
};
|
|
1032
1295
|
}
|
|
1033
|
-
case "varDecl":
|
|
1034
|
-
case "assign":
|
|
1035
|
-
return { ...s, localId: rename(s.localId) };
|
|
1036
1296
|
case "break":
|
|
1037
1297
|
case "continue":
|
|
1038
1298
|
return s.label && s.label !== exit ? { ...s, label: label(s.label) } : s;
|
|
1039
|
-
case "while":
|
|
1040
|
-
case "doWhile":
|
|
1041
|
-
case "for":
|
|
1042
|
-
case "block":
|
|
1043
|
-
return s.labels ? { ...s, labels: s.labels.map(label) } : s;
|
|
1044
1299
|
default:
|
|
1045
|
-
return s;
|
|
1300
|
+
return renameStmt(s);
|
|
1046
1301
|
}
|
|
1047
1302
|
},
|
|
1048
1303
|
});
|
|
1049
|
-
const bind = fn.params.flatMap((p, index) => aliased.has(p.localId)
|
|
1050
|
-
? []
|
|
1051
|
-
: [{ kind: "varDecl", localId: rename(p.localId), init: args[index], loc }]);
|
|
1052
1304
|
const pre = [];
|
|
1053
1305
|
if (result !== null)
|
|
1054
1306
|
pre.push({ kind: "varDecl", localId: result, init: null, loc });
|
|
@@ -1523,7 +1775,8 @@ class FusedLoop {
|
|
|
1523
1775
|
};
|
|
1524
1776
|
foldKnownUnions(fn);
|
|
1525
1777
|
scalarizeRecordTemporaries(this.lowerer, fn);
|
|
1526
|
-
|
|
1778
|
+
const inlinedCaptures = this.callees.flatMap((c) => c.inline && c.arg.kind === "closure" ? c.arg.captures : []);
|
|
1779
|
+
return { fn, args: this.args, key: this.keyParts.join("|"), inlinedCaptures };
|
|
1527
1780
|
}
|
|
1528
1781
|
}
|
|
1529
1782
|
function increment(id, loc) {
|
|
@@ -1623,8 +1876,11 @@ function foldKnownUnions(fn) {
|
|
|
1623
1876
|
case "for":
|
|
1624
1877
|
case "while":
|
|
1625
1878
|
case "doWhile":
|
|
1879
|
+
case "forOf":
|
|
1626
1880
|
case "block":
|
|
1627
1881
|
return { ...s, body: prune(s.body) };
|
|
1882
|
+
case "switch":
|
|
1883
|
+
return { ...s, cases: s.cases.map((c) => ({ ...c, body: prune(c.body) })) };
|
|
1628
1884
|
default:
|
|
1629
1885
|
return s;
|
|
1630
1886
|
}
|
|
@@ -1816,6 +2072,19 @@ function scalarizeRecordTemporaries(lowerer, fn) {
|
|
|
1816
2072
|
body: rewriteList(s.body),
|
|
1817
2073
|
},
|
|
1818
2074
|
];
|
|
2075
|
+
case "forOf":
|
|
2076
|
+
return [{ ...s, iterable: rewriteExpr(s.iterable), body: rewriteList(s.body) }];
|
|
2077
|
+
case "switch":
|
|
2078
|
+
return [
|
|
2079
|
+
{
|
|
2080
|
+
...s,
|
|
2081
|
+
disc: rewriteExpr(s.disc),
|
|
2082
|
+
cases: s.cases.map((c) => ({
|
|
2083
|
+
test: c.test === null ? null : rewriteExpr(c.test),
|
|
2084
|
+
body: rewriteList(c.body),
|
|
2085
|
+
})),
|
|
2086
|
+
},
|
|
2087
|
+
];
|
|
1819
2088
|
case "block":
|
|
1820
2089
|
return [{ ...s, body: rewriteList(s.body) }];
|
|
1821
2090
|
default: {
|