@scriptc/compiler 0.2.5 → 0.2.7
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 +62 -48
- package/dist/backend/cycle-analysis.d.ts +21 -9
- package/dist/backend/cycle-analysis.js +139 -67
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +283 -3
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +39 -0
- package/dist/backend/cycle-mutability.js +205 -0
- package/dist/backend/cycle-mutability.js.map +1 -0
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +4 -1
- package/dist/backend/link-plan-core.js +16 -3
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +3 -1
- package/dist/backend/link-plan.js +3 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +40 -0
- package/dist/backend/llvm/alloc.js +205 -0
- package/dist/backend/llvm/alloc.js.map +1 -0
- package/dist/backend/llvm/alloc.test.d.ts +1 -0
- package/dist/backend/llvm/alloc.test.js +102 -0
- package/dist/backend/llvm/alloc.test.js.map +1 -0
- package/dist/backend/llvm/byte-numbers.js +32 -4
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/byte-windows.d.ts +31 -0
- package/dist/backend/llvm/byte-windows.js +334 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -0
- package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
- package/dist/backend/llvm/byte-windows.test.js +244 -0
- package/dist/backend/llvm/byte-windows.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +17 -5
- package/dist/backend/llvm/call-lifetimes.js +58 -24
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +170 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +18 -2
- package/dist/backend/llvm/classes.js +115 -41
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.d.ts +1 -0
- package/dist/backend/llvm/classes.test.js +132 -0
- package/dist/backend/llvm/classes.test.js.map +1 -0
- package/dist/backend/llvm/common.d.ts +13 -0
- package/dist/backend/llvm/common.js +30 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +27 -0
- package/dist/backend/llvm/constant-callbacks.js +450 -0
- package/dist/backend/llvm/constant-callbacks.js.map +1 -0
- package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
- package/dist/backend/llvm/constant-callbacks.test.js +261 -0
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
- package/dist/backend/llvm/dense-array-access.d.ts +29 -0
- package/dist/backend/llvm/dense-array-access.js +335 -0
- package/dist/backend/llvm/dense-array-access.js.map +1 -0
- package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-access.test.js +149 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +35 -1
- package/dist/backend/llvm/dyn.js +196 -35
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +143 -4
- package/dist/backend/llvm/emitter.js +882 -136
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +82 -14
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +58 -4
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.d.ts +1 -0
- package/dist/backend/llvm/expr-async.test.js +62 -0
- package/dist/backend/llvm/expr-async.test.js.map +1 -0
- package/dist/backend/llvm/expr-bytes.js +11 -0
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +151 -25
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +37 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +92 -2
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +210 -28
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +58 -23
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.js +3 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +59 -2
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/integer-remainder.d.ts +18 -0
- package/dist/backend/llvm/integer-remainder.js +117 -0
- package/dist/backend/llvm/integer-remainder.js.map +1 -0
- package/dist/backend/llvm/layouts.d.ts +2 -1
- package/dist/backend/llvm/layouts.js +4 -3
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +16 -0
- package/dist/backend/llvm/lazy-captures.js +96 -0
- package/dist/backend/llvm/lazy-captures.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
- package/dist/backend/llvm/lazy-captures.test.js +78 -0
- package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
- package/dist/backend/llvm/lib-abi.js +7 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +7 -22
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +3 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +15 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +13 -3
- package/dist/backend/llvm/local-array-reads.js +159 -77
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +105 -4
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +5 -1
- package/dist/backend/llvm/local-union-storage.js +48 -6
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +91 -4
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
- package/dist/backend/llvm/loop-array-borrows.js +70 -0
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
- package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
- package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
- package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
- package/dist/backend/llvm/map-read-lifetimes.js +20 -5
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
- package/dist/backend/llvm/nullable-fields.d.ts +28 -0
- package/dist/backend/llvm/nullable-fields.js +45 -0
- package/dist/backend/llvm/nullable-fields.js.map +1 -0
- package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-fields.test.js +48 -0
- package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
- package/dist/backend/llvm/reference-effects.d.ts +2 -1
- package/dist/backend/llvm/reference-effects.js +7 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +73 -3
- package/dist/backend/llvm/shapes.js +281 -34
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +114 -5
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.d.ts +48 -0
- package/dist/backend/llvm/split-loops.js +183 -0
- package/dist/backend/llvm/split-loops.js.map +1 -0
- package/dist/backend/llvm/split.js +0 -7
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +66 -2
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
- package/dist/backend/llvm/stack-callbacks.js +72 -0
- package/dist/backend/llvm/stack-callbacks.js.map +1 -0
- package/dist/backend/llvm/stack-captures.d.ts +27 -0
- package/dist/backend/llvm/stack-captures.js +152 -0
- package/dist/backend/llvm/stack-captures.js.map +1 -0
- package/dist/backend/llvm/stack-unions.test.js +38 -1
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-key-hash.d.ts +8 -0
- package/dist/backend/llvm/string-key-hash.js +59 -0
- package/dist/backend/llvm/string-key-hash.js.map +1 -0
- package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
- package/dist/backend/llvm/string-key-hash.test.js +34 -0
- package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +48 -7
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +20 -0
- package/dist/backend/llvm/string-slices.js +87 -0
- package/dist/backend/llvm/string-slices.js.map +1 -0
- package/dist/backend/llvm/string-slices.test.d.ts +1 -0
- package/dist/backend/llvm/string-slices.test.js +98 -0
- package/dist/backend/llvm/string-slices.test.js.map +1 -0
- package/dist/backend/llvm/switch-dispatch.js +1 -1
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +2 -2
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +4 -14
- package/dist/backend/llvm/walkers.js +53 -311
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +4 -1
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +1 -1
- package/dist/backend/native/cache-warm.d.ts +2 -1
- package/dist/backend/native/cache-warm.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -2
- package/dist/backend/native/contracts.js.map +1 -1
- package/dist/backend/native/executable.js +12 -4
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +3 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +7 -0
- package/dist/backend/native-codegen-core.js +21 -0
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +9 -0
- package/dist/backend/native-codegen.js +38 -18
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +70 -2
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -2
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.d.ts +2 -1
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +2 -2
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +6 -2
- package/dist/backend/native-tools.js +6 -5
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/optimization.d.ts +25 -0
- package/dist/backend/optimization.js +21 -0
- package/dist/backend/optimization.js.map +1 -0
- package/dist/backend/optimization.test.d.ts +1 -0
- package/dist/backend/optimization.test.js +24 -0
- package/dist/backend/optimization.test.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +16 -4
- package/dist/backend/runtime-pack-core.js +31 -13
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +7 -3
- package/dist/backend/runtime-pack-native.js +0 -3
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +41 -4
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +20 -2
- package/dist/backend/runtime-pack.js +23 -0
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +125 -2
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/targets.d.ts +2 -1
- package/dist/backend/targets.js +1 -1
- package/dist/backend/targets.js.map +1 -1
- package/dist/cli/command.js +5 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +2 -1
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +5 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +5 -2
- package/dist/diagnostics/diagnostic.js +10 -8
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -2
- package/dist/executable/executable-cache.js +8 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +35 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/fork-target.d.ts +5 -0
- package/dist/frontend/fork-target.js +40 -8
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.d.ts +1 -0
- package/dist/frontend/fork-target.test.js +59 -0
- package/dist/frontend/fork-target.test.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.js +5 -49
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +23 -0
- package/dist/frontend/lowering/array-values.js +129 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.d.ts +2 -11
- package/dist/frontend/lowering/builtins/atomics.js +64 -28
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +17 -2
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +3 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +51 -4
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +6 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +6 -17
- package/dist/frontend/lowering/builtins/process.js +56 -29
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
- package/dist/frontend/lowering/builtins/workers.js +65 -0
- package/dist/frontend/lowering/builtins/workers.js.map +1 -0
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
- package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-assertions.d.ts +11 -0
- package/dist/frontend/lowering/class-assertions.js +104 -0
- package/dist/frontend/lowering/class-assertions.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
- package/dist/frontend/lowering/class-callbacks.js +18 -5
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
- package/dist/frontend/lowering/class-method-mutations.js +472 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.js +25 -5
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +17 -0
- package/dist/frontend/lowering/class-protocols.js +126 -0
- package/dist/frontend/lowering/class-protocols.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.js +8 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-unions.d.ts +16 -0
- package/dist/frontend/lowering/class-unions.js +127 -0
- package/dist/frontend/lowering/class-unions.js.map +1 -0
- package/dist/frontend/lowering/coercions/builders.js +8 -1
- package/dist/frontend/lowering/coercions/builders.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
- package/dist/frontend/lowering/coercions/identity.js +26 -0
- package/dist/frontend/lowering/coercions/identity.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural.js +9 -6
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
- package/dist/frontend/lowering/collection-narrowing.js +31 -0
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -12
- package/dist/frontend/lowering/containers/array-callbacks.js +415 -136
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-concat.js +130 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
- package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
- package/dist/frontend/lowering/containers/array-construction.js +95 -3
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
- package/dist/frontend/lowering/containers/array-methods.js +43 -132
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +12 -34
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +10 -1
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +22 -3
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
- package/dist/frontend/lowering/cycle-initialization.js +277 -0
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +140 -38
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
- package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +2 -5
- package/dist/frontend/lowering/generic-functions.js +13 -10
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
- package/dist/frontend/lowering/instantiation-path.js +10 -0
- package/dist/frontend/lowering/instantiation-path.js.map +1 -0
- package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
- package/dist/frontend/lowering/instantiation-path.test.js +23 -0
- package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
- package/dist/frontend/lowering/iterator-adapters.js +605 -0
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-array-sort.js +44 -5
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +7 -0
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +12 -7
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +3 -3
- package/dist/frontend/lowering/lower-calls.js +198 -124
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +7 -0
- package/dist/frontend/lowering/lower-classes.js +166 -96
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
- package/dist/frontend/lowering/lower-exprs.js +421 -167
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +1 -1
- package/dist/frontend/lowering/lower-functions.js +33 -20
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +26 -2
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +1 -1
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.js +54 -11
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +59 -69
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +1 -1
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +50 -1
- package/dist/frontend/lowering/lowerer.js +333 -26
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +3 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/split-consumers.d.ts +7 -0
- package/dist/frontend/lowering/split-consumers.js +64 -0
- package/dist/frontend/lowering/split-consumers.js.map +1 -0
- package/dist/frontend/lowering/strict-equality.d.ts +9 -0
- package/dist/frontend/lowering/strict-equality.js +116 -0
- package/dist/frontend/lowering/strict-equality.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -4
- package/dist/frontend/lowering/surfaces.js +38 -7
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-comparison.d.ts +5 -0
- package/dist/frontend/lowering/union-comparison.js +47 -0
- package/dist/frontend/lowering/union-comparison.js.map +1 -0
- package/dist/frontend/module-source-candidates.d.ts +10 -0
- package/dist/frontend/module-source-candidates.js +40 -0
- package/dist/frontend/module-source-candidates.js.map +1 -0
- package/dist/frontend/module-source-candidates.test.d.ts +1 -0
- package/dist/frontend/module-source-candidates.test.js +53 -0
- package/dist/frontend/module-source-candidates.test.js.map +1 -0
- package/dist/frontend/pipeline.js +2 -2
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +2 -0
- package/dist/frontend/program-analysis.js +2 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +38 -2
- package/dist/frontend/program.js +457 -88
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +59 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/ts7/ast-node.js +6 -8
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +42 -1
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -0
- package/dist/frontend/ts7/ast-wire.js +28 -0
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +2 -1
- package/dist/frontend/ts7/ast.js +8 -4
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +8 -2
- package/dist/frontend/ts7/checker.js +41 -5
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +42 -0
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +26 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +29 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +4 -1
- package/dist/frontend/type-mapper.js +133 -16
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +15 -3
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/worker-target.d.ts +6 -0
- package/dist/frontend/worker-target.js +108 -0
- package/dist/frontend/worker-target.js.map +1 -0
- package/dist/frontend/worker-target.test.d.ts +1 -0
- package/dist/frontend/worker-target.test.js +71 -0
- package/dist/frontend/worker-target.test.js.map +1 -0
- package/dist/index.js +47 -14
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +3 -1
- package/dist/ir/analysis.js +4 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/builtin-effects.js +12 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +15 -15
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/ir.d.ts +85 -23
- package/dist/ir/ir.js +20 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/numeric-call-specialization.d.ts +8 -0
- package/dist/ir/numeric-call-specialization.js +198 -0
- package/dist/ir/numeric-call-specialization.js.map +1 -0
- package/dist/ir/runtime-features.js +4 -3
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +3 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +8 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +207 -43
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +356 -8
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/ir-policy.js +2 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +2 -1
- package/dist/library/library-profile.js +4 -3
- package/dist/library/library-profile.js.map +1 -1
- package/dist/native/compiler.js +24 -11
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +7 -3
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/library.d.ts +2 -1
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +29 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.d.ts +3 -2
- package/dist/native/sanitizer.js +3 -13
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +37 -3
|
@@ -321,9 +321,7 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
321
321
|
flushFields();
|
|
322
322
|
hasAccessors = true;
|
|
323
323
|
acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
324
|
-
|
|
325
|
-
lowerer.rejectThisInObjectMethod(prop.body ?? prop);
|
|
326
|
-
const fn = lowerer.lowerLambda(prop);
|
|
324
|
+
const fn = lowerer.lowerLambda(prop, true);
|
|
327
325
|
const descriptor = {
|
|
328
326
|
kind: "dynObjLit",
|
|
329
327
|
type: DYN,
|
|
@@ -370,9 +368,7 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
370
368
|
const propDiagsBefore = lowerer.diags.length;
|
|
371
369
|
try {
|
|
372
370
|
const lowerValue = () => ts.isMethodDeclaration(prop)
|
|
373
|
-
?
|
|
374
|
-
? lowerer.lowerLambda(prop)
|
|
375
|
-
: (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop))
|
|
371
|
+
? lowerer.lowerLambda(prop, true)
|
|
376
372
|
: !boxValue && ts.isObjectLiteralExpression(valueExpr)
|
|
377
373
|
? lowerer.lowerExprExpecting(valueExpr, DYN)
|
|
378
374
|
: lowerer.lowerExpr(valueExpr);
|
|
@@ -1342,6 +1338,68 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1342
1338
|
captured.add(ref);
|
|
1343
1339
|
return ref;
|
|
1344
1340
|
};
|
|
1341
|
+
// A pending field value may carry the ABSENT state (an omitted
|
|
1342
|
+
// conditional-spread arm, a spread source lacking the key). That state
|
|
1343
|
+
// only lives in a field slot, so a snapshot splits the value into a
|
|
1344
|
+
// captured ordinary value and a pure presence test over captured
|
|
1345
|
+
// conditions, then rebuilds `present ? value : absent` (arms stay lazy:
|
|
1346
|
+
// the captured value keeps the original ternary structure).
|
|
1347
|
+
const canLackField = (t) => t.kind === "union" && lowerer.armTag(t.unionId, UNDEFINED_T) >= 0;
|
|
1348
|
+
const containsAbsent = (value) => value.kind === "fieldAbsent" ||
|
|
1349
|
+
(value.kind === "ternary" && (containsAbsent(value.then) || containsAbsent(value.else_)));
|
|
1350
|
+
const captureField = (value) => {
|
|
1351
|
+
if (captured.has(value))
|
|
1352
|
+
return value;
|
|
1353
|
+
if (!containsAbsent(value))
|
|
1354
|
+
return capture(value);
|
|
1355
|
+
if (value.kind === "fieldAbsent")
|
|
1356
|
+
return value;
|
|
1357
|
+
const split = (v) => {
|
|
1358
|
+
if (v.kind === "fieldAbsent") {
|
|
1359
|
+
return {
|
|
1360
|
+
value: lowerer.wrappedUndefined(v.type, v.loc),
|
|
1361
|
+
present: { kind: "boolLit", value: false, type: BOOL, loc: v.loc },
|
|
1362
|
+
};
|
|
1363
|
+
}
|
|
1364
|
+
if (v.kind === "ternary" && containsAbsent(v)) {
|
|
1365
|
+
// Conditions snapshot here too. Nested conditions come from the
|
|
1366
|
+
// spread desugar's own presence tests over captured sources, so
|
|
1367
|
+
// evaluating them eagerly is unobservable.
|
|
1368
|
+
const cond = v.cond.kind === "varRef" || v.cond.kind === "boolLit" ? v.cond : capture(v.cond);
|
|
1369
|
+
const t = split(v.then);
|
|
1370
|
+
const e = split(v.else_);
|
|
1371
|
+
return {
|
|
1372
|
+
value: { ...v, cond, then: t.value, else_: e.value },
|
|
1373
|
+
present: {
|
|
1374
|
+
kind: "ternary",
|
|
1375
|
+
cond,
|
|
1376
|
+
then: t.present,
|
|
1377
|
+
else_: e.present,
|
|
1378
|
+
type: BOOL,
|
|
1379
|
+
loc: v.loc,
|
|
1380
|
+
},
|
|
1381
|
+
};
|
|
1382
|
+
}
|
|
1383
|
+
return { value: v, present: { kind: "boolLit", value: true, type: BOOL, loc: v.loc } };
|
|
1384
|
+
};
|
|
1385
|
+
const parts = split(value);
|
|
1386
|
+
const ref = capture(parts.value);
|
|
1387
|
+
const out = {
|
|
1388
|
+
kind: "ternary",
|
|
1389
|
+
cond: parts.present,
|
|
1390
|
+
then: ref,
|
|
1391
|
+
else_: {
|
|
1392
|
+
kind: "fieldAbsent",
|
|
1393
|
+
unionId: value.type.unionId,
|
|
1394
|
+
type: value.type,
|
|
1395
|
+
loc: value.loc,
|
|
1396
|
+
},
|
|
1397
|
+
type: value.type,
|
|
1398
|
+
loc: value.loc,
|
|
1399
|
+
};
|
|
1400
|
+
captured.add(out);
|
|
1401
|
+
return out;
|
|
1402
|
+
};
|
|
1345
1403
|
// Field names introduced by conditional spreads: their ternary carries
|
|
1346
1404
|
// the spread's whole evaluation (cond once, value lazily), so a LATER
|
|
1347
1405
|
// contributor overriding one would silently drop that evaluation —
|
|
@@ -1362,8 +1420,7 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1362
1420
|
fields.splice(i--, 1);
|
|
1363
1421
|
continue;
|
|
1364
1422
|
}
|
|
1365
|
-
|
|
1366
|
-
field.value = capture(field.value);
|
|
1423
|
+
field.value = captureField(field.value);
|
|
1367
1424
|
}
|
|
1368
1425
|
}
|
|
1369
1426
|
if (ts.isSpreadAssignment(prop)) {
|
|
@@ -1384,7 +1441,7 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1384
1441
|
}
|
|
1385
1442
|
shapeMismatch(prop);
|
|
1386
1443
|
}
|
|
1387
|
-
const absent = lowerer.
|
|
1444
|
+
const absent = lowerer.absentFieldValue(fieldType, locOf(prop));
|
|
1388
1445
|
if (!absent) {
|
|
1389
1446
|
lowerer.unsupported("SC1090", prop, `conditional spreads onto the required field '${name}' (the empty arm leaves it undefined — declare the field optional)`);
|
|
1390
1447
|
}
|
|
@@ -1473,8 +1530,10 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1473
1530
|
continue;
|
|
1474
1531
|
const lt = laterSpreadType(lowerer, later.expression);
|
|
1475
1532
|
if (lt?.kind === "record") {
|
|
1533
|
+
// A field the later source may lack defines nothing.
|
|
1476
1534
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1477
|
-
|
|
1535
|
+
if (!canLackField(lf.type))
|
|
1536
|
+
laterNames.add(lf.name);
|
|
1478
1537
|
}
|
|
1479
1538
|
continue;
|
|
1480
1539
|
}
|
|
@@ -1524,8 +1583,34 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1524
1583
|
loc: locOf(prop),
|
|
1525
1584
|
};
|
|
1526
1585
|
let thenVal;
|
|
1586
|
+
// A source field that can be absent copies only when present.
|
|
1587
|
+
const fieldPresent = () => ({
|
|
1588
|
+
kind: "logical",
|
|
1589
|
+
op: "&&",
|
|
1590
|
+
left: cond,
|
|
1591
|
+
right: {
|
|
1592
|
+
kind: "recordHas",
|
|
1593
|
+
obj: {
|
|
1594
|
+
kind: "unionNarrow",
|
|
1595
|
+
unionId: srcType.unionId,
|
|
1596
|
+
tag: recTag,
|
|
1597
|
+
value: srcRef(),
|
|
1598
|
+
type: recArm,
|
|
1599
|
+
loc: locOf(prop),
|
|
1600
|
+
},
|
|
1601
|
+
shapeId: recArm.shapeId,
|
|
1602
|
+
field: f.name,
|
|
1603
|
+
type: BOOL,
|
|
1604
|
+
loc: locOf(prop),
|
|
1605
|
+
},
|
|
1606
|
+
type: BOOL,
|
|
1607
|
+
loc: locOf(prop),
|
|
1608
|
+
});
|
|
1609
|
+
const canBeAbsent = f.type.kind === "union" && lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0;
|
|
1527
1610
|
if (typeEquals(f.type, targetType)) {
|
|
1528
1611
|
thenVal = fRead();
|
|
1612
|
+
if (canBeAbsent)
|
|
1613
|
+
cond = fieldPresent();
|
|
1529
1614
|
}
|
|
1530
1615
|
else if (f.type.kind === "union" &&
|
|
1531
1616
|
lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0 &&
|
|
@@ -1594,9 +1679,11 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1594
1679
|
throw new PoisonError();
|
|
1595
1680
|
}
|
|
1596
1681
|
thenVal = lowerer.applyWidthLift(lift, fRead(), targetType, locOf(prop));
|
|
1682
|
+
if (canBeAbsent)
|
|
1683
|
+
cond = fieldPresent();
|
|
1597
1684
|
}
|
|
1598
1685
|
const at = fields.findIndex((x) => x.name === f.name && !x.drop);
|
|
1599
|
-
const elseVal = at >= 0 ? fields[at].value : lowerer.
|
|
1686
|
+
const elseVal = at >= 0 ? fields[at].value : lowerer.absentFieldValue(targetType, locOf(prop));
|
|
1600
1687
|
if (!elseVal) {
|
|
1601
1688
|
lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(srcType)}' sources where '${f.name}' has no earlier contributor (the absent arm leaves the required field unset — spread defaults first: { ...defaults, ...overrides })`);
|
|
1602
1689
|
}
|
|
@@ -1641,8 +1728,10 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1641
1728
|
continue;
|
|
1642
1729
|
const lt = laterSpreadType(lowerer, later.expression);
|
|
1643
1730
|
if (lt?.kind === "record") {
|
|
1731
|
+
// A field the later source may lack defines nothing.
|
|
1644
1732
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1645
|
-
|
|
1733
|
+
if (!canLackField(lf.type))
|
|
1734
|
+
laterNames.add(lf.name);
|
|
1646
1735
|
}
|
|
1647
1736
|
continue;
|
|
1648
1737
|
}
|
|
@@ -1725,6 +1814,32 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1725
1814
|
lowerer.unsupported("SC1090", prop, `spread of '${f.name}' over an earlier conditional spread (the desugar keeps one entry per name — restructure so each name has one contributor)`);
|
|
1726
1815
|
}
|
|
1727
1816
|
const at = fields.findIndex((x) => x.name === f.name);
|
|
1817
|
+
// A source field that can be absent copies only when present: an
|
|
1818
|
+
// absent one keeps the earlier contributor's value, or leaves the
|
|
1819
|
+
// target field absent.
|
|
1820
|
+
const canBeAbsent = f.type.kind === "union" && lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0;
|
|
1821
|
+
if (canBeAbsent) {
|
|
1822
|
+
const present = obj.type.kind === "dyn"
|
|
1823
|
+
? {
|
|
1824
|
+
kind: "dynHasKey",
|
|
1825
|
+
key: f.name,
|
|
1826
|
+
value: obj,
|
|
1827
|
+
type: BOOL,
|
|
1828
|
+
loc: locOf(prop),
|
|
1829
|
+
}
|
|
1830
|
+
: lowerer.recordFieldPresent(obj, srcType.shapeId, f.name, locOf(prop));
|
|
1831
|
+
const otherwise = at >= 0 ? fields[at].value : lowerer.absentFieldValue(targetType, locOf(prop));
|
|
1832
|
+
if (otherwise) {
|
|
1833
|
+
value = {
|
|
1834
|
+
kind: "ternary",
|
|
1835
|
+
cond: present,
|
|
1836
|
+
then: value,
|
|
1837
|
+
else_: otherwise,
|
|
1838
|
+
type: targetType,
|
|
1839
|
+
loc: locOf(prop),
|
|
1840
|
+
};
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1728
1843
|
if (at >= 0)
|
|
1729
1844
|
fields[at] = { name: f.name, value };
|
|
1730
1845
|
else
|
|
@@ -1913,10 +2028,10 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1913
2028
|
fields.splice(at, 1);
|
|
1914
2029
|
fields.push({ name, value });
|
|
1915
2030
|
}
|
|
1916
|
-
// Optional fields may be omitted: the
|
|
1917
|
-
//
|
|
1918
|
-
//
|
|
1919
|
-
//
|
|
2031
|
+
// Optional fields may be omitted: the field holds its ABSENT state (it
|
|
2032
|
+
// reads as undefined but is not an own property) or, for an island
|
|
2033
|
+
// handle slot, the engine's undefined cell. tsc rejects omission of
|
|
2034
|
+
// required fields before lowering.
|
|
1920
2035
|
// A REQUIRED missing field keeps the shape-mismatch rejection (possible
|
|
1921
2036
|
// through `as`: the cast smuggles a narrower literal past freshness).
|
|
1922
2037
|
if (droppedNames.size > 0) {
|
|
@@ -1940,7 +2055,7 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1940
2055
|
const absentHandle = f.type.kind === "jsval" && optional
|
|
1941
2056
|
? { kind: "jsOp", op: "undefLit", args: [], type: JSVAL, loc }
|
|
1942
2057
|
: null;
|
|
1943
|
-
const absent = lowerer.
|
|
2058
|
+
const absent = lowerer.absentFieldValue(f.type, loc) ??
|
|
1944
2059
|
(f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null) ??
|
|
1945
2060
|
absentHandle;
|
|
1946
2061
|
if (!absent)
|
|
@@ -2194,8 +2309,8 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
2194
2309
|
fenceAccessorSpreadSource(lowerer, prop, srcShape);
|
|
2195
2310
|
srcs.push({ value, shapeId: value.type.shapeId, shape: srcShape });
|
|
2196
2311
|
}
|
|
2197
|
-
// Every target field must be optional:
|
|
2198
|
-
//
|
|
2312
|
+
// Every target field must be optional: keys no source supplies stay
|
|
2313
|
+
// absent.
|
|
2199
2314
|
for (const f of shape.fields) {
|
|
2200
2315
|
if (f.type.kind !== "union" || lowerer.armTag(f.type.unionId, UNDEFINED_T) < 0) {
|
|
2201
2316
|
lowerer.unsupported("SC1090", expr, `object spread of runtime-keyed sources onto the required field '${f.name}' (the keys decide presence at runtime — declare the field optional or spell it explicitly)`);
|
|
@@ -2313,7 +2428,7 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
2313
2428
|
kind: "recordLit",
|
|
2314
2429
|
fields: shape.fields.map((f) => ({
|
|
2315
2430
|
name: f.name,
|
|
2316
|
-
value: lowerer.
|
|
2431
|
+
value: lowerer.absentFieldValue(f.type, loc),
|
|
2317
2432
|
})),
|
|
2318
2433
|
type,
|
|
2319
2434
|
loc,
|
|
@@ -2369,26 +2484,13 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
2369
2484
|
value: lowerer.applyWidthLift(lift, raw, target.type, loc),
|
|
2370
2485
|
loc,
|
|
2371
2486
|
};
|
|
2372
|
-
// Optional declared fields
|
|
2487
|
+
// Optional declared fields copy only when present (an explicit
|
|
2488
|
+
// undefined is a real property and overwrites an earlier value).
|
|
2373
2489
|
// A dyn field, including a present undefined, is a real property;
|
|
2374
2490
|
// its checked conversion runs and can overwrite an earlier value.
|
|
2375
|
-
const
|
|
2376
|
-
if (
|
|
2377
|
-
body.push({
|
|
2378
|
-
kind: "if",
|
|
2379
|
-
cond: {
|
|
2380
|
-
kind: "unionIsTag",
|
|
2381
|
-
unionId: field.type.unionId,
|
|
2382
|
-
tag: absent,
|
|
2383
|
-
negated: true,
|
|
2384
|
-
value: raw,
|
|
2385
|
-
type: BOOL,
|
|
2386
|
-
loc,
|
|
2387
|
-
},
|
|
2388
|
-
then: [write],
|
|
2389
|
-
else_: null,
|
|
2390
|
-
loc,
|
|
2391
|
-
});
|
|
2491
|
+
const present = lowerer.recordFieldPresent(receiver, source.shapeId, field.name, loc);
|
|
2492
|
+
if (present.kind === "recordHas") {
|
|
2493
|
+
body.push({ kind: "if", cond: present, then: [write], else_: null, loc });
|
|
2392
2494
|
}
|
|
2393
2495
|
else
|
|
2394
2496
|
body.push(write);
|