@scriptc/compiler 0.1.6 → 0.2.0
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 +73 -25
- package/ambient/scriptc-overrides.d.ts +10 -6
- package/ambient/scriptc.d.ts +28 -5
- package/dist/backend/build-cache.d.ts +1 -3
- package/dist/backend/build-cache.js +3 -22
- package/dist/backend/build-cache.js.map +1 -1
- package/dist/backend/cache-root.d.ts +3 -0
- package/dist/backend/cache-root.js +23 -0
- package/dist/backend/cache-root.js.map +1 -0
- package/dist/backend/cycle-analysis.d.ts +15 -0
- package/dist/backend/cycle-analysis.js +107 -0
- package/dist/backend/cycle-analysis.js.map +1 -0
- package/dist/backend/cycle-analysis.test.js +124 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -0
- package/dist/backend/debug-symbols.d.ts +8 -0
- package/dist/backend/debug-symbols.js +52 -0
- package/dist/backend/debug-symbols.js.map +1 -0
- package/dist/backend/executable-features.d.ts +4 -0
- package/dist/backend/executable-features.js +42 -0
- package/dist/backend/executable-features.js.map +1 -0
- package/dist/backend/external-c.d.ts +5 -27
- package/dist/backend/external-c.js +5 -40
- package/dist/backend/external-c.js.map +1 -1
- package/dist/backend/ffi-callbacks.d.ts +2 -3
- package/dist/backend/ffi-callbacks.js +2 -3
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/library-identity-markers.d.ts +4 -9
- package/dist/backend/library-identity-markers.js +11 -49
- package/dist/backend/library-identity-markers.js.map +1 -1
- package/dist/backend/library-pack.d.ts +5 -0
- package/dist/backend/library-pack.js +123 -0
- package/dist/backend/library-pack.js.map +1 -0
- package/dist/backend/link-plan-core.d.ts +20 -0
- package/dist/backend/link-plan-core.js +18 -0
- package/dist/backend/link-plan-core.js.map +1 -0
- package/dist/backend/link-plan.d.ts +2 -1
- package/dist/backend/link-plan.js +18 -17
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/link-trace.d.ts +2 -0
- package/dist/backend/link-trace.js +24 -0
- package/dist/backend/link-trace.js.map +1 -0
- package/dist/backend/linker.js +9 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/literals.d.ts +9 -0
- package/dist/backend/literals.js +35 -0
- package/dist/backend/literals.js.map +1 -0
- package/dist/backend/literals.test.d.ts +1 -0
- package/dist/backend/literals.test.js +53 -0
- package/dist/backend/literals.test.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +4 -0
- package/dist/backend/llvm/blocks.js +25 -4
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/blocks.test.d.ts +1 -0
- package/dist/backend/llvm/blocks.test.js +91 -0
- package/dist/backend/llvm/blocks.test.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +14 -8
- package/dist/backend/llvm/classes.js +70 -28
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +5 -1
- package/dist/backend/llvm/common.js +45 -4
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +32 -0
- package/dist/backend/llvm/debug-info.js +198 -0
- package/dist/backend/llvm/debug-info.js.map +1 -0
- package/dist/backend/llvm/debug-info.test.d.ts +1 -0
- package/dist/backend/llvm/debug-info.test.js +110 -0
- package/dist/backend/llvm/debug-info.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +16 -2
- package/dist/backend/llvm/dyn.js +498 -175
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +598 -1
- package/dist/backend/llvm/emitter.js +739 -409
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.d.ts +1 -0
- package/dist/backend/llvm/emitter.test.js +179 -0
- package/dist/backend/llvm/emitter.test.js.map +1 -0
- package/dist/backend/llvm/expr-async.js +23 -14
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +32 -14
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
- package/dist/backend/llvm/expr-callbacks.js +25 -22
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +136 -35
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +1 -1
- package/dist/backend/llvm/expr-containers.js +43 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +5 -260
- package/dist/backend/llvm/expr-control.js +9 -5
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +72 -74
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.d.ts +1 -1
- package/dist/backend/llvm/expr-island.js +11 -7
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +51 -30
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.d.ts +5 -1
- package/dist/backend/llvm/expr-records.js +43 -4
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
- package/dist/backend/llvm/expr-stream-bridges.js +102 -121
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
- package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +19 -0
- package/dist/backend/llvm/layouts.js +12 -0
- package/dist/backend/llvm/layouts.js.map +1 -0
- package/dist/backend/llvm/lib-abi.d.ts +19 -0
- package/dist/backend/llvm/lib-abi.js +82 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -0
- package/dist/backend/llvm/lib-connect.d.ts +2 -0
- package/dist/backend/llvm/lib-connect.js +51 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.d.ts +2 -0
- package/dist/backend/llvm/lib-datagram.js +135 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -0
- package/dist/backend/llvm/lib-dispatch.js +50 -6
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +59 -18
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +2 -0
- package/dist/backend/llvm/lib-http2.js +215 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -0
- package/dist/backend/llvm/lib-lookup.d.ts +2 -0
- package/dist/backend/llvm/lib-lookup.js +39 -0
- package/dist/backend/llvm/lib-lookup.js.map +1 -0
- package/dist/backend/llvm/lib-network.js +25 -2
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +21 -16
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +125 -1
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +3 -2
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.d.ts +2 -0
- package/dist/backend/llvm/lib-test.js +34 -0
- package/dist/backend/llvm/lib-test.js.map +1 -0
- package/dist/backend/llvm/lib-tls.d.ts +2 -0
- package/dist/backend/llvm/lib-tls.js +82 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +10 -9
- package/dist/backend/llvm/shapes.js +35 -130
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/split.js +4 -1
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +26 -1
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/unsupported.d.ts +1 -0
- package/dist/backend/llvm/unsupported.js +1 -2
- package/dist/backend/llvm/unsupported.js.map +1 -1
- package/dist/backend/llvm/walkers.js +1 -7
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/mangle.d.ts +2 -2
- package/dist/backend/mangle.js +16 -5
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
- package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
- package/dist/backend/may-throw.js.map +1 -0
- package/dist/backend/may-throw.test.d.ts +1 -0
- package/dist/backend/may-throw.test.js +58 -0
- package/dist/backend/may-throw.test.js.map +1 -0
- package/dist/backend/native-codegen-core.d.ts +22 -0
- package/dist/backend/native-codegen-core.js +44 -0
- package/dist/backend/native-codegen-core.js.map +1 -0
- package/dist/backend/native-codegen.d.ts +3 -19
- package/dist/backend/native-codegen.js +5 -44
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +2 -2
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +94 -0
- package/dist/backend/native-link-info-core.js +62 -0
- package/dist/backend/native-link-info-core.js.map +1 -0
- package/dist/backend/native-link-info.d.ts +3 -88
- package/dist/backend/native-link-info.js +12 -243
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +41 -146
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +10 -25
- package/dist/backend/native-toolchain.js +89 -219
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +15 -5
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +24 -0
- package/dist/backend/native-tools.js +33 -0
- package/dist/backend/native-tools.js.map +1 -0
- package/dist/backend/object-localize.js +19 -8
- package/dist/backend/object-localize.js.map +1 -1
- package/dist/backend/object-localize.test.js +22 -0
- package/dist/backend/object-localize.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 +101 -0
- package/dist/backend/runtime-pack-core.js +172 -0
- package/dist/backend/runtime-pack-core.js.map +1 -0
- package/dist/backend/runtime-pack-native.d.ts +21 -0
- package/dist/backend/runtime-pack-native.js +70 -0
- package/dist/backend/runtime-pack-native.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.d.ts +3 -83
- package/dist/backend/runtime-pack.js +8 -151
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +24 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/source-locations.d.ts +12 -0
- package/dist/backend/source-locations.js +32 -0
- package/dist/backend/source-locations.js.map +1 -0
- package/dist/backend/source-locations.test.d.ts +1 -0
- package/dist/backend/source-locations.test.js +16 -0
- package/dist/backend/source-locations.test.js.map +1 -0
- package/dist/backend/target-diagnostics.d.ts +22 -0
- package/dist/backend/target-diagnostics.js +108 -0
- package/dist/backend/target-diagnostics.js.map +1 -0
- package/dist/backend/target-platform.d.ts +15 -0
- package/dist/backend/target-platform.js +72 -0
- package/dist/backend/target-platform.js.map +1 -0
- package/dist/backend/targets.d.ts +13 -4
- package/dist/backend/targets.js +95 -30
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +65 -4
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/backend/toolchain-environment.d.ts +6 -0
- package/dist/backend/toolchain-environment.js +99 -0
- package/dist/backend/toolchain-environment.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +1 -9
- package/dist/backend/vendor-archives.js +2 -9
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +9 -0
- package/dist/backend/vendor-inputs.js +10 -0
- package/dist/backend/vendor-inputs.js.map +1 -0
- package/dist/backend/warm-cache.d.ts +3 -0
- package/dist/backend/warm-cache.js +41 -0
- package/dist/backend/warm-cache.js.map +1 -0
- package/dist/cli/command.d.ts +3 -0
- package/dist/cli/command.js +328 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/host.d.ts +24 -0
- package/dist/cli/host.js +2 -0
- package/dist/cli/host.js.map +1 -0
- package/dist/cli/output-options.d.ts +26 -0
- package/dist/cli/output-options.js +60 -0
- package/dist/cli/output-options.js.map +1 -0
- package/dist/cli/paths.d.ts +12 -0
- package/dist/cli/paths.js +42 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/usage.d.ts +74 -0
- package/dist/cli/usage.js +86 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/cli/wasi-paths.d.ts +8 -0
- package/dist/cli/wasi-paths.js +41 -0
- package/dist/cli/wasi-paths.js.map +1 -0
- package/dist/cli/wasi-runner.d.ts +2 -0
- package/dist/cli/wasi-runner.js +28 -0
- package/dist/cli/wasi-runner.js.map +1 -0
- package/dist/compat/fetch-profile.js +3 -3
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +162 -0
- package/dist/compile-types.js +2 -0
- package/dist/compile-types.js.map +1 -0
- package/dist/coverage/report.js +11 -5
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +5 -2
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js +15 -3
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -4
- package/dist/executable/executable-cache.js +33 -10
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +38 -16
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +14 -0
- package/dist/executable/prepare.js +66 -0
- package/dist/executable/prepare.js.map +1 -0
- package/dist/ffi/ffi-manifest.d.ts +11 -4
- package/dist/ffi/ffi-manifest.js +170 -58
- package/dist/ffi/ffi-manifest.js.map +1 -1
- package/dist/ffi/ffi-manifest.test.d.ts +1 -0
- package/dist/ffi/ffi-manifest.test.js +111 -0
- package/dist/ffi/ffi-manifest.test.js.map +1 -0
- package/dist/format-integer.d.ts +3 -0
- package/dist/format-integer.js +14 -0
- package/dist/format-integer.js.map +1 -0
- package/dist/frontend/analysis.d.ts +5 -0
- package/dist/frontend/analysis.js +88 -0
- package/dist/frontend/analysis.js.map +1 -0
- package/dist/frontend/arguments-usage.d.ts +4 -0
- package/dist/frontend/arguments-usage.js +40 -0
- package/dist/frontend/arguments-usage.js.map +1 -0
- package/dist/frontend/binding-source.d.ts +4 -0
- package/dist/frontend/binding-source.js +18 -0
- package/dist/frontend/binding-source.js.map +1 -0
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -1
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-lexer.d.ts +4 -25
- package/dist/frontend/cjs-lexer.js +6 -806
- package/dist/frontend/cjs-lexer.js.map +1 -1
- package/dist/frontend/cjs-resolve.d.ts +5 -0
- package/dist/frontend/cjs-resolve.js +429 -0
- package/dist/frontend/cjs-resolve.js.map +1 -0
- package/dist/frontend/cjs-syntax.d.ts +26 -0
- package/dist/frontend/cjs-syntax.js +806 -0
- package/dist/frontend/cjs-syntax.js.map +1 -0
- package/dist/frontend/comptime-node.d.ts +4 -0
- package/dist/frontend/comptime-node.js +16 -0
- package/dist/frontend/comptime-node.js.map +1 -0
- package/dist/frontend/comptime-node.test.d.ts +1 -0
- package/dist/frontend/comptime-node.test.js +37 -0
- package/dist/frontend/comptime-node.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +3 -4
- package/dist/frontend/dts-paths.js +15 -8
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/fork-target.js +2 -2
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/helper-tokens.d.ts +1 -0
- package/dist/frontend/helper-tokens.js +147 -0
- package/dist/frontend/helper-tokens.js.map +1 -0
- package/dist/frontend/helper-tokens.test.d.ts +1 -0
- package/dist/frontend/helper-tokens.test.js +35 -0
- package/dist/frontend/helper-tokens.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
- package/dist/frontend/inferred-js-diagnostics.js +69 -0
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
- package/dist/frontend/input-tracker.d.ts +5 -2
- package/dist/frontend/input-tracker.js +24 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +23 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lib-contract.js +32 -24
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/literal-values.d.ts +4 -0
- package/dist/frontend/literal-values.js +21 -0
- package/dist/frontend/literal-values.js.map +1 -0
- package/dist/frontend/literal-values.test.d.ts +1 -0
- package/dist/frontend/literal-values.test.js +91 -0
- package/dist/frontend/literal-values.test.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
- package/dist/frontend/lowering/abstract-equality.js +3 -0
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +4 -1
- package/dist/frontend/lowering/array-values.js +43 -1
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/callback-arg.js +1 -0
- package/dist/frontend/lowering/callback-arg.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
- package/dist/frontend/lowering/class-callbacks.js +63 -0
- package/dist/frontend/lowering/class-callbacks.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +9 -0
- package/dist/frontend/lowering/class-descriptors.js +73 -0
- package/dist/frontend/lowering/class-descriptors.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +41 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +803 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +92 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
- package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
- package/dist/frontend/lowering/class-instance-constructor.js +64 -0
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.d.ts +10 -0
- package/dist/frontend/lowering/class-method-values.js +170 -0
- package/dist/frontend/lowering/class-method-values.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.d.ts +16 -0
- package/dist/frontend/lowering/class-prototypes.js +134 -0
- package/dist/frontend/lowering/class-prototypes.js.map +1 -0
- package/dist/frontend/lowering/class-static-data.d.ts +6 -0
- package/dist/frontend/lowering/class-static-data.js +56 -0
- package/dist/frontend/lowering/class-static-data.js.map +1 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
- package/dist/frontend/lowering/containers/bytes.js +164 -155
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
- package/dist/frontend/lowering/containers/string-and-regexp.js +39 -16
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
- package/dist/frontend/lowering/containers/string-replacement.js +217 -0
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
- package/dist/frontend/lowering/error-methods.d.ts +11 -0
- package/dist/frontend/lowering/error-methods.js +78 -0
- package/dist/frontend/lowering/error-methods.js.map +1 -0
- package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
- package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
- package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
- package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
- package/dist/frontend/lowering/expressions/native-proxy.js +49 -0
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js +124 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
- package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
- package/dist/frontend/lowering/expressions/object-literals.js +485 -185
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +5 -6
- package/dist/frontend/lowering/expressions/optional-chains.js +27 -14
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
- package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
- package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
- package/dist/frontend/lowering/function-context.d.ts +93 -0
- package/dist/frontend/lowering/function-context.js +103 -0
- package/dist/frontend/lowering/function-context.js.map +1 -0
- package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
- package/dist/frontend/lowering/generator-delegation.js +85 -0
- package/dist/frontend/lowering/generator-delegation.js.map +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +10 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +105 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +2 -1
- package/dist/frontend/lowering/lib-boundary.js +59 -20
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
- package/dist/frontend/lowering/lib-boundary.test.js +45 -0
- package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-assert.d.ts +1 -1
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
- package/dist/frontend/lowering/lower-builtin-values.js +139 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +27 -41
- package/dist/frontend/lowering/lower-builtins.js +553 -346
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +22 -26
- package/dist/frontend/lowering/lower-calls.js +1373 -380
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +83 -45
- package/dist/frontend/lowering/lower-classes.js +952 -339
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
- package/dist/frontend/lowering/lower-comptime.js +23 -32
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +27 -32
- package/dist/frontend/lowering/lower-containers.js +796 -151
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.d.ts +1 -1
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
- package/dist/frontend/lowering/lower-event-emitter.js +58 -26
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.d.ts +7 -1
- package/dist/frontend/lowering/lower-expando.js +14 -6
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +35 -11
- package/dist/frontend/lowering/lower-exprs.js +1785 -790
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +2 -5
- package/dist/frontend/lowering/lower-generators.js +77 -46
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
- package/dist/frontend/lowering/lower-global-value.js +17 -0
- package/dist/frontend/lowering/lower-global-value.js.map +1 -0
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +17 -8
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +5 -8
- package/dist/frontend/lowering/lower-island.js +34 -23
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
- package/dist/frontend/lowering/lower-mixins.js +5 -3
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -1
- package/dist/frontend/lowering/lower-modules.js +252 -38
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
- package/dist/frontend/lowering/lower-node-module.js +13 -10
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +1 -1
- package/dist/frontend/lowering/lower-server.js +6 -10
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +10 -14
- package/dist/frontend/lowering/lower-stmts.js +731 -532
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +1 -1
- package/dist/frontend/lowering/lower-stream.js +19 -10
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +1 -1
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-url.d.ts +6 -0
- package/dist/frontend/lowering/lower-url.js +77 -0
- package/dist/frontend/lowering/lower-url.js.map +1 -0
- package/dist/frontend/lowering/lowerer.d.ts +113 -189
- package/dist/frontend/lowering/lowerer.js +1033 -663
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
- package/dist/frontend/lowering/lowerer.test.js +26 -0
- package/dist/frontend/lowering/lowerer.test.js.map +1 -0
- package/dist/frontend/lowering/native-ffi.d.ts +5 -0
- package/dist/frontend/lowering/native-ffi.js +40 -0
- package/dist/frontend/lowering/native-ffi.js.map +1 -0
- package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
- package/dist/frontend/lowering/object-factory-new.js +68 -0
- package/dist/frontend/lowering/object-factory-new.js.map +1 -0
- package/dist/frontend/lowering/optional-arguments.js +6 -1
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
- package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
- package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
- package/dist/frontend/lowering/sanitize-class-types.js +79 -0
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
- package/dist/frontend/lowering/static-this.d.ts +5 -1
- package/dist/frontend/lowering/static-this.js +28 -2
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/string-index.d.ts +7 -0
- package/dist/frontend/lowering/string-index.js +39 -0
- package/dist/frontend/lowering/string-index.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +9 -4
- package/dist/frontend/lowering/surfaces.js +98 -35
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
- package/dist/frontend/lowering/symbol-fields.js +183 -0
- package/dist/frontend/lowering/symbol-fields.js.map +1 -0
- package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
- package/dist/frontend/lowering/symbol-methods.js +30 -0
- package/dist/frontend/lowering/symbol-methods.js.map +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.d.ts +10 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +77 -0
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.d.ts +9 -0
- package/dist/frontend/lowering/union-narrow.js +59 -0
- package/dist/frontend/lowering/union-narrow.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
- package/dist/frontend/lowering/union-narrow.test.js +72 -0
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
- package/dist/frontend/lowering/union-retag.d.ts +43 -0
- package/dist/frontend/lowering/union-retag.js +259 -0
- package/dist/frontend/lowering/union-retag.js.map +1 -0
- package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
- package/dist/frontend/lowering/union-retag.test.js +405 -0
- package/dist/frontend/lowering/union-retag.test.js.map +1 -0
- package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
- package/dist/frontend/lowering/unregistered-class-types.js +94 -0
- package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
- package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
- package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
- package/dist/frontend/lowering/width-lift.d.ts +40 -0
- package/dist/frontend/lowering/width-lift.js +2 -0
- package/dist/frontend/lowering/width-lift.js.map +1 -0
- package/dist/frontend/module-syntax.d.ts +58 -0
- package/dist/frontend/module-syntax.js +123 -0
- package/dist/frontend/module-syntax.js.map +1 -0
- package/dist/frontend/module-syntax.test.d.ts +1 -0
- package/dist/frontend/module-syntax.test.js +78 -0
- package/dist/frontend/module-syntax.test.js.map +1 -0
- package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
- package/dist/frontend/npm-fetch-analysis.js +100 -0
- package/dist/frontend/npm-fetch-analysis.js.map +1 -0
- package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
- package/dist/frontend/npm-fetch-analysis.test.js +107 -0
- package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
- package/dist/frontend/npm-fetch-node.d.ts +2 -0
- package/dist/frontend/npm-fetch-node.js +12 -0
- package/dist/frontend/npm-fetch-node.js.map +1 -0
- package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
- package/dist/frontend/npm-fetch-syntax.js +207 -0
- package/dist/frontend/npm-fetch-syntax.js.map +1 -0
- package/dist/frontend/npm-node.d.ts +10 -0
- package/dist/frontend/npm-node.js +14 -0
- package/dist/frontend/npm-node.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
- package/dist/frontend/npm-static-bundled-cjs.js +236 -0
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
- package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
- package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
- package/dist/frontend/npm-static-declaration-syntax.js +944 -0
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
- package/dist/frontend/npm-static-declarations.d.ts +11 -39
- package/dist/frontend/npm-static-declarations.js +22 -561
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +245 -6
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.d.ts +1 -1
- package/dist/frontend/npm-static-prune.js +5 -4
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +1 -1
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
- package/dist/frontend/npm-static-rewrite-host.js +179 -0
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
- package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
- package/dist/frontend/npm-static-rewrite.d.ts +0 -5
- package/dist/frontend/npm-static-rewrite.js +2 -1079
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.d.ts +5 -0
- package/dist/frontend/npm-static-subtyping.js +55 -0
- package/dist/frontend/npm-static-subtyping.js.map +1 -0
- package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
- package/dist/frontend/npm-static-subtyping.test.js +58 -0
- package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +7 -15
- package/dist/frontend/npm-static.js +19 -28
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +8 -69
- package/dist/frontend/npm.js +21 -361
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +2 -2
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.d.ts +6 -0
- package/dist/frontend/pipeline-native.js +32 -0
- package/dist/frontend/pipeline-native.js.map +1 -0
- package/dist/frontend/pipeline.d.ts +54 -0
- package/dist/frontend/pipeline.js +382 -0
- package/dist/frontend/pipeline.js.map +1 -0
- package/dist/frontend/pipeline.test.d.ts +1 -0
- package/dist/frontend/pipeline.test.js +77 -0
- package/dist/frontend/pipeline.test.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +10 -0
- package/dist/frontend/program-analysis.js +14 -0
- package/dist/frontend/program-analysis.js.map +1 -0
- package/dist/frontend/program-node.d.ts +9 -0
- package/dist/frontend/program-node.js +48 -0
- package/dist/frontend/program-node.js.map +1 -0
- package/dist/frontend/program.d.ts +43 -19
- package/dist/frontend/program.js +556 -197
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.d.ts +1 -0
- package/dist/frontend/program.test.js +202 -0
- package/dist/frontend/program.test.js.map +1 -0
- package/dist/frontend/provenance-core.d.ts +9 -0
- package/dist/frontend/provenance-core.js +435 -0
- package/dist/frontend/provenance-core.js.map +1 -0
- package/dist/frontend/provenance.d.ts +0 -4
- package/dist/frontend/provenance.js +4 -459
- package/dist/frontend/provenance.js.map +1 -1
- package/dist/frontend/resolve.d.ts +3 -1
- package/dist/frontend/resolve.js +6 -3
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.d.ts +4 -3
- package/dist/frontend/runtime-resolve.js +22 -18
- package/dist/frontend/runtime-resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.test.js +53 -0
- package/dist/frontend/runtime-resolve.test.js.map +1 -1
- package/dist/frontend/services-node.d.ts +5 -0
- package/dist/frontend/services-node.js +19 -0
- package/dist/frontend/services-node.js.map +1 -0
- package/dist/frontend/services-node.test.d.ts +1 -0
- package/dist/frontend/services-node.test.js +70 -0
- package/dist/frontend/services-node.test.js.map +1 -0
- package/dist/frontend/services.d.ts +44 -0
- package/dist/frontend/services.js +90 -0
- package/dist/frontend/services.js.map +1 -0
- package/dist/frontend/services.test.d.ts +1 -0
- package/dist/frontend/services.test.js +174 -0
- package/dist/frontend/services.test.js.map +1 -0
- package/dist/frontend/ts7/adapter.d.ts +3 -3
- package/dist/frontend/ts7/adapter.js +14 -31
- package/dist/frontend/ts7/adapter.js.map +1 -1
- package/dist/frontend/ts7/api.d.ts +16 -0
- package/dist/frontend/ts7/api.js +24 -0
- package/dist/frontend/ts7/api.js.map +1 -0
- package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
- package/dist/frontend/ts7/ast-bytes.js +137 -0
- package/dist/frontend/ts7/ast-bytes.js.map +1 -0
- package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-bytes.test.js +73 -0
- package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
- package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
- package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-guards.test.js +43 -0
- package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +194 -0
- package/dist/frontend/ts7/ast-node.js +448 -0
- package/dist/frontend/ts7/ast-node.js.map +1 -0
- package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-node.test.js +266 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -0
- package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
- package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
- package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-text.d.ts +6 -0
- package/dist/frontend/ts7/ast-text.js +124 -0
- package/dist/frontend/ts7/ast-text.js.map +1 -0
- package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-text.test.js +38 -0
- package/dist/frontend/ts7/ast-text.test.js.map +1 -0
- package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
- package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
- package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-types.d.ts +42 -0
- package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
- package/dist/frontend/ts7/ast-types.generated.js +5 -0
- package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-types.js +3 -0
- package/dist/frontend/ts7/ast-types.js.map +1 -0
- package/dist/frontend/ts7/ast-wire.d.ts +58 -0
- package/dist/frontend/ts7/ast-wire.js +267 -0
- package/dist/frontend/ts7/ast-wire.js.map +1 -0
- package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-wire.test.js +151 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
- package/dist/frontend/ts7/ast.d.ts +14 -14
- package/dist/frontend/ts7/ast.js +21 -15
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/census-check.js +1 -0
- package/dist/frontend/ts7/census-check.js.map +1 -1
- package/dist/frontend/ts7/checker-cache.d.ts +48 -0
- package/dist/frontend/ts7/checker-cache.js +92 -0
- package/dist/frontend/ts7/checker-cache.js.map +1 -0
- package/dist/frontend/ts7/checker.d.ts +19 -46
- package/dist/frontend/ts7/checker.js +231 -161
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.d.ts +1 -0
- package/dist/frontend/ts7/checker.test.js +335 -0
- package/dist/frontend/ts7/checker.test.js.map +1 -0
- package/dist/frontend/ts7/enums.d.ts +4 -27
- package/dist/frontend/ts7/enums.generated.d.ts +878 -0
- package/dist/frontend/ts7/enums.generated.js +1313 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -0
- package/dist/frontend/ts7/enums.js +4 -45
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/enums.test.d.ts +1 -0
- package/dist/frontend/ts7/enums.test.js +48 -0
- package/dist/frontend/ts7/enums.test.js.map +1 -0
- package/dist/frontend/ts7/native-api.d.ts +10 -0
- package/dist/frontend/ts7/native-api.js +10 -0
- package/dist/frontend/ts7/native-api.js.map +1 -0
- package/dist/frontend/ts7/native-host.d.ts +2 -0
- package/dist/frontend/ts7/native-host.js +11 -0
- package/dist/frontend/ts7/native-host.js.map +1 -0
- package/dist/frontend/ts7/native-process.d.ts +14 -0
- package/dist/frontend/ts7/native-process.js +62 -0
- package/dist/frontend/ts7/native-process.js.map +1 -0
- package/dist/frontend/ts7/program-adapter.d.ts +10 -98
- package/dist/frontend/ts7/program-adapter.js +16 -310
- package/dist/frontend/ts7/program-adapter.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +115 -0
- package/dist/frontend/ts7/program-host.js +347 -0
- package/dist/frontend/ts7/program-host.js.map +1 -0
- package/dist/frontend/ts7/program-host.test.d.ts +1 -0
- package/dist/frontend/ts7/program-host.test.js +207 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-api.d.ts +12 -0
- package/dist/frontend/ts7/rpc-api.js +23 -0
- package/dist/frontend/ts7/rpc-api.js.map +1 -0
- package/dist/frontend/ts7/rpc-client.d.ts +27 -0
- package/dist/frontend/ts7/rpc-client.js +102 -0
- package/dist/frontend/ts7/rpc-client.js.map +1 -0
- package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-client.test.js +133 -0
- package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
- package/dist/frontend/ts7/rpc-filesystem.js +42 -0
- package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
- package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
- package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-process.d.ts +2 -0
- package/dist/frontend/ts7/rpc-process.js +148 -0
- package/dist/frontend/ts7/rpc-process.js.map +1 -0
- package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-process.test.js +29 -0
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
- package/dist/frontend/ts7/rpc-wire.js +195 -0
- package/dist/frontend/ts7/rpc-wire.js.map +1 -0
- package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-wire.test.js +168 -0
- package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
- package/dist/frontend/ts7/semantic-checker.js +221 -0
- package/dist/frontend/ts7/semantic-checker.js.map +1 -0
- package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-checker.test.js +119 -0
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-json.d.ts +5 -0
- package/dist/frontend/ts7/semantic-json.js +52 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -0
- package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-json.test.js +42 -0
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-model.d.ts +222 -0
- package/dist/frontend/ts7/semantic-model.js +423 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -0
- package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-model.test.js +322 -0
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
- package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
- package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/semantic-types.d.ts +5 -0
- package/dist/frontend/ts7/semantic-types.js +2 -0
- package/dist/frontend/ts7/semantic-types.js.map +1 -0
- package/dist/frontend/ts7/session-cache.d.ts +17 -0
- package/dist/frontend/ts7/session-cache.js +97 -0
- package/dist/frontend/ts7/session-cache.js.map +1 -0
- package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
- package/dist/frontend/ts7/session-cache.test.js +87 -0
- package/dist/frontend/ts7/session-cache.test.js.map +1 -0
- package/dist/frontend/ts7/session-path.d.ts +18 -0
- package/dist/frontend/ts7/session-path.js +203 -0
- package/dist/frontend/ts7/session-path.js.map +1 -0
- package/dist/frontend/ts7/session-path.test.d.ts +1 -0
- package/dist/frontend/ts7/session-path.test.js +34 -0
- package/dist/frontend/ts7/session-path.test.js.map +1 -0
- package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
- package/dist/frontend/ts7/session-schema.generated.js +5 -0
- package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/session-timing.d.ts +50 -0
- package/dist/frontend/ts7/session-timing.js +61 -0
- package/dist/frontend/ts7/session-timing.js.map +1 -0
- package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
- package/dist/frontend/ts7/session-timing.test.js +52 -0
- package/dist/frontend/ts7/session-timing.test.js.map +1 -0
- package/dist/frontend/ts7/session.d.ts +105 -0
- package/dist/frontend/ts7/session.js +233 -0
- package/dist/frontend/ts7/session.js.map +1 -0
- package/dist/frontend/ts7/session.test.d.ts +1 -0
- package/dist/frontend/ts7/session.test.js +215 -0
- package/dist/frontend/ts7/session.test.js.map +1 -0
- package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
- package/dist/frontend/ts7/source-parser-node.js +15 -0
- package/dist/frontend/ts7/source-parser-node.js.map +1 -0
- package/dist/frontend/ts7/source-parser.d.ts +25 -0
- package/dist/frontend/ts7/source-parser.js +96 -0
- package/dist/frontend/ts7/source-parser.js.map +1 -0
- package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
- package/dist/frontend/ts7/source-parser.test.js +151 -0
- package/dist/frontend/ts7/source-parser.test.js.map +1 -0
- package/dist/frontend/ts7/syntax.d.ts +3 -0
- package/dist/frontend/ts7/syntax.js +4 -0
- package/dist/frontend/ts7/syntax.js.map +1 -0
- package/dist/frontend/tsc-codes.js +3 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +29 -19
- package/dist/frontend/type-mapper.js +713 -306
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.d.ts +1 -0
- package/dist/frontend/type-mapper.test.js +207 -0
- package/dist/frontend/type-mapper.test.js.map +1 -0
- package/dist/frontend/union-discriminants.d.ts +16 -0
- package/dist/frontend/union-discriminants.js +98 -0
- package/dist/frontend/union-discriminants.js.map +1 -0
- package/dist/frontend/union-discriminants.test.d.ts +1 -0
- package/dist/frontend/union-discriminants.test.js +182 -0
- package/dist/frontend/union-discriminants.test.js.map +1 -0
- package/dist/index.d.ts +7 -197
- package/dist/index.js +369 -1567
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +16 -4
- package/dist/ir/analysis.js +25 -6
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +15 -2
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/constant-tables.js +67 -49
- package/dist/ir/constant-tables.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/control-flow.d.ts +6 -0
- package/dist/ir/control-flow.js +142 -0
- package/dist/ir/control-flow.js.map +1 -0
- package/dist/ir/control-flow.test.d.ts +1 -0
- package/dist/ir/control-flow.test.js +113 -0
- package/dist/ir/control-flow.test.js.map +1 -0
- package/dist/ir/integer-loops.js +7 -18
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-ranges.js +53 -27
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +309 -164
- package/dist/ir/ir.js +588 -879
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +127 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/scalar-records.js +165 -134
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +4 -2
- package/dist/ir/serialize.js +19 -12
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.d.ts +1 -0
- package/dist/ir/serialize.test.js +53 -0
- package/dist/ir/serialize.test.js.map +1 -0
- package/dist/ir/traverse.d.ts +41 -0
- package/dist/ir/traverse.js +660 -0
- package/dist/ir/traverse.js.map +1 -0
- package/dist/ir/traverse.test.d.ts +1 -0
- package/dist/ir/traverse.test.js +242 -0
- package/dist/ir/traverse.test.js.map +1 -0
- package/dist/ir/validate.js +1956 -1496
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +476 -2
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/cache-primitives.d.ts +2 -3
- package/dist/library/cache-primitives.js +4 -6
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/compiler-self-identity.d.ts +1 -1
- package/dist/library/compiler-self-identity.js +31 -15
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/compiler-self-identity.test.d.ts +1 -0
- package/dist/library/compiler-self-identity.test.js +93 -0
- package/dist/library/compiler-self-identity.test.js.map +1 -0
- package/dist/library/fence-eval.js +2 -2
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/int-infer.js +7 -6
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/library-cache.d.ts +3 -2
- package/dist/library/library-cache.js +5 -17
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +54 -41
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/library-profile.d.ts +3 -1
- package/dist/library/library-profile.js +15 -6
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.d.ts +15 -0
- package/dist/library/prepare.js +584 -0
- package/dist/library/prepare.js.map +1 -0
- package/dist/library/semantic-source.d.ts +1 -1
- package/dist/library/semantic-source.js +8 -6
- package/dist/library/semantic-source.js.map +1 -1
- package/dist/library/sidecar-validate.js +4 -4
- package/dist/library/sidecar-validate.js.map +1 -1
- package/dist/library/sidecar.d.ts +2 -0
- package/dist/library/sidecar.js +10 -3
- package/dist/library/sidecar.js.map +1 -1
- package/dist/native/cache.d.ts +11 -0
- package/dist/native/cache.js +113 -0
- package/dist/native/cache.js.map +1 -0
- package/dist/native/cache.test.d.ts +1 -0
- package/dist/native/cache.test.js +66 -0
- package/dist/native/cache.test.js.map +1 -0
- package/dist/native/cli.d.ts +1 -0
- package/dist/native/cli.js +112 -0
- package/dist/native/cli.js.map +1 -0
- package/dist/native/compiler.d.ts +15 -0
- package/dist/native/compiler.js +336 -0
- package/dist/native/compiler.js.map +1 -0
- package/dist/native/compiler.test.d.ts +1 -0
- package/dist/native/compiler.test.js +174 -0
- package/dist/native/compiler.test.js.map +1 -0
- package/dist/native/comptime.d.ts +5 -0
- package/dist/native/comptime.js +73 -0
- package/dist/native/comptime.js.map +1 -0
- package/dist/native/comptime.test.d.ts +1 -0
- package/dist/native/comptime.test.js +65 -0
- package/dist/native/comptime.test.js.map +1 -0
- package/dist/native/executable-cache.d.ts +26 -0
- package/dist/native/executable-cache.js +228 -0
- package/dist/native/executable-cache.js.map +1 -0
- package/dist/native/executable-cache.test.d.ts +1 -0
- package/dist/native/executable-cache.test.js +151 -0
- package/dist/native/executable-cache.test.js.map +1 -0
- package/dist/native/file-identity.d.ts +4 -0
- package/dist/native/file-identity.js +14 -0
- package/dist/native/file-identity.js.map +1 -0
- package/dist/native/file-identity.test.d.ts +1 -0
- package/dist/native/file-identity.test.js +43 -0
- package/dist/native/file-identity.test.js.map +1 -0
- package/dist/native/library.d.ts +22 -0
- package/dist/native/library.js +83 -0
- package/dist/native/library.js.map +1 -0
- package/dist/native/prepare.d.ts +21 -0
- package/dist/native/prepare.js +174 -0
- package/dist/native/prepare.js.map +1 -0
- package/dist/native/prepare.test.d.ts +1 -0
- package/dist/native/prepare.test.js +70 -0
- package/dist/native/prepare.test.js.map +1 -0
- package/dist/native/sanitizer.d.ts +11 -0
- package/dist/native/sanitizer.js +135 -0
- package/dist/native/sanitizer.js.map +1 -0
- package/dist/native/sanitizer.test.d.ts +1 -0
- package/dist/native/sanitizer.test.js +58 -0
- package/dist/native/sanitizer.test.js.map +1 -0
- package/dist/native/task.d.ts +4 -0
- package/dist/native/task.js +16 -0
- package/dist/native/task.js.map +1 -0
- package/dist/native/task.test.d.ts +1 -0
- package/dist/native/task.test.js +17 -0
- package/dist/native/task.test.js.map +1 -0
- package/dist/native/toolchain.d.ts +45 -0
- package/dist/native/toolchain.js +74 -0
- package/dist/native/toolchain.js.map +1 -0
- package/dist/native/toolchain.test.d.ts +1 -0
- package/dist/native/toolchain.test.js +33 -0
- package/dist/native/toolchain.test.js.map +1 -0
- package/dist/startup-cache.d.ts +1 -1
- package/dist/startup-cache.js +2 -5
- package/dist/startup-cache.js.map +1 -1
- package/dist/timing.d.ts +4 -0
- package/dist/timing.js +19 -0
- package/dist/timing.js.map +1 -0
- package/dist/wasi-paths.js +10 -7
- package/dist/wasi-paths.js.map +1 -1
- package/package.json +28 -19
- package/surface-manifest.json +171 -18
- package/dist/backend/c/async.d.ts +0 -171
- package/dist/backend/c/async.js +0 -1317
- package/dist/backend/c/async.js.map +0 -1
- package/dist/backend/c/c-emitter.d.ts +0 -531
- package/dist/backend/c/c-emitter.js +0 -1917
- package/dist/backend/c/c-emitter.js.map +0 -1
- package/dist/backend/c/exprs.d.ts +0 -15
- package/dist/backend/c/exprs.js +0 -8803
- package/dist/backend/c/exprs.js.map +0 -1
- package/dist/backend/c/island.d.ts +0 -45
- package/dist/backend/c/island.js +0 -281
- package/dist/backend/c/island.js.map +0 -1
- package/dist/backend/c/may-throw.js.map +0 -1
- package/dist/backend/c/shapes.d.ts +0 -142
- package/dist/backend/c/shapes.js +0 -603
- package/dist/backend/c/shapes.js.map +0 -1
- package/dist/backend/c/stmts.d.ts +0 -76
- package/dist/backend/c/stmts.js +0 -1084
- package/dist/backend/c/stmts.js.map +0 -1
- package/dist/backend/c/types.d.ts +0 -71
- package/dist/backend/c/types.js +0 -459
- package/dist/backend/c/types.js.map +0 -1
- package/dist/backend/c/types.test.js +0 -32
- package/dist/backend/c/types.test.js.map +0 -1
- package/dist/backend/c/walkers.d.ts +0 -134
- package/dist/backend/c/walkers.js +0 -1773
- package/dist/backend/c/walkers.js.map +0 -1
- /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { objectEnumerationReceiver } from "./object-enumeration-receiver.js";
|
|
1
2
|
import { InternalCompilerError } from "../../errors.js";
|
|
2
3
|
/* Container-surface call lowering: array methods (including the HOF family
|
|
3
4
|
* map/filter/forEach with their synthesized helper functions), Map/Set
|
|
@@ -7,13 +8,13 @@ import * as ts from "../ts7/adapter.js";
|
|
|
7
8
|
import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
|
|
8
9
|
import { ARRAY_METHODS, MAP_METHODS, SET_COMBINE_METHODS, SET_METHODS } from "./surfaces.js";
|
|
9
10
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
10
|
-
import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
|
|
11
11
|
import { forOfVarTarget, lowerDestructuringAssign } from "./lower-stmts.js";
|
|
12
12
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
13
13
|
import { islandPrimitiveExit, lowerDynDispatchMethodCall } from "./lower-calls.js";
|
|
14
14
|
import { buildArraySortFn } from "./lower-array-sort.js";
|
|
15
15
|
import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, currentArrayIndexPresent } from "./array-values.js";
|
|
16
16
|
import { typeKey } from "../type-mapper.js";
|
|
17
|
+
import { nodeThrowExpr } from "./lowerer.js";
|
|
17
18
|
import { boolLit, countedFor, numLit, strLit, varRef } from "../../ir/build.js";
|
|
18
19
|
import { defaultAfterUndefined, lowerPositionArgument, lowerStaticallyUndefinedArgument, positionNumber } from "./optional-arguments.js";
|
|
19
20
|
import { lowerArrayCopyWithin, lowerArrayFill } from "./array-indexed-mutation.js";
|
|
@@ -79,7 +80,13 @@ function lowerArraySpreadItems(lowerer, nodes, elem, arrType, loc) {
|
|
|
79
80
|
];
|
|
80
81
|
for (const node of nodes) {
|
|
81
82
|
if (ts.isSpreadElement(node)) {
|
|
82
|
-
|
|
83
|
+
let source = lowerer.lowerExpr(node.expression);
|
|
84
|
+
if (source.type.kind === "set" && typeEquals(source.type.elem, elem)) {
|
|
85
|
+
source = { kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrType, loc };
|
|
86
|
+
}
|
|
87
|
+
if (source.type.kind === "record" && lowerer.shapes.get(source.type.shapeId)?.tuple) {
|
|
88
|
+
source = lowerer.widthCoerce(source, arrType) ?? source;
|
|
89
|
+
}
|
|
83
90
|
if (!typeEquals(source.type, arrType)) {
|
|
84
91
|
lowerer.noLowering(`Array insertion spread from '${lowerer.fmt(source.type)}'`, node);
|
|
85
92
|
}
|
|
@@ -205,6 +212,21 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
205
212
|
// static arrIntrinsic over a jsval (the validator ICE).
|
|
206
213
|
{
|
|
207
214
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
215
|
+
if (receiver.type.kind === "union") {
|
|
216
|
+
const arms = lowerer.unions.get(receiver.type.unionId)?.arms;
|
|
217
|
+
const present = arms?.find((arm) => arm.kind === "array");
|
|
218
|
+
if (present?.kind === "array" && arms?.every((arm) => typeEquals(arm, present) || isUnitType(arm))) {
|
|
219
|
+
// A predicate can narrow the element type without changing the
|
|
220
|
+
// original array layout. Extract that stored array before choosing
|
|
221
|
+
// a helper, then adapt callback arguments at their actual ABI.
|
|
222
|
+
const array = lowerer.runtimeOptionalPropertyReceiver(access.expression, receiver, present, name) ??
|
|
223
|
+
lowerer.coerceInto(access.expression, receiver, present);
|
|
224
|
+
return lowerer.withExpressionOverride(access.expression, array, () => lowerArrayMethodCall(lowerer, call, access));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (receiver.type.kind === "record" && lowerer.shapes.get(receiver.type.shapeId)?.tuple) {
|
|
228
|
+
return lowerTupleReadMethodCall(lowerer, call, access, receiver);
|
|
229
|
+
}
|
|
208
230
|
if (receiver.type.kind === "jsval") {
|
|
209
231
|
const loweredArgs = call.arguments.map((a) => lowerer.lowerExpr(a));
|
|
210
232
|
if (name === "filter" && loweredArgs[0]?.type.kind === "func" && loweredArgs[0].type.ret.kind === "void") {
|
|
@@ -228,16 +250,11 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
228
250
|
return dispatched;
|
|
229
251
|
lowerer.noLowering(`.${name} on an array value held in a checked-dynamic binding`, call, "assign it to an array-typed binding first (the validated extraction), then call the method");
|
|
230
252
|
}
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
// the truth — ride the explicit-`any[]` handle-element lowering
|
|
237
|
-
// (pushes marshal in, HOF callbacks bind the handle, results exit
|
|
238
|
-
// per the checker type), never a typed intrinsic over a jsval-
|
|
239
|
-
// element array (the validator ICE).
|
|
240
|
-
if (receiver.type.kind === "array" && receiver.type.elem.kind === "jsval" && !typeEquals(receiverIr, receiver.type)) {
|
|
253
|
+
// Flow predicates and evolving-any analysis can refine the checker
|
|
254
|
+
// element type without changing the array's storage. Helpers and
|
|
255
|
+
// callback array arguments must retain the original layout and
|
|
256
|
+
// identity; element conversions happen at the callback boundary.
|
|
257
|
+
if (receiver.type.kind === "array" && !typeEquals(receiverIr, receiver.type)) {
|
|
241
258
|
receiverIr = receiver.type;
|
|
242
259
|
elem = receiver.type.elem;
|
|
243
260
|
}
|
|
@@ -445,6 +462,17 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
445
462
|
loc,
|
|
446
463
|
};
|
|
447
464
|
}
|
|
465
|
+
if (call.arguments.some(ts.isSpreadElement)) {
|
|
466
|
+
// Finish argument evaluation before mutating the receiver. Each
|
|
467
|
+
// spread snapshots its elements immediately, so a later argument
|
|
468
|
+
// can mutate that source without changing already-collected values.
|
|
469
|
+
const items = lowerArraySpreadItems(lowerer, call.arguments, elem, receiverIr, loc);
|
|
470
|
+
return {
|
|
471
|
+
kind: "arrIntrinsic",
|
|
472
|
+
method: name === "push" ? "pushSpread" : "unshiftSpread",
|
|
473
|
+
receiver, args: [items], type: F64, loc,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
448
476
|
const valueProbes = call.arguments.map((arg) => tryLowerExpression(lowerer, arg));
|
|
449
477
|
if (valueProbes.some((probe) => probe !== null && lowerer.runtimeOptionalWidening(probe.type, elem) !== null)) {
|
|
450
478
|
const items = lowerArrayValueItems(lowerer, call.arguments.map((arg) => lowerer.lowerExpr(arg)), elem, receiverIr, loc);
|
|
@@ -471,12 +499,11 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
471
499
|
};
|
|
472
500
|
}
|
|
473
501
|
if (name === "pop") {
|
|
474
|
-
//
|
|
475
|
-
//
|
|
476
|
-
//
|
|
477
|
-
// wrapper would lose the element identity contract.
|
|
502
|
+
// Widen a union payload through the normal array-read machinery
|
|
503
|
+
// before removing it. Reinterpreting the stored union's tag as the
|
|
504
|
+
// result union would confuse arms when undefined changes their order.
|
|
478
505
|
if (elem.kind === "union" && lowerer.armTag(elem.unionId, UNDEFINED_T) < 0) {
|
|
479
|
-
lowerer.
|
|
506
|
+
return lowerUnionArrayRemoval(lowerer, access.expression, elem, false, loc);
|
|
480
507
|
}
|
|
481
508
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
482
509
|
return {
|
|
@@ -580,14 +607,9 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
580
607
|
return { kind: "arrIntrinsic", method: "spliceInsert", receiver, args: [...args, items], type: receiverIr, loc };
|
|
581
608
|
}
|
|
582
609
|
if (name === "shift") {
|
|
583
|
-
//
|
|
584
|
-
// element with the tail sliding down — the result is the interned
|
|
585
|
-
// `elem | undefined` union, the env-read convention. Union-element
|
|
586
|
-
// arrays are fenced: their shift result would collapse arms
|
|
587
|
-
// (`(string | undefined)[]`'s shift is `string | undefined` too, and
|
|
588
|
-
// the box can't say which world the undefined came from).
|
|
610
|
+
// Like pop, a union without undefined needs an explicit tag widening.
|
|
589
611
|
if (elem.kind === "union" && lowerer.armTag(elem.unionId, UNDEFINED_T) < 0) {
|
|
590
|
-
lowerer.
|
|
612
|
+
return lowerUnionArrayRemoval(lowerer, access.expression, elem, true, loc);
|
|
591
613
|
}
|
|
592
614
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
593
615
|
return { kind: "arrIntrinsic", method: "shift", receiver, args: [], type: arrayValueType(lowerer, elem), loc };
|
|
@@ -627,6 +649,38 @@ export function lowerArrayMethodCall(lowerer, call, access) {
|
|
|
627
649
|
// reduce / reduceRight
|
|
628
650
|
return lowerArrayReduceCall(lowerer, call, access, name, elem);
|
|
629
651
|
}
|
|
652
|
+
/** Read before splice so removal cannot destroy the result's owned payload.
|
|
653
|
+
* The source is evaluated once and empty/sparse arrays yield undefined using
|
|
654
|
+
* the same slot-state checks as an indexed read. */
|
|
655
|
+
function lowerUnionArrayRemoval(lowerer, source, elem, first, loc) {
|
|
656
|
+
const receiver = lowerer.lowerExpr(source);
|
|
657
|
+
const arr = lowerer.declareHiddenLocal("%removeArray", receiver.type);
|
|
658
|
+
const arrRef = varRef(arr.id, arr.type, loc);
|
|
659
|
+
const index = lowerer.declareHiddenLocal("%removeIndex", F64);
|
|
660
|
+
const indexRef = varRef(index.id, F64, loc);
|
|
661
|
+
const value = arrayValueRead(lowerer, arrRef, indexRef, elem, loc);
|
|
662
|
+
const result = lowerer.declareHiddenLocal("%removedValue", value.type);
|
|
663
|
+
return {
|
|
664
|
+
kind: "seqExpr",
|
|
665
|
+
stmts: [
|
|
666
|
+
{ kind: "varDecl", localId: arr.id, init: receiver, loc },
|
|
667
|
+
{
|
|
668
|
+
kind: "varDecl", localId: index.id,
|
|
669
|
+
init: first ? numLit(0, loc) : {
|
|
670
|
+
kind: "bin", op: "-",
|
|
671
|
+
left: { kind: "arrIntrinsic", method: "length", receiver: arrRef, args: [], type: F64, loc },
|
|
672
|
+
right: numLit(1, loc), type: F64, loc,
|
|
673
|
+
}, loc,
|
|
674
|
+
},
|
|
675
|
+
{ kind: "varDecl", localId: result.id, init: value, loc },
|
|
676
|
+
{
|
|
677
|
+
kind: "exprStmt",
|
|
678
|
+
expr: { kind: "arrIntrinsic", method: "splice", receiver: arrRef, args: [indexRef, numLit(1, loc)], type: arr.type, loc }, loc,
|
|
679
|
+
},
|
|
680
|
+
],
|
|
681
|
+
result: varRef(result.id, result.type, loc), type: result.type, loc,
|
|
682
|
+
};
|
|
683
|
+
}
|
|
630
684
|
function literalFlatDepth(value) {
|
|
631
685
|
if (value.kind === "numLit")
|
|
632
686
|
return value.value;
|
|
@@ -709,10 +763,9 @@ function lowerArrayFlatCall(lowerer, call, access, receiverType) {
|
|
|
709
763
|
function lowerArraySearchCall(lowerer, call, access, method, elem) {
|
|
710
764
|
const loc = locOf(call);
|
|
711
765
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
712
|
-
const argNode = call.arguments[0] ?? call;
|
|
713
766
|
if (call.arguments.some(ts.isSpreadElement))
|
|
714
767
|
lowerer.noLowering(`.${method} with spread arguments`, call);
|
|
715
|
-
|
|
768
|
+
const needle = call.arguments[0]
|
|
716
769
|
? lowerer.lowerExpr(call.arguments[0])
|
|
717
770
|
: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc };
|
|
718
771
|
const fromIndex = call.arguments[1]
|
|
@@ -720,6 +773,11 @@ function lowerArraySearchCall(lowerer, call, access, method, elem) {
|
|
|
720
773
|
: method === "lastIndexOf"
|
|
721
774
|
? { kind: "bin", op: "/", left: numLit(1, loc), right: numLit(0, loc), type: F64, loc }
|
|
722
775
|
: numLit(0, loc);
|
|
776
|
+
return lowerArraySearchValues(lowerer, call, method, elem, receiver, needle, fromIndex);
|
|
777
|
+
}
|
|
778
|
+
function lowerArraySearchValues(lowerer, call, method, elem, receiver, needle, fromIndex) {
|
|
779
|
+
const loc = locOf(call);
|
|
780
|
+
const argNode = call.arguments[0] ?? call;
|
|
723
781
|
// A derived CLASS VALUE against a base-classval element widens (the same
|
|
724
782
|
// pointer — identity search is exact); the coercion path owns the ABI gate.
|
|
725
783
|
if (needle.type.kind === "classval" && elem.kind === "classval" && !typeEquals(needle.type, elem)) {
|
|
@@ -765,14 +823,15 @@ function lowerArraySearchCall(lowerer, call, access, method, elem) {
|
|
|
765
823
|
: [needle.type];
|
|
766
824
|
const scalarNeedle = needleArms.every((arm) => arm.kind === "f64" || arm.kind === "string" || arm.kind === "bool" ||
|
|
767
825
|
arm.kind === "bigint" || arm.kind === "symbol" || isUnitType(arm));
|
|
768
|
-
const
|
|
826
|
+
const valueDef = lowerer.unions.get(valueT.unionId);
|
|
827
|
+
const valueArms = valueDef.arms;
|
|
769
828
|
if (scalarNeedle && !valueArms.some((arm) => arm.kind === "func" || arm.kind === "set")) {
|
|
770
829
|
const arms = [...valueArms];
|
|
771
830
|
for (const arm of needleArms)
|
|
772
831
|
if (!arms.some((existing) => typeEquals(existing, arm)))
|
|
773
832
|
arms.push(arm);
|
|
774
833
|
if (arms.length !== valueArms.length)
|
|
775
|
-
valueT = { kind: "union", unionId: lowerer.unions.
|
|
834
|
+
valueT = { kind: "union", unionId: lowerer.unions.transform(valueDef, arms) };
|
|
776
835
|
}
|
|
777
836
|
const directNeedle = method === "lastIndexOf" && elem.kind !== "union" && typeEquals(needle.type, elem);
|
|
778
837
|
const searchNeedle = directNeedle ? needle : lowerer.coerceInto(argNode, needle, valueT);
|
|
@@ -791,6 +850,12 @@ function lowerArraySearchCall(lowerer, call, access, method, elem) {
|
|
|
791
850
|
* includes, where NaN equals NaN while +0 and -0 remain equal. */
|
|
792
851
|
function arraySearchEquality(lowerer, left, right, sameValueZero, loc) {
|
|
793
852
|
if (left.type.kind !== "union" || right.type.kind !== "union" || left.type.unionId !== right.type.unionId) {
|
|
853
|
+
if (left.type.kind === "string" && right.type.kind === "string") {
|
|
854
|
+
return { kind: "strEq", negated: false, left, right, type: BOOL, loc };
|
|
855
|
+
}
|
|
856
|
+
if (left.type.kind === "bigint" && right.type.kind === "bigint") {
|
|
857
|
+
return { kind: "bin", op: "===", left: { kind: "libCall", fn: "bigint.cmp", args: [left, right], type: F64, loc }, right: numLit(0, loc), type: BOOL, loc };
|
|
858
|
+
}
|
|
794
859
|
return { kind: "bin", op: "===", left, right, type: BOOL, loc };
|
|
795
860
|
}
|
|
796
861
|
const unionId = left.type.unionId;
|
|
@@ -1004,7 +1069,7 @@ function arraySearchHelper(lowerer, method, elem, valueT, needleT, directNeedle,
|
|
|
1004
1069
|
* loop passes exactly what it declares (JS passes everything; a callback
|
|
1005
1070
|
* only sees the parameters it names). Returns the lowered callback and
|
|
1006
1071
|
* its declared arity. */
|
|
1007
|
-
function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
|
|
1072
|
+
function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false, expectedReturn) {
|
|
1008
1073
|
const full = [...lead, F64, arrT];
|
|
1009
1074
|
// A DYN-receiver HOF's callback (`parsed.flatMap((value) => ...)`):
|
|
1010
1075
|
// the contextual signature types the unannotated param `any` (the
|
|
@@ -1039,15 +1104,16 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
|
|
|
1039
1104
|
lowerer.jsvalParamOverrides.add(p);
|
|
1040
1105
|
});
|
|
1041
1106
|
}
|
|
1042
|
-
//
|
|
1043
|
-
//
|
|
1044
|
-
//
|
|
1045
|
-
//
|
|
1046
|
-
//
|
|
1107
|
+
// An untyped or flow-refined array can contextually type an inline
|
|
1108
|
+
// callback differently from the stored element and array layout. Bind
|
|
1109
|
+
// unannotated parameters to the helper's ABI when a boundary adapter
|
|
1110
|
+
// cannot carry it. Include the optional-read prepass's parameter type
|
|
1111
|
+
// in this comparison. The override is temporary because one callback
|
|
1112
|
+
// AST can lower under several generic instances.
|
|
1047
1113
|
const contextual = [];
|
|
1048
1114
|
const previousImplicit = lowerer.implicitParamTypes;
|
|
1049
1115
|
let contextualTs = null;
|
|
1050
|
-
if (
|
|
1116
|
+
if (ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode)) {
|
|
1051
1117
|
argNode.parameters.forEach((param, i) => {
|
|
1052
1118
|
const expected = full[i];
|
|
1053
1119
|
if (expected === undefined || expected.kind === "dyn" || expected.kind === "jsval" ||
|
|
@@ -1055,7 +1121,10 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
|
|
|
1055
1121
|
return;
|
|
1056
1122
|
}
|
|
1057
1123
|
const checkerType = lowerer.checker.getTypeAtLocation(param.name);
|
|
1058
|
-
|
|
1124
|
+
const untyped = (checkerType.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0;
|
|
1125
|
+
const raw = untyped ? null : lowerer.mapTypeOf(checkerType);
|
|
1126
|
+
const mapped = raw ? lowerer.runtimeOptionalBindingType(param.name, raw) : null;
|
|
1127
|
+
if (untyped ? !bindUntyped : mapped === null || lowerer.coercibleValue(expected, mapped))
|
|
1059
1128
|
return;
|
|
1060
1129
|
const symbol = lowerer.checker.getSymbolAtLocation(param.name);
|
|
1061
1130
|
if (!symbol)
|
|
@@ -1076,6 +1145,10 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
|
|
|
1076
1145
|
}
|
|
1077
1146
|
if (contextualTs !== null)
|
|
1078
1147
|
lowerer.implicitParamTypes = contextualTs;
|
|
1148
|
+
const previousReturn = lowerer.contextualFunctionReturns.get(argNode);
|
|
1149
|
+
if (expectedReturn && (ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode))) {
|
|
1150
|
+
lowerer.contextualFunctionReturns.set(argNode, expectedReturn);
|
|
1151
|
+
}
|
|
1079
1152
|
let fnArg;
|
|
1080
1153
|
try {
|
|
1081
1154
|
fnArg = lowerer.lowerExpr(argNode);
|
|
@@ -1090,6 +1163,27 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
|
|
|
1090
1163
|
lowerer.runtimeOptionalBindingTypes.set(symbol, previous);
|
|
1091
1164
|
}
|
|
1092
1165
|
lowerer.implicitParamTypes = previousImplicit;
|
|
1166
|
+
if (previousReturn === undefined)
|
|
1167
|
+
lowerer.contextualFunctionReturns.delete(argNode);
|
|
1168
|
+
else
|
|
1169
|
+
lowerer.contextualFunctionReturns.set(argNode, previousReturn);
|
|
1170
|
+
}
|
|
1171
|
+
// A callback can accept a wider parameter type than the array supplies
|
|
1172
|
+
// (a reusable predicate over a union is common). Its closure still has
|
|
1173
|
+
// that wider ABI: adapt each actual argument before invoking it, just
|
|
1174
|
+
// as assignment to a narrower function slot does. Require a conversion
|
|
1175
|
+
// plan so this path never manufactures a stranded callback.
|
|
1176
|
+
if (fnArg.type.kind === "dyn") {
|
|
1177
|
+
const signatures = lowerer.checker.getCallSignatures(lowerer.typeOf(argNode));
|
|
1178
|
+
const ret = expectedReturn ?? (signatures[0] ? lowerer.mapTypeOf(lowerer.checker.getReturnTypeOfSignature(signatures[0])) : null);
|
|
1179
|
+
if (ret && ret.kind !== "void")
|
|
1180
|
+
fnArg = lowerer.coerceToExpected(fnArg, funcOf(full, ret));
|
|
1181
|
+
}
|
|
1182
|
+
if (fnArg.type.kind === "func" && fnArg.type.params.length <= full.length &&
|
|
1183
|
+
fnArg.type.params.every((param, i) => lowerer.coercibleValue(full[i], param))) {
|
|
1184
|
+
const callbackType = funcOf(full.slice(0, fnArg.type.params.length), fnArg.type.ret);
|
|
1185
|
+
if (!typeEquals(fnArg.type, callbackType))
|
|
1186
|
+
fnArg = lowerer.coerceToExpected(fnArg, callbackType);
|
|
1093
1187
|
}
|
|
1094
1188
|
// Array storage widens indexed reads with undefined so holes remain
|
|
1095
1189
|
// observable. The HOF helper guards every callback behind arrayHas,
|
|
@@ -1193,12 +1287,10 @@ function filterResultElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
|
|
|
1193
1287
|
const checkerReceiver = access
|
|
1194
1288
|
? lowerer.mapTypeOf(lowerer.typeOf(access.expression))
|
|
1195
1289
|
: null;
|
|
1196
|
-
//
|
|
1197
|
-
//
|
|
1198
|
-
//
|
|
1199
|
-
|
|
1200
|
-
if (elem.kind === "jsval" && valueT.kind === "jsval" &&
|
|
1201
|
-
result?.kind === "array" && checkerReceiver?.kind === "array" &&
|
|
1290
|
+
// Equal checker elements mean the filter introduces no new refinement.
|
|
1291
|
+
// Preserve the stored element layout even if an earlier predicate or
|
|
1292
|
+
// evolving-any analysis changed the receiver's flow type.
|
|
1293
|
+
if (result?.kind === "array" && checkerReceiver?.kind === "array" &&
|
|
1202
1294
|
typeEquals(result.elem, checkerReceiver.elem)) {
|
|
1203
1295
|
return elem;
|
|
1204
1296
|
}
|
|
@@ -1451,29 +1543,22 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
|
|
|
1451
1543
|
});
|
|
1452
1544
|
return name;
|
|
1453
1545
|
}
|
|
1454
|
-
/**
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
* each read wrapped into its arm (exactly the checker's callback
|
|
1461
|
-
* parameter type). Null when this isn't a tuple slice/map — writers and
|
|
1462
|
-
* the rest of the surface keep their fences. */
|
|
1463
|
-
export function lowerTupleReadMethodCall(lowerer, call, access) {
|
|
1546
|
+
/** Tuple methods keep the original receiver alive through argument evaluation.
|
|
1547
|
+
* Callback methods read each position only when it is visited, so writes to
|
|
1548
|
+
* later positions through a captured alias are visible. A tuple cannot be
|
|
1549
|
+
* passed as the callback's array parameter without changing its identity;
|
|
1550
|
+
* that parameter retains an explicit representation boundary. */
|
|
1551
|
+
export function lowerTupleReadMethodCall(lowerer, call, access, tupleReceiver) {
|
|
1464
1552
|
if (lowerer.chainBlocked(access, call))
|
|
1465
1553
|
return null;
|
|
1466
|
-
const
|
|
1467
|
-
|
|
1554
|
+
const method = access.name.text;
|
|
1555
|
+
const search = method === "includes" || method === "indexOf" || method === "lastIndexOf";
|
|
1556
|
+
if (method !== "slice" && method !== "map" && method !== "flatMap" && method !== "join" && !search)
|
|
1468
1557
|
return null;
|
|
1469
1558
|
if (!lowerer.isStdlibMember(access))
|
|
1470
1559
|
return null;
|
|
1471
|
-
let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
|
|
1472
|
-
let receiver = null;
|
|
1473
|
-
// A readonly tuple union under Array.isArray is checker-typed as an
|
|
1474
|
-
// unmappable intersection with any[], while maybeNarrow still extracts
|
|
1475
|
-
// its one tuple arm. Dispatch the supported tuple read methods from
|
|
1476
|
-
// that lowered representation, like tuple indexing and `.length`.
|
|
1560
|
+
let receiverIr = tupleReceiver?.type ?? lowerer.mapTypeOf(lowerer.typeOf(access.expression));
|
|
1561
|
+
let receiver = tupleReceiver ?? null;
|
|
1477
1562
|
const checkerArray = lowerer.checkerArrayValue(access.expression);
|
|
1478
1563
|
if (checkerArray?.type.kind === "record") {
|
|
1479
1564
|
receiverIr = checkerArray.type;
|
|
@@ -1485,75 +1570,185 @@ export function lowerTupleReadMethodCall(lowerer, call, access) {
|
|
|
1485
1570
|
if (!shape?.tuple)
|
|
1486
1571
|
return null;
|
|
1487
1572
|
receiver ??= lowerer.lowerExpr(access.expression);
|
|
1573
|
+
if (method === "join") {
|
|
1574
|
+
// Object.entries can retain its dynamic array representation behind a
|
|
1575
|
+
// checker tuple. Native tuples box as live references, so separator
|
|
1576
|
+
// evaluation can still mutate their elements before join reads them.
|
|
1577
|
+
// An unchecked outer array read must validate its optional payload
|
|
1578
|
+
// before passing the tuple to the runtime.
|
|
1579
|
+
if (receiver.type.kind === "union") {
|
|
1580
|
+
receiver = lowerer.coerceInto(access.expression, receiver, receiverIr);
|
|
1581
|
+
}
|
|
1582
|
+
const converted = lowerer.coerceInto(access.expression, receiver, DYN);
|
|
1583
|
+
const boxed = converted.kind === "dynFrom" && converted.value.type.kind === "record"
|
|
1584
|
+
? { ...converted, liveRef: true } : converted;
|
|
1585
|
+
const joined = lowerDynDispatchMethodCall(lowerer, call, access, boxed, true);
|
|
1586
|
+
return joined ? lowerer.coerceInto(call, joined, STRING) : null;
|
|
1587
|
+
}
|
|
1488
1588
|
if (receiver.type.kind !== "record")
|
|
1489
1589
|
return null;
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1590
|
+
const fields = [...shape.fields].sort((a, b) => Number(a.name) - Number(b.name));
|
|
1591
|
+
const arms = [];
|
|
1592
|
+
for (const field of fields) {
|
|
1593
|
+
const types = field.type.kind === "union" ? lowerer.unions.get(field.type.unionId).arms : [field.type];
|
|
1594
|
+
for (const type of types)
|
|
1595
|
+
if (!arms.some(arm => typeEquals(arm, type)))
|
|
1596
|
+
arms.push(type);
|
|
1597
|
+
}
|
|
1598
|
+
if (arms.length === 0)
|
|
1599
|
+
return null;
|
|
1600
|
+
const elem = arms.length === 1 ? arms[0] : { kind: "union", unionId: lowerer.unions.intern(arms) };
|
|
1493
1601
|
const loc = locOf(call);
|
|
1494
|
-
const
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
break;
|
|
1502
|
-
}
|
|
1503
|
-
if (!arms.some((a) => typeEquals(a, f.type)))
|
|
1504
|
-
arms.push(f.type);
|
|
1505
|
-
elemT = arms.length === 1 ? arms[0] : { kind: "union", unionId: lowerer.unions.intern(arms) };
|
|
1602
|
+
const tuple = varRef("a.0", receiver.type, loc);
|
|
1603
|
+
const read = (field) => lowerer.coerceInto(access.expression, {
|
|
1604
|
+
kind: "recordGet", obj: tuple, shapeId: receiverIr.shapeId, field: field.name, type: field.type, loc,
|
|
1605
|
+
}, elem);
|
|
1606
|
+
if (search) {
|
|
1607
|
+
if (call.arguments.length > 2 || call.arguments.some(ts.isSpreadElement)) {
|
|
1608
|
+
return lowerer.noLowering(`tuple .${method} with spread or extra arguments`, call);
|
|
1506
1609
|
}
|
|
1610
|
+
const arg = call.arguments[0];
|
|
1611
|
+
const undefinedArg = arg ? lowerStaticallyUndefinedArgument(lowerer, arg) : null;
|
|
1612
|
+
let needle = arg ? undefinedArg ?? lowerer.lowerExpr(arg) : null;
|
|
1613
|
+
if (!needle || isUnitType(needle.type) || needle.type.kind === "void") {
|
|
1614
|
+
const optional = arrayValueType(lowerer, elem);
|
|
1615
|
+
const wrapped = needle?.type.kind === "nullT"
|
|
1616
|
+
? lowerer.coerceInto(arg ?? call, needle, optional) : lowerer.wrappedUndefined(optional, loc);
|
|
1617
|
+
if (!wrapped)
|
|
1618
|
+
return lowerer.noLowering(`tuple .${method} missing search value`, call);
|
|
1619
|
+
needle = needle ? defaultAfterUndefined(needle, wrapped) : wrapped;
|
|
1620
|
+
}
|
|
1621
|
+
const from = call.arguments[1]
|
|
1622
|
+
? lowerPositionArgument(lowerer, call.arguments[1], numLit(0, loc))
|
|
1623
|
+
: numLit(method === "lastIndexOf" ? Infinity : 0, loc);
|
|
1624
|
+
const key = `tuple.${method}:${typeKey(receiver.type)}:${typeKey(needle.type)}:${typeKey(from.type)}:${call.arguments.length}`;
|
|
1625
|
+
let helper = lowerer.arrHofHelpers.get(key);
|
|
1626
|
+
const resultType = method === "includes" ? BOOL : F64;
|
|
1627
|
+
if (!helper) {
|
|
1628
|
+
helper = `%tuple.${method}.${lowerer.arrHofHelpers.size}`;
|
|
1629
|
+
lowerer.arrHofHelpers.set(key, helper);
|
|
1630
|
+
const params = [
|
|
1631
|
+
{ localId: "a.0", name: "a", type: receiver.type },
|
|
1632
|
+
{ localId: "needle.0", name: "needle", type: needle.type },
|
|
1633
|
+
{ localId: "from.0", name: "from", type: from.type },
|
|
1634
|
+
];
|
|
1635
|
+
const result = lowerArraySearchValues(lowerer, call, method, elem, { kind: "arrayLit", elems: fields.map(read), type: arrayOf(elem), loc }, varRef("needle.0", needle.type, loc), varRef("position.0", F64, loc));
|
|
1636
|
+
lowerer.liftedFns.push({
|
|
1637
|
+
name: helper, params, returnType: resultType,
|
|
1638
|
+
locals: [
|
|
1639
|
+
...params.map(param => ({ id: param.localId, name: param.name, type: param.type, mutable: false })),
|
|
1640
|
+
{ id: "position.0", name: "position", type: F64, mutable: false },
|
|
1641
|
+
],
|
|
1642
|
+
body: [
|
|
1643
|
+
{ kind: "varDecl", localId: "position.0", init: positionNumber(lowerer, varRef("from.0", from.type, loc), numLit(0, loc), call.arguments[1] ?? call, "tuple search position"), loc },
|
|
1644
|
+
{ kind: "return", value: result, loc },
|
|
1645
|
+
], loc,
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1648
|
+
return { kind: "call", callee: helper, args: [receiver, needle, from], type: resultType, loc };
|
|
1507
1649
|
}
|
|
1508
|
-
if (
|
|
1509
|
-
|
|
1510
|
-
const snapshotElem = elemT;
|
|
1511
|
-
const snapshot = {
|
|
1512
|
-
kind: "arrayLit",
|
|
1513
|
-
elems: byIndex.map((f) => {
|
|
1514
|
-
const read = {
|
|
1515
|
-
kind: "recordGet",
|
|
1516
|
-
obj: receiver,
|
|
1517
|
-
shapeId: receiverIr.shapeId,
|
|
1518
|
-
field: f.name,
|
|
1519
|
-
type: f.type,
|
|
1520
|
-
loc,
|
|
1521
|
-
};
|
|
1522
|
-
return typeEquals(f.type, snapshotElem) ? read : lowerer.coerceInto(access.expression, read, snapshotElem);
|
|
1523
|
-
}),
|
|
1524
|
-
type: arrayOf(snapshotElem),
|
|
1525
|
-
loc,
|
|
1526
|
-
};
|
|
1527
|
-
if (name === "slice") {
|
|
1528
|
-
if (call.arguments.length > 2) {
|
|
1650
|
+
if (method === "slice") {
|
|
1651
|
+
if (call.arguments.length > 2 || call.arguments.some(ts.isSpreadElement)) {
|
|
1529
1652
|
lowerer.noLowering(`.slice with ${call.arguments.length} arguments`, call);
|
|
1530
1653
|
}
|
|
1531
|
-
const args = call.arguments.map(
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1654
|
+
const args = call.arguments.map(arg => lowerer.lowerExpr(arg));
|
|
1655
|
+
args.forEach((arg, i) => { if (arg.type.kind !== "f64")
|
|
1656
|
+
lowerer.badType(call.arguments[i], lowerer.typeOf(call.arguments[i])); });
|
|
1657
|
+
const resultType = arrayOf(elem);
|
|
1658
|
+
const key = `tuple.slice:${typeKey(receiver.type)}:${args.length}`;
|
|
1659
|
+
let helper = lowerer.arrHofHelpers.get(key);
|
|
1660
|
+
if (!helper) {
|
|
1661
|
+
helper = `%tuple.slice.${lowerer.arrHofHelpers.size}`;
|
|
1662
|
+
lowerer.arrHofHelpers.set(key, helper);
|
|
1663
|
+
const params = [receiver, ...args].map((arg, i) => ({ localId: i === 0 ? "a.0" : `arg.${i}`, name: `arg${i}`, type: arg.type }));
|
|
1664
|
+
lowerer.liftedFns.push({
|
|
1665
|
+
name: helper, params, returnType: resultType,
|
|
1666
|
+
locals: params.map(param => ({ id: param.localId, name: param.name, type: param.type, mutable: false })),
|
|
1667
|
+
body: [{ kind: "return", value: {
|
|
1668
|
+
kind: "arrIntrinsic", method: "slice",
|
|
1669
|
+
receiver: { kind: "arrayLit", elems: fields.map(read), type: resultType, loc },
|
|
1670
|
+
args: args.map((arg, i) => varRef(`arg.${i + 1}`, arg.type, loc)), type: resultType, loc,
|
|
1671
|
+
}, loc }], loc,
|
|
1672
|
+
});
|
|
1535
1673
|
}
|
|
1536
|
-
return { kind: "
|
|
1674
|
+
return { kind: "call", callee: helper, args: [receiver, ...args], type: resultType, loc };
|
|
1537
1675
|
}
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
lowerer.noLowering(`.map with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
|
|
1676
|
+
if (call.arguments.length !== 1 || call.arguments.some(ts.isSpreadElement)) {
|
|
1677
|
+
lowerer.noLowering(`.${method} with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
|
|
1541
1678
|
}
|
|
1542
|
-
const
|
|
1543
|
-
|
|
1544
|
-
const
|
|
1545
|
-
if (
|
|
1679
|
+
const callback = call.arguments[0];
|
|
1680
|
+
// Check before the array HOF adapter can create a tuple-to-array copy.
|
|
1681
|
+
const signatures = lowerer.checker.getCallSignatures(lowerer.typeOf(callback));
|
|
1682
|
+
if (signatures.some(signature => signature.getParameters().length > 2)) {
|
|
1683
|
+
lowerer.noLowering(`tuple .${method} callback array parameter`, callback, "capture the original tuple explicitly to preserve its identity");
|
|
1684
|
+
}
|
|
1685
|
+
const { fnArg, arity } = hofCallbackArg(lowerer, callback, [elem], receiver.type);
|
|
1686
|
+
const ret = fnArg.type.ret;
|
|
1687
|
+
if (ret.kind === "void" || ret.kind === "func")
|
|
1546
1688
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1689
|
+
if (method === "flatMap" && ret.kind === "union" && lowerer.unions.get(ret.unionId).arms.some(arm => arm.kind === "array")) {
|
|
1690
|
+
lowerer.noLowering("tuple .flatMap callback mixing array and scalar results", callback, "return an array from every path");
|
|
1691
|
+
}
|
|
1692
|
+
const flatten = method === "flatMap" && ret.kind === "array";
|
|
1693
|
+
const outElem = flatten ? ret.elem : callbackArrayElem(lowerer, call, ret);
|
|
1694
|
+
fenceProducedArrayElem(lowerer, call, `'.${method}()'`, outElem);
|
|
1695
|
+
const outType = arrayOf(outElem);
|
|
1696
|
+
const key = `tuple.${method}:${typeKey(receiver.type)}:${typeKey(fnArg.type)}:${typeKey(outElem)}`;
|
|
1697
|
+
let helper = lowerer.arrHofHelpers.get(key);
|
|
1698
|
+
if (!helper) {
|
|
1699
|
+
helper = `%tuple.${method}.${lowerer.arrHofHelpers.size}`;
|
|
1700
|
+
lowerer.arrHofHelpers.set(key, helper);
|
|
1701
|
+
const out = varRef("out.0", outType, loc);
|
|
1702
|
+
const result = varRef("r.0", ret, loc);
|
|
1703
|
+
const outputLength = { kind: "arrIntrinsic", method: "length", receiver: out, args: [], type: F64, loc };
|
|
1704
|
+
const body = [{ kind: "varDecl", localId: "out.0", init: { kind: "arrayLit", elems: [], type: outType, loc }, loc }];
|
|
1705
|
+
for (const field of fields) {
|
|
1706
|
+
const invocation = {
|
|
1707
|
+
kind: "callValue", callee: varRef("f.0", fnArg.type, loc),
|
|
1708
|
+
args: [read(field), numLit(Number(field.name), loc)].slice(0, arity), type: ret, loc,
|
|
1709
|
+
};
|
|
1710
|
+
body.push(field === fields[0]
|
|
1711
|
+
? { kind: "varDecl", localId: "r.0", init: invocation, loc }
|
|
1712
|
+
: { kind: "assign", localId: "r.0", value: invocation, loc });
|
|
1713
|
+
if (flatten) {
|
|
1714
|
+
const index = varRef("i.0", F64, loc);
|
|
1715
|
+
body.push(countedFor(loc, { kind: "arrIntrinsic", method: "length", receiver: result, args: [], type: F64, loc }, () => [{
|
|
1716
|
+
kind: "if", cond: arrayIndexPresent(result, index, loc), then: [
|
|
1717
|
+
{ kind: "varDecl", localId: "inner.0", init: arrayValueRead(lowerer, result, index, outElem, loc), loc },
|
|
1718
|
+
arrayValueStore(lowerer, out, outputLength, varRef("inner.0", arrayValueType(lowerer, outElem), loc), outElem, loc),
|
|
1719
|
+
], else_: null, loc,
|
|
1720
|
+
}]));
|
|
1721
|
+
}
|
|
1722
|
+
else {
|
|
1723
|
+
body.push(arrayValueStore(lowerer, out, outputLength, result, outElem, loc));
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
body.push({ kind: "return", value: out, loc });
|
|
1727
|
+
lowerer.liftedFns.push({
|
|
1728
|
+
name: helper,
|
|
1729
|
+
params: [{ localId: "a.0", name: "a", type: receiver.type }, { localId: "f.0", name: "f", type: fnArg.type }],
|
|
1730
|
+
returnType: outType,
|
|
1731
|
+
locals: [
|
|
1732
|
+
{ id: "a.0", name: "a", type: receiver.type, mutable: false },
|
|
1733
|
+
{ id: "f.0", name: "f", type: fnArg.type, mutable: false },
|
|
1734
|
+
{ id: "out.0", name: "out", type: outType, mutable: false },
|
|
1735
|
+
{ id: "r.0", name: "r", type: ret, mutable: true },
|
|
1736
|
+
...(flatten ? [
|
|
1737
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
1738
|
+
{ id: "inner.0", name: "inner", type: arrayValueType(lowerer, outElem), mutable: false },
|
|
1739
|
+
] : []),
|
|
1740
|
+
], body, loc,
|
|
1741
|
+
});
|
|
1742
|
+
}
|
|
1743
|
+
return { kind: "call", callee: helper, args: [receiver, fnArg], type: outType, loc };
|
|
1551
1744
|
}
|
|
1552
1745
|
/** An ordinary indexed read: values retain their element type, while
|
|
1553
1746
|
* holes, missing properties, and present undefined yield undefined. */
|
|
1554
1747
|
export function lowerSafeIndexRead(lowerer, arr, index, loc) {
|
|
1748
|
+
if (arr.type.kind !== "array")
|
|
1749
|
+
throw new InternalCompilerError("indexed read requires an array");
|
|
1555
1750
|
const elem = arr.type.elem;
|
|
1556
|
-
if (elem.kind === "void"
|
|
1751
|
+
if (elem.kind === "void")
|
|
1557
1752
|
return null;
|
|
1558
1753
|
const resultT = arrayValueType(lowerer, elem);
|
|
1559
1754
|
const key = `idxOr:${typeKey(elem)}`;
|
|
@@ -1814,18 +2009,38 @@ function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bindUntyped
|
|
|
1814
2009
|
loc,
|
|
1815
2010
|
};
|
|
1816
2011
|
}
|
|
1817
|
-
// find
|
|
1818
|
-
//
|
|
1819
|
-
//
|
|
1820
|
-
//
|
|
1821
|
-
//
|
|
1822
|
-
const
|
|
2012
|
+
// find visits holes as undefined and can infer a predicate that selects
|
|
2013
|
+
// a subset of the element union. A result matching the receiver's flow
|
|
2014
|
+
// element inherits that earlier refinement. Otherwise only an inline,
|
|
2015
|
+
// inferred predicate proves a new narrowing; explicit assertions keep
|
|
2016
|
+
// the same refusal boundary as filter.
|
|
2017
|
+
const valueT = arrayValueType(lowerer, elem);
|
|
2018
|
+
const checkerReceiver = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
|
|
2019
|
+
const checkerResult = lowerer.irTypeOf(call);
|
|
2020
|
+
const unchangedElement = checkerReceiver?.kind === "array" &&
|
|
2021
|
+
typeEquals(checkerResult, arrayValueType(lowerer, checkerReceiver.elem));
|
|
2022
|
+
const resultT = bindUntyped ? valueT : checkerResult;
|
|
1823
2023
|
if (resultT.kind !== "union")
|
|
1824
2024
|
lowerer.badType(call, lowerer.typeOf(call)); // defensive: T | undefined always maps to a union
|
|
1825
2025
|
const undefTag = lowerer.armTag(resultT.unionId, UNDEFINED_T);
|
|
1826
2026
|
if (undefTag < 0)
|
|
1827
2027
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
1828
|
-
|
|
2028
|
+
let retag = null;
|
|
2029
|
+
if (!lowerer.coercibleValue(valueT, resultT)) {
|
|
2030
|
+
const inline = ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode);
|
|
2031
|
+
if (!unchangedElement && (!inline || argNode.type !== undefined)) {
|
|
2032
|
+
lowerer.unsupported("SC1090", argNode, `narrowing '.${method}' requires an inline callback with an inferred predicate (annotate the return ': boolean' to keep the receiver's element type)`);
|
|
2033
|
+
}
|
|
2034
|
+
const signature = inline ? lowerer.checker.getSignatureFromDeclaration(argNode) : undefined;
|
|
2035
|
+
const predicate = signature ? lowerer.checker.getTypePredicateOfSignature(signature) : undefined;
|
|
2036
|
+
if ((!unchangedElement && (!predicate || predicate.parameterIndex !== 0)) || valueT.kind !== "union") {
|
|
2037
|
+
lowerer.unsupported("SC1090", call, `'.${method}' result narrowing without a predicate over its element`);
|
|
2038
|
+
}
|
|
2039
|
+
retag = lowerer.narrowedRetagHelper(call, valueT.unionId, resultT.unionId, loc);
|
|
2040
|
+
if (retag === null)
|
|
2041
|
+
lowerer.unsupported("SC1090", call, `'.${method}' narrowing to an incompatible result layout`);
|
|
2042
|
+
}
|
|
2043
|
+
const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag);
|
|
1829
2044
|
return { kind: "call", callee: helper, args: [receiver, fnArg], type: resultT, loc };
|
|
1830
2045
|
}
|
|
1831
2046
|
/** ToBoolean of a predicate result inside a synthesized HOF helper — the
|
|
@@ -1842,7 +2057,7 @@ function predToBool(e) {
|
|
|
1842
2057
|
* for (i = 0; i < n; i++) { v = a[i]; if (f(v)) return <v as result arm>; }
|
|
1843
2058
|
* return <undefined arm>;
|
|
1844
2059
|
*/
|
|
1845
|
-
function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc) {
|
|
2060
|
+
function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag) {
|
|
1846
2061
|
const method = last ? "findLast" : "find";
|
|
1847
2062
|
const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}`;
|
|
1848
2063
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
@@ -1854,7 +2069,8 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc) {
|
|
|
1854
2069
|
const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
|
|
1855
2070
|
const valueT = arrayValueType(lowerer, elem);
|
|
1856
2071
|
const v = varRef("v.0", valueT, loc);
|
|
1857
|
-
const found = lowerer.coerceToExpected(v, resultT)
|
|
2072
|
+
const found = retag === null ? lowerer.coerceToExpected(v, resultT) :
|
|
2073
|
+
{ kind: "call", callee: retag, args: [v], type: resultT, loc };
|
|
1858
2074
|
const miss = {
|
|
1859
2075
|
kind: "unionWrap",
|
|
1860
2076
|
unionId: resultT.unionId,
|
|
@@ -2170,7 +2386,7 @@ function lowerArrayReduceCall(lowerer, call, access, method, elem) {
|
|
|
2170
2386
|
(hasInit ? lowerer.irTypeOf(call) : arrayValueType(lowerer, elem));
|
|
2171
2387
|
if (accT.kind === "void" || accT.kind === "func")
|
|
2172
2388
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
2173
|
-
const { fnArg, arity } = hofCallbackArg(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], arrT);
|
|
2389
|
+
const { fnArg, arity } = hofCallbackArg(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], arrT, false, accT);
|
|
2174
2390
|
const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type.ret, arity, hasInit, loc);
|
|
2175
2391
|
const args = [receiver, fnArg];
|
|
2176
2392
|
if (hasInit)
|
|
@@ -2311,7 +2527,18 @@ function lowerArraySortCall(lowerer, call, access, elem, arrT) {
|
|
|
2311
2527
|
}
|
|
2312
2528
|
const receiver = lowerer.lowerExpr(access.expression);
|
|
2313
2529
|
const argNode = call.arguments[0];
|
|
2314
|
-
|
|
2530
|
+
let fnArg = lowerer.lowerExpr(argNode);
|
|
2531
|
+
// Reusable JS comparators often accept checked values. Adapt the array's
|
|
2532
|
+
// element ABI just as other array callbacks do before sorting.
|
|
2533
|
+
if (fnArg.type.kind === "func" && fnArg.type.params.length <= 2 &&
|
|
2534
|
+
fnArg.type.params.every((param) => lowerer.coercibleValue(elem, param))) {
|
|
2535
|
+
// Arithmetic on inferred JS values retains a checked result because
|
|
2536
|
+
// it can produce BigInt. The sort callback still requires a number.
|
|
2537
|
+
const result = fnArg.type.ret.kind === "dyn" && isJsSourceFile(argNode.getSourceFile()) ? F64 : fnArg.type.ret;
|
|
2538
|
+
const expected = funcOf(fnArg.type.params.map(() => elem), result);
|
|
2539
|
+
if (!typeEquals(fnArg.type, expected))
|
|
2540
|
+
fnArg = lowerer.coerceToExpected(fnArg, expected);
|
|
2541
|
+
}
|
|
2315
2542
|
// The comparator receives exactly (a, b); declaring a prefix is
|
|
2316
2543
|
// ordinary TS. Its result must be number (the spec coerces arbitrary
|
|
2317
2544
|
// results — no lowering for that).
|
|
@@ -2556,10 +2783,25 @@ export function lowerArrayConstructor(lowerer, expr, args) {
|
|
|
2556
2783
|
if (contextual)
|
|
2557
2784
|
result = lowerer.mapTypeOf(contextual);
|
|
2558
2785
|
}
|
|
2786
|
+
if (isJsSourceFile(expr.getSourceFile()) && (result === null || result.kind === "dyn"))
|
|
2787
|
+
result = arrayOf(DYN);
|
|
2559
2788
|
if (result?.kind !== "array" || !isSupportedArrayElem(result.elem)) {
|
|
2560
2789
|
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
2561
2790
|
}
|
|
2562
2791
|
const argType = args.length === 1 ? lowerer.mapTypeOf(lowerer.typeOf(args[0])) : null;
|
|
2792
|
+
if (args.length === 1 && result.elem.kind === "dyn" && (argType === null || argType.kind === "dyn")) {
|
|
2793
|
+
const input = lowerer.declareHiddenLocal("%arrayCtorValue", DYN);
|
|
2794
|
+
const value = varRef(input.id, DYN, loc);
|
|
2795
|
+
const local = lowerer.declareHiddenLocal("%arrayCtor", result);
|
|
2796
|
+
const array = varRef(local.id, result, loc);
|
|
2797
|
+
return { kind: "seqExpr", stmts: [
|
|
2798
|
+
{ kind: "varDecl", localId: input.id, init: lowerer.lowerExprExpecting(args[0], DYN), loc },
|
|
2799
|
+
{ kind: "varDecl", localId: local.id, init: { kind: "arrayLit", elems: [], type: result, loc }, loc },
|
|
2800
|
+
{ kind: "if", cond: { kind: "dynTest", test: "number", value, type: BOOL, loc },
|
|
2801
|
+
then: [{ kind: "arraySetLength", arr: array, length: { kind: "dynCheck", value, type: F64, loc }, loc }],
|
|
2802
|
+
else_: [arrayValueStore(lowerer, array, numLit(0, loc), value, DYN, loc)], loc },
|
|
2803
|
+
], result: array, type: result, loc };
|
|
2804
|
+
}
|
|
2563
2805
|
if (argType?.kind === "dyn" || argType?.kind === "jsval") {
|
|
2564
2806
|
lowerer.noLowering("Array constructor with a dynamically typed sole argument", args[0]);
|
|
2565
2807
|
}
|
|
@@ -2622,6 +2864,33 @@ export function lowerArrayOfCall(lowerer, call, access) {
|
|
|
2622
2864
|
loc: locOf(call),
|
|
2623
2865
|
};
|
|
2624
2866
|
}
|
|
2867
|
+
/** Mapper-less checked Array.from: acquire once, then step through emitted
|
|
2868
|
+
* property and call dispatch so native class iterators retain their methods. */
|
|
2869
|
+
function lowerCheckedArrayFrom(lowerer, source, loc) {
|
|
2870
|
+
const iterator = lowerer.declareHiddenLocal("%fromIterator", DYN);
|
|
2871
|
+
const next = lowerer.declareHiddenLocal("%fromNext", DYN);
|
|
2872
|
+
const step = lowerer.declareHiddenLocal("%fromStep", DYN);
|
|
2873
|
+
const out = lowerer.declareHiddenLocal("%fromArray", DYN);
|
|
2874
|
+
const done = lowerer.declareHiddenLocal("%fromDone", BOOL);
|
|
2875
|
+
done.mutable = true;
|
|
2876
|
+
const get = (value, key) => ({ kind: "dynKeyGet", value, key: strLit(key, loc), type: DYN, loc });
|
|
2877
|
+
const stmts = [
|
|
2878
|
+
{ kind: "varDecl", localId: iterator.id, init: { kind: "libCall", fn: "dyn.iteratorResult", args: [{ kind: "libCall", fn: "dyn.arrayFromIterator", args: [source], type: DYN, loc }], type: DYN, loc }, loc },
|
|
2879
|
+
{ kind: "varDecl", localId: next.id, init: get(varRef(iterator.id, DYN, loc), "next"), loc },
|
|
2880
|
+
{ kind: "varDecl", localId: out.id, init: { kind: "dynArrLit", elems: [], type: DYN, loc }, loc },
|
|
2881
|
+
{ kind: "varDecl", localId: done.id, init: boolLit(false, loc), loc },
|
|
2882
|
+
{ kind: "while", cond: { kind: "unary", op: "!", operand: varRef(done.id, BOOL, loc), type: BOOL, loc }, body: [
|
|
2883
|
+
{ kind: "varDecl", localId: step.id, init: { kind: "libCall", fn: "dyn.iteratorResult", args: [{
|
|
2884
|
+
kind: "dynCall", callee: varRef(next.id, DYN, loc), receiver: varRef(iterator.id, DYN, loc), calleeName: "iterator.next", args: [], type: DYN, loc,
|
|
2885
|
+
}], type: DYN, loc }, loc },
|
|
2886
|
+
{ kind: "assign", localId: done.id, value: { kind: "dynTest", test: "truthy", value: get(varRef(step.id, DYN, loc), "done"), type: BOOL, loc }, loc },
|
|
2887
|
+
{ kind: "if", cond: { kind: "unary", op: "!", operand: varRef(done.id, BOOL, loc), type: BOOL, loc }, then: [
|
|
2888
|
+
{ kind: "exprStmt", expr: { kind: "dynInvoke", recv: varRef(out.id, DYN, loc), method: "push", calleeName: "Array.from", args: [get(varRef(step.id, DYN, loc), "value")], type: DYN, loc }, loc },
|
|
2889
|
+
], else_: null, loc },
|
|
2890
|
+
], loc },
|
|
2891
|
+
];
|
|
2892
|
+
return { kind: "seqExpr", stmts, result: varRef(out.id, DYN, loc), type: DYN, loc };
|
|
2893
|
+
}
|
|
2625
2894
|
/** `Array.from({ length: n }, mapfn)` — the counted-generation idiom — on
|
|
2626
2895
|
* THE stdlib Array global. The source must be an OBJECT LITERAL whose
|
|
2627
2896
|
* single property is `length` (the shape the idiom always spells; the
|
|
@@ -2719,6 +2988,9 @@ export function lowerArrayFromCall(lowerer, call, access) {
|
|
|
2719
2988
|
}
|
|
2720
2989
|
return { kind: "call", callee: helper, args: [src, fnArg], type: arrayOf(outElem), loc };
|
|
2721
2990
|
}
|
|
2991
|
+
if (src.type.kind === "bytes" && args.length === 1) {
|
|
2992
|
+
return { kind: "bytesIntrinsic", method: "toArray", receiver: src, args: [], type: arrayOf(F64), loc };
|
|
2993
|
+
}
|
|
2722
2994
|
if (src.type.kind === "set" && args.length === 1) {
|
|
2723
2995
|
return { kind: "setIntrinsic", method: "toArray", receiver: src, args: [], type: arrayOf(src.type.elem), loc };
|
|
2724
2996
|
}
|
|
@@ -2726,6 +2998,9 @@ export function lowerArrayFromCall(lowerer, call, access) {
|
|
|
2726
2998
|
// `[...s]` and both Array.from(s) forms.
|
|
2727
2999
|
if (src.type.kind === "string" && args.length === 1)
|
|
2728
3000
|
return strCharsCall(lowerer, src, loc);
|
|
3001
|
+
if (src.type.kind === "dyn" && args.length === 1) {
|
|
3002
|
+
return lowerCheckedArrayFrom(lowerer, src, loc);
|
|
3003
|
+
}
|
|
2729
3004
|
lowerer.noLowering("Array.from with this argument shape", call, "Array.from(array), Array.from(array, mapper), Array.from(aString), Array.from(aString, mapper), and Array.from({ length: n }, mapper) are the lowered forms");
|
|
2730
3005
|
}
|
|
2731
3006
|
const n = args.length === 2 && ts.isObjectLiteralExpression(args[0]) && args[0].properties.length === 1
|
|
@@ -2949,10 +3224,12 @@ export function lowerMapMethodCall(lowerer, call, access) {
|
|
|
2949
3224
|
}
|
|
2950
3225
|
if (receiverIr?.kind !== "map")
|
|
2951
3226
|
return null;
|
|
2952
|
-
|
|
3227
|
+
// Collection views can refine has() while retaining its native ABI.
|
|
3228
|
+
if (!lowerer.isStdlibMember(access) && name !== "has")
|
|
2953
3229
|
return null;
|
|
2954
3230
|
const loc = locOf(call);
|
|
2955
|
-
const
|
|
3231
|
+
const value = lowerer.lowerExpr(access.expression);
|
|
3232
|
+
const receiver = lowerer.runtimeOptionalPropertyReceiver(access.expression, value, receiverIr, name) ?? value;
|
|
2956
3233
|
// The lib's `set` returns the Map (chaining typechecks); the lowered
|
|
2957
3234
|
// set is a void statement, so a chained receiver has no value — fence
|
|
2958
3235
|
// it instead of emitting a void receiver.
|
|
@@ -2964,23 +3241,25 @@ export function lowerMapMethodCall(lowerer, call, access) {
|
|
|
2964
3241
|
lowerer.noLowering(`.forEach with ${call.arguments.length} arguments`, call, "the thisArg parameter has no lowering — use an arrow function");
|
|
2965
3242
|
}
|
|
2966
3243
|
if (name === "get") {
|
|
2967
|
-
const k = lowerer.
|
|
3244
|
+
const k = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.key);
|
|
2968
3245
|
// The checker types the call `V | undefined`, which interns the
|
|
2969
3246
|
// result union. `undefined` sorts LAST among all possible arm
|
|
2970
3247
|
// typeKeys, so when V is itself a union its arms keep their tags in
|
|
2971
3248
|
// the result union — the backend leans on that (docs/ir.md).
|
|
2972
|
-
const type = lowerer.irTypeOf(call);
|
|
2973
|
-
if (type.kind !== "union")
|
|
3249
|
+
const type = receiverIr.value.kind === "dyn" ? DYN : lowerer.irTypeOf(call);
|
|
3250
|
+
if (type.kind !== "union" && type.kind !== "dyn")
|
|
2974
3251
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
2975
3252
|
return { kind: "mapIntrinsic", method: "get", receiver, args: [k], type, loc };
|
|
2976
3253
|
}
|
|
2977
3254
|
if (name === "set") {
|
|
2978
|
-
const k = lowerer.
|
|
2979
|
-
const v =
|
|
3255
|
+
const k = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.key);
|
|
3256
|
+
const v = receiverIr.value.kind === "dyn"
|
|
3257
|
+
? lowerer.lowerCollectionKey(call.arguments[1], receiverIr.value)
|
|
3258
|
+
: lowerer.lowerExprExpecting(call.arguments[1], receiverIr.value);
|
|
2980
3259
|
return { kind: "mapIntrinsic", method: "set", receiver, args: [k, v], type: VOID, loc };
|
|
2981
3260
|
}
|
|
2982
3261
|
if (name === "has" || name === "delete") {
|
|
2983
|
-
const k = lowerer.
|
|
3262
|
+
const k = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.key);
|
|
2984
3263
|
return { kind: "mapIntrinsic", method: name, receiver, args: [k], type: BOOL, loc };
|
|
2985
3264
|
}
|
|
2986
3265
|
if (name === "clear") {
|
|
@@ -3100,6 +3379,65 @@ function buildMapIterDrainFn(name, mapT, method, elemT, tupleT, loc) {
|
|
|
3100
3379
|
loc,
|
|
3101
3380
|
};
|
|
3102
3381
|
}
|
|
3382
|
+
/** An immediate Map spread observes the same entry order as entries().
|
|
3383
|
+
* Each pair is new; its key and value retain their original identities. */
|
|
3384
|
+
export function mapEntriesArray(lowerer, receiver) {
|
|
3385
|
+
const mapT = receiver.type;
|
|
3386
|
+
if (mapT.kind !== "map")
|
|
3387
|
+
throw new InternalCompilerError("Map entries require a map");
|
|
3388
|
+
const tupleT = {
|
|
3389
|
+
kind: "record", shapeId: lowerer.shapes.intern([
|
|
3390
|
+
{ name: "0", type: mapT.key }, { name: "1", type: mapT.value },
|
|
3391
|
+
], true),
|
|
3392
|
+
};
|
|
3393
|
+
const key = `entries:${typeKey(mapT.key)}:${typeKey(mapT.value)}`;
|
|
3394
|
+
let helper = lowerer.mapHofHelpers.get(key);
|
|
3395
|
+
if (!helper) {
|
|
3396
|
+
helper = `%map.entries.${lowerer.mapHofHelpers.size}`;
|
|
3397
|
+
lowerer.mapHofHelpers.set(key, helper);
|
|
3398
|
+
lowerer.liftedFns.push(buildMapIterDrainFn(helper, mapT, "entries", tupleT, tupleT, receiver.loc));
|
|
3399
|
+
}
|
|
3400
|
+
return { kind: "call", callee: helper, args: [receiver], type: arrayOf(tupleT), loc: receiver.loc };
|
|
3401
|
+
}
|
|
3402
|
+
/** Snapshot a collection for immediate iteration. Array reads and callback
|
|
3403
|
+
* parameters may retain an undefined arm even when the checker spells a
|
|
3404
|
+
* bare collection. Observe that arm before touching native storage. */
|
|
3405
|
+
export function lowerCollectionSpread(lowerer, source, node) {
|
|
3406
|
+
if (source.type.kind === "map")
|
|
3407
|
+
return mapEntriesArray(lowerer, source);
|
|
3408
|
+
if (source.type.kind === "set")
|
|
3409
|
+
return {
|
|
3410
|
+
kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrayOf(source.type.elem), loc: source.loc,
|
|
3411
|
+
};
|
|
3412
|
+
if (source.type.kind !== "union")
|
|
3413
|
+
return null;
|
|
3414
|
+
const arms = lowerer.unions.get(source.type.unionId)?.arms;
|
|
3415
|
+
const tag = arms?.findIndex((arm) => arm.kind === "map" || arm.kind === "set") ?? -1;
|
|
3416
|
+
const collection = arms?.[tag];
|
|
3417
|
+
if ((collection?.kind !== "map" && collection?.kind !== "set") ||
|
|
3418
|
+
!arms?.every((arm, index) => index === tag || isUnitType(arm)))
|
|
3419
|
+
return null;
|
|
3420
|
+
const loc = locOf(node);
|
|
3421
|
+
const slot = lowerer.declareHiddenLocal("%collectionSpread", source.type);
|
|
3422
|
+
const value = varRef(slot.id, source.type, loc);
|
|
3423
|
+
const narrowed = {
|
|
3424
|
+
kind: "unionNarrow", unionId: source.type.unionId, tag, value, type: collection, loc,
|
|
3425
|
+
};
|
|
3426
|
+
const entries = collection.kind === "map"
|
|
3427
|
+
? mapEntriesArray(lowerer, narrowed)
|
|
3428
|
+
: { kind: "setIntrinsic", method: "toArray", receiver: narrowed, args: [], type: arrayOf(collection.elem), loc };
|
|
3429
|
+
return {
|
|
3430
|
+
kind: "seqExpr", stmts: [{ kind: "varDecl", localId: slot.id, init: source, loc }],
|
|
3431
|
+
result: {
|
|
3432
|
+
kind: "ternary",
|
|
3433
|
+
cond: { kind: "unionIsTag", unionId: source.type.unionId, tag, value, negated: false, type: BOOL, loc },
|
|
3434
|
+
then: entries,
|
|
3435
|
+
else_: nodeThrowExpr(1, "", `${node.getText()} is not iterable`, entries.type, loc),
|
|
3436
|
+
type: entries.type, loc,
|
|
3437
|
+
},
|
|
3438
|
+
type: entries.type, loc,
|
|
3439
|
+
};
|
|
3440
|
+
}
|
|
3103
3441
|
/** `m.forEach(fn)` desugars to a direct call of a synthetic module
|
|
3104
3442
|
* function — one per key/value type + callback arity, interned — whose
|
|
3105
3443
|
* body is an index loop over the map's ITERATION PRIMITIVES: read
|
|
@@ -3285,10 +3623,14 @@ export function lowerSetMethodCall(lowerer, call, access) {
|
|
|
3285
3623
|
}
|
|
3286
3624
|
if (receiverIr?.kind !== "set")
|
|
3287
3625
|
return null;
|
|
3288
|
-
|
|
3626
|
+
// A collection interface may refine has() into a type predicate.
|
|
3627
|
+
// Type mapping checked that view's native ABI; the value check below
|
|
3628
|
+
// still rejects structural mocks and assertions over other objects.
|
|
3629
|
+
if (!lowerer.isStdlibMember(access) && name !== "has")
|
|
3289
3630
|
return null;
|
|
3290
3631
|
const loc = locOf(call);
|
|
3291
|
-
const
|
|
3632
|
+
const value = lowerer.lowerExpr(access.expression);
|
|
3633
|
+
const receiver = lowerer.runtimeOptionalPropertyReceiver(access.expression, value, receiverIr, name) ?? value;
|
|
3292
3634
|
// The lib's `add` returns the Set (chaining typechecks); the lowered
|
|
3293
3635
|
// add is a void statement — fence chained receivers like Map's set.
|
|
3294
3636
|
if (receiver.type.kind !== "set") {
|
|
@@ -3301,11 +3643,11 @@ export function lowerSetMethodCall(lowerer, call, access) {
|
|
|
3301
3643
|
return lowerSetCombineCall(lowerer, call, name, receiver, receiverIr);
|
|
3302
3644
|
}
|
|
3303
3645
|
if (name === "add") {
|
|
3304
|
-
const v = lowerer.
|
|
3646
|
+
const v = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.elem);
|
|
3305
3647
|
return { kind: "setIntrinsic", method: "add", receiver, args: [v], type: VOID, loc };
|
|
3306
3648
|
}
|
|
3307
3649
|
if (name === "has" || name === "delete") {
|
|
3308
|
-
const v = lowerer.
|
|
3650
|
+
const v = lowerer.lowerCollectionKey(call.arguments[0], receiverIr.elem);
|
|
3309
3651
|
return { kind: "setIntrinsic", method: name, receiver, args: [v], type: BOOL, loc };
|
|
3310
3652
|
}
|
|
3311
3653
|
if (name === "clear") {
|
|
@@ -3771,7 +4113,11 @@ export function lowerIteratorHelperCall(lowerer, call, access) {
|
|
|
3771
4113
|
if (terminal !== "forEach" && (checkerT === null || !typeEquals(checkerT, resultT))) {
|
|
3772
4114
|
lowerer.noLowering(`.${terminal} at this result type`, call, "the chain's element and result types must be representable — annotate the callbacks' types");
|
|
3773
4115
|
}
|
|
3774
|
-
const stageKeys = stageIrs.map((s) =>
|
|
4116
|
+
const stageKeys = stageIrs.map((s) => {
|
|
4117
|
+
if (!s)
|
|
4118
|
+
throw new InternalCompilerError("missing iterator stage");
|
|
4119
|
+
return "budget" in s ? s.kind : `${s.kind}:${typeKey(s.fn.type)}`;
|
|
4120
|
+
});
|
|
3775
4121
|
const key = `iter:${srcProj}:${typeKey(items.type)}:${stageKeys.join(",")}:${terminal}:${termArgs.map((a) => typeKey(a.type)).join(",")}`;
|
|
3776
4122
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
3777
4123
|
if (!helper) {
|
|
@@ -3779,7 +4125,11 @@ export function lowerIteratorHelperCall(lowerer, call, access) {
|
|
|
3779
4125
|
lowerer.arrHofHelpers.set(key, helper);
|
|
3780
4126
|
lowerer.liftedFns.push(buildIterChainFn(lowerer, helper, items.type, srcProj, stageIrs, terminal, termArgs.map((a) => a.type), resultT, loc));
|
|
3781
4127
|
}
|
|
3782
|
-
const budgetOrFn = stageIrs.map((s) =>
|
|
4128
|
+
const budgetOrFn = stageIrs.map((s) => {
|
|
4129
|
+
if (!s)
|
|
4130
|
+
throw new InternalCompilerError("missing iterator stage");
|
|
4131
|
+
return "budget" in s ? s.budget : s.fn;
|
|
4132
|
+
});
|
|
3783
4133
|
return { kind: "call", callee: helper, args: [items, ...budgetOrFn, ...termArgs], type: resultT, loc };
|
|
3784
4134
|
}
|
|
3785
4135
|
const ITER_STAGES = new Set(["map", "filter", "take", "drop", "flatMap"]);
|
|
@@ -4457,6 +4807,8 @@ export function lowerForOfSearchParams(lowerer, stmt, iterable, proj) {
|
|
|
4457
4807
|
export function lowerForOfArrayIter(lowerer, stmt, iterable, proj) {
|
|
4458
4808
|
const loc = locOf(stmt);
|
|
4459
4809
|
const arrT = iterable.type;
|
|
4810
|
+
if (arrT.kind !== "array" && arrT.kind !== "bytes")
|
|
4811
|
+
throw new InternalCompilerError("array iterator requires indexed storage");
|
|
4460
4812
|
const elemT = arrT.kind === "array" ? arrayValueType(lowerer, arrT.elem) : F64;
|
|
4461
4813
|
const yieldsPair = proj === "entries";
|
|
4462
4814
|
if (!ts.isVariableDeclarationList(stmt.initializer)) {
|
|
@@ -4835,7 +5187,11 @@ function exitBeforeReturns(stmts, make) {
|
|
|
4835
5187
|
case "block":
|
|
4836
5188
|
return [{ ...s, body: walk(s.body) }];
|
|
4837
5189
|
case "switch":
|
|
4838
|
-
return [{ ...s, cases: s.cases.map((c) =>
|
|
5190
|
+
return [{ ...s, cases: s.cases.map((c) => {
|
|
5191
|
+
if (!c)
|
|
5192
|
+
throw new InternalCompilerError("missing switch clause");
|
|
5193
|
+
return { ...c, body: walk(c.body) };
|
|
5194
|
+
}) }];
|
|
4839
5195
|
case "tryCatch":
|
|
4840
5196
|
return [
|
|
4841
5197
|
{
|
|
@@ -4851,18 +5207,290 @@ function exitBeforeReturns(stmts, make) {
|
|
|
4851
5207
|
});
|
|
4852
5208
|
return walk(stmts);
|
|
4853
5209
|
}
|
|
4854
|
-
/**
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
5210
|
+
/** Consume a Set seed immediately, including optional inherited sets used
|
|
5211
|
+
* by compiler tables. Nullish seeds construct empty sets; a lazy fallback
|
|
5212
|
+
* consumes its evaluated branch even when it reassigns the source binding. */
|
|
5213
|
+
export function lowerSetSeedNew(lowerer, node, setT) {
|
|
5214
|
+
if (ts.isSpreadElement(node))
|
|
5215
|
+
return null;
|
|
5216
|
+
while (ts.isParenthesizedExpression(node))
|
|
5217
|
+
node = node.expression;
|
|
5218
|
+
const loc = locOf(node);
|
|
5219
|
+
const undefinedSeed = lowerStaticallyUndefinedArgument(lowerer, node);
|
|
5220
|
+
if (undefinedSeed)
|
|
5221
|
+
return defaultAfterUndefined(undefinedSeed, { kind: "setNew", type: setT, loc });
|
|
5222
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken) {
|
|
5223
|
+
const undefinedLeft = lowerStaticallyUndefinedArgument(lowerer, node.left);
|
|
5224
|
+
const fallback = node.right;
|
|
5225
|
+
if (undefinedLeft) {
|
|
5226
|
+
const selected = lowerSetSeedNew(lowerer, fallback, setT);
|
|
5227
|
+
return selected ? defaultAfterUndefined(undefinedLeft, selected) : null;
|
|
5228
|
+
}
|
|
5229
|
+
const source = lowerer.lowerExpr(node.left);
|
|
5230
|
+
if (isUnitType(source.type)) {
|
|
5231
|
+
const selected = lowerSetSeedNew(lowerer, fallback, setT);
|
|
5232
|
+
return selected ? defaultAfterUndefined(source, selected) : null;
|
|
5233
|
+
}
|
|
5234
|
+
return setFromSeedValue(lowerer, source, setT, () => lowerSetSeedNew(lowerer, fallback, setT));
|
|
5235
|
+
}
|
|
5236
|
+
if (ts.isConditionalExpression(node)) {
|
|
5237
|
+
const yes = lowerSetSeedNew(lowerer, node.whenTrue, setT);
|
|
5238
|
+
const no = lowerSetSeedNew(lowerer, node.whenFalse, setT);
|
|
5239
|
+
return yes && no ? { kind: "ternary", cond: lowerer.lowerCondition(node.condition), then: yes, else_: no, type: setT, loc } : null;
|
|
5240
|
+
}
|
|
5241
|
+
// Constructor contextual types include Iterable<T>, which has no value
|
|
5242
|
+
// representation. Build a literal at the actual Set element ABI instead.
|
|
5243
|
+
if (ts.isArrayLiteralExpression(node) && !node.elements.some(ts.isSpreadElement)) {
|
|
5244
|
+
const elems = node.elements.map((element) => lowerer.lowerCollectionKey(element, setT.elem));
|
|
5245
|
+
return { kind: "setNew", seed: { kind: "arrayLit", elems, type: arrayOf(setT.elem), loc }, type: setT, loc };
|
|
5246
|
+
}
|
|
5247
|
+
const declared = lowerer.mapTypeOf(lowerer.typeOf(node));
|
|
5248
|
+
const scalar = setT.elem.kind === "f64" || setT.elem.kind === "string";
|
|
5249
|
+
let source = !scalar && (declared?.kind === "array" || declared?.kind === "record")
|
|
5250
|
+
? lowerer.lowerCollectionKey(node, declared)
|
|
5251
|
+
: lowerer.lowerExpr(node);
|
|
5252
|
+
if (declared?.kind === "string" && setT.elem.kind === "string" &&
|
|
5253
|
+
(source.type.kind === "dyn" || source.type.kind === "jsval")) {
|
|
5254
|
+
source = lowerer.coerceInto(node, source, STRING);
|
|
5255
|
+
}
|
|
5256
|
+
if (source.type.kind === "dyn" && setT.elem.kind === "dyn") {
|
|
5257
|
+
return { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.nativeSetNew", args: [source], type: DYN, loc }, type: setT, loc };
|
|
5258
|
+
}
|
|
5259
|
+
if (declared?.kind === "array" && typeEquals(declared.elem, setT.elem)) {
|
|
5260
|
+
// Preserve the existing checked scalar-iterable bridge. Reference
|
|
5261
|
+
// elements must retain identity and cannot enter via a copying exit.
|
|
5262
|
+
if (source.type.kind === "jsval" && lowerer.boundaryExitSafe(arrayOf(setT.elem))) {
|
|
5263
|
+
source = { kind: "jsExit", value: source, type: arrayOf(setT.elem), loc };
|
|
5264
|
+
}
|
|
5265
|
+
if (source.type.kind === "dyn" && scalar) {
|
|
5266
|
+
source = lowerer.coerceInto(node, {
|
|
5267
|
+
kind: "libCall", fn: "dyn.iterPack", args: [source, strLit(node.getText(), loc)], type: DYN, loc,
|
|
5268
|
+
}, arrayOf(setT.elem));
|
|
5269
|
+
}
|
|
5270
|
+
}
|
|
5271
|
+
return setFromSeedValue(lowerer, source, setT, () => ({ kind: "setNew", type: setT, loc }));
|
|
5272
|
+
}
|
|
5273
|
+
function setFromSeedValue(lowerer, source, setT, missing) {
|
|
5274
|
+
const loc = source.loc;
|
|
5275
|
+
if (isUnitType(source.type)) {
|
|
5276
|
+
const empty = missing();
|
|
5277
|
+
return empty ? defaultAfterUndefined(source, empty) : null;
|
|
5278
|
+
}
|
|
5279
|
+
if (source.type.kind === "union") {
|
|
5280
|
+
const unionId = source.type.unionId;
|
|
5281
|
+
const arms = lowerer.unions.get(unionId)?.arms;
|
|
5282
|
+
if (!arms)
|
|
5283
|
+
return null;
|
|
5284
|
+
const slot = lowerer.declareHiddenLocal("%setSeed", source.type);
|
|
5285
|
+
const ref = varRef(slot.id, source.type, loc);
|
|
5286
|
+
let result = null;
|
|
5287
|
+
for (let tag = arms.length - 1; tag >= 0; tag--) {
|
|
5288
|
+
const arm = arms[tag];
|
|
5289
|
+
const branch = isUnitType(arm) ? missing() : setFromSeedValue(lowerer, {
|
|
5290
|
+
kind: "unionNarrow", unionId, tag, value: ref, type: arm, loc,
|
|
5291
|
+
}, setT, missing);
|
|
5292
|
+
if (!branch)
|
|
5293
|
+
return null;
|
|
5294
|
+
result = result === null ? branch : {
|
|
5295
|
+
kind: "ternary", cond: { kind: "unionIsTag", unionId, tag, value: ref, negated: false, type: BOOL, loc },
|
|
5296
|
+
then: branch, else_: result, type: setT, loc,
|
|
5297
|
+
};
|
|
5298
|
+
}
|
|
5299
|
+
return result ? {
|
|
5300
|
+
kind: "seqExpr", stmts: [{ kind: "varDecl", localId: slot.id, init: source, loc }], result, type: setT, loc,
|
|
5301
|
+
} : null;
|
|
5302
|
+
}
|
|
5303
|
+
let seed;
|
|
5304
|
+
if (source.type.kind === "set" && typeEquals(source.type, setT)) {
|
|
5305
|
+
seed = { kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrayOf(setT.elem), loc };
|
|
5306
|
+
}
|
|
5307
|
+
else if (source.type.kind === "string" && setT.elem.kind === "string") {
|
|
5308
|
+
seed = strCharsCall(lowerer, source, loc);
|
|
5309
|
+
}
|
|
5310
|
+
else if (source.type.kind === "array" && typeEquals(source.type.elem, setT.elem)) {
|
|
5311
|
+
seed = source;
|
|
5312
|
+
}
|
|
5313
|
+
else if (source.type.kind === "record") {
|
|
5314
|
+
const shape = lowerer.shapes.get(source.type.shapeId);
|
|
5315
|
+
if (!shape?.tuple || !shape.fields.every((field) => typeEquals(field.type, setT.elem)))
|
|
5316
|
+
return null;
|
|
5317
|
+
const arrayT = { kind: "array", elem: setT.elem };
|
|
5318
|
+
const helper = lowerer.tupleArrayWidthHelper(source.type.shapeId, arrayT, loc);
|
|
5319
|
+
if (!helper)
|
|
5320
|
+
return null;
|
|
5321
|
+
seed = { kind: "call", callee: helper, args: [source], type: arrayT, loc };
|
|
5322
|
+
}
|
|
5323
|
+
else
|
|
5324
|
+
return null;
|
|
5325
|
+
return { kind: "setNew", seed, type: setT, loc };
|
|
5326
|
+
}
|
|
5327
|
+
/** Consume supported Map seeds: matching Maps and tuple arrays, plus
|
|
5328
|
+
* nullish values that construct an empty Map. Conditional/nullish seeds
|
|
5329
|
+
* select one lazy branch without representing a first-class iterable.
|
|
5330
|
+
* Copy loops preserve entry order and stored reference identities. */
|
|
5331
|
+
export function lowerMapSeedNew(lowerer, argNode, mapT) {
|
|
4863
5332
|
if (ts.isSpreadElement(argNode))
|
|
4864
5333
|
return null;
|
|
5334
|
+
const empty = lowerer.emptyCollectionFor(argNode, mapT);
|
|
5335
|
+
if (empty)
|
|
5336
|
+
return empty;
|
|
5337
|
+
while (ts.isParenthesizedExpression(argNode))
|
|
5338
|
+
argNode = argNode.expression;
|
|
5339
|
+
// A constructor consumes either iterable branch immediately. It does
|
|
5340
|
+
// not need a first-class Map|array representation for `cached ?? []`.
|
|
5341
|
+
// Snapshot the left before the lazy fallback can mutate its binding.
|
|
5342
|
+
if (ts.isBinaryExpression(argNode) && argNode.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken) {
|
|
5343
|
+
const source = lowerer.lowerExpr(argNode.left);
|
|
5344
|
+
if (isUnitType(source.type)) {
|
|
5345
|
+
const fallback = lowerMapSeedNew(lowerer, argNode.right, mapT);
|
|
5346
|
+
return fallback ? defaultAfterUndefined(source, fallback) : null;
|
|
5347
|
+
}
|
|
5348
|
+
if (source.type.kind !== "union")
|
|
5349
|
+
return mapFromSeedValue(lowerer, source, mapT);
|
|
5350
|
+
const arms = lowerer.unions.get(source.type.unionId)?.arms;
|
|
5351
|
+
if (!arms)
|
|
5352
|
+
return null;
|
|
5353
|
+
const loc = locOf(argNode);
|
|
5354
|
+
const saved = lowerer.declareHiddenLocal("%mapSeed", source.type);
|
|
5355
|
+
const ref = varRef(saved.id, source.type, loc);
|
|
5356
|
+
let result = null;
|
|
5357
|
+
for (let tag = arms.length - 1; tag >= 0; tag--) {
|
|
5358
|
+
const arm = arms[tag];
|
|
5359
|
+
const branch = isUnitType(arm)
|
|
5360
|
+
? lowerMapSeedNew(lowerer, argNode.right, mapT)
|
|
5361
|
+
: mapFromSeedValue(lowerer, { kind: "unionNarrow", unionId: source.type.unionId, tag, value: ref, type: arm, loc }, mapT);
|
|
5362
|
+
if (!branch)
|
|
5363
|
+
return null;
|
|
5364
|
+
result = result === null ? branch : {
|
|
5365
|
+
kind: "ternary",
|
|
5366
|
+
cond: { kind: "unionIsTag", unionId: source.type.unionId, tag, value: ref, negated: false, type: BOOL, loc },
|
|
5367
|
+
then: branch, else_: result, type: mapT, loc,
|
|
5368
|
+
};
|
|
5369
|
+
}
|
|
5370
|
+
return result ? { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: source, loc }], result, type: mapT, loc } : null;
|
|
5371
|
+
}
|
|
5372
|
+
if (ts.isConditionalExpression(argNode)) {
|
|
5373
|
+
const yes = lowerMapSeedNew(lowerer, argNode.whenTrue, mapT);
|
|
5374
|
+
const no = lowerMapSeedNew(lowerer, argNode.whenFalse, mapT);
|
|
5375
|
+
return yes && no ? { kind: "ternary", cond: lowerer.lowerCondition(argNode.condition), then: yes, else_: no, type: mapT, loc: locOf(argNode) } : null;
|
|
5376
|
+
}
|
|
5377
|
+
if (ts.isArrayLiteralExpression(argNode)) {
|
|
5378
|
+
if (isJsSourceFile(argNode.getSourceFile()) && argNode.elements.some((entry) => !ts.isArrayLiteralExpression(entry))) {
|
|
5379
|
+
return mapFromSeedValue(lowerer, lowerer.lowerExprExpecting(argNode, DYN), mapT);
|
|
5380
|
+
}
|
|
5381
|
+
const tuple = { kind: "record", shapeId: lowerer.shapes.intern([
|
|
5382
|
+
{ name: "0", type: mapT.key }, { name: "1", type: mapT.value },
|
|
5383
|
+
], true) };
|
|
5384
|
+
return mapFromSeedValue(lowerer, lowerer.lowerArrayLiteral(argNode, { kind: "array", elem: tuple }), mapT);
|
|
5385
|
+
}
|
|
4865
5386
|
const seed = lowerer.lowerExpr(argNode);
|
|
5387
|
+
return mapFromSeedValue(lowerer, seed, mapT);
|
|
5388
|
+
}
|
|
5389
|
+
function mapFromSeedValue(lowerer, seed, mapT) {
|
|
5390
|
+
const loc = seed.loc;
|
|
5391
|
+
if (isUnitType(seed.type)) {
|
|
5392
|
+
return defaultAfterUndefined(seed, { kind: "mapNew", type: mapT, loc });
|
|
5393
|
+
}
|
|
5394
|
+
if (seed.type.kind === "union") {
|
|
5395
|
+
const arms = lowerer.unions.get(seed.type.unionId)?.arms;
|
|
5396
|
+
if (!arms)
|
|
5397
|
+
return null;
|
|
5398
|
+
const saved = lowerer.declareHiddenLocal("%mapSeed", seed.type);
|
|
5399
|
+
const ref = varRef(saved.id, seed.type, loc);
|
|
5400
|
+
let result = null;
|
|
5401
|
+
for (let tag = arms.length - 1; tag >= 0; tag--) {
|
|
5402
|
+
const arm = arms[tag];
|
|
5403
|
+
const branch = isUnitType(arm) ? { kind: "mapNew", type: mapT, loc }
|
|
5404
|
+
: mapFromSeedValue(lowerer, { kind: "unionNarrow", unionId: seed.type.unionId, tag, value: ref, type: arm, loc }, mapT);
|
|
5405
|
+
if (!branch)
|
|
5406
|
+
return null;
|
|
5407
|
+
result = result === null ? branch : {
|
|
5408
|
+
kind: "ternary",
|
|
5409
|
+
cond: { kind: "unionIsTag", unionId: seed.type.unionId, tag, value: ref, negated: false, type: BOOL, loc },
|
|
5410
|
+
then: branch, else_: result, type: mapT, loc,
|
|
5411
|
+
};
|
|
5412
|
+
}
|
|
5413
|
+
return result ? { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: seed, loc }], result, type: mapT, loc } : null;
|
|
5414
|
+
}
|
|
5415
|
+
if (seed.type.kind === "map") {
|
|
5416
|
+
if (!typeEquals(seed.type, mapT))
|
|
5417
|
+
return null;
|
|
5418
|
+
const key = `copy:${typeKey(mapT)}`;
|
|
5419
|
+
let name = lowerer.mapHofHelpers.get(key);
|
|
5420
|
+
if (!name) {
|
|
5421
|
+
name = `%map.copy.${lowerer.mapHofHelpers.size}`;
|
|
5422
|
+
lowerer.mapHofHelpers.set(key, name);
|
|
5423
|
+
const source = varRef("source.0", mapT, loc);
|
|
5424
|
+
const target = varRef("target.0", mapT, loc);
|
|
5425
|
+
const index = varRef("i.0", F64, loc);
|
|
5426
|
+
const read = (method, type) => ({
|
|
5427
|
+
kind: "mapIntrinsic", method, receiver: source, args: method === "iterCount" ? [] : [index], type, loc,
|
|
5428
|
+
});
|
|
5429
|
+
lowerer.liftedFns.push({
|
|
5430
|
+
name, params: [{ localId: "source.0", name: "source", type: mapT }], returnType: mapT,
|
|
5431
|
+
locals: [
|
|
5432
|
+
{ id: "source.0", name: "source", type: mapT, mutable: false },
|
|
5433
|
+
{ id: "target.0", name: "target", type: mapT, mutable: false },
|
|
5434
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
5435
|
+
],
|
|
5436
|
+
body: [
|
|
5437
|
+
{ kind: "varDecl", localId: "target.0", init: { kind: "mapNew", type: mapT, loc }, loc },
|
|
5438
|
+
countedFor(loc, read("iterCount", F64), () => [{
|
|
5439
|
+
kind: "if", cond: read("iterLive", BOOL), then: [{ kind: "exprStmt", expr: {
|
|
5440
|
+
kind: "mapIntrinsic", method: "set", receiver: target,
|
|
5441
|
+
args: [read("iterKey", mapT.key), read("iterValue", mapT.value)], type: VOID, loc,
|
|
5442
|
+
}, loc }], else_: null, loc,
|
|
5443
|
+
}]),
|
|
5444
|
+
{ kind: "return", value: target, loc },
|
|
5445
|
+
], loc,
|
|
5446
|
+
});
|
|
5447
|
+
}
|
|
5448
|
+
return { kind: "call", callee: name, args: [seed], type: mapT, loc };
|
|
5449
|
+
}
|
|
5450
|
+
if (seed.type.kind === "dyn" || seed.type.kind === "array" && seed.type.elem.kind === "dyn") {
|
|
5451
|
+
const key = `checked-seed:${typeKey(mapT)}`;
|
|
5452
|
+
let name = lowerer.mapHofHelpers.get(key);
|
|
5453
|
+
if (!name) {
|
|
5454
|
+
name = `%map.checkedSeed.${lowerer.mapHofHelpers.size}`;
|
|
5455
|
+
lowerer.mapHofHelpers.set(key, name);
|
|
5456
|
+
const source = varRef("source.0", DYN, loc);
|
|
5457
|
+
const entries = varRef("entries.0", DYN, loc);
|
|
5458
|
+
const entry = varRef("entry.0", DYN, loc);
|
|
5459
|
+
const target = varRef("target.0", mapT, loc);
|
|
5460
|
+
const keyValue = varRef("key.0", DYN, loc);
|
|
5461
|
+
const itemValue = varRef("value.0", DYN, loc);
|
|
5462
|
+
const checked = (value, type) => type.kind === "dyn" ? value
|
|
5463
|
+
: { kind: "dynCheck", value, type, loc };
|
|
5464
|
+
lowerer.liftedFns.push({
|
|
5465
|
+
name, params: [{ localId: "source.0", name: "source", type: DYN }], returnType: mapT,
|
|
5466
|
+
locals: [
|
|
5467
|
+
{ id: "source.0", name: "source", type: DYN, mutable: false },
|
|
5468
|
+
{ id: "entries.0", name: "entries", type: DYN, mutable: false },
|
|
5469
|
+
{ id: "entry.0", name: "entry", type: DYN, mutable: false },
|
|
5470
|
+
{ id: "key.0", name: "key", type: DYN, mutable: false },
|
|
5471
|
+
{ id: "value.0", name: "value", type: DYN, mutable: false },
|
|
5472
|
+
{ id: "target.0", name: "target", type: mapT, mutable: false },
|
|
5473
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
5474
|
+
],
|
|
5475
|
+
body: [
|
|
5476
|
+
{ kind: "varDecl", localId: "target.0", init: { kind: "mapNew", type: mapT, loc }, loc },
|
|
5477
|
+
{ kind: "varDecl", localId: "entries.0", init: { kind: "libCall", fn: "dyn.mapSeedEntries", args: [source], type: DYN, loc }, loc },
|
|
5478
|
+
countedFor(loc, { kind: "libCall", fn: "dyn.arrLen", args: [entries], type: F64, loc }, () => [
|
|
5479
|
+
{ kind: "varDecl", localId: "entry.0", init: { kind: "libCall", fn: "dyn.mapSeedEntry", args: [
|
|
5480
|
+
{ kind: "libCall", fn: "dyn.arrAt", args: [entries, varRef("i.0", F64, loc)], type: DYN, loc },
|
|
5481
|
+
], type: DYN, loc }, loc },
|
|
5482
|
+
{ kind: "varDecl", localId: "key.0", init: { kind: "dynKeyGet", value: entry, key: strLit("0", loc), type: DYN, loc }, loc },
|
|
5483
|
+
{ kind: "varDecl", localId: "value.0", init: { kind: "dynKeyGet", value: entry, key: strLit("1", loc), type: DYN, loc }, loc },
|
|
5484
|
+
{ kind: "exprStmt", expr: { kind: "mapIntrinsic", method: "set", receiver: target,
|
|
5485
|
+
args: [checked(keyValue, mapT.key), checked(itemValue, mapT.value)], type: VOID, loc }, loc },
|
|
5486
|
+
]),
|
|
5487
|
+
{ kind: "return", value: target, loc },
|
|
5488
|
+
], loc,
|
|
5489
|
+
});
|
|
5490
|
+
}
|
|
5491
|
+
const source = seed.type.kind === "dyn" ? seed : { kind: "dynFrom", value: seed, type: DYN, loc };
|
|
5492
|
+
return { kind: "call", callee: name, args: [source], type: mapT, loc };
|
|
5493
|
+
}
|
|
4866
5494
|
if (seed.type.kind !== "array" || seed.type.elem.kind !== "record")
|
|
4867
5495
|
return null;
|
|
4868
5496
|
const elem = seed.type.elem;
|
|
@@ -4873,7 +5501,6 @@ export function lowerMapSeedArrayNew(lowerer, argNode, mapT) {
|
|
|
4873
5501
|
const vT = shape.fields.find((f) => f.name === "1").type;
|
|
4874
5502
|
if (!typeEquals(kT, mapT.key) || !typeEquals(vT, mapT.value))
|
|
4875
5503
|
return null;
|
|
4876
|
-
const loc = locOf(argNode);
|
|
4877
5504
|
const key = `seed:${typeKey(mapT.key)}:${typeKey(mapT.value)}:${elem.shapeId}`;
|
|
4878
5505
|
let helper = lowerer.mapHofHelpers.get(key);
|
|
4879
5506
|
if (!helper) {
|
|
@@ -4946,7 +5573,7 @@ export function lowerObjectIterOverIndexShape(lowerer, call, member, argIr, shap
|
|
|
4946
5573
|
const resultT = lowerer.irTypeOf(call);
|
|
4947
5574
|
if (resultT.kind !== "array")
|
|
4948
5575
|
lowerer.badType(call, lowerer.typeOf(call)); // defensive
|
|
4949
|
-
return objectIterOverIndexShape(lowerer, call, member, argIr, shape, lowerer.lowerExpr(call.arguments[0]), resultT, locOf(call));
|
|
5576
|
+
return objectIterOverIndexShape(lowerer, call, member, argIr, shape, objectEnumerationReceiver(lowerer, lowerer.lowerExpr(call.arguments[0]), argIr, locOf(call)), resultT, locOf(call));
|
|
4950
5577
|
}
|
|
4951
5578
|
/** The construction core, receiver/result pre-resolved — `node` anchors
|
|
4952
5579
|
* the fences. for-in reuses the "keys" arm directly (it iterates exactly
|
|
@@ -5146,6 +5773,21 @@ export function objectIterOverIndexShape(lowerer, node, member, argIr, shape, re
|
|
|
5146
5773
|
* (lowerRecordOvfCaptureHelper). Null when the argument or result shape
|
|
5147
5774
|
* is outside this (Maps, richer iterables → the SC2020 fence). */
|
|
5148
5775
|
export function lowerObjectFromEntriesCall(lowerer, call, callee) {
|
|
5776
|
+
const typed = lowerTypedObjectFromEntriesCall(lowerer, call, callee);
|
|
5777
|
+
if (typed)
|
|
5778
|
+
return typed;
|
|
5779
|
+
if (!ts.isPropertyAccessExpression(callee) || call.questionDotToken || callee.questionDotToken ||
|
|
5780
|
+
!lowerer.isStdlibGlobal(callee.expression, "Object") || callee.name.text !== "fromEntries" ||
|
|
5781
|
+
call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0]))
|
|
5782
|
+
return null;
|
|
5783
|
+
if (lowerer.dynamic)
|
|
5784
|
+
return null;
|
|
5785
|
+
return {
|
|
5786
|
+
kind: "libCall", fn: "dyn.fromEntries", type: DYN, loc: locOf(call),
|
|
5787
|
+
args: [lowerer.lowerExprExpecting(call.arguments[0], DYN)],
|
|
5788
|
+
};
|
|
5789
|
+
}
|
|
5790
|
+
function lowerTypedObjectFromEntriesCall(lowerer, call, callee) {
|
|
5149
5791
|
if (!ts.isPropertyAccessExpression(callee))
|
|
5150
5792
|
return null;
|
|
5151
5793
|
if (call.questionDotToken || callee.questionDotToken)
|
|
@@ -5202,7 +5844,10 @@ export function lowerObjectFromEntriesCall(lowerer, call, callee) {
|
|
|
5202
5844
|
if (!convertible) {
|
|
5203
5845
|
lowerer.unsupported("SC1090", call, `Object.fromEntries over '${lowerer.fmt(argIr)}' (the tuple's '${lowerer.fmt(valT)}' value cannot flow into the '${lowerer.fmt(iv)}' signature slot)`);
|
|
5204
5846
|
}
|
|
5205
|
-
|
|
5847
|
+
// Enumeration/filtering may keep the array in checked-dynamic storage.
|
|
5848
|
+
// Validate its tuple layout before calling a helper with a native-array
|
|
5849
|
+
// ABI; opaque tuple values themselves retain their original references.
|
|
5850
|
+
const receiver = lowerer.lowerExprExpecting(argNode, argIr);
|
|
5206
5851
|
const key = `obj.fromEntries:${argIr.elem.shapeId}:${resultT.shapeId}`;
|
|
5207
5852
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
5208
5853
|
if (!helper) {
|