@scriptc/compiler 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +915 -215
- package/ambient/scriptc-overrides.d.ts +5 -1
- package/ambient/scriptc.d.ts +22 -2
- package/dist/backend/build-cache.d.ts +4 -0
- package/dist/backend/build-cache.js +16 -2
- package/dist/backend/build-cache.js.map +1 -1
- package/dist/backend/cycle-analysis.js +17 -5
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +50 -11
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/debug-symbols.js.map +1 -1
- package/dist/backend/executable-features.js +2 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/external-c.d.ts +13 -6
- package/dist/backend/external-c.js +15 -3
- package/dist/backend/external-c.js.map +1 -1
- package/dist/backend/ffi-callbacks.js +6 -9
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/library-identity-markers.js.map +1 -1
- package/dist/backend/library-pack.d.ts +1 -1
- package/dist/backend/library-pack.js +81 -24
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/link-plan-core.js +9 -2
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -1
- package/dist/backend/link-plan.js +4 -5
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/linker.d.ts +1 -1
- package/dist/backend/linker.js +42 -23
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/literals.js +5 -4
- package/dist/backend/literals.js.map +1 -1
- package/dist/backend/literals.test.js +30 -5
- package/dist/backend/literals.test.js.map +1 -1
- package/dist/backend/llvm/blocks.test.js +5 -2
- package/dist/backend/llvm/blocks.test.js.map +1 -1
- package/dist/backend/llvm/borrowed-inputs.d.ts +15 -0
- package/dist/backend/llvm/borrowed-inputs.js +28 -0
- package/dist/backend/llvm/borrowed-inputs.js.map +1 -0
- package/dist/backend/llvm/borrowed-receivers.js +43 -19
- package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
- package/dist/backend/llvm/byte-numbers.d.ts +10 -0
- package/dist/backend/llvm/byte-numbers.js +240 -0
- package/dist/backend/llvm/byte-numbers.js.map +1 -0
- package/dist/backend/llvm/bytes-bounds.d.ts +9 -0
- package/dist/backend/llvm/bytes-bounds.js +240 -0
- package/dist/backend/llvm/bytes-bounds.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +10 -0
- package/dist/backend/llvm/call-lifetimes.js +83 -20
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +203 -18
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.d.ts +13 -0
- package/dist/backend/llvm/checked-value-lifetimes.js +45 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -0
- package/dist/backend/llvm/classes.js +16 -12
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.js +4 -1
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +6 -0
- package/dist/backend/llvm/counted-loops.js +35 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -0
- package/dist/backend/llvm/debug-info.js +33 -13
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/debug-info.test.js +28 -6
- package/dist/backend/llvm/debug-info.test.js.map +1 -1
- package/dist/backend/llvm/dyn.js +68 -22
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +34 -12
- package/dist/backend/llvm/emitter.js +357 -124
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +237 -46
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +28 -8
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +4 -4
- package/dist/backend/llvm/expr-bytes.js +78 -36
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +10 -4
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +40 -21
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +4 -1
- package/dist/backend/llvm/expr-containers.js +157 -76
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +11 -0
- package/dist/backend/llvm/expr-control.js +27 -8
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +3 -1
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +50 -33
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.js +26 -6
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +139 -37
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +43 -1
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +16 -9
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +44 -26
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +51 -14
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +34 -14
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-values.d.ts +10 -0
- package/dist/backend/llvm/integer-values.js +52 -0
- package/dist/backend/llvm/integer-values.js.map +1 -0
- package/dist/backend/llvm/integer-views.d.ts +7 -0
- package/dist/backend/llvm/integer-views.js +83 -0
- package/dist/backend/llvm/integer-views.js.map +1 -0
- package/dist/backend/llvm/integer-views.test.d.ts +1 -0
- package/dist/backend/llvm/integer-views.test.js +69 -0
- package/dist/backend/llvm/integer-views.test.js.map +1 -0
- package/dist/backend/llvm/lib-abi.js +13 -4
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-connect.js +7 -1
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +35 -10
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +36 -15
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +38 -23
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +60 -15
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +12 -5
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +97 -31
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +57 -14
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +107 -31
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +33 -14
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +21 -7
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +69 -20
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +3 -4
- package/dist/backend/llvm/local-array-reads.js +100 -121
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +379 -71
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +25 -0
- package/dist/backend/llvm/local-union-storage.js +109 -0
- package/dist/backend/llvm/local-union-storage.js.map +1 -0
- package/dist/backend/llvm/local-union-storage.test.d.ts +1 -0
- package/dist/backend/llvm/local-union-storage.test.js +210 -0
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +6 -2
- package/dist/backend/llvm/map-read-lifetimes.js +46 -16
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +93 -17
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/reference-effects.d.ts +23 -0
- package/dist/backend/llvm/reference-effects.js +179 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -0
- package/dist/backend/llvm/reference-effects.test.d.ts +1 -0
- package/dist/backend/llvm/reference-effects.test.js +157 -0
- package/dist/backend/llvm/reference-effects.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +7 -4
- package/dist/backend/llvm/shapes.js +82 -22
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +3 -1
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split.js +4 -4
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +14 -6
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.js +14 -5
- package/dist/backend/llvm/stack-unions.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +172 -32
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.d.ts +10 -0
- package/dist/backend/llvm/string-construction.js +38 -0
- package/dist/backend/llvm/string-construction.js.map +1 -0
- package/dist/backend/llvm/string-construction.test.d.ts +1 -0
- package/dist/backend/llvm/string-construction.test.js +90 -0
- package/dist/backend/llvm/string-construction.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.d.ts +2 -2
- package/dist/backend/llvm/string-lifetimes.js +19 -11
- package/dist/backend/llvm/string-lifetimes.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +127 -32
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.d.ts +9 -0
- package/dist/backend/llvm/switch-dispatch.js +114 -0
- package/dist/backend/llvm/switch-dispatch.js.map +1 -0
- package/dist/backend/llvm/switch-dispatch.test.d.ts +1 -0
- package/dist/backend/llvm/switch-dispatch.test.js +83 -0
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -0
- package/dist/backend/llvm/unsupported.js.map +1 -1
- package/dist/backend/llvm/walkers.js +6 -3
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/mangle.js +9 -3
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.js +18 -8
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +118 -22
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native/artifact-stamps.d.ts +39 -0
- package/dist/backend/native/artifact-stamps.js +371 -0
- package/dist/backend/native/artifact-stamps.js.map +1 -0
- package/dist/backend/native/cache-warm.d.ts +24 -0
- package/dist/backend/native/cache-warm.js +80 -0
- package/dist/backend/native/cache-warm.js.map +1 -0
- package/dist/backend/native/compiler-fingerprint.d.ts +19 -0
- package/dist/backend/native/compiler-fingerprint.js +357 -0
- package/dist/backend/native/compiler-fingerprint.js.map +1 -0
- package/dist/backend/native/contracts.d.ts +314 -0
- package/dist/backend/native/contracts.js +2 -0
- package/dist/backend/native/contracts.js.map +1 -0
- package/dist/backend/native/dependency-files.d.ts +5 -0
- package/dist/backend/native/dependency-files.js +83 -0
- package/dist/backend/native/dependency-files.js.map +1 -0
- package/dist/backend/native/driver.d.ts +50 -0
- package/dist/backend/native/driver.js +294 -0
- package/dist/backend/native/driver.js.map +1 -0
- package/dist/backend/native/executable.d.ts +18 -0
- package/dist/backend/native/executable.js +1267 -0
- package/dist/backend/native/executable.js.map +1 -0
- package/dist/backend/native/library.d.ts +2 -0
- package/dist/backend/native/library.js +614 -0
- package/dist/backend/native/library.js.map +1 -0
- package/dist/backend/native/linker-fingerprint.d.ts +8 -0
- package/dist/backend/native/linker-fingerprint.js +174 -0
- package/dist/backend/native/linker-fingerprint.js.map +1 -0
- package/dist/backend/native/object-merge.d.ts +2 -0
- package/dist/backend/native/object-merge.js +154 -0
- package/dist/backend/native/object-merge.js.map +1 -0
- package/dist/backend/native/process.d.ts +17 -0
- package/dist/backend/native/process.js +42 -0
- package/dist/backend/native/process.js.map +1 -0
- package/dist/backend/native/program-shards.d.ts +21 -0
- package/dist/backend/native/program-shards.js +99 -0
- package/dist/backend/native/program-shards.js.map +1 -0
- package/dist/backend/native/runtime-inputs.d.ts +12 -0
- package/dist/backend/native/runtime-inputs.js +163 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -0
- package/dist/backend/native/runtime-inputs.test.d.ts +1 -0
- package/dist/backend/native/runtime-inputs.test.js +64 -0
- package/dist/backend/native/runtime-inputs.test.js.map +1 -0
- package/dist/backend/native/runtime-objects.d.ts +16 -0
- package/dist/backend/native/runtime-objects.js +122 -0
- package/dist/backend/native/runtime-objects.js.map +1 -0
- package/dist/backend/native/session.d.ts +12 -0
- package/dist/backend/native/session.js +31 -0
- package/dist/backend/native/session.js.map +1 -0
- package/dist/backend/native/tool-identity.d.ts +37 -0
- package/dist/backend/native/tool-identity.js +310 -0
- package/dist/backend/native/tool-identity.js.map +1 -0
- package/dist/backend/native/trace-paths.d.ts +12 -0
- package/dist/backend/native/trace-paths.js +73 -0
- package/dist/backend/native/trace-paths.js.map +1 -0
- package/dist/backend/native/vendor.d.ts +1 -0
- package/dist/backend/native/vendor.js +12 -0
- package/dist/backend/native/vendor.js.map +1 -0
- package/dist/backend/native-codegen-core.js +2 -1
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +1 -1
- package/dist/backend/native-codegen.js +24 -13
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +12 -9
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.js +9 -5
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.js +14 -5
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +58 -13
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +17 -450
- package/dist/backend/native-toolchain.js +17 -3971
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +103 -72
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/native-tools.js +27 -8
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/object-localize.js +17 -14
- package/dist/backend/object-localize.js.map +1 -1
- package/dist/backend/object-localize.test.js +59 -12
- package/dist/backend/object-localize.test.js.map +1 -1
- package/dist/backend/runtime-pack-core.js +96 -49
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.js +5 -3
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +87 -15
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +1 -1
- package/dist/backend/runtime-pack.js +11 -12
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +40 -24
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/source-locations.js.map +1 -1
- package/dist/backend/source-locations.test.js +7 -2
- package/dist/backend/source-locations.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +44 -14
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +93 -20
- package/dist/backend/target-diagnostics.test.js.map +1 -1
- package/dist/backend/targets.js +230 -86
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +32 -18
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/backend/toolchain-environment.js +5 -1
- package/dist/backend/toolchain-environment.js.map +1 -1
- package/dist/backend/vendor-archives.d.ts +2 -2
- package/dist/backend/vendor-archives.js +84 -35
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.js +13 -1
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/warm-cache.d.ts +1 -1
- package/dist/backend/warm-cache.js +33 -9
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +39 -9
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/output-options.js +14 -4
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/paths.js.map +1 -1
- package/dist/cli/wasi-runner.js.map +1 -1
- package/dist/compat/fetch-profile.js +36 -35
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/coverage/report.js +16 -17
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +112 -26
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +55 -16
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -1
- package/dist/executable/executable-cache.js +78 -48
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +75 -26
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -2
- package/dist/executable/prepare.js.map +1 -1
- package/dist/ffi/ffi-manifest.js +78 -20
- package/dist/ffi/ffi-manifest.js.map +1 -1
- package/dist/ffi/ffi-manifest.test.js +96 -16
- package/dist/ffi/ffi-manifest.test.js.map +1 -1
- package/dist/format-integer.js.map +1 -1
- package/dist/frontend/analysis.js +12 -2
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/binding-source.js +9 -3
- package/dist/frontend/binding-source.js.map +1 -1
- package/dist/frontend/builtin-modules.js +46 -2
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-resolve.js +40 -17
- package/dist/frontend/cjs-resolve.js.map +1 -1
- package/dist/frontend/cjs-syntax.js +31 -10
- package/dist/frontend/cjs-syntax.js.map +1 -1
- package/dist/frontend/comptime-node.test.js +10 -11
- package/dist/frontend/comptime-node.test.js.map +1 -1
- package/dist/frontend/dts-paths.js +7 -3
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/fork-target.js +17 -12
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/function-completion.js +11 -6
- package/dist/frontend/function-completion.js.map +1 -1
- package/dist/frontend/helper-tokens.js +53 -6
- package/dist/frontend/helper-tokens.js.map +1 -1
- package/dist/frontend/helper-tokens.test.js +18 -2
- package/dist/frontend/helper-tokens.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.js +32 -12
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.test.js +11 -15
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/input-tracker.js +11 -11
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +4 -1
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lib-contract.js +38 -9
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/literal-values.js.map +1 -1
- package/dist/frontend/literal-values.test.js +28 -8
- package/dist/frontend/literal-values.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +53 -10
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.d.ts +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +108 -106
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +37 -14
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +50 -0
- package/dist/frontend/lowering/binding-analysis.js +376 -0
- package/dist/frontend/lowering/binding-analysis.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.d.ts +9 -0
- package/dist/frontend/lowering/builtin-calls.js +60 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.d.ts +43 -0
- package/dist/frontend/lowering/builtins/arguments.js +247 -0
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -0
- package/dist/frontend/lowering/builtins/async-context.d.ts +52 -0
- package/dist/frontend/lowering/builtins/async-context.js +436 -0
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -0
- package/dist/frontend/lowering/builtins/atomics.d.ts +15 -0
- package/dist/frontend/lowering/builtins/atomics.js +46 -0
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -0
- package/dist/frontend/lowering/builtins/callable-aliases.d.ts +13 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js +87 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +18 -0
- package/dist/frontend/lowering/builtins/child-process-async.js +245 -0
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +21 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js +362 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process-sync.d.ts +4 -0
- package/dist/frontend/lowering/builtins/child-process-sync.js +639 -0
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -0
- package/dist/frontend/lowering/builtins/child-process.d.ts +55 -0
- package/dist/frontend/lowering/builtins/child-process.js +669 -0
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -0
- package/dist/frontend/lowering/builtins/compression.d.ts +7 -0
- package/dist/frontend/lowering/builtins/compression.js +115 -0
- package/dist/frontend/lowering/builtins/compression.js.map +1 -0
- package/dist/frontend/lowering/builtins/console.d.ts +10 -0
- package/dist/frontend/lowering/builtins/console.js +38 -0
- package/dist/frontend/lowering/builtins/console.js.map +1 -0
- package/dist/frontend/lowering/builtins/constants.d.ts +24 -0
- package/dist/frontend/lowering/builtins/constants.js +141 -0
- package/dist/frontend/lowering/builtins/constants.js.map +1 -0
- package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
- package/dist/frontend/lowering/builtins/crypto.js +517 -0
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -0
- package/dist/frontend/lowering/builtins/dates.d.ts +7 -0
- package/dist/frontend/lowering/builtins/dates.js +101 -0
- package/dist/frontend/lowering/builtins/dates.js.map +1 -0
- package/dist/frontend/lowering/builtins/environment.d.ts +34 -0
- package/dist/frontend/lowering/builtins/environment.js +95 -0
- package/dist/frontend/lowering/builtins/environment.js.map +1 -0
- package/dist/frontend/lowering/builtins/errors.d.ts +14 -0
- package/dist/frontend/lowering/builtins/errors.js +83 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +32 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +678 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -0
- package/dist/frontend/lowering/builtins/filesystem.d.ts +108 -0
- package/dist/frontend/lowering/builtins/filesystem.js +1061 -0
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -0
- package/dist/frontend/lowering/builtins/ipc.d.ts +8 -0
- package/dist/frontend/lowering/builtins/ipc.js +76 -0
- package/dist/frontend/lowering/builtins/ipc.js.map +1 -0
- package/dist/frontend/lowering/builtins/json.d.ts +12 -0
- package/dist/frontend/lowering/builtins/json.js +387 -0
- package/dist/frontend/lowering/builtins/json.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +85 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +346 -0
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-calls.js +303 -0
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +38 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +344 -0
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.d.ts +15 -0
- package/dist/frontend/lowering/builtins/numbers.js +124 -0
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -0
- package/dist/frontend/lowering/builtins/operating-system.d.ts +13 -0
- package/dist/frontend/lowering/builtins/operating-system.js +148 -0
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -0
- package/dist/frontend/lowering/builtins/performance.d.ts +13 -0
- package/dist/frontend/lowering/builtins/performance.js +100 -0
- package/dist/frontend/lowering/builtins/performance.js.map +1 -0
- package/dist/frontend/lowering/builtins/process.d.ts +50 -0
- package/dist/frontend/lowering/builtins/process.js +1138 -0
- package/dist/frontend/lowering/builtins/process.js.map +1 -0
- package/dist/frontend/lowering/builtins/promises.d.ts +14 -0
- package/dist/frontend/lowering/builtins/promises.js +356 -0
- package/dist/frontend/lowering/builtins/promises.js.map +1 -0
- package/dist/frontend/lowering/builtins/properties.d.ts +11 -0
- package/dist/frontend/lowering/builtins/properties.js +186 -0
- package/dist/frontend/lowering/builtins/properties.js.map +1 -0
- package/dist/frontend/lowering/builtins/querystring.d.ts +19 -0
- package/dist/frontend/lowering/builtins/querystring.js +150 -0
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -0
- package/dist/frontend/lowering/builtins/readline.d.ts +13 -0
- package/dist/frontend/lowering/builtins/readline.js +138 -0
- package/dist/frontend/lowering/builtins/readline.js.map +1 -0
- package/dist/frontend/lowering/builtins/receiver-types.d.ts +5 -0
- package/dist/frontend/lowering/builtins/receiver-types.js +15 -0
- package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -0
- package/dist/frontend/lowering/builtins/reflection.d.ts +13 -0
- package/dist/frontend/lowering/builtins/reflection.js +95 -0
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -0
- package/dist/frontend/lowering/builtins/strings.d.ts +14 -0
- package/dist/frontend/lowering/builtins/strings.js +121 -0
- package/dist/frontend/lowering/builtins/strings.js.map +1 -0
- package/dist/frontend/lowering/builtins/text-codecs.d.ts +29 -0
- package/dist/frontend/lowering/builtins/text-codecs.js +590 -0
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -0
- package/dist/frontend/lowering/builtins/timers.d.ts +22 -0
- package/dist/frontend/lowering/builtins/timers.js +180 -0
- package/dist/frontend/lowering/builtins/timers.js.map +1 -0
- package/dist/frontend/lowering/builtins/url.d.ts +37 -0
- package/dist/frontend/lowering/builtins/url.js +596 -0
- package/dist/frontend/lowering/builtins/url.js.map +1 -0
- package/dist/frontend/lowering/builtins/util-types.d.ts +7 -0
- package/dist/frontend/lowering/builtins/util-types.js +31 -0
- package/dist/frontend/lowering/builtins/util-types.js.map +1 -0
- package/dist/frontend/lowering/call-arguments.d.ts +72 -0
- package/dist/frontend/lowering/call-arguments.js +618 -0
- package/dist/frontend/lowering/call-arguments.js.map +1 -0
- package/dist/frontend/lowering/call-signatures.d.ts +115 -0
- package/dist/frontend/lowering/call-signatures.js +719 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -0
- package/dist/frontend/lowering/callback-arg.js.map +1 -1
- package/dist/frontend/lowering/checked-iterable-spread.js +53 -10
- package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.js +41 -9
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
- package/dist/frontend/lowering/class-callbacks.js +130 -27
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +1 -1
- package/dist/frontend/lowering/class-construction.js +247 -50
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.js +109 -29
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +2471 -465
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +284 -44
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +17 -5
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +199 -51
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +345 -86
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +80 -17
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-static-data.js +76 -16
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/coercions/builders.d.ts +13 -0
- package/dist/frontend/lowering/coercions/builders.js +77 -0
- package/dist/frontend/lowering/coercions/builders.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +58 -0
- package/dist/frontend/lowering/coercions/function-adapters.js +430 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -0
- package/dist/frontend/lowering/coercions/island.d.ts +37 -0
- package/dist/frontend/lowering/coercions/island.js +350 -0
- package/dist/frontend/lowering/coercions/island.js.map +1 -0
- package/dist/frontend/lowering/coercions/state.d.ts +14 -0
- package/dist/frontend/lowering/coercions/state.js +16 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural-plans.d.ts +40 -0
- package/dist/frontend/lowering/coercions/structural-plans.js +447 -0
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural.d.ts +63 -0
- package/dist/frontend/lowering/coercions/structural.js +616 -0
- package/dist/frontend/lowering/coercions/structural.js.map +1 -0
- package/dist/frontend/lowering/coercions/unions.d.ts +65 -0
- package/dist/frontend/lowering/coercions/unions.js +318 -0
- package/dist/frontend/lowering/coercions/unions.js.map +1 -0
- package/dist/frontend/lowering/collection-ingestion.js +359 -67
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +92 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +1646 -0
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-construction.d.ts +42 -0
- package/dist/frontend/lowering/containers/array-construction.js +1044 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -0
- package/dist/frontend/lowering/containers/array-iteration.d.ts +16 -0
- package/dist/frontend/lowering/containers/array-iteration.js +95 -0
- package/dist/frontend/lowering/containers/array-iteration.js.map +1 -0
- package/dist/frontend/lowering/containers/array-methods.d.ts +27 -0
- package/dist/frontend/lowering/containers/array-methods.js +1854 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +17 -17
- package/dist/frontend/lowering/containers/bytes.js +419 -105
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +26 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +179 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -0
- package/dist/frontend/lowering/containers/collection-grouping.d.ts +19 -0
- package/dist/frontend/lowering/containers/collection-grouping.js +297 -0
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -0
- package/dist/frontend/lowering/containers/collection-methods.d.ts +57 -0
- package/dist/frontend/lowering/containers/collection-methods.js +1314 -0
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/dynamic-receivers.d.ts +18 -0
- package/dist/frontend/lowering/containers/dynamic-receivers.js +114 -0
- package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -0
- package/dist/frontend/lowering/containers/for-of.d.ts +60 -0
- package/dist/frontend/lowering/containers/for-of.js +643 -0
- package/dist/frontend/lowering/containers/for-of.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +132 -0
- package/dist/frontend/lowering/containers/indexed-objects.js +1743 -0
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -0
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +20 -0
- package/dist/frontend/lowering/containers/iterator-helpers.js +809 -0
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +585 -157
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +213 -63
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.js +263 -64
- package/dist/frontend/lowering/crypto-tables.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +172 -68
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +41 -8
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +339 -65
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/evaluation-safety.js +3 -2
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/global-symbols.js +2 -1
- package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -1
- package/dist/frontend/lowering/expressions/native-proxy.js +11 -5
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +67 -13
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +589 -162
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +68 -17
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.js +45 -18
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
- package/dist/frontend/lowering/function-context.js +5 -1
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.d.ts +67 -0
- package/dist/frontend/lowering/function-returns.js +392 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -0
- package/dist/frontend/lowering/generator-delegation.d.ts +1 -1
- package/dist/frontend/lowering/generator-delegation.js +171 -39
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -1
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +176 -36
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +274 -0
- package/dist/frontend/lowering/generic-functions.js +1727 -0
- package/dist/frontend/lowering/generic-functions.js.map +1 -0
- package/dist/frontend/lowering/import-meta.d.ts +1 -1
- package/dist/frontend/lowering/import-meta.js +37 -14
- package/dist/frontend/lowering/import-meta.js.map +1 -1
- package/dist/frontend/lowering/indexed-comparison.js +6 -2
- package/dist/frontend/lowering/indexed-comparison.js.map +1 -1
- package/dist/frontend/lowering/iterator-consumption.d.ts +9 -0
- package/dist/frontend/lowering/iterator-consumption.js +91 -0
- package/dist/frontend/lowering/iterator-consumption.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.js +40 -17
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.test.js +49 -11
- package/dist/frontend/lowering/lib-boundary.test.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.d.ts +0 -19
- package/dist/frontend/lowering/lower-array-sort.js +331 -566
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +248 -43
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +71 -16
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +420 -71
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +39 -558
- package/dist/frontend/lowering/lower-calls.js +2593 -5667
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +243 -242
- package/dist/frontend/lowering/lower-classes.js +1704 -727
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +35 -35
- package/dist/frontend/lowering/lower-comptime.js +39 -37
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +59 -31
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.js +5 -2
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +322 -85
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.js +19 -7
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +194 -194
- package/dist/frontend/lowering/lower-exprs.js +3455 -1153
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +23 -0
- package/dist/frontend/lowering/lower-functions.js +449 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -0
- package/dist/frontend/lowering/lower-generators.js +121 -32
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +15 -4
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +479 -89
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +79 -79
- package/dist/frontend/lowering/lower-island.js +365 -273
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-island.test.js +7 -2
- package/dist/frontend/lowering/lower-island.test.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +17 -8
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +94 -94
- package/dist/frontend/lowering/lower-modules.js +612 -321
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +91 -20
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +25 -8
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.js +115 -34
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +1210 -290
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +148 -148
- package/dist/frontend/lowering/lower-stmts.js +2312 -984
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +13 -5
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +362 -90
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-system-errors.js +30 -8
- package/dist/frontend/lowering/lower-system-errors.js.map +1 -1
- package/dist/frontend/lowering/lower-test.js +40 -13
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.d.ts +31 -0
- package/dist/frontend/lowering/lower-timers.js +336 -0
- package/dist/frontend/lowering/lower-timers.js.map +1 -0
- package/dist/frontend/lowering/lower-url.d.ts +1 -1
- package/dist/frontend/lowering/lower-url.js +46 -13
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +21 -351
- package/dist/frontend/lowering/lowerer.js +1031 -2704
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +85 -17
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js +43 -8
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.d.ts +21 -1
- package/dist/frontend/lowering/native-ffi.js +487 -18
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/object-enumeration-receiver.js +55 -10
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
- package/dist/frontend/lowering/object-factory-new.d.ts +1 -1
- package/dist/frontend/lowering/object-factory-new.js +36 -11
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.js +49 -20
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +66 -14
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.js +3 -1
- package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.js +4 -1
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.test.js +86 -18
- package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -1
- package/dist/frontend/lowering/static-this.js +13 -6
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/string-index.js +32 -10
- package/dist/frontend/lowering/string-index.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +42 -42
- package/dist/frontend/lowering/surfaces.js +1094 -249
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.js +40 -15
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/symbol-methods.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.js +236 -24
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
- package/dist/frontend/lowering/text-decoder-encoding.test.js +84 -12
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.js +59 -16
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.test.js +24 -7
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
- package/dist/frontend/lowering/union-retag.js +155 -40
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +131 -33
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/unregistered-class-types.js.map +1 -1
- package/dist/frontend/lowering/unregistered-class-types.test.js +34 -8
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
- package/dist/frontend/module-syntax.js +21 -8
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/module-syntax.test.js +37 -13
- package/dist/frontend/module-syntax.test.js.map +1 -1
- package/dist/frontend/npm-fetch-analysis.js +13 -4
- package/dist/frontend/npm-fetch-analysis.js.map +1 -1
- package/dist/frontend/npm-fetch-analysis.test.js +33 -10
- package/dist/frontend/npm-fetch-analysis.test.js.map +1 -1
- package/dist/frontend/npm-fetch-node.js.map +1 -1
- package/dist/frontend/npm-fetch-syntax.js +4 -9
- package/dist/frontend/npm-fetch-syntax.js.map +1 -1
- package/dist/frontend/npm-node.js +3 -1
- package/dist/frontend/npm-node.js.map +1 -1
- package/dist/frontend/npm-static-bundled-cjs.js +88 -29
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
- package/dist/frontend/npm-static-bundled-cjs.test.js +29 -10
- package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -1
- package/dist/frontend/npm-static-declaration-syntax.js +148 -56
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
- package/dist/frontend/npm-static-declarations.d.ts +1 -1
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +33 -7
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.js +26 -12
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +17 -3
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.js +2 -3
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +64 -21
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.js +9 -4
- package/dist/frontend/npm-static-subtyping.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.test.js +30 -6
- package/dist/frontend/npm-static-subtyping.test.js.map +1 -1
- package/dist/frontend/npm-static.js +15 -4
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.js +122 -36
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +30 -10
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.js +25 -8
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +21 -7
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program-node.js +5 -3
- package/dist/frontend/program-node.js.map +1 -1
- package/dist/frontend/program.d.ts +2 -2
- package/dist/frontend/program.js +234 -101
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +27 -27
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/provenance-core.js +8 -4
- package/dist/frontend/provenance-core.js.map +1 -1
- package/dist/frontend/provenance-registry.js +1 -4
- package/dist/frontend/provenance-registry.js.map +1 -1
- package/dist/frontend/resolve.js +32 -20
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +1 -1
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/runtime-resolve.js +13 -4
- package/dist/frontend/runtime-resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.test.js +25 -9
- package/dist/frontend/runtime-resolve.test.js.map +1 -1
- package/dist/frontend/services-node.js +6 -2
- package/dist/frontend/services-node.js.map +1 -1
- package/dist/frontend/services-node.test.js +18 -6
- package/dist/frontend/services-node.test.js.map +1 -1
- package/dist/frontend/services.js +8 -4
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +6 -2
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/ts7/api.js +12 -4
- package/dist/frontend/ts7/api.js.map +1 -1
- package/dist/frontend/ts7/ast-bytes.js +10 -3
- package/dist/frontend/ts7/ast-bytes.js.map +1 -1
- package/dist/frontend/ts7/ast-bytes.test.js +23 -4
- package/dist/frontend/ts7/ast-bytes.test.js.map +1 -1
- package/dist/frontend/ts7/ast-guards.test.js +14 -5
- package/dist/frontend/ts7/ast-guards.test.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +6 -1
- package/dist/frontend/ts7/ast-node.js +484 -164
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +109 -36
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-text.js +13 -3
- package/dist/frontend/ts7/ast-text.js.map +1 -1
- package/dist/frontend/ts7/ast-text.test.js.map +1 -1
- package/dist/frontend/ts7/ast-types.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +1 -1
- package/dist/frontend/ts7/ast-wire.js +55 -20
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +53 -8
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/ast.js +47 -28
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/census-check.js +1 -1
- package/dist/frontend/ts7/census-check.js.map +1 -1
- package/dist/frontend/ts7/checker-cache.js.map +1 -1
- package/dist/frontend/ts7/checker.js +5 -3
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +54 -17
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/enums.test.js +9 -4
- package/dist/frontend/ts7/enums.test.js.map +1 -1
- package/dist/frontend/ts7/native-api.js.map +1 -1
- package/dist/frontend/ts7/native-host.js.map +1 -1
- package/dist/frontend/ts7/native-process.js +9 -3
- package/dist/frontend/ts7/native-process.js.map +1 -1
- package/dist/frontend/ts7/program-adapter.js +1 -1
- package/dist/frontend/ts7/program-adapter.js.map +1 -1
- package/dist/frontend/ts7/program-host.js +7 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +43 -11
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-api.js +3 -1
- package/dist/frontend/ts7/rpc-api.js.map +1 -1
- package/dist/frontend/ts7/rpc-client.js +15 -5
- package/dist/frontend/ts7/rpc-client.js.map +1 -1
- package/dist/frontend/ts7/rpc-client.test.js +26 -8
- package/dist/frontend/ts7/rpc-client.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
- package/dist/frontend/ts7/rpc-filesystem.test.js +43 -10
- package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.js +16 -6
- package/dist/frontend/ts7/rpc-process.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-wire.d.ts +1 -0
- package/dist/frontend/ts7/rpc-wire.js +41 -14
- package/dist/frontend/ts7/rpc-wire.js.map +1 -1
- package/dist/frontend/ts7/rpc-wire.test.js +36 -6
- package/dist/frontend/ts7/rpc-wire.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.js +209 -68
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.test.js +29 -14
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.js +7 -1
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.test.js +17 -3
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.js +147 -51
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +72 -19
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +2 -2
- package/dist/frontend/ts7/session-cache.js +10 -3
- package/dist/frontend/ts7/session-cache.js.map +1 -1
- package/dist/frontend/ts7/session-cache.test.js +13 -4
- package/dist/frontend/ts7/session-cache.test.js.map +1 -1
- package/dist/frontend/ts7/session-path.js +25 -10
- package/dist/frontend/ts7/session-path.js.map +1 -1
- package/dist/frontend/ts7/session-path.test.js +47 -4
- package/dist/frontend/ts7/session-path.test.js.map +1 -1
- package/dist/frontend/ts7/session-timing.js +22 -3
- package/dist/frontend/ts7/session-timing.js.map +1 -1
- package/dist/frontend/ts7/session-timing.test.js +12 -3
- package/dist/frontend/ts7/session-timing.test.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +1 -0
- package/dist/frontend/ts7/session.js +109 -35
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/ts7/session.test.js +69 -15
- package/dist/frontend/ts7/session.test.js.map +1 -1
- package/dist/frontend/ts7/source-parser.js +17 -6
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/ts7/source-parser.test.js +32 -9
- package/dist/frontend/ts7/source-parser.test.js.map +1 -1
- package/dist/frontend/tsc-codes.js +56 -11
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/tsc-codes.test.d.ts +1 -0
- package/dist/frontend/tsc-codes.test.js +16 -0
- package/dist/frontend/tsc-codes.test.js.map +1 -0
- package/dist/frontend/type-mapper.js +547 -206
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +108 -33
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/union-discriminants.js +8 -2
- package/dist/frontend/union-discriminants.js.map +1 -1
- package/dist/frontend/union-discriminants.test.js +77 -20
- package/dist/frontend/union-discriminants.test.js.map +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.js +150 -81
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +97 -38
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +91 -15
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/api.d.ts +4 -0
- package/dist/ir/api.js +6 -0
- package/dist/ir/api.js.map +1 -0
- package/dist/ir/build.d.ts +7 -0
- package/dist/ir/build.js +27 -1
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +9 -0
- package/dist/ir/builtin-effects.js +631 -0
- package/dist/ir/builtin-effects.js.map +1 -0
- package/dist/ir/builtin-signatures.d.ts +15 -0
- package/dist/ir/builtin-signatures.js +3396 -0
- package/dist/ir/builtin-signatures.js.map +1 -0
- package/dist/ir/byte-numbers.d.ts +20 -0
- package/dist/ir/byte-numbers.js +116 -0
- package/dist/ir/byte-numbers.js.map +1 -0
- package/dist/ir/byte-numbers.test.d.ts +1 -0
- package/dist/ir/byte-numbers.test.js +55 -0
- package/dist/ir/byte-numbers.test.js.map +1 -0
- package/dist/ir/constant-tables.js +13 -5
- package/dist/ir/constant-tables.js.map +1 -1
- package/dist/ir/constant-tables.test.js +47 -7
- package/dist/ir/constant-tables.test.js.map +1 -1
- package/dist/ir/control-flow.js +2 -1
- package/dist/ir/control-flow.js.map +1 -1
- package/dist/ir/control-flow.test.js +35 -11
- package/dist/ir/control-flow.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +9 -0
- package/dist/ir/initializer-bindings.js +115 -0
- package/dist/ir/initializer-bindings.js.map +1 -0
- package/dist/ir/initializer-bindings.test.d.ts +1 -0
- package/dist/ir/initializer-bindings.test.js +118 -0
- package/dist/ir/initializer-bindings.test.js.map +1 -0
- package/dist/ir/integer-loop-facts.d.ts +12 -0
- package/dist/ir/integer-loop-facts.js +137 -0
- package/dist/ir/integer-loop-facts.js.map +1 -0
- package/dist/ir/integer-loops.d.ts +19 -0
- package/dist/ir/integer-loops.js +172 -11
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +122 -9
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +8 -6
- package/dist/ir/integer-ranges.js +416 -90
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +239 -10
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/intrinsic-signatures.d.ts +20 -0
- package/dist/ir/intrinsic-signatures.js +57 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -0
- package/dist/ir/ir.d.ts +14 -2155
- package/dist/ir/ir.js +169 -1394
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +98 -77
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +221 -0
- package/dist/ir/runtime-features.js +551 -0
- package/dist/ir/runtime-features.js.map +1 -0
- package/dist/ir/runtime-features.test.d.ts +1 -0
- package/dist/ir/runtime-features.test.js +98 -0
- package/dist/ir/runtime-features.test.js.map +1 -0
- package/dist/ir/scalar-records.js +130 -40
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +146 -27
- package/dist/ir/scalar-records.test.js.map +1 -1
- package/dist/ir/serialize.js +4 -2
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +44 -9
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +156 -43
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/traverse.test.js +99 -24
- package/dist/ir/traverse.test.js.map +1 -1
- package/dist/ir/validate.d.ts +1 -31
- package/dist/ir/validate.js +826 -1915
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +627 -111
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/cache-primitives.js +9 -10
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/cache-reset.test.js +2 -1
- package/dist/library/cache-reset.test.js.map +1 -1
- package/dist/library/compiler-self-identity.js +11 -5
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/compiler-self-identity.test.js +10 -3
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/fence-eval.js +24 -7
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/fence-eval.test.js +31 -7
- package/dist/library/fence-eval.test.js.map +1 -1
- package/dist/library/int-infer.js +199 -59
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +133 -57
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/ir-policy.d.ts +27 -0
- package/dist/library/ir-policy.js +232 -0
- package/dist/library/ir-policy.js.map +1 -0
- package/dist/library/library-cache.js +40 -17
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +24 -13
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/library-profile.js +68 -13
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +48 -20
- package/dist/library/prepare.js.map +1 -1
- package/dist/library/semantic-source.js +16 -14
- package/dist/library/semantic-source.js.map +1 -1
- package/dist/library/semantic-source.test.js +9 -14
- package/dist/library/semantic-source.test.js.map +1 -1
- package/dist/library/sidecar-validate.js +53 -12
- package/dist/library/sidecar-validate.js.map +1 -1
- package/dist/library/sidecar.js +85 -24
- package/dist/library/sidecar.js.map +1 -1
- package/dist/library/trap-teaching.js +11 -2
- package/dist/library/trap-teaching.js.map +1 -1
- package/dist/native/cache.js +10 -4
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +34 -9
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +167 -43
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +129 -32
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/comptime.js +23 -7
- package/dist/native/comptime.js.map +1 -1
- package/dist/native/comptime.test.js +26 -6
- package/dist/native/comptime.test.js.map +1 -1
- package/dist/native/executable-cache.js +77 -27
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/executable-cache.test.js +41 -6
- package/dist/native/executable-cache.test.js.map +1 -1
- package/dist/native/file-identity.js +9 -2
- package/dist/native/file-identity.js.map +1 -1
- package/dist/native/file-identity.test.js.map +1 -1
- package/dist/native/library.js +50 -12
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +119 -34
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +22 -6
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/runtime-typescript.js +24 -11
- package/dist/native/runtime-typescript.js.map +1 -1
- package/dist/native/runtime-typescript.test.js.map +1 -1
- package/dist/native/sanitizer.js +71 -18
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +77 -20
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/task.js.map +1 -1
- package/dist/native/task.test.js +7 -2
- package/dist/native/task.test.js.map +1 -1
- package/dist/native/toolchain.js +74 -29
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +95 -18
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -1
- package/dist/startup-cache.js +1 -1
- package/dist/startup-cache.js.map +1 -1
- package/dist/timing.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +0 -601
- package/dist/frontend/lowering/lower-builtins.js +0 -8984
- package/dist/frontend/lowering/lower-builtins.js.map +0 -1
- package/dist/frontend/lowering/lower-containers.d.ts +0 -382
- package/dist/frontend/lowering/lower-containers.js +0 -7366
- package/dist/frontend/lowering/lower-containers.js.map +0 -1
|
@@ -0,0 +1,1743 @@
|
|
|
1
|
+
import { countedFor, numLit, varRef } from "../../../ir/build.js";
|
|
2
|
+
import { objectEnumerationReceiver } from "../object-enumeration-receiver.js";
|
|
3
|
+
import { InternalCompilerError } from "../../../errors.js";
|
|
4
|
+
import * as ts from "../../ts7/adapter.js";
|
|
5
|
+
import { BOOL, DYN, F64, STRING, UNDEFINED_T, arrayOf, isRefCounted, isSupportedIndexValue, isUnitType, typeEquals, } from "../../../ir/ir.js";
|
|
6
|
+
import { tryLowerExpression } from "../expressions/try-lower-expression.js";
|
|
7
|
+
import { locOf } from "../../program.js";
|
|
8
|
+
import { typeKey } from "../../type-mapper.js";
|
|
9
|
+
import {} from "../lowerer.js";
|
|
10
|
+
/** Object() and new Object() preserve known object inputs. Primitive
|
|
11
|
+
* boxing and unproven checked-dynamic values retain their refusal. */
|
|
12
|
+
export function lowerObjectConstructor(lowerer, args, loc) {
|
|
13
|
+
if (args.length === 0) {
|
|
14
|
+
return {
|
|
15
|
+
kind: "recordLit",
|
|
16
|
+
fields: [],
|
|
17
|
+
type: { kind: "record", shapeId: lowerer.shapes.intern([]) },
|
|
18
|
+
loc,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (args.length !== 1 || ts.isSpreadElement(args[0]))
|
|
22
|
+
return null;
|
|
23
|
+
const value = lowerer.lowerExpr(args[0]);
|
|
24
|
+
if (value.kind === "dynObjLit" || value.kind === "dynArrLit")
|
|
25
|
+
return value;
|
|
26
|
+
if ([
|
|
27
|
+
"record",
|
|
28
|
+
"array",
|
|
29
|
+
"object",
|
|
30
|
+
"regex",
|
|
31
|
+
"date",
|
|
32
|
+
"bytes",
|
|
33
|
+
"map",
|
|
34
|
+
"set",
|
|
35
|
+
"func",
|
|
36
|
+
"classval",
|
|
37
|
+
].includes(value.type.kind))
|
|
38
|
+
return value;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
/** `Object.keys/values/entries` over an INDEX-SIGNATURE (overflow-carrying)
|
|
42
|
+
* record shape: declared fields answer first from the compile-time field
|
|
43
|
+
* list (declaration order, undefined-valued fields skipped — exactly the
|
|
44
|
+
* fixed-shape lowering and SEMANTICS.md 37), then the overflow map's live
|
|
45
|
+
* keys in JS OWN-KEY order (canonical array indices ascending, then
|
|
46
|
+
* insertion order — recordOvfKeys). For a PURE index-signature shape
|
|
47
|
+
* (Record<string, T> — no declared fields, the typical CLI config patterns) the
|
|
48
|
+
* result order is Node-exact; hybrids inherit the documented
|
|
49
|
+
* declared-then-overflow divergence. Values surface as the checker's
|
|
50
|
+
* result element type: identity, an arm-into-union wrap, or (dyn
|
|
51
|
+
* results) the dyn conversion — recordKeyGet's own surfacing rules for
|
|
52
|
+
* the overflow, mirrored statically for declared fields. */
|
|
53
|
+
export function lowerObjectIterOverIndexShape(lowerer, call, member, argIr, shape) {
|
|
54
|
+
const resultT = lowerer.irTypeOf(call);
|
|
55
|
+
if (resultT.kind !== "array")
|
|
56
|
+
lowerer.badType(call, lowerer.typeOf(call)); // defensive
|
|
57
|
+
return objectIterOverIndexShape(lowerer, call, member, argIr, shape, objectEnumerationReceiver(lowerer, lowerer.lowerExpr(call.arguments[0]), argIr, locOf(call)), resultT, locOf(call));
|
|
58
|
+
}
|
|
59
|
+
/** The construction core, receiver/result pre-resolved — `node` anchors
|
|
60
|
+
* the fences. for-in reuses the "keys" arm directly (it iterates exactly
|
|
61
|
+
* the keys Object.keys answers; same intern key, one helper). */
|
|
62
|
+
export function objectIterOverIndexShape(lowerer, node, member, argIr, shape, receiver, resultT, loc) {
|
|
63
|
+
const iv = shape.indexValue;
|
|
64
|
+
// The result-element type values flow into (string for keys, the
|
|
65
|
+
// checker's element for values, the [string, V] tuple's "1" for
|
|
66
|
+
// entries).
|
|
67
|
+
let valueT = null;
|
|
68
|
+
let tupleT = null;
|
|
69
|
+
if (member === "values")
|
|
70
|
+
valueT = resultT.elem;
|
|
71
|
+
if (member === "entries") {
|
|
72
|
+
if (resultT.elem.kind !== "record")
|
|
73
|
+
lowerer.badType(node, lowerer.typeOf(node));
|
|
74
|
+
tupleT = resultT.elem;
|
|
75
|
+
const tupleShape = lowerer.shapes.get(resultT.elem.shapeId);
|
|
76
|
+
if (!tupleShape?.tuple || tupleShape.fields.length !== 2)
|
|
77
|
+
lowerer.badType(node, lowerer.typeOf(node));
|
|
78
|
+
valueT = tupleShape.fields.find((f) => f.name === "1").type;
|
|
79
|
+
}
|
|
80
|
+
// JS lists integer-like OWN keys first regardless of where they live;
|
|
81
|
+
// the declared-then-overflow order can only honor that when no
|
|
82
|
+
// DECLARED field name is integer-like (the overflow walk handles its
|
|
83
|
+
// own). Shapes that mix one in keep a fence, not a silent reorder.
|
|
84
|
+
const arrayIndexRe = /^(0|[1-9][0-9]{0,9})$/;
|
|
85
|
+
if (shape.fields.some((f) => arrayIndexRe.test(f.name) && Number(f.name) <= 4294967294)) {
|
|
86
|
+
lowerer.unsupported("SC1090", node, `Object.${member} over '${lowerer.fmt(argIr)}' (a declared field name is integer-like — JS orders integer keys first, across declared and overflow keys)`);
|
|
87
|
+
}
|
|
88
|
+
// The overflow value must surface as the element type (identity, an
|
|
89
|
+
// arm of a union element, or a dyn element over a dyn signature).
|
|
90
|
+
if (valueT) {
|
|
91
|
+
const ivSurfaces = typeEquals(iv, valueT) ||
|
|
92
|
+
(valueT.kind === "union" && lowerer.armTag(valueT.unionId, iv) >= 0) ||
|
|
93
|
+
(valueT.kind === "dyn" && iv.kind === "dyn");
|
|
94
|
+
if (!ivSurfaces) {
|
|
95
|
+
lowerer.unsupported("SC1090", node, `Object.${member} over '${lowerer.fmt(argIr)}' (the index signature's '${lowerer.fmt(iv)}' value cannot flow into the '${lowerer.fmt(valueT)}' result element)`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const key = `obj.${member}:ovf:${argIr.shapeId}:${typeKey(resultT)}`;
|
|
99
|
+
let helper = lowerer.arrHofHelpers.get(key);
|
|
100
|
+
if (!helper) {
|
|
101
|
+
helper = `%obj.${member}.${lowerer.arrHofHelpers.size}`;
|
|
102
|
+
const outRef = varRef("out.0", resultT, loc);
|
|
103
|
+
const rRef = varRef("r.0", argIr, loc);
|
|
104
|
+
const push = (value) => ({
|
|
105
|
+
kind: "exprStmt",
|
|
106
|
+
expr: {
|
|
107
|
+
kind: "arrIntrinsic",
|
|
108
|
+
method: "push",
|
|
109
|
+
receiver: outRef,
|
|
110
|
+
args: [value],
|
|
111
|
+
type: F64,
|
|
112
|
+
loc,
|
|
113
|
+
},
|
|
114
|
+
loc,
|
|
115
|
+
});
|
|
116
|
+
const body = [
|
|
117
|
+
{
|
|
118
|
+
kind: "varDecl",
|
|
119
|
+
localId: "out.0",
|
|
120
|
+
init: { kind: "arrayLit", elems: [], type: resultT, loc },
|
|
121
|
+
loc,
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
const fieldStmts = new Map();
|
|
125
|
+
// Declared fields, in declaration order. Undefined-valued fields
|
|
126
|
+
// skip at runtime (the unset-optional convention); values surface
|
|
127
|
+
// into the element type or the site fences with the field named.
|
|
128
|
+
const order = shape.declaredOrder ?? shape.fields.map((f) => f.name);
|
|
129
|
+
for (const name of order) {
|
|
130
|
+
const f = shape.fields.find((x) => x.name === name);
|
|
131
|
+
const raw = {
|
|
132
|
+
kind: "recordGet",
|
|
133
|
+
obj: rRef,
|
|
134
|
+
shapeId: argIr.shapeId,
|
|
135
|
+
field: f.name,
|
|
136
|
+
type: f.type,
|
|
137
|
+
loc,
|
|
138
|
+
};
|
|
139
|
+
const utag = f.type.kind === "union" ? lowerer.armTag(f.type.unionId, UNDEFINED_T) : -1;
|
|
140
|
+
// The pushed value per member; null when the field cannot surface.
|
|
141
|
+
const surfaced = () => {
|
|
142
|
+
if (!valueT)
|
|
143
|
+
return null;
|
|
144
|
+
if (typeEquals(f.type, valueT))
|
|
145
|
+
return raw;
|
|
146
|
+
if (valueT.kind === "dyn") {
|
|
147
|
+
return lowerer.dynConvertible(f.type)
|
|
148
|
+
? { kind: "dynFrom", value: raw, type: DYN, loc }
|
|
149
|
+
: null;
|
|
150
|
+
}
|
|
151
|
+
if (valueT.kind === "union") {
|
|
152
|
+
const tag = lowerer.armTag(valueT.unionId, f.type);
|
|
153
|
+
if (tag >= 0)
|
|
154
|
+
return {
|
|
155
|
+
kind: "unionWrap",
|
|
156
|
+
unionId: valueT.unionId,
|
|
157
|
+
tag,
|
|
158
|
+
value: raw,
|
|
159
|
+
type: valueT,
|
|
160
|
+
loc,
|
|
161
|
+
};
|
|
162
|
+
// An undefined-armed field union whose ONE other arm is an
|
|
163
|
+
// element arm: narrow (the undefined case is guard-skipped),
|
|
164
|
+
// then wrap.
|
|
165
|
+
if (utag >= 0 && f.type.kind === "union") {
|
|
166
|
+
const others = (lowerer.unions.get(f.type.unionId)?.arms ?? []).filter((a) => a.kind !== "undefinedT");
|
|
167
|
+
if (others.length === 1) {
|
|
168
|
+
const otherTag = lowerer.armTag(valueT.unionId, others[0]);
|
|
169
|
+
const narrowTag = lowerer.armTag(f.type.unionId, others[0]);
|
|
170
|
+
if (otherTag >= 0 && narrowTag >= 0) {
|
|
171
|
+
const other = others[0];
|
|
172
|
+
// A UNIT other arm pushes the unit LITERAL (undefined
|
|
173
|
+
// was filtered above, so the unit is null; units carry
|
|
174
|
+
// no payload and narrowing to a unit arm is malformed
|
|
175
|
+
// IR) — the fixed-shape helper's rule exactly.
|
|
176
|
+
const narrowed = isUnitType(other)
|
|
177
|
+
? { kind: "unitLit", unit: "null", type: other, loc }
|
|
178
|
+
: {
|
|
179
|
+
kind: "unionNarrow",
|
|
180
|
+
unionId: f.type.unionId,
|
|
181
|
+
tag: narrowTag,
|
|
182
|
+
value: raw,
|
|
183
|
+
type: other,
|
|
184
|
+
loc,
|
|
185
|
+
};
|
|
186
|
+
return {
|
|
187
|
+
kind: "unionWrap",
|
|
188
|
+
unionId: valueT.unionId,
|
|
189
|
+
tag: otherTag,
|
|
190
|
+
value: narrowed,
|
|
191
|
+
type: valueT,
|
|
192
|
+
loc,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
};
|
|
200
|
+
let pushed;
|
|
201
|
+
if (member === "keys") {
|
|
202
|
+
pushed = { kind: "strLit", value: f.name, type: STRING, loc };
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const s = surfaced();
|
|
206
|
+
if (!s) {
|
|
207
|
+
lowerer.unsupported("SC1090", node, `Object.${member} over '${lowerer.fmt(argIr)}' (field '${f.name}' of type '${lowerer.fmt(f.type)}' cannot flow into the '${lowerer.fmt(valueT)}' result element — read the fields directly)`);
|
|
208
|
+
}
|
|
209
|
+
pushed =
|
|
210
|
+
member === "values"
|
|
211
|
+
? s
|
|
212
|
+
: {
|
|
213
|
+
kind: "recordLit",
|
|
214
|
+
fields: [
|
|
215
|
+
{ name: "0", value: { kind: "strLit", value: f.name, type: STRING, loc } },
|
|
216
|
+
{ name: "1", value: s },
|
|
217
|
+
],
|
|
218
|
+
type: tupleT,
|
|
219
|
+
loc,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const fieldStmt = utag >= 0 && f.type.kind === "union"
|
|
223
|
+
? {
|
|
224
|
+
kind: "if",
|
|
225
|
+
cond: {
|
|
226
|
+
kind: "unionIsTag",
|
|
227
|
+
unionId: f.type.unionId,
|
|
228
|
+
tag: utag,
|
|
229
|
+
negated: true,
|
|
230
|
+
value: raw,
|
|
231
|
+
type: BOOL,
|
|
232
|
+
loc,
|
|
233
|
+
},
|
|
234
|
+
then: [push(pushed)],
|
|
235
|
+
else_: null,
|
|
236
|
+
loc,
|
|
237
|
+
}
|
|
238
|
+
: push(pushed);
|
|
239
|
+
fieldStmts.set(f.name, fieldStmt);
|
|
240
|
+
body.push(fieldStmt);
|
|
241
|
+
}
|
|
242
|
+
// The overflow walk: a fresh key snapshot in JS own-key order, each
|
|
243
|
+
// value read back through the overflow-only keyed read (declared
|
|
244
|
+
// names never live in the overflow map).
|
|
245
|
+
const ksT = arrayOf(STRING);
|
|
246
|
+
const ksRef = varRef("ks.0", ksT, loc);
|
|
247
|
+
const kRef = varRef("k.0", STRING, loc);
|
|
248
|
+
const readValue = valueT
|
|
249
|
+
? {
|
|
250
|
+
kind: "recordKeyGet",
|
|
251
|
+
obj: rRef,
|
|
252
|
+
shapeId: argIr.shapeId,
|
|
253
|
+
key: kRef,
|
|
254
|
+
overflowOnly: true,
|
|
255
|
+
type: valueT,
|
|
256
|
+
loc,
|
|
257
|
+
}
|
|
258
|
+
: null;
|
|
259
|
+
const loopPushed = member === "keys"
|
|
260
|
+
? kRef
|
|
261
|
+
: member === "values"
|
|
262
|
+
? readValue
|
|
263
|
+
: {
|
|
264
|
+
kind: "recordLit",
|
|
265
|
+
fields: [
|
|
266
|
+
{ name: "0", value: kRef },
|
|
267
|
+
{ name: "1", value: readValue },
|
|
268
|
+
],
|
|
269
|
+
type: tupleT,
|
|
270
|
+
loc,
|
|
271
|
+
};
|
|
272
|
+
body.push({
|
|
273
|
+
kind: "varDecl",
|
|
274
|
+
localId: "ks.0",
|
|
275
|
+
init: { kind: "recordOvfKeys", obj: rRef, shapeId: argIr.shapeId, type: ksT, loc },
|
|
276
|
+
loc,
|
|
277
|
+
}, countedFor(loc, { kind: "arrIntrinsic", method: "length", receiver: ksRef, args: [], type: F64, loc }, () => [
|
|
278
|
+
{
|
|
279
|
+
kind: "varDecl",
|
|
280
|
+
localId: "k.0",
|
|
281
|
+
init: {
|
|
282
|
+
kind: "arrayGet",
|
|
283
|
+
arr: ksRef,
|
|
284
|
+
index: varRef("i.0", F64, loc),
|
|
285
|
+
type: STRING,
|
|
286
|
+
loc,
|
|
287
|
+
},
|
|
288
|
+
loc,
|
|
289
|
+
},
|
|
290
|
+
push(loopPushed),
|
|
291
|
+
]), { kind: "return", value: outRef, loc });
|
|
292
|
+
const suffix = body.slice(1 + fieldStmts.size);
|
|
293
|
+
lowerer.arrHofHelpers.set(key, helper);
|
|
294
|
+
const fn = {
|
|
295
|
+
name: helper,
|
|
296
|
+
params: [{ localId: "r.0", name: "r", type: argIr }],
|
|
297
|
+
returnType: resultT,
|
|
298
|
+
locals: [
|
|
299
|
+
{ id: "r.0", name: "r", type: argIr, mutable: true },
|
|
300
|
+
{ id: "out.0", name: "out", type: resultT, mutable: false },
|
|
301
|
+
{ id: "ks.0", name: "ks", type: ksT, mutable: false },
|
|
302
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
303
|
+
{ id: "k.0", name: "k", type: STRING, mutable: false },
|
|
304
|
+
],
|
|
305
|
+
body,
|
|
306
|
+
loc,
|
|
307
|
+
};
|
|
308
|
+
lowerer.shapeOrderHelperFinalizers.push(() => {
|
|
309
|
+
const current = lowerer.shapes.get(argIr.shapeId) ?? shape;
|
|
310
|
+
const currentOrder = current.declaredOrder ?? current.fields.map((f) => f.name);
|
|
311
|
+
fn.body = [
|
|
312
|
+
body[0],
|
|
313
|
+
...currentOrder.flatMap((name) => {
|
|
314
|
+
const stmt = fieldStmts.get(name);
|
|
315
|
+
return stmt ? [stmt] : [];
|
|
316
|
+
}),
|
|
317
|
+
...suffix,
|
|
318
|
+
];
|
|
319
|
+
});
|
|
320
|
+
lowerer.liftedFns.push(fn);
|
|
321
|
+
}
|
|
322
|
+
return { kind: "call", callee: helper, args: [receiver], type: resultT, loc };
|
|
323
|
+
}
|
|
324
|
+
/** `Object.fromEntries(pairs)` over a `[string, V][]` VALUE into the
|
|
325
|
+
* checker's own index-signature result shape (`{ [k: string]: V }` —
|
|
326
|
+
* always declared-field-free from the lib signature): an interned helper
|
|
327
|
+
* loops the pairs and keyed-writes each into a fresh record's overflow —
|
|
328
|
+
* later duplicates overwrite in place (first insertion position wins for
|
|
329
|
+
* ORDER, last value wins — exactly JS). Values flow into the signature's
|
|
330
|
+
* value slot (dyn slots convert JSON-safe values, identity otherwise).
|
|
331
|
+
* The `as ModelPricing` reshape AFTER it is the width-coercion capture
|
|
332
|
+
* (lowerRecordOvfCaptureHelper). Null when the argument or result shape
|
|
333
|
+
* is outside this (Maps, richer iterables → the SC2020 fence). */
|
|
334
|
+
export function lowerObjectFromEntriesCall(lowerer, call, callee) {
|
|
335
|
+
const typed = lowerTypedObjectFromEntriesCall(lowerer, call, callee);
|
|
336
|
+
if (typed)
|
|
337
|
+
return typed;
|
|
338
|
+
if (!ts.isPropertyAccessExpression(callee) ||
|
|
339
|
+
call.questionDotToken ||
|
|
340
|
+
callee.questionDotToken ||
|
|
341
|
+
!lowerer.isStdlibGlobal(callee.expression, "Object") ||
|
|
342
|
+
callee.name.text !== "fromEntries" ||
|
|
343
|
+
call.arguments.length !== 1 ||
|
|
344
|
+
ts.isSpreadElement(call.arguments[0]))
|
|
345
|
+
return null;
|
|
346
|
+
if (lowerer.dynamic)
|
|
347
|
+
return null;
|
|
348
|
+
return {
|
|
349
|
+
kind: "libCall",
|
|
350
|
+
fn: "dyn.fromEntries",
|
|
351
|
+
type: DYN,
|
|
352
|
+
loc: locOf(call),
|
|
353
|
+
args: [lowerer.lowerExprExpecting(call.arguments[0], DYN)],
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
function lowerTypedObjectFromEntriesCall(lowerer, call, callee) {
|
|
357
|
+
if (!ts.isPropertyAccessExpression(callee))
|
|
358
|
+
return null;
|
|
359
|
+
if (call.questionDotToken || callee.questionDotToken)
|
|
360
|
+
return null;
|
|
361
|
+
if (!lowerer.isStdlibGlobal(callee.expression, "Object"))
|
|
362
|
+
return null;
|
|
363
|
+
if (callee.name.text !== "fromEntries")
|
|
364
|
+
return null;
|
|
365
|
+
if (call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0]))
|
|
366
|
+
return null;
|
|
367
|
+
const argNode = call.arguments[0];
|
|
368
|
+
const argIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
|
|
369
|
+
if (argIr?.kind !== "array")
|
|
370
|
+
return null;
|
|
371
|
+
const represented = tryLowerExpression(lowerer, argNode);
|
|
372
|
+
if (represented && !typeEquals(represented.type, argIr))
|
|
373
|
+
return null;
|
|
374
|
+
// `Object.fromEntries(rows)` over a `string[][]` VALUE — the env-line
|
|
375
|
+
// idiom (`envArray.map((env) => env.split('='))`). The checker has no
|
|
376
|
+
// tuple to type here (string[] misses the lib's [PropertyKey, T]
|
|
377
|
+
// overload, so the Iterable<readonly any[]> one answers `any`), but
|
|
378
|
+
// the honest static result IS typable: the index-signature record over
|
|
379
|
+
// the row's read positions — key ToPropertyKey(row[0]) ("undefined"
|
|
380
|
+
// when the row is empty, exactly Node), value row[1] as the
|
|
381
|
+
// `string | undefined` union (a 1-element row's [1] read IS undefined
|
|
382
|
+
// in Node; 'A=B=C'.split('=') takes 'B' and drops the tail). Later
|
|
383
|
+
// duplicates overwrite in place — first insertion position wins for
|
|
384
|
+
// ORDER, last value wins, the tuple path's rule.
|
|
385
|
+
if (argIr.elem.kind === "array" && argIr.elem.elem.kind === "string") {
|
|
386
|
+
return lowerFromEntriesStringRows(lowerer, call, argNode, argIr);
|
|
387
|
+
}
|
|
388
|
+
if (argIr.elem.kind !== "record")
|
|
389
|
+
return null;
|
|
390
|
+
const tupleShape = lowerer.shapes.get(argIr.elem.shapeId);
|
|
391
|
+
if (!tupleShape?.tuple || tupleShape.fields.length !== 2)
|
|
392
|
+
return null;
|
|
393
|
+
const keyT = tupleShape.fields.find((f) => f.name === "0").type;
|
|
394
|
+
const valT = tupleShape.fields.find((f) => f.name === "1").type;
|
|
395
|
+
if (keyT.kind !== "string")
|
|
396
|
+
return null;
|
|
397
|
+
// The result shape is interned directly — the lib's `{ [k: string]: T }`
|
|
398
|
+
// return type is lib-declared and deliberately does not map through
|
|
399
|
+
// provenance; the PURE index-signature shape over the tuple's value
|
|
400
|
+
// type IS that type (structurally identical to Record<string, T>, so
|
|
401
|
+
// it interns to the same shape a user annotation would).
|
|
402
|
+
if (!isSupportedIndexValue(valT))
|
|
403
|
+
return null;
|
|
404
|
+
const resultT = {
|
|
405
|
+
kind: "record",
|
|
406
|
+
shapeId: lowerer.shapes.intern([], false, valT, []),
|
|
407
|
+
};
|
|
408
|
+
const iv = valT;
|
|
409
|
+
const loc = locOf(call);
|
|
410
|
+
// The tuple's value position must flow into the index-value slot.
|
|
411
|
+
const convertible = typeEquals(valT, iv) || (iv.kind === "dyn" && lowerer.dynConvertible(valT));
|
|
412
|
+
const convert = (v) => typeEquals(valT, iv) ? v : { kind: "dynFrom", value: v, type: DYN, loc };
|
|
413
|
+
if (!convertible) {
|
|
414
|
+
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)`);
|
|
415
|
+
}
|
|
416
|
+
// Enumeration/filtering may keep the array in checked-dynamic storage.
|
|
417
|
+
// Validate its tuple layout before calling a helper with a native-array
|
|
418
|
+
// ABI; opaque tuple values themselves retain their original references.
|
|
419
|
+
const receiver = lowerer.lowerExprExpecting(argNode, argIr);
|
|
420
|
+
const key = `obj.fromEntries:${argIr.elem.shapeId}:${resultT.shapeId}`;
|
|
421
|
+
let helper = lowerer.arrHofHelpers.get(key);
|
|
422
|
+
if (!helper) {
|
|
423
|
+
helper = `%obj.fromEntries.${lowerer.arrHofHelpers.size}`;
|
|
424
|
+
const tupleT = argIr.elem;
|
|
425
|
+
const tRef = varRef("t.0", tupleT, loc);
|
|
426
|
+
const body = [
|
|
427
|
+
{
|
|
428
|
+
kind: "varDecl",
|
|
429
|
+
localId: "out.0",
|
|
430
|
+
init: { kind: "recordLit", fields: [], type: resultT, loc },
|
|
431
|
+
loc,
|
|
432
|
+
},
|
|
433
|
+
countedFor(loc, {
|
|
434
|
+
kind: "arrIntrinsic",
|
|
435
|
+
method: "length",
|
|
436
|
+
receiver: varRef("a.0", argIr, loc),
|
|
437
|
+
args: [],
|
|
438
|
+
type: F64,
|
|
439
|
+
loc,
|
|
440
|
+
}, () => [
|
|
441
|
+
{
|
|
442
|
+
kind: "varDecl",
|
|
443
|
+
localId: "t.0",
|
|
444
|
+
init: {
|
|
445
|
+
kind: "arrayGet",
|
|
446
|
+
arr: varRef("a.0", argIr, loc),
|
|
447
|
+
index: varRef("i.0", F64, loc),
|
|
448
|
+
type: tupleT,
|
|
449
|
+
loc,
|
|
450
|
+
},
|
|
451
|
+
loc,
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
kind: "recordKeySet",
|
|
455
|
+
obj: varRef("out.0", resultT, loc),
|
|
456
|
+
shapeId: resultT.shapeId,
|
|
457
|
+
key: {
|
|
458
|
+
kind: "recordGet",
|
|
459
|
+
obj: tRef,
|
|
460
|
+
shapeId: tupleT.shapeId,
|
|
461
|
+
field: "0",
|
|
462
|
+
type: STRING,
|
|
463
|
+
loc,
|
|
464
|
+
},
|
|
465
|
+
value: convert({
|
|
466
|
+
kind: "recordGet",
|
|
467
|
+
obj: tRef,
|
|
468
|
+
shapeId: tupleT.shapeId,
|
|
469
|
+
field: "1",
|
|
470
|
+
type: valT,
|
|
471
|
+
loc,
|
|
472
|
+
}),
|
|
473
|
+
loc,
|
|
474
|
+
},
|
|
475
|
+
]),
|
|
476
|
+
{ kind: "return", value: varRef("out.0", resultT, loc), loc },
|
|
477
|
+
];
|
|
478
|
+
lowerer.arrHofHelpers.set(key, helper);
|
|
479
|
+
lowerer.liftedFns.push({
|
|
480
|
+
name: helper,
|
|
481
|
+
params: [{ localId: "a.0", name: "a", type: argIr }],
|
|
482
|
+
returnType: resultT,
|
|
483
|
+
locals: [
|
|
484
|
+
{ id: "a.0", name: "a", type: argIr, mutable: true },
|
|
485
|
+
{ id: "out.0", name: "out", type: resultT, mutable: false },
|
|
486
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
487
|
+
{ id: "t.0", name: "t", type: tupleT, mutable: false },
|
|
488
|
+
],
|
|
489
|
+
body,
|
|
490
|
+
loc,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
return { kind: "call", callee: helper, args: [receiver], type: resultT, loc };
|
|
494
|
+
}
|
|
495
|
+
/** The string-rows half of lowerObjectFromEntriesCall (see the caller's
|
|
496
|
+
* comment): an interned helper loops the `string[][]` rows and
|
|
497
|
+
* keyed-writes ToPropertyKey(row[0]) → row[1] into a fresh
|
|
498
|
+
* `{ [k: string]: string | undefined }` record. Row reads are lazy
|
|
499
|
+
* ternaries over the row's length — a static string[] read past the end
|
|
500
|
+
* would trap, but Node's fromEntries reads entry[0]/entry[1] as plain
|
|
501
|
+
* (possibly-undefined) gets: the empty row keys "undefined", the
|
|
502
|
+
* 1-element row's value is the union's undefined arm. */
|
|
503
|
+
function lowerFromEntriesStringRows(lowerer, call, argNode, argIr) {
|
|
504
|
+
const loc = locOf(call);
|
|
505
|
+
const rowT = argIr.elem; // string[]
|
|
506
|
+
const valT = { kind: "union", unionId: lowerer.unions.intern([STRING, UNDEFINED_T]) };
|
|
507
|
+
const strTag = lowerer.armTag(valT.unionId, STRING);
|
|
508
|
+
const resultT = {
|
|
509
|
+
kind: "record",
|
|
510
|
+
shapeId: lowerer.shapes.intern([], false, valT, []),
|
|
511
|
+
};
|
|
512
|
+
const receiver = lowerer.lowerExpr(argNode);
|
|
513
|
+
const key = `obj.fromEntries:strrows:${resultT.shapeId}`;
|
|
514
|
+
let helper = lowerer.arrHofHelpers.get(key);
|
|
515
|
+
if (!helper) {
|
|
516
|
+
helper = `%obj.fromEntries.${lowerer.arrHofHelpers.size}`;
|
|
517
|
+
const tRef = varRef("t.0", rowT, loc);
|
|
518
|
+
const rowLen = {
|
|
519
|
+
kind: "arrIntrinsic",
|
|
520
|
+
method: "length",
|
|
521
|
+
receiver: tRef,
|
|
522
|
+
args: [],
|
|
523
|
+
type: F64,
|
|
524
|
+
loc,
|
|
525
|
+
};
|
|
526
|
+
const lenAtLeast = (n) => ({
|
|
527
|
+
kind: "bin",
|
|
528
|
+
op: ">=",
|
|
529
|
+
left: rowLen,
|
|
530
|
+
right: numLit(n, loc),
|
|
531
|
+
type: BOOL,
|
|
532
|
+
loc,
|
|
533
|
+
});
|
|
534
|
+
const body = [
|
|
535
|
+
{
|
|
536
|
+
kind: "varDecl",
|
|
537
|
+
localId: "out.0",
|
|
538
|
+
init: { kind: "recordLit", fields: [], type: resultT, loc },
|
|
539
|
+
loc,
|
|
540
|
+
},
|
|
541
|
+
countedFor(loc, {
|
|
542
|
+
kind: "arrIntrinsic",
|
|
543
|
+
method: "length",
|
|
544
|
+
receiver: varRef("a.0", argIr, loc),
|
|
545
|
+
args: [],
|
|
546
|
+
type: F64,
|
|
547
|
+
loc,
|
|
548
|
+
}, () => [
|
|
549
|
+
{
|
|
550
|
+
kind: "varDecl",
|
|
551
|
+
localId: "t.0",
|
|
552
|
+
init: {
|
|
553
|
+
kind: "arrayGet",
|
|
554
|
+
arr: varRef("a.0", argIr, loc),
|
|
555
|
+
index: varRef("i.0", F64, loc),
|
|
556
|
+
type: rowT,
|
|
557
|
+
loc,
|
|
558
|
+
},
|
|
559
|
+
loc,
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
kind: "recordKeySet",
|
|
563
|
+
obj: varRef("out.0", resultT, loc),
|
|
564
|
+
shapeId: resultT.shapeId,
|
|
565
|
+
key: {
|
|
566
|
+
kind: "ternary",
|
|
567
|
+
cond: lenAtLeast(1),
|
|
568
|
+
then: { kind: "arrayGet", arr: tRef, index: numLit(0, loc), type: STRING, loc },
|
|
569
|
+
else_: { kind: "strLit", value: "undefined", type: STRING, loc },
|
|
570
|
+
type: STRING,
|
|
571
|
+
loc,
|
|
572
|
+
},
|
|
573
|
+
value: {
|
|
574
|
+
kind: "ternary",
|
|
575
|
+
cond: lenAtLeast(2),
|
|
576
|
+
then: {
|
|
577
|
+
kind: "unionWrap",
|
|
578
|
+
unionId: valT.unionId,
|
|
579
|
+
tag: strTag,
|
|
580
|
+
value: { kind: "arrayGet", arr: tRef, index: numLit(1, loc), type: STRING, loc },
|
|
581
|
+
type: valT,
|
|
582
|
+
loc,
|
|
583
|
+
},
|
|
584
|
+
else_: lowerer.wrappedUndefined(valT, loc),
|
|
585
|
+
type: valT,
|
|
586
|
+
loc,
|
|
587
|
+
},
|
|
588
|
+
loc,
|
|
589
|
+
},
|
|
590
|
+
]),
|
|
591
|
+
{ kind: "return", value: varRef("out.0", resultT, loc), loc },
|
|
592
|
+
];
|
|
593
|
+
lowerer.arrHofHelpers.set(key, helper);
|
|
594
|
+
lowerer.liftedFns.push({
|
|
595
|
+
name: helper,
|
|
596
|
+
params: [{ localId: "a.0", name: "a", type: argIr }],
|
|
597
|
+
returnType: resultT,
|
|
598
|
+
locals: [
|
|
599
|
+
{ id: "a.0", name: "a", type: argIr, mutable: true },
|
|
600
|
+
{ id: "out.0", name: "out", type: resultT, mutable: false },
|
|
601
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
602
|
+
{ id: "t.0", name: "t", type: rowT, mutable: false },
|
|
603
|
+
],
|
|
604
|
+
body,
|
|
605
|
+
loc,
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
return { kind: "call", callee: helper, args: [receiver], type: resultT, loc };
|
|
609
|
+
}
|
|
610
|
+
/** Interned `%rec.capture.<n>(s)` — the INDEX-SIGNATURE reshape behind
|
|
611
|
+
* `Object.fromEntries(entries) as ModelPricing` (hybrid→hybrid width
|
|
612
|
+
* coercion) and `const r: Record<string, number> = { a: 1, b: 2 }`
|
|
613
|
+
* (a DECLARED-fields shape narrowing into a pure overflow shape — the
|
|
614
|
+
* record becomes width-free key/value storage), both called from
|
|
615
|
+
* widthCoerce after recordWidthHelper declines: builds the target shape
|
|
616
|
+
* fresh — declared fields default to their undefined arms — then
|
|
617
|
+
* keyed-writes every source key into it, declared fields first in the
|
|
618
|
+
* source's DECLARATION order (skipping ones holding the undefined arm,
|
|
619
|
+
* the unset convention — insertion order is what Object.keys/JSON
|
|
620
|
+
* answer, stance 37), then the source overflow in JS own-key order. A
|
|
621
|
+
* key colliding with a target DECLARED field validates through the
|
|
622
|
+
* keyed write's dynCheck (a mismatch throws the catchable TypeError —
|
|
623
|
+
* divergence 34), which is exactly what makes the `as` honest. The
|
|
624
|
+
* result is a COPY (divergence 36's stance). Null when the pair is
|
|
625
|
+
* outside the supported matrix: the target needs an index signature,
|
|
626
|
+
* every source value (declared fields, and the overflow slot when the
|
|
627
|
+
* source carries one) must enter the target's value slot (identity, a
|
|
628
|
+
* width lift — arm wrap/re-tag/nested reshape, or JSON-safe into a dyn
|
|
629
|
+
* slot), and every target field must either be initialized directly by
|
|
630
|
+
* a same-named source declared field (the rule that admits REQUIRED
|
|
631
|
+
* declared members) or be optional-flavored (the fresh record's
|
|
632
|
+
* default) and writable at runtime. */
|
|
633
|
+
export function lowerRecordOvfCaptureHelper(lowerer, fromId, toId, loc) {
|
|
634
|
+
const from = lowerer.shapes.get(fromId);
|
|
635
|
+
const to = lowerer.shapes.get(toId);
|
|
636
|
+
if (!from || !to?.indexValue || from.tuple || to.tuple)
|
|
637
|
+
return null;
|
|
638
|
+
const fIv = from.indexValue ?? null;
|
|
639
|
+
const tIv = to.indexValue;
|
|
640
|
+
// How a source value enters the target's value slot: identity, the
|
|
641
|
+
// dyn conversion, or a width lift (wrap/retag/nested reshape).
|
|
642
|
+
const slotLift = (t) => {
|
|
643
|
+
if (typeEquals(t, tIv))
|
|
644
|
+
return { how: "copy" };
|
|
645
|
+
if (tIv.kind === "dyn" && (t.kind === "dyn" || lowerer.dynConvertible(t)))
|
|
646
|
+
return "dyn";
|
|
647
|
+
return lowerer.widthLiftPlan(t, tIv);
|
|
648
|
+
};
|
|
649
|
+
// The overflow value slot must line up (sources without an index
|
|
650
|
+
// signature have no overflow to carry over).
|
|
651
|
+
if (fIv && slotLift(fIv) === null)
|
|
652
|
+
return null;
|
|
653
|
+
const inits = [];
|
|
654
|
+
const consumed = new Set();
|
|
655
|
+
for (const tf of to.fields) {
|
|
656
|
+
const sf = from.fields.find((f) => f.name === tf.name);
|
|
657
|
+
const directLift = sf ? lowerer.widthLiftPlan(sf.type, tf.type) : null;
|
|
658
|
+
if (sf && directLift) {
|
|
659
|
+
inits.push({ name: tf.name, kind: "direct", src: sf.type, lift: directLift });
|
|
660
|
+
consumed.add(tf.name);
|
|
661
|
+
continue;
|
|
662
|
+
}
|
|
663
|
+
if (tf.type.kind !== "union")
|
|
664
|
+
return null;
|
|
665
|
+
const utag = lowerer.armTag(tf.type.unionId, UNDEFINED_T);
|
|
666
|
+
if (utag < 0)
|
|
667
|
+
return null;
|
|
668
|
+
if (tIv.kind === "dyn" ? !lowerer.dynConvertible(tf.type) : !typeEquals(tf.type, tIv))
|
|
669
|
+
return null;
|
|
670
|
+
inits.push({ name: tf.name, kind: "undef", unionId: tf.type.unionId, utag });
|
|
671
|
+
}
|
|
672
|
+
// Every source declared field must flow into the keyed-write slot —
|
|
673
|
+
// in DECLARATION order (insertion order below; declaredOrder omits
|
|
674
|
+
// internal '%'-fields, which never enter the copy).
|
|
675
|
+
const orderedFields = from.declaredOrder
|
|
676
|
+
? from.declaredOrder.flatMap((n) => {
|
|
677
|
+
const f = from.fields.find((x) => x.name === n);
|
|
678
|
+
return f ? [f] : [];
|
|
679
|
+
})
|
|
680
|
+
: from.fields;
|
|
681
|
+
const fieldLifts = new Map();
|
|
682
|
+
for (const ff of orderedFields) {
|
|
683
|
+
if (consumed.has(ff.name))
|
|
684
|
+
continue; // direct-initialized above
|
|
685
|
+
const lift = slotLift(ff.type);
|
|
686
|
+
if (lift === null)
|
|
687
|
+
return null;
|
|
688
|
+
fieldLifts.set(ff.name, lift);
|
|
689
|
+
}
|
|
690
|
+
// DISPATCH writes — keys that can hit a declared target slot: the
|
|
691
|
+
// overflow loop's runtime keys, and a literal source-field name the
|
|
692
|
+
// target also declares. Non-dyn slots store THROUGH on a collision, so
|
|
693
|
+
// such writes need every declared field to BE the slot type (the
|
|
694
|
+
// validator's recordKeySet rule); dyn slots validate per field
|
|
695
|
+
// (dynCheck), so each field must be dyn-convertible. Writes to
|
|
696
|
+
// literal names the target does NOT declare are overflowOnly and
|
|
697
|
+
// exempt — which is what lets a direct-initialized required field
|
|
698
|
+
// (`id: number` beside a `number | undefined` slot) coexist with a
|
|
699
|
+
// declared-only source, while an index-signature source declines.
|
|
700
|
+
const dispatchWrites = fIv !== undefined ||
|
|
701
|
+
orderedFields.some((ff) => !consumed.has(ff.name) && to.fields.some((f) => f.name === ff.name));
|
|
702
|
+
if (dispatchWrites) {
|
|
703
|
+
if (tIv.kind === "dyn"
|
|
704
|
+
? !to.fields.every((f) => lowerer.dynConvertible(f.type))
|
|
705
|
+
: !to.fields.every((f) => typeEquals(f.type, tIv))) {
|
|
706
|
+
return null;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
const key = `ovf:${fromId}:${toId}`;
|
|
710
|
+
const existing = lowerer.valueHelpers.get(key);
|
|
711
|
+
if (existing)
|
|
712
|
+
return existing;
|
|
713
|
+
const name = `%rec.capture.${lowerer.valueHelpers.size}`;
|
|
714
|
+
lowerer.valueHelpers.set(key, name);
|
|
715
|
+
const fromT = { kind: "record", shapeId: fromId };
|
|
716
|
+
const toT = { kind: "record", shapeId: toId };
|
|
717
|
+
const sRef = varRef("s.0", fromT, loc);
|
|
718
|
+
const outRef = varRef("out.0", toT, loc);
|
|
719
|
+
const intoSlot = (v, lift) => lift === "dyn"
|
|
720
|
+
? { kind: "dynFrom", value: v, type: DYN, loc }
|
|
721
|
+
: lowerer.applyWidthLift(lift, v, tIv, loc);
|
|
722
|
+
const body = [
|
|
723
|
+
{
|
|
724
|
+
kind: "varDecl",
|
|
725
|
+
localId: "out.0",
|
|
726
|
+
init: {
|
|
727
|
+
kind: "recordLit",
|
|
728
|
+
fields: inits.map((d) => ({
|
|
729
|
+
name: d.name,
|
|
730
|
+
value: d.kind === "direct"
|
|
731
|
+
? lowerer.applyWidthLift(d.lift, {
|
|
732
|
+
kind: "recordGet",
|
|
733
|
+
obj: sRef,
|
|
734
|
+
shapeId: fromId,
|
|
735
|
+
field: d.name,
|
|
736
|
+
type: d.src,
|
|
737
|
+
loc,
|
|
738
|
+
}, to.fields.find((f) => f.name === d.name).type, loc)
|
|
739
|
+
: {
|
|
740
|
+
kind: "unionWrap",
|
|
741
|
+
unionId: d.unionId,
|
|
742
|
+
tag: d.utag,
|
|
743
|
+
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
744
|
+
type: to.fields.find((f) => f.name === d.name).type,
|
|
745
|
+
loc,
|
|
746
|
+
},
|
|
747
|
+
})),
|
|
748
|
+
type: toT,
|
|
749
|
+
loc,
|
|
750
|
+
},
|
|
751
|
+
loc,
|
|
752
|
+
},
|
|
753
|
+
];
|
|
754
|
+
const fieldStmts = new Map();
|
|
755
|
+
// Source declared fields in declaration order, skipping unset
|
|
756
|
+
// optionals (stance 37) and the direct-initialized (consumed) names.
|
|
757
|
+
for (const ff of orderedFields) {
|
|
758
|
+
if (consumed.has(ff.name))
|
|
759
|
+
continue;
|
|
760
|
+
const raw = {
|
|
761
|
+
kind: "recordGet",
|
|
762
|
+
obj: sRef,
|
|
763
|
+
shapeId: fromId,
|
|
764
|
+
field: ff.name,
|
|
765
|
+
type: ff.type,
|
|
766
|
+
loc,
|
|
767
|
+
};
|
|
768
|
+
const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
|
|
769
|
+
const write = {
|
|
770
|
+
kind: "recordKeySet",
|
|
771
|
+
obj: outRef,
|
|
772
|
+
shapeId: toId,
|
|
773
|
+
key: { kind: "strLit", value: ff.name, type: STRING, loc },
|
|
774
|
+
value: intoSlot(raw, fieldLifts.get(ff.name)),
|
|
775
|
+
// A literal name the target does not declare can only land in the
|
|
776
|
+
// overflow — skip the declared dispatch (and its validator gate).
|
|
777
|
+
...(to.fields.some((f) => f.name === ff.name) ? {} : { overflowOnly: true }),
|
|
778
|
+
loc,
|
|
779
|
+
};
|
|
780
|
+
const fieldStmt = utag >= 0 && ff.type.kind === "union"
|
|
781
|
+
? {
|
|
782
|
+
kind: "if",
|
|
783
|
+
cond: {
|
|
784
|
+
kind: "unionIsTag",
|
|
785
|
+
unionId: ff.type.unionId,
|
|
786
|
+
tag: utag,
|
|
787
|
+
negated: true,
|
|
788
|
+
value: raw,
|
|
789
|
+
type: BOOL,
|
|
790
|
+
loc,
|
|
791
|
+
},
|
|
792
|
+
then: [write],
|
|
793
|
+
else_: null,
|
|
794
|
+
loc,
|
|
795
|
+
}
|
|
796
|
+
: write;
|
|
797
|
+
fieldStmts.set(ff.name, fieldStmt);
|
|
798
|
+
body.push(fieldStmt);
|
|
799
|
+
}
|
|
800
|
+
// The source overflow, in JS own-key order (only index-signature
|
|
801
|
+
// sources carry one).
|
|
802
|
+
const ksT = arrayOf(STRING);
|
|
803
|
+
if (fIv) {
|
|
804
|
+
const ovfLift = slotLift(fIv);
|
|
805
|
+
body.push({
|
|
806
|
+
kind: "varDecl",
|
|
807
|
+
localId: "ks.0",
|
|
808
|
+
init: { kind: "recordOvfKeys", obj: sRef, shapeId: fromId, type: ksT, loc },
|
|
809
|
+
loc,
|
|
810
|
+
}, countedFor(loc, {
|
|
811
|
+
kind: "arrIntrinsic",
|
|
812
|
+
method: "length",
|
|
813
|
+
receiver: varRef("ks.0", ksT, loc),
|
|
814
|
+
args: [],
|
|
815
|
+
type: F64,
|
|
816
|
+
loc,
|
|
817
|
+
}, () => [
|
|
818
|
+
{
|
|
819
|
+
kind: "varDecl",
|
|
820
|
+
localId: "k.0",
|
|
821
|
+
init: {
|
|
822
|
+
kind: "arrayGet",
|
|
823
|
+
arr: varRef("ks.0", ksT, loc),
|
|
824
|
+
index: varRef("i.0", F64, loc),
|
|
825
|
+
type: STRING,
|
|
826
|
+
loc,
|
|
827
|
+
},
|
|
828
|
+
loc,
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
kind: "recordKeySet",
|
|
832
|
+
obj: outRef,
|
|
833
|
+
shapeId: toId,
|
|
834
|
+
key: varRef("k.0", STRING, loc),
|
|
835
|
+
value: intoSlot({
|
|
836
|
+
kind: "recordKeyGet",
|
|
837
|
+
obj: sRef,
|
|
838
|
+
shapeId: fromId,
|
|
839
|
+
key: varRef("k.0", STRING, loc),
|
|
840
|
+
overflowOnly: true,
|
|
841
|
+
type: fIv,
|
|
842
|
+
loc,
|
|
843
|
+
}, ovfLift),
|
|
844
|
+
loc,
|
|
845
|
+
},
|
|
846
|
+
]));
|
|
847
|
+
}
|
|
848
|
+
body.push({ kind: "return", value: outRef, loc });
|
|
849
|
+
const suffix = body.slice(1 + fieldStmts.size);
|
|
850
|
+
const fn = {
|
|
851
|
+
name,
|
|
852
|
+
params: [{ localId: "s.0", name: "s", type: fromT }],
|
|
853
|
+
returnType: toT,
|
|
854
|
+
locals: [
|
|
855
|
+
{ id: "s.0", name: "s", type: fromT, mutable: true },
|
|
856
|
+
{ id: "out.0", name: "out", type: toT, mutable: false },
|
|
857
|
+
...(fIv
|
|
858
|
+
? [
|
|
859
|
+
{ id: "ks.0", name: "ks", type: ksT, mutable: false },
|
|
860
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
861
|
+
{ id: "k.0", name: "k", type: STRING, mutable: false },
|
|
862
|
+
]
|
|
863
|
+
: []),
|
|
864
|
+
],
|
|
865
|
+
body,
|
|
866
|
+
loc,
|
|
867
|
+
};
|
|
868
|
+
lowerer.shapeOrderHelperFinalizers.push(() => {
|
|
869
|
+
const current = lowerer.shapes.get(fromId) ?? from;
|
|
870
|
+
const currentOrder = current.declaredOrder ?? current.fields.map((f) => f.name);
|
|
871
|
+
fn.body = [
|
|
872
|
+
body[0],
|
|
873
|
+
...currentOrder.flatMap((field) => {
|
|
874
|
+
const stmt = fieldStmts.get(field);
|
|
875
|
+
return stmt ? [stmt] : [];
|
|
876
|
+
}),
|
|
877
|
+
...suffix,
|
|
878
|
+
];
|
|
879
|
+
});
|
|
880
|
+
lowerer.liftedFns.push(fn);
|
|
881
|
+
return name;
|
|
882
|
+
}
|
|
883
|
+
/** `Object.assign(target, ...sources)` into an INDEX-SIGNATURE record:
|
|
884
|
+
* the capture helper's keyed-write walk aimed at the EXISTING target —
|
|
885
|
+
* each source's declared fields write in declaration order (unset
|
|
886
|
+
* optionals skip, stance 37), then its overflow in JS own-key order,
|
|
887
|
+
* and the result IS the target (identity, like JS — later reads through
|
|
888
|
+
* the target see every merged key). One interned `%obj.assign.<n>(t, s)`
|
|
889
|
+
* per (target shape, source shape) pair; multiple sources chain. Null
|
|
890
|
+
* when outside the matrix: the target needs an index signature, every
|
|
891
|
+
* source value must enter its value slot (identity, a width lift, or
|
|
892
|
+
* the dyn conversion), and tsc's `T & U` result type must collapse back
|
|
893
|
+
* to the target's own record shape (the self-shaped merges init-config
|
|
894
|
+
* patterns spell). */
|
|
895
|
+
export function lowerObjectAssignIndexShape(lowerer, call) {
|
|
896
|
+
if (call.arguments.length < 2 || call.arguments.some((a) => ts.isSpreadElement(a)))
|
|
897
|
+
return null;
|
|
898
|
+
const loc = locOf(call);
|
|
899
|
+
const targetIr = lowerer.mapTypeOf(lowerer.typeOf(call.arguments[0]));
|
|
900
|
+
if (targetIr?.kind !== "record")
|
|
901
|
+
return null;
|
|
902
|
+
const to = lowerer.shapes.get(targetIr.shapeId);
|
|
903
|
+
if (!to?.indexValue || to.tuple)
|
|
904
|
+
return null;
|
|
905
|
+
// tsc types the call `T & U & …`; the runtime value is the TARGET
|
|
906
|
+
// record (its shape, its identity). The lowering is honest exactly
|
|
907
|
+
// when nothing observes the intersection: the result is DISCARDED
|
|
908
|
+
// (expression-statement position — the mutate-in-place spelling), or
|
|
909
|
+
// the intersection collapses back to the target's own mapped record.
|
|
910
|
+
let parent = call.parent;
|
|
911
|
+
while (ts.isParenthesizedExpression(parent) || ts.isVoidExpression(parent))
|
|
912
|
+
parent = parent.parent;
|
|
913
|
+
const discarded = ts.isExpressionStatement(parent);
|
|
914
|
+
if (!discarded) {
|
|
915
|
+
const resultIr = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
916
|
+
if (!resultIr || !typeEquals(resultIr, targetIr))
|
|
917
|
+
return null;
|
|
918
|
+
}
|
|
919
|
+
const tIv = to.indexValue;
|
|
920
|
+
const slotLift = (t) => {
|
|
921
|
+
if (typeEquals(t, tIv))
|
|
922
|
+
return { how: "copy" };
|
|
923
|
+
if (tIv.kind === "dyn" && (t.kind === "dyn" || lowerer.dynConvertible(t)))
|
|
924
|
+
return "dyn";
|
|
925
|
+
return lowerer.widthLiftPlan(t, tIv);
|
|
926
|
+
};
|
|
927
|
+
const plans = [];
|
|
928
|
+
for (const argNode of call.arguments.slice(1)) {
|
|
929
|
+
const srcIr = lowerer.mapTypeOf(lowerer.typeOf(argNode));
|
|
930
|
+
if (srcIr?.kind !== "record")
|
|
931
|
+
return null;
|
|
932
|
+
const from = lowerer.shapes.get(srcIr.shapeId);
|
|
933
|
+
if (!from || from.tuple)
|
|
934
|
+
return null;
|
|
935
|
+
if (from.fields.some((f) => f.name.startsWith("%")))
|
|
936
|
+
return null;
|
|
937
|
+
const orderedFields = from.declaredOrder
|
|
938
|
+
? from.declaredOrder.flatMap((n) => {
|
|
939
|
+
const f = from.fields.find((x) => x.name === n);
|
|
940
|
+
return f ? [f] : [];
|
|
941
|
+
})
|
|
942
|
+
: from.fields;
|
|
943
|
+
const fields = [];
|
|
944
|
+
for (const ff of orderedFields) {
|
|
945
|
+
const lift = slotLift(ff.type);
|
|
946
|
+
if (lift === null)
|
|
947
|
+
return null;
|
|
948
|
+
fields.push({ name: ff.name, type: ff.type, lift });
|
|
949
|
+
}
|
|
950
|
+
let ovfLift = null;
|
|
951
|
+
if (from.indexValue) {
|
|
952
|
+
ovfLift = slotLift(from.indexValue);
|
|
953
|
+
if (ovfLift === null)
|
|
954
|
+
return null;
|
|
955
|
+
}
|
|
956
|
+
plans.push({ fromId: srcIr.shapeId, fields, ovfLift });
|
|
957
|
+
}
|
|
958
|
+
const helperFor = (plan) => {
|
|
959
|
+
const key = `assign:${targetIr.shapeId}:${plan.fromId}`;
|
|
960
|
+
const existing = lowerer.valueHelpers.get(key);
|
|
961
|
+
if (existing)
|
|
962
|
+
return existing;
|
|
963
|
+
const name = `%obj.assign.${lowerer.valueHelpers.size}`;
|
|
964
|
+
lowerer.valueHelpers.set(key, name);
|
|
965
|
+
const toT = { kind: "record", shapeId: targetIr.shapeId };
|
|
966
|
+
const fromT = { kind: "record", shapeId: plan.fromId };
|
|
967
|
+
const tRef = varRef("t.0", toT, loc);
|
|
968
|
+
const sRef = varRef("s.0", fromT, loc);
|
|
969
|
+
const intoSlot = (v, lift) => lift === "dyn"
|
|
970
|
+
? { kind: "dynFrom", value: v, type: DYN, loc }
|
|
971
|
+
: lowerer.applyWidthLift(lift, v, tIv, loc);
|
|
972
|
+
const body = [];
|
|
973
|
+
const fieldStmts = new Map();
|
|
974
|
+
for (const ff of plan.fields) {
|
|
975
|
+
const raw = {
|
|
976
|
+
kind: "recordGet",
|
|
977
|
+
obj: sRef,
|
|
978
|
+
shapeId: plan.fromId,
|
|
979
|
+
field: ff.name,
|
|
980
|
+
type: ff.type,
|
|
981
|
+
loc,
|
|
982
|
+
};
|
|
983
|
+
const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
|
|
984
|
+
const write = {
|
|
985
|
+
kind: "recordKeySet",
|
|
986
|
+
obj: tRef,
|
|
987
|
+
shapeId: targetIr.shapeId,
|
|
988
|
+
key: { kind: "strLit", value: ff.name, type: STRING, loc },
|
|
989
|
+
value: intoSlot(raw, ff.lift),
|
|
990
|
+
loc,
|
|
991
|
+
};
|
|
992
|
+
const fieldStmt = utag >= 0 && ff.type.kind === "union"
|
|
993
|
+
? {
|
|
994
|
+
kind: "if",
|
|
995
|
+
cond: {
|
|
996
|
+
kind: "unionIsTag",
|
|
997
|
+
unionId: ff.type.unionId,
|
|
998
|
+
tag: utag,
|
|
999
|
+
negated: true,
|
|
1000
|
+
value: raw,
|
|
1001
|
+
type: BOOL,
|
|
1002
|
+
loc,
|
|
1003
|
+
},
|
|
1004
|
+
then: [write],
|
|
1005
|
+
else_: null,
|
|
1006
|
+
loc,
|
|
1007
|
+
}
|
|
1008
|
+
: write;
|
|
1009
|
+
fieldStmts.set(ff.name, fieldStmt);
|
|
1010
|
+
body.push(fieldStmt);
|
|
1011
|
+
}
|
|
1012
|
+
const ksT = arrayOf(STRING);
|
|
1013
|
+
const fromShape = lowerer.shapes.get(plan.fromId);
|
|
1014
|
+
if (plan.ovfLift !== null && fromShape.indexValue) {
|
|
1015
|
+
const fIv = fromShape.indexValue;
|
|
1016
|
+
const ovfLift = plan.ovfLift;
|
|
1017
|
+
body.push({
|
|
1018
|
+
kind: "varDecl",
|
|
1019
|
+
localId: "ks.0",
|
|
1020
|
+
init: { kind: "recordOvfKeys", obj: sRef, shapeId: plan.fromId, type: ksT, loc },
|
|
1021
|
+
loc,
|
|
1022
|
+
}, countedFor(loc, {
|
|
1023
|
+
kind: "arrIntrinsic",
|
|
1024
|
+
method: "length",
|
|
1025
|
+
receiver: varRef("ks.0", ksT, loc),
|
|
1026
|
+
args: [],
|
|
1027
|
+
type: F64,
|
|
1028
|
+
loc,
|
|
1029
|
+
}, () => [
|
|
1030
|
+
{
|
|
1031
|
+
kind: "varDecl",
|
|
1032
|
+
localId: "k.0",
|
|
1033
|
+
init: {
|
|
1034
|
+
kind: "arrayGet",
|
|
1035
|
+
arr: varRef("ks.0", ksT, loc),
|
|
1036
|
+
index: varRef("i.0", F64, loc),
|
|
1037
|
+
type: STRING,
|
|
1038
|
+
loc,
|
|
1039
|
+
},
|
|
1040
|
+
loc,
|
|
1041
|
+
},
|
|
1042
|
+
{
|
|
1043
|
+
kind: "recordKeySet",
|
|
1044
|
+
obj: tRef,
|
|
1045
|
+
shapeId: targetIr.shapeId,
|
|
1046
|
+
key: varRef("k.0", STRING, loc),
|
|
1047
|
+
value: intoSlot({
|
|
1048
|
+
kind: "recordKeyGet",
|
|
1049
|
+
obj: sRef,
|
|
1050
|
+
shapeId: plan.fromId,
|
|
1051
|
+
key: varRef("k.0", STRING, loc),
|
|
1052
|
+
overflowOnly: true,
|
|
1053
|
+
type: fIv,
|
|
1054
|
+
loc,
|
|
1055
|
+
}, ovfLift),
|
|
1056
|
+
loc,
|
|
1057
|
+
},
|
|
1058
|
+
]));
|
|
1059
|
+
}
|
|
1060
|
+
body.push({ kind: "return", value: tRef, loc });
|
|
1061
|
+
const suffix = body.slice(fieldStmts.size);
|
|
1062
|
+
const fn = {
|
|
1063
|
+
name,
|
|
1064
|
+
params: [
|
|
1065
|
+
{ localId: "t.0", name: "t", type: toT },
|
|
1066
|
+
{ localId: "s.0", name: "s", type: fromT },
|
|
1067
|
+
],
|
|
1068
|
+
returnType: toT,
|
|
1069
|
+
locals: [
|
|
1070
|
+
{ id: "t.0", name: "t", type: toT, mutable: true },
|
|
1071
|
+
{ id: "s.0", name: "s", type: fromT, mutable: true },
|
|
1072
|
+
...(plan.ovfLift !== null && fromShape.indexValue
|
|
1073
|
+
? [
|
|
1074
|
+
{ id: "ks.0", name: "ks", type: ksT, mutable: false },
|
|
1075
|
+
{ id: "i.0", name: "i", type: F64, mutable: true },
|
|
1076
|
+
{ id: "k.0", name: "k", type: STRING, mutable: false },
|
|
1077
|
+
]
|
|
1078
|
+
: []),
|
|
1079
|
+
],
|
|
1080
|
+
body,
|
|
1081
|
+
loc,
|
|
1082
|
+
};
|
|
1083
|
+
lowerer.shapeOrderHelperFinalizers.push(() => {
|
|
1084
|
+
const current = lowerer.shapes.get(plan.fromId) ?? fromShape;
|
|
1085
|
+
const currentOrder = current.declaredOrder ?? current.fields.map((f) => f.name);
|
|
1086
|
+
fn.body = [
|
|
1087
|
+
...currentOrder.flatMap((field) => {
|
|
1088
|
+
const stmt = fieldStmts.get(field);
|
|
1089
|
+
return stmt ? [stmt] : [];
|
|
1090
|
+
}),
|
|
1091
|
+
...suffix,
|
|
1092
|
+
];
|
|
1093
|
+
});
|
|
1094
|
+
lowerer.liftedFns.push(fn);
|
|
1095
|
+
return name;
|
|
1096
|
+
};
|
|
1097
|
+
let acc = lowerer.lowerExprExpecting(call.arguments[0], targetIr);
|
|
1098
|
+
for (let i = 0; i < plans.length; i++) {
|
|
1099
|
+
const src = lowerer.lowerExprExpecting(call.arguments[i + 1], {
|
|
1100
|
+
kind: "record",
|
|
1101
|
+
shapeId: plans[i].fromId,
|
|
1102
|
+
});
|
|
1103
|
+
acc = { kind: "call", callee: helperFor(plans[i]), args: [acc, src], type: targetIr, loc };
|
|
1104
|
+
}
|
|
1105
|
+
return acc;
|
|
1106
|
+
}
|
|
1107
|
+
/** The interned merge helper behind `{ ...a, ...b, K: v }` literals whose
|
|
1108
|
+
* TARGET shape is a PURE index-signature record (no declared fields) —
|
|
1109
|
+
* the spawn-env pattern (`{ ...process.env, ...extraEnv }`). Contributors
|
|
1110
|
+
* apply in literal order with keyed writes, so JS's last-write-wins holds
|
|
1111
|
+
* for colliding runtime keys. Spread sources must be index-signature
|
|
1112
|
+
* records whose value slot IS the target's or LIFTS into it (a
|
|
1113
|
+
* `Record<string, string>` spreads into a `string | undefined` target by
|
|
1114
|
+
* wrapping each copied value); their declared fields copy first (skipping
|
|
1115
|
+
* undefined-armed absents — the unset convention), then their overflow in
|
|
1116
|
+
* JS own-key order. Explicit values arrive pre-coerced to the target's
|
|
1117
|
+
* value slot. Null when a spread source is outside that matrix (the
|
|
1118
|
+
* caller keeps its fence). */
|
|
1119
|
+
export function lowerIndexMergeHelper(lowerer, toId, contributors, loc) {
|
|
1120
|
+
const to = lowerer.shapes.get(toId);
|
|
1121
|
+
if (!to?.indexValue || to.tuple || to.fields.length > 0)
|
|
1122
|
+
return null;
|
|
1123
|
+
const tIv = to.indexValue;
|
|
1124
|
+
// Per-source plan: how each spread's values reach the target slot —
|
|
1125
|
+
// identity, a one-arm wrap, or (a SUB-UNION value slot: the
|
|
1126
|
+
// `{ ...proxyRes.headers }` spread into OutgoingHttpHeaders, whose
|
|
1127
|
+
// slot adds arms the source never carries) an arm-wise re-tag. A
|
|
1128
|
+
// FIXED-shape source (the `{ ...DEFAULT_TOKENS }` config-defaults
|
|
1129
|
+
// pattern) plans per FIELD instead: each declared field keyed-writes
|
|
1130
|
+
// when its type enters the slot (identity, the dyn conversion, or a
|
|
1131
|
+
// width lift — the capture helper's matrix); accessor/reserved slots
|
|
1132
|
+
// decline (a spread would need the getter's computed value).
|
|
1133
|
+
const srcPlans = [];
|
|
1134
|
+
for (const c of contributors) {
|
|
1135
|
+
// A conditional spread needs the undefined arm as its "absent"
|
|
1136
|
+
// value — a target slot without one can't carry the empty arm.
|
|
1137
|
+
if (c.kind === "condField" &&
|
|
1138
|
+
(tIv.kind !== "union" || lowerer.armTag(tIv.unionId, UNDEFINED_T) < 0)) {
|
|
1139
|
+
return null;
|
|
1140
|
+
}
|
|
1141
|
+
if (c.kind !== "spread")
|
|
1142
|
+
continue;
|
|
1143
|
+
const from = lowerer.shapes.get(c.shapeId);
|
|
1144
|
+
if (!from || from.tuple)
|
|
1145
|
+
return null;
|
|
1146
|
+
if (!from.indexValue) {
|
|
1147
|
+
if (from.fields.some((f) => f.name.startsWith("%")))
|
|
1148
|
+
return null;
|
|
1149
|
+
const fields = new Map();
|
|
1150
|
+
for (const ff of from.fields) {
|
|
1151
|
+
const lift = typeEquals(ff.type, tIv)
|
|
1152
|
+
? { how: "copy" }
|
|
1153
|
+
: tIv.kind === "dyn" && (ff.type.kind === "dyn" || lowerer.dynConvertible(ff.type))
|
|
1154
|
+
? "dyn"
|
|
1155
|
+
: lowerer.widthLiftPlan(ff.type, tIv);
|
|
1156
|
+
if (lift === null)
|
|
1157
|
+
return null;
|
|
1158
|
+
fields.set(ff.name, lift);
|
|
1159
|
+
}
|
|
1160
|
+
srcPlans.push({ shapeId: c.shapeId, wrapTag: -1, retag: null, fields });
|
|
1161
|
+
continue;
|
|
1162
|
+
}
|
|
1163
|
+
const fIv = from.indexValue;
|
|
1164
|
+
let wrapTag = -1;
|
|
1165
|
+
let retag = null;
|
|
1166
|
+
if (!typeEquals(fIv, tIv)) {
|
|
1167
|
+
if (tIv.kind !== "union")
|
|
1168
|
+
return null;
|
|
1169
|
+
wrapTag = lowerer.armTag(tIv.unionId, fIv);
|
|
1170
|
+
if (wrapTag < 0) {
|
|
1171
|
+
if (!(fIv.kind === "union" && lowerer.unionRetagMappable(fIv.unionId, tIv.unionId)))
|
|
1172
|
+
return null;
|
|
1173
|
+
retag = lowerer.unionRetagHelper(fIv.unionId, tIv.unionId, loc);
|
|
1174
|
+
if (retag === null)
|
|
1175
|
+
return null;
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
for (const ff of from.fields) {
|
|
1179
|
+
// Declared source fields must reach the slot the same way the
|
|
1180
|
+
// overflow does (fields typed AS the source's own value slot); a
|
|
1181
|
+
// shape outside that keeps the fence.
|
|
1182
|
+
if (!typeEquals(ff.type, fIv))
|
|
1183
|
+
return null;
|
|
1184
|
+
}
|
|
1185
|
+
srcPlans.push({ shapeId: c.shapeId, wrapTag, retag, fields: null });
|
|
1186
|
+
}
|
|
1187
|
+
const key = `ixmerge:${toId}:` +
|
|
1188
|
+
contributors
|
|
1189
|
+
.map((c) => c.kind === "spread"
|
|
1190
|
+
? `s${c.shapeId}`
|
|
1191
|
+
: c.kind === "condField"
|
|
1192
|
+
? `c${c.name}`
|
|
1193
|
+
: c.kind === "keyedField"
|
|
1194
|
+
? "k"
|
|
1195
|
+
: `f${c.name}`)
|
|
1196
|
+
.join(",");
|
|
1197
|
+
const existing = lowerer.valueHelpers.get(key);
|
|
1198
|
+
if (existing)
|
|
1199
|
+
return existing;
|
|
1200
|
+
const name = `%rec.merge.${lowerer.valueHelpers.size}`;
|
|
1201
|
+
lowerer.valueHelpers.set(key, name);
|
|
1202
|
+
const toT = { kind: "record", shapeId: toId };
|
|
1203
|
+
const ksT = arrayOf(STRING);
|
|
1204
|
+
const outRef = varRef("out.0", toT, loc);
|
|
1205
|
+
const params = [];
|
|
1206
|
+
const locals = [{ id: "out.0", name: "out", type: toT, mutable: false }];
|
|
1207
|
+
const body = [
|
|
1208
|
+
{
|
|
1209
|
+
kind: "varDecl",
|
|
1210
|
+
localId: "out.0",
|
|
1211
|
+
init: { kind: "recordLit", fields: [], type: toT, loc },
|
|
1212
|
+
loc,
|
|
1213
|
+
},
|
|
1214
|
+
];
|
|
1215
|
+
let spreadNo = 0;
|
|
1216
|
+
contributors.forEach((c, ci) => {
|
|
1217
|
+
if (c.kind === "keyedField") {
|
|
1218
|
+
// The runtime key and its value are consecutive parameters — the
|
|
1219
|
+
// call site's argument order IS the property's key-then-value
|
|
1220
|
+
// evaluation order.
|
|
1221
|
+
const kid = `kk.${ci}`;
|
|
1222
|
+
const pid = `v.${ci}`;
|
|
1223
|
+
params.push({ localId: kid, name: `kk${ci}`, type: STRING }, { localId: pid, name: `v${ci}`, type: tIv });
|
|
1224
|
+
locals.push({ id: kid, name: `kk${ci}`, type: STRING, mutable: false }, { id: pid, name: `v${ci}`, type: tIv, mutable: false });
|
|
1225
|
+
body.push({
|
|
1226
|
+
kind: "recordKeySet",
|
|
1227
|
+
obj: outRef,
|
|
1228
|
+
shapeId: toId,
|
|
1229
|
+
key: varRef(kid, STRING, loc),
|
|
1230
|
+
value: varRef(pid, tIv, loc),
|
|
1231
|
+
overflowOnly: true,
|
|
1232
|
+
loc,
|
|
1233
|
+
});
|
|
1234
|
+
return;
|
|
1235
|
+
}
|
|
1236
|
+
if (c.kind === "field" || c.kind === "condField") {
|
|
1237
|
+
const pid = `v.${ci}`;
|
|
1238
|
+
params.push({ localId: pid, name: `v${ci}`, type: tIv });
|
|
1239
|
+
locals.push({ id: pid, name: `v${ci}`, type: tIv, mutable: false });
|
|
1240
|
+
const write = {
|
|
1241
|
+
kind: "recordKeySet",
|
|
1242
|
+
obj: outRef,
|
|
1243
|
+
shapeId: toId,
|
|
1244
|
+
key: { kind: "strLit", value: c.name, type: STRING, loc },
|
|
1245
|
+
value: varRef(pid, tIv, loc),
|
|
1246
|
+
overflowOnly: true,
|
|
1247
|
+
loc,
|
|
1248
|
+
};
|
|
1249
|
+
if (c.kind === "condField" && tIv.kind === "union") {
|
|
1250
|
+
// The key writes only when the spread's condition held (its
|
|
1251
|
+
// value arg holds the interned undefined arm otherwise) — an
|
|
1252
|
+
// absent key STAYS absent, presence being the observable.
|
|
1253
|
+
// (The pre-pass above guaranteed the undefined arm exists.)
|
|
1254
|
+
const undefTag = lowerer.armTag(tIv.unionId, UNDEFINED_T);
|
|
1255
|
+
body.push({
|
|
1256
|
+
kind: "if",
|
|
1257
|
+
cond: {
|
|
1258
|
+
kind: "unionIsTag",
|
|
1259
|
+
unionId: tIv.unionId,
|
|
1260
|
+
tag: undefTag,
|
|
1261
|
+
negated: true,
|
|
1262
|
+
value: varRef(pid, tIv, loc),
|
|
1263
|
+
type: BOOL,
|
|
1264
|
+
loc,
|
|
1265
|
+
},
|
|
1266
|
+
then: [write],
|
|
1267
|
+
else_: null,
|
|
1268
|
+
loc,
|
|
1269
|
+
});
|
|
1270
|
+
return;
|
|
1271
|
+
}
|
|
1272
|
+
body.push(write);
|
|
1273
|
+
return;
|
|
1274
|
+
}
|
|
1275
|
+
const plan = srcPlans[spreadNo];
|
|
1276
|
+
const n = spreadNo++;
|
|
1277
|
+
const from = lowerer.shapes.get(plan.shapeId);
|
|
1278
|
+
const fromT = { kind: "record", shapeId: plan.shapeId };
|
|
1279
|
+
const sid = `s.${ci}`;
|
|
1280
|
+
params.push({ localId: sid, name: `s${ci}`, type: fromT });
|
|
1281
|
+
locals.push({ id: sid, name: `s${ci}`, type: fromT, mutable: false });
|
|
1282
|
+
const sRef = varRef(sid, fromT, loc);
|
|
1283
|
+
// A FIXED-shape source: each declared field keyed-writes through its
|
|
1284
|
+
// own planned lift (absent optionals skip — the unset convention);
|
|
1285
|
+
// no overflow exists to walk.
|
|
1286
|
+
if (plan.fields !== null) {
|
|
1287
|
+
for (const ff of from.fields) {
|
|
1288
|
+
const lift = plan.fields.get(ff.name);
|
|
1289
|
+
const raw = {
|
|
1290
|
+
kind: "recordGet",
|
|
1291
|
+
obj: sRef,
|
|
1292
|
+
shapeId: plan.shapeId,
|
|
1293
|
+
field: ff.name,
|
|
1294
|
+
type: ff.type,
|
|
1295
|
+
loc,
|
|
1296
|
+
};
|
|
1297
|
+
const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
|
|
1298
|
+
const write = {
|
|
1299
|
+
kind: "recordKeySet",
|
|
1300
|
+
obj: outRef,
|
|
1301
|
+
shapeId: toId,
|
|
1302
|
+
key: { kind: "strLit", value: ff.name, type: STRING, loc },
|
|
1303
|
+
value: lift === "dyn"
|
|
1304
|
+
? { kind: "dynFrom", value: raw, type: DYN, loc }
|
|
1305
|
+
: lowerer.applyWidthLift(lift, raw, tIv, loc),
|
|
1306
|
+
overflowOnly: true,
|
|
1307
|
+
loc,
|
|
1308
|
+
};
|
|
1309
|
+
body.push(utag >= 0 && ff.type.kind === "union"
|
|
1310
|
+
? {
|
|
1311
|
+
kind: "if",
|
|
1312
|
+
cond: {
|
|
1313
|
+
kind: "unionIsTag",
|
|
1314
|
+
unionId: ff.type.unionId,
|
|
1315
|
+
tag: utag,
|
|
1316
|
+
negated: true,
|
|
1317
|
+
value: raw,
|
|
1318
|
+
type: BOOL,
|
|
1319
|
+
loc,
|
|
1320
|
+
},
|
|
1321
|
+
then: [write],
|
|
1322
|
+
else_: null,
|
|
1323
|
+
loc,
|
|
1324
|
+
}
|
|
1325
|
+
: write);
|
|
1326
|
+
}
|
|
1327
|
+
return;
|
|
1328
|
+
}
|
|
1329
|
+
const fIv = from.indexValue;
|
|
1330
|
+
const intoSlot = (v) => plan.retag !== null
|
|
1331
|
+
? { kind: "call", callee: plan.retag, args: [v], type: tIv, loc }
|
|
1332
|
+
: plan.wrapTag < 0
|
|
1333
|
+
? v
|
|
1334
|
+
: {
|
|
1335
|
+
kind: "unionWrap",
|
|
1336
|
+
unionId: tIv.unionId,
|
|
1337
|
+
tag: plan.wrapTag,
|
|
1338
|
+
value: v,
|
|
1339
|
+
type: tIv,
|
|
1340
|
+
loc,
|
|
1341
|
+
};
|
|
1342
|
+
// Declared source fields first (literal keys; absent optionals skip).
|
|
1343
|
+
for (const ff of from.fields) {
|
|
1344
|
+
const raw = {
|
|
1345
|
+
kind: "recordGet",
|
|
1346
|
+
obj: sRef,
|
|
1347
|
+
shapeId: plan.shapeId,
|
|
1348
|
+
field: ff.name,
|
|
1349
|
+
type: ff.type,
|
|
1350
|
+
loc,
|
|
1351
|
+
};
|
|
1352
|
+
const utag = ff.type.kind === "union" ? lowerer.armTag(ff.type.unionId, UNDEFINED_T) : -1;
|
|
1353
|
+
const write = {
|
|
1354
|
+
kind: "recordKeySet",
|
|
1355
|
+
obj: outRef,
|
|
1356
|
+
shapeId: toId,
|
|
1357
|
+
key: { kind: "strLit", value: ff.name, type: STRING, loc },
|
|
1358
|
+
value: intoSlot(raw),
|
|
1359
|
+
overflowOnly: true,
|
|
1360
|
+
loc,
|
|
1361
|
+
};
|
|
1362
|
+
body.push(utag >= 0 && ff.type.kind === "union"
|
|
1363
|
+
? {
|
|
1364
|
+
kind: "if",
|
|
1365
|
+
cond: {
|
|
1366
|
+
kind: "unionIsTag",
|
|
1367
|
+
unionId: ff.type.unionId,
|
|
1368
|
+
tag: utag,
|
|
1369
|
+
negated: true,
|
|
1370
|
+
value: raw,
|
|
1371
|
+
type: BOOL,
|
|
1372
|
+
loc,
|
|
1373
|
+
},
|
|
1374
|
+
then: [write],
|
|
1375
|
+
else_: null,
|
|
1376
|
+
loc,
|
|
1377
|
+
}
|
|
1378
|
+
: write);
|
|
1379
|
+
}
|
|
1380
|
+
// Then the source overflow, in JS own-key order.
|
|
1381
|
+
const ks = `ks.${ci}`;
|
|
1382
|
+
const iv = `i.${ci}`;
|
|
1383
|
+
const kv = `k.${ci}`;
|
|
1384
|
+
locals.push({ id: ks, name: `ks${n}`, type: ksT, mutable: false }, { id: iv, name: `i${n}`, type: F64, mutable: true }, { id: kv, name: `k${n}`, type: STRING, mutable: false });
|
|
1385
|
+
body.push({
|
|
1386
|
+
kind: "varDecl",
|
|
1387
|
+
localId: ks,
|
|
1388
|
+
init: { kind: "recordOvfKeys", obj: sRef, shapeId: plan.shapeId, type: ksT, loc },
|
|
1389
|
+
loc,
|
|
1390
|
+
}, {
|
|
1391
|
+
kind: "for",
|
|
1392
|
+
init: { kind: "varDecl", localId: iv, init: numLit(0, loc), loc },
|
|
1393
|
+
cond: {
|
|
1394
|
+
kind: "bin",
|
|
1395
|
+
op: "<",
|
|
1396
|
+
left: varRef(iv, F64, loc),
|
|
1397
|
+
right: {
|
|
1398
|
+
kind: "arrIntrinsic",
|
|
1399
|
+
method: "length",
|
|
1400
|
+
receiver: varRef(ks, ksT, loc),
|
|
1401
|
+
args: [],
|
|
1402
|
+
type: F64,
|
|
1403
|
+
loc,
|
|
1404
|
+
},
|
|
1405
|
+
type: BOOL,
|
|
1406
|
+
loc,
|
|
1407
|
+
},
|
|
1408
|
+
update: {
|
|
1409
|
+
kind: "assign",
|
|
1410
|
+
localId: iv,
|
|
1411
|
+
value: {
|
|
1412
|
+
kind: "bin",
|
|
1413
|
+
op: "+",
|
|
1414
|
+
left: varRef(iv, F64, loc),
|
|
1415
|
+
right: numLit(1, loc),
|
|
1416
|
+
type: F64,
|
|
1417
|
+
loc,
|
|
1418
|
+
},
|
|
1419
|
+
loc,
|
|
1420
|
+
},
|
|
1421
|
+
body: [
|
|
1422
|
+
{
|
|
1423
|
+
kind: "varDecl",
|
|
1424
|
+
localId: kv,
|
|
1425
|
+
init: {
|
|
1426
|
+
kind: "arrayGet",
|
|
1427
|
+
arr: varRef(ks, ksT, loc),
|
|
1428
|
+
index: varRef(iv, F64, loc),
|
|
1429
|
+
type: STRING,
|
|
1430
|
+
loc,
|
|
1431
|
+
},
|
|
1432
|
+
loc,
|
|
1433
|
+
},
|
|
1434
|
+
{
|
|
1435
|
+
kind: "recordKeySet",
|
|
1436
|
+
obj: outRef,
|
|
1437
|
+
shapeId: toId,
|
|
1438
|
+
key: varRef(kv, STRING, loc),
|
|
1439
|
+
value: intoSlot({
|
|
1440
|
+
kind: "recordKeyGet",
|
|
1441
|
+
obj: sRef,
|
|
1442
|
+
shapeId: plan.shapeId,
|
|
1443
|
+
key: varRef(kv, STRING, loc),
|
|
1444
|
+
overflowOnly: true,
|
|
1445
|
+
type: fIv,
|
|
1446
|
+
loc,
|
|
1447
|
+
}),
|
|
1448
|
+
overflowOnly: true,
|
|
1449
|
+
loc,
|
|
1450
|
+
},
|
|
1451
|
+
],
|
|
1452
|
+
loc,
|
|
1453
|
+
});
|
|
1454
|
+
});
|
|
1455
|
+
body.push({ kind: "return", value: outRef, loc });
|
|
1456
|
+
lowerer.liftedFns.push({ name, params, returnType: toT, locals, body, loc });
|
|
1457
|
+
return name;
|
|
1458
|
+
}
|
|
1459
|
+
/** The interned helper flattening an env-shaped record into the
|
|
1460
|
+
* [k0, v0, k1, v1, ...] string[] cp.execSync consumes — declared string
|
|
1461
|
+
* fields first (undefined-armed absents skipped, the Node-drops-undefined
|
|
1462
|
+
* rule), then index-signature overflow in JS own-key order. Every value
|
|
1463
|
+
* source must be a string or a `string | undefined` union whose value arm
|
|
1464
|
+
* is a string. Null when the shape carries a non-string field/value slot
|
|
1465
|
+
* (the caller fences). */
|
|
1466
|
+
export function lowerEnvToPairsHelper(lowerer, shapeId, loc) {
|
|
1467
|
+
const shape = lowerer.shapes.get(shapeId);
|
|
1468
|
+
if (!shape || shape.tuple)
|
|
1469
|
+
return null;
|
|
1470
|
+
// A string | undefined value flows as its string arm; a bare string
|
|
1471
|
+
// flows directly. `unwrapStr` returns the code (or null → fence).
|
|
1472
|
+
const strArmTag = (t) => {
|
|
1473
|
+
if (t.kind === "string")
|
|
1474
|
+
return "plain";
|
|
1475
|
+
if (t.kind !== "union")
|
|
1476
|
+
return null;
|
|
1477
|
+
const def = lowerer.unions.get(t.unionId);
|
|
1478
|
+
if (!def)
|
|
1479
|
+
return null;
|
|
1480
|
+
const nonUnit = def.arms.filter((a) => !isRefCounted(a) || a.kind === "string");
|
|
1481
|
+
// Exactly a string arm plus unit arms (string | undefined).
|
|
1482
|
+
const strTag = def.arms.findIndex((a) => a.kind === "string");
|
|
1483
|
+
if (strTag < 0)
|
|
1484
|
+
return null;
|
|
1485
|
+
if (!def.arms.every((a) => a.kind === "string" || a.kind === "undefinedT" || a.kind === "nullT")) {
|
|
1486
|
+
return null;
|
|
1487
|
+
}
|
|
1488
|
+
void nonUnit;
|
|
1489
|
+
return strTag;
|
|
1490
|
+
};
|
|
1491
|
+
// The HEADER value matrix (OutgoingHttpHeaders — `number | string |
|
|
1492
|
+
// string[] | undefined`): numbers format (Node's String(n)), arrays
|
|
1493
|
+
// expand to one pair per element (Node writes one line each), units
|
|
1494
|
+
// skip. Slots whose arms fit neither matrix keep the fence.
|
|
1495
|
+
const headerArms = (t) => {
|
|
1496
|
+
if (t.kind !== "union")
|
|
1497
|
+
return null;
|
|
1498
|
+
const def = lowerer.unions.get(t.unionId);
|
|
1499
|
+
if (!def)
|
|
1500
|
+
return null;
|
|
1501
|
+
if (!def.arms.every((a) => a.kind === "string" ||
|
|
1502
|
+
a.kind === "f64" ||
|
|
1503
|
+
(a.kind === "array" && a.elem.kind === "string") ||
|
|
1504
|
+
a.kind === "undefinedT" ||
|
|
1505
|
+
a.kind === "nullT")) {
|
|
1506
|
+
return null;
|
|
1507
|
+
}
|
|
1508
|
+
return {
|
|
1509
|
+
str: def.arms.findIndex((a) => a.kind === "string"),
|
|
1510
|
+
f64: def.arms.findIndex((a) => a.kind === "f64"),
|
|
1511
|
+
arr: def.arms.findIndex((a) => a.kind === "array"),
|
|
1512
|
+
};
|
|
1513
|
+
};
|
|
1514
|
+
const slotOk = (t) => strArmTag(t) !== null || headerArms(t) !== null;
|
|
1515
|
+
for (const f of shape.fields) {
|
|
1516
|
+
if (!slotOk(f.type))
|
|
1517
|
+
return null;
|
|
1518
|
+
}
|
|
1519
|
+
if (shape.indexValue && !slotOk(shape.indexValue))
|
|
1520
|
+
return null;
|
|
1521
|
+
const key = `env.pairs:${shapeId}`;
|
|
1522
|
+
const existing = lowerer.valueHelpers.get(key);
|
|
1523
|
+
if (existing)
|
|
1524
|
+
return existing;
|
|
1525
|
+
const name = `%env.pairs.${lowerer.valueHelpers.size}`;
|
|
1526
|
+
lowerer.valueHelpers.set(key, name);
|
|
1527
|
+
const recT = { kind: "record", shapeId };
|
|
1528
|
+
const arrT = arrayOf(STRING);
|
|
1529
|
+
const sRef = varRef("s.0", recT, loc);
|
|
1530
|
+
const outRef = varRef("out.0", arrT, loc);
|
|
1531
|
+
// The string value of a field/overflow read: unwrap the union arm, or
|
|
1532
|
+
// pass a plain string through.
|
|
1533
|
+
const asStr = (raw, t) => {
|
|
1534
|
+
const tag = strArmTag(t);
|
|
1535
|
+
if (tag === "plain" || tag === null)
|
|
1536
|
+
return raw;
|
|
1537
|
+
if (t.kind !== "union")
|
|
1538
|
+
return raw;
|
|
1539
|
+
return { kind: "unionNarrow", unionId: t.unionId, tag, value: raw, type: STRING, loc };
|
|
1540
|
+
};
|
|
1541
|
+
const pushOne = (v) => ({
|
|
1542
|
+
kind: "exprStmt",
|
|
1543
|
+
expr: { kind: "arrIntrinsic", method: "push", receiver: outRef, args: [v], type: F64, loc },
|
|
1544
|
+
loc,
|
|
1545
|
+
});
|
|
1546
|
+
const push = (k, v) => ({
|
|
1547
|
+
kind: "block",
|
|
1548
|
+
body: [pushOne(k), pushOne(v)],
|
|
1549
|
+
loc,
|
|
1550
|
+
});
|
|
1551
|
+
const locals = [
|
|
1552
|
+
{ id: "s.0", name: "s", type: recT, mutable: true },
|
|
1553
|
+
{ id: "out.0", name: "out", type: arrT, mutable: false },
|
|
1554
|
+
];
|
|
1555
|
+
// One write per entry: the string|undefined fast path keeps its
|
|
1556
|
+
// historic shape; a header slot dispatches arm-wise (string pushes,
|
|
1557
|
+
// f64 formats via toString, string[] expands element-wise — repeated
|
|
1558
|
+
// same-name pairs, one per element — and units skip).
|
|
1559
|
+
let siteNo = 0;
|
|
1560
|
+
const writeFor = (k, raw, t) => {
|
|
1561
|
+
const st = strArmTag(t);
|
|
1562
|
+
if (st !== null) {
|
|
1563
|
+
const write = push(k, asStr(raw, t));
|
|
1564
|
+
const utag = t.kind === "union" ? lowerer.armTag(t.unionId, UNDEFINED_T) : -1;
|
|
1565
|
+
return utag >= 0 && t.kind === "union"
|
|
1566
|
+
? {
|
|
1567
|
+
kind: "if",
|
|
1568
|
+
cond: {
|
|
1569
|
+
kind: "unionIsTag",
|
|
1570
|
+
unionId: t.unionId,
|
|
1571
|
+
tag: utag,
|
|
1572
|
+
negated: true,
|
|
1573
|
+
value: raw,
|
|
1574
|
+
type: BOOL,
|
|
1575
|
+
loc,
|
|
1576
|
+
},
|
|
1577
|
+
then: [write],
|
|
1578
|
+
else_: null,
|
|
1579
|
+
loc,
|
|
1580
|
+
}
|
|
1581
|
+
: write;
|
|
1582
|
+
}
|
|
1583
|
+
if (t.kind !== "union")
|
|
1584
|
+
throw new InternalCompilerError("lowerer bug: header slot outside the pairs matrix");
|
|
1585
|
+
const ha = headerArms(t);
|
|
1586
|
+
const isTag = (tag) => ({
|
|
1587
|
+
kind: "unionIsTag",
|
|
1588
|
+
unionId: t.unionId,
|
|
1589
|
+
tag,
|
|
1590
|
+
negated: false,
|
|
1591
|
+
value: raw,
|
|
1592
|
+
type: BOOL,
|
|
1593
|
+
loc,
|
|
1594
|
+
});
|
|
1595
|
+
const narrowTo = (tag, nt) => ({
|
|
1596
|
+
kind: "unionNarrow",
|
|
1597
|
+
unionId: t.unionId,
|
|
1598
|
+
tag,
|
|
1599
|
+
value: raw,
|
|
1600
|
+
type: nt,
|
|
1601
|
+
loc,
|
|
1602
|
+
});
|
|
1603
|
+
let chain = [];
|
|
1604
|
+
if (ha.arr >= 0) {
|
|
1605
|
+
const uid = siteNo++;
|
|
1606
|
+
const aT = arrayOf(STRING);
|
|
1607
|
+
locals.push({ id: `a.${uid}`, name: `a${uid}`, type: aT, mutable: false }, { id: `j.${uid}`, name: `j${uid}`, type: F64, mutable: true });
|
|
1608
|
+
const aRef = varRef(`a.${uid}`, aT, loc);
|
|
1609
|
+
const jRef = varRef(`j.${uid}`, F64, loc);
|
|
1610
|
+
chain = [
|
|
1611
|
+
{
|
|
1612
|
+
kind: "if",
|
|
1613
|
+
cond: isTag(ha.arr),
|
|
1614
|
+
then: [
|
|
1615
|
+
{ kind: "varDecl", localId: `a.${uid}`, init: narrowTo(ha.arr, aT), loc },
|
|
1616
|
+
{
|
|
1617
|
+
kind: "for",
|
|
1618
|
+
init: { kind: "varDecl", localId: `j.${uid}`, init: numLit(0, loc), loc },
|
|
1619
|
+
cond: {
|
|
1620
|
+
kind: "bin",
|
|
1621
|
+
op: "<",
|
|
1622
|
+
left: jRef,
|
|
1623
|
+
right: {
|
|
1624
|
+
kind: "arrIntrinsic",
|
|
1625
|
+
method: "length",
|
|
1626
|
+
receiver: aRef,
|
|
1627
|
+
args: [],
|
|
1628
|
+
type: F64,
|
|
1629
|
+
loc,
|
|
1630
|
+
},
|
|
1631
|
+
type: BOOL,
|
|
1632
|
+
loc,
|
|
1633
|
+
},
|
|
1634
|
+
update: {
|
|
1635
|
+
kind: "assign",
|
|
1636
|
+
localId: `j.${uid}`,
|
|
1637
|
+
value: { kind: "bin", op: "+", left: jRef, right: numLit(1, loc), type: F64, loc },
|
|
1638
|
+
loc,
|
|
1639
|
+
},
|
|
1640
|
+
body: [push(k, { kind: "arrayGet", arr: aRef, index: jRef, type: STRING, loc })],
|
|
1641
|
+
loc,
|
|
1642
|
+
},
|
|
1643
|
+
],
|
|
1644
|
+
else_: chain.length > 0 ? chain : null,
|
|
1645
|
+
loc,
|
|
1646
|
+
},
|
|
1647
|
+
];
|
|
1648
|
+
}
|
|
1649
|
+
if (ha.f64 >= 0) {
|
|
1650
|
+
chain = [
|
|
1651
|
+
{
|
|
1652
|
+
kind: "if",
|
|
1653
|
+
cond: isTag(ha.f64),
|
|
1654
|
+
then: [push(k, { kind: "toString", operand: narrowTo(ha.f64, F64), type: STRING, loc })],
|
|
1655
|
+
else_: chain.length > 0 ? chain : null,
|
|
1656
|
+
loc,
|
|
1657
|
+
},
|
|
1658
|
+
];
|
|
1659
|
+
}
|
|
1660
|
+
if (ha.str >= 0) {
|
|
1661
|
+
chain = [
|
|
1662
|
+
{
|
|
1663
|
+
kind: "if",
|
|
1664
|
+
cond: isTag(ha.str),
|
|
1665
|
+
then: [push(k, narrowTo(ha.str, STRING))],
|
|
1666
|
+
else_: chain.length > 0 ? chain : null,
|
|
1667
|
+
loc,
|
|
1668
|
+
},
|
|
1669
|
+
];
|
|
1670
|
+
}
|
|
1671
|
+
return { kind: "block", body: chain, loc };
|
|
1672
|
+
};
|
|
1673
|
+
const body = [
|
|
1674
|
+
{
|
|
1675
|
+
kind: "varDecl",
|
|
1676
|
+
localId: "out.0",
|
|
1677
|
+
init: { kind: "arrayLit", elems: [], type: arrT, loc },
|
|
1678
|
+
loc,
|
|
1679
|
+
},
|
|
1680
|
+
];
|
|
1681
|
+
for (const f of shape.fields) {
|
|
1682
|
+
const raw = { kind: "recordGet", obj: sRef, shapeId, field: f.name, type: f.type, loc };
|
|
1683
|
+
const k = { kind: "strLit", value: f.name, type: STRING, loc };
|
|
1684
|
+
body.push(writeFor(k, raw, f.type));
|
|
1685
|
+
}
|
|
1686
|
+
if (shape.indexValue) {
|
|
1687
|
+
const iv = shape.indexValue;
|
|
1688
|
+
const ksT = arrayOf(STRING);
|
|
1689
|
+
locals.push({ id: "ks.0", name: "ks", type: ksT, mutable: false }, { id: "i.0", name: "i", type: F64, mutable: true }, { id: "k.0", name: "k", type: STRING, mutable: false }, { id: "raw.0", name: "raw", type: iv, mutable: false });
|
|
1690
|
+
const rawRead = {
|
|
1691
|
+
kind: "recordKeyGet",
|
|
1692
|
+
obj: sRef,
|
|
1693
|
+
shapeId,
|
|
1694
|
+
key: varRef("k.0", STRING, loc),
|
|
1695
|
+
overflowOnly: true,
|
|
1696
|
+
type: iv,
|
|
1697
|
+
loc,
|
|
1698
|
+
};
|
|
1699
|
+
const utag = iv.kind === "union" ? lowerer.armTag(iv.unionId, UNDEFINED_T) : -1;
|
|
1700
|
+
const innerBody = [
|
|
1701
|
+
{
|
|
1702
|
+
kind: "varDecl",
|
|
1703
|
+
localId: "k.0",
|
|
1704
|
+
init: {
|
|
1705
|
+
kind: "arrayGet",
|
|
1706
|
+
arr: varRef("ks.0", ksT, loc),
|
|
1707
|
+
index: varRef("i.0", F64, loc),
|
|
1708
|
+
type: STRING,
|
|
1709
|
+
loc,
|
|
1710
|
+
},
|
|
1711
|
+
loc,
|
|
1712
|
+
},
|
|
1713
|
+
{ kind: "varDecl", localId: "raw.0", init: rawRead, loc },
|
|
1714
|
+
];
|
|
1715
|
+
const rawRef = varRef("raw.0", iv, loc);
|
|
1716
|
+
void utag;
|
|
1717
|
+
innerBody.push(writeFor(varRef("k.0", STRING, loc), rawRef, iv));
|
|
1718
|
+
body.push({
|
|
1719
|
+
kind: "varDecl",
|
|
1720
|
+
localId: "ks.0",
|
|
1721
|
+
init: { kind: "recordOvfKeys", obj: sRef, shapeId, type: ksT, loc },
|
|
1722
|
+
loc,
|
|
1723
|
+
}, countedFor(loc, {
|
|
1724
|
+
kind: "arrIntrinsic",
|
|
1725
|
+
method: "length",
|
|
1726
|
+
receiver: varRef("ks.0", ksT, loc),
|
|
1727
|
+
args: [],
|
|
1728
|
+
type: F64,
|
|
1729
|
+
loc,
|
|
1730
|
+
}, () => innerBody));
|
|
1731
|
+
}
|
|
1732
|
+
body.push({ kind: "return", value: outRef, loc });
|
|
1733
|
+
lowerer.liftedFns.push({
|
|
1734
|
+
name,
|
|
1735
|
+
params: [{ localId: "s.0", name: "s", type: recT }],
|
|
1736
|
+
returnType: arrT,
|
|
1737
|
+
locals,
|
|
1738
|
+
body,
|
|
1739
|
+
loc,
|
|
1740
|
+
});
|
|
1741
|
+
return name;
|
|
1742
|
+
}
|
|
1743
|
+
//# sourceMappingURL=indexed-objects.js.map
|