@scriptc/compiler 0.2.6 → 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 +5 -18
- 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/link-plan-core.d.ts +2 -1
- package/dist/backend/link-plan-core.js +15 -3
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +2 -1
- 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/call-lifetimes.d.ts +15 -3
- package/dist/backend/llvm/call-lifetimes.js +42 -18
- 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 +4 -1
- package/dist/backend/llvm/classes.js +35 -32
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +36 -3
- package/dist/backend/llvm/classes.test.js.map +1 -1
- 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 +19 -3
- package/dist/backend/llvm/constant-callbacks.js +289 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +140 -3
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- 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 +34 -0
- package/dist/backend/llvm/dyn.js +189 -1
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +124 -4
- package/dist/backend/llvm/emitter.js +623 -105
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +68 -6
- 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-calls.js +64 -6
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +16 -5
- 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 +174 -25
- 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 +52 -24
- 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 +11 -0
- package/dist/backend/llvm/integer-remainder.js +91 -0
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +2 -1
- package/dist/backend/llvm/layouts.js +3 -2
- 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-filesystem.js +3 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +5 -1
- package/dist/backend/llvm/local-array-reads.js +78 -17
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +78 -1
- 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/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/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 +69 -2
- package/dist/backend/llvm/shapes.js +259 -27
- 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/stack-callbacks.js +2 -3
- package/dist/backend/llvm/stack-callbacks.js.map +1 -1
- package/dist/backend/llvm/stack-captures.d.ts +3 -1
- package/dist/backend/llvm/stack-captures.js +5 -3
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- 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 +41 -4
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- 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/may-throw.js +3 -0
- 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 +3 -2
- package/dist/backend/native/contracts.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +2 -1
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +5 -0
- package/dist/backend/native-codegen.js +4 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +23 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +3 -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 +3 -1
- package/dist/backend/native-tools.js +0 -1
- 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 +15 -4
- package/dist/backend/runtime-pack-core.js +23 -12
- 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 +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 +115 -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 +2 -2
- package/dist/executable/executable-cache.js +7 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +20 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- 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/builtins/errors.js +17 -2
- package/dist/frontend/lowering/builtins/errors.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/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 +4 -0
- package/dist/frontend/lowering/class-assertions.js +12 -4
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- 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-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 +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +363 -49
- 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/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/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 +138 -32
- 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/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 +1 -0
- 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 +162 -121
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +2 -0
- package/dist/frontend/lowering/lower-classes.js +45 -43
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
- package/dist/frontend/lowering/lower-exprs.js +390 -157
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +32 -19
- 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-modules.js +10 -2
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +46 -58
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +37 -0
- package/dist/frontend/lowering/lowerer.js +283 -18
- 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/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.js +3 -0
- 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/program.d.ts +38 -2
- package/dist/frontend/program.js +440 -59
- 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/type-mapper.d.ts +1 -1
- package/dist/frontend/type-mapper.js +89 -14
- 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/index.js +25 -9
- 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-signatures.js +2 -3
- 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 +78 -15
- package/dist/ir/ir.js +20 -6
- package/dist/ir/ir.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 +118 -20
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +269 -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/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.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/library.d.ts +2 -1
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +27 -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/package.json +20 -20
- package/surface-manifest.json +8 -2
|
@@ -38,6 +38,10 @@ export function isSafeToDiscard(expr) {
|
|
|
38
38
|
case "unionIsTag":
|
|
39
39
|
case "unionWrap":
|
|
40
40
|
return isSafeToDiscard(expr.value);
|
|
41
|
+
case "recordHas":
|
|
42
|
+
return isSafeToDiscard(expr.obj);
|
|
43
|
+
case "fieldAbsent":
|
|
44
|
+
return true;
|
|
41
45
|
// Fresh allocations are unobservable too — only their pieces can
|
|
42
46
|
// carry effects (a spread re-reads its source: pure; element and
|
|
43
47
|
// field initializers recurse).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluation-safety.js","sourceRoot":"","sources":["../../../../src/frontend/lowering/expressions/evaluation-safety.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluation-safety.js","sourceRoot":"","sources":["../../../../src/frontend/lowering/expressions/evaluation-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -1338,6 +1338,68 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1338
1338
|
captured.add(ref);
|
|
1339
1339
|
return ref;
|
|
1340
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
|
+
};
|
|
1341
1403
|
// Field names introduced by conditional spreads: their ternary carries
|
|
1342
1404
|
// the spread's whole evaluation (cond once, value lazily), so a LATER
|
|
1343
1405
|
// contributor overriding one would silently drop that evaluation —
|
|
@@ -1358,8 +1420,7 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1358
1420
|
fields.splice(i--, 1);
|
|
1359
1421
|
continue;
|
|
1360
1422
|
}
|
|
1361
|
-
|
|
1362
|
-
field.value = capture(field.value);
|
|
1423
|
+
field.value = captureField(field.value);
|
|
1363
1424
|
}
|
|
1364
1425
|
}
|
|
1365
1426
|
if (ts.isSpreadAssignment(prop)) {
|
|
@@ -1380,7 +1441,7 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1380
1441
|
}
|
|
1381
1442
|
shapeMismatch(prop);
|
|
1382
1443
|
}
|
|
1383
|
-
const absent = lowerer.
|
|
1444
|
+
const absent = lowerer.absentFieldValue(fieldType, locOf(prop));
|
|
1384
1445
|
if (!absent) {
|
|
1385
1446
|
lowerer.unsupported("SC1090", prop, `conditional spreads onto the required field '${name}' (the empty arm leaves it undefined — declare the field optional)`);
|
|
1386
1447
|
}
|
|
@@ -1469,8 +1530,10 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1469
1530
|
continue;
|
|
1470
1531
|
const lt = laterSpreadType(lowerer, later.expression);
|
|
1471
1532
|
if (lt?.kind === "record") {
|
|
1533
|
+
// A field the later source may lack defines nothing.
|
|
1472
1534
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1473
|
-
|
|
1535
|
+
if (!canLackField(lf.type))
|
|
1536
|
+
laterNames.add(lf.name);
|
|
1474
1537
|
}
|
|
1475
1538
|
continue;
|
|
1476
1539
|
}
|
|
@@ -1520,8 +1583,34 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1520
1583
|
loc: locOf(prop),
|
|
1521
1584
|
};
|
|
1522
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;
|
|
1523
1610
|
if (typeEquals(f.type, targetType)) {
|
|
1524
1611
|
thenVal = fRead();
|
|
1612
|
+
if (canBeAbsent)
|
|
1613
|
+
cond = fieldPresent();
|
|
1525
1614
|
}
|
|
1526
1615
|
else if (f.type.kind === "union" &&
|
|
1527
1616
|
lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0 &&
|
|
@@ -1590,9 +1679,11 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1590
1679
|
throw new PoisonError();
|
|
1591
1680
|
}
|
|
1592
1681
|
thenVal = lowerer.applyWidthLift(lift, fRead(), targetType, locOf(prop));
|
|
1682
|
+
if (canBeAbsent)
|
|
1683
|
+
cond = fieldPresent();
|
|
1593
1684
|
}
|
|
1594
1685
|
const at = fields.findIndex((x) => x.name === f.name && !x.drop);
|
|
1595
|
-
const elseVal = at >= 0 ? fields[at].value : lowerer.
|
|
1686
|
+
const elseVal = at >= 0 ? fields[at].value : lowerer.absentFieldValue(targetType, locOf(prop));
|
|
1596
1687
|
if (!elseVal) {
|
|
1597
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 })`);
|
|
1598
1689
|
}
|
|
@@ -1637,8 +1728,10 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1637
1728
|
continue;
|
|
1638
1729
|
const lt = laterSpreadType(lowerer, later.expression);
|
|
1639
1730
|
if (lt?.kind === "record") {
|
|
1731
|
+
// A field the later source may lack defines nothing.
|
|
1640
1732
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1641
|
-
|
|
1733
|
+
if (!canLackField(lf.type))
|
|
1734
|
+
laterNames.add(lf.name);
|
|
1642
1735
|
}
|
|
1643
1736
|
continue;
|
|
1644
1737
|
}
|
|
@@ -1721,6 +1814,32 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1721
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)`);
|
|
1722
1815
|
}
|
|
1723
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
|
+
}
|
|
1724
1843
|
if (at >= 0)
|
|
1725
1844
|
fields[at] = { name: f.name, value };
|
|
1726
1845
|
else
|
|
@@ -1909,10 +2028,10 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1909
2028
|
fields.splice(at, 1);
|
|
1910
2029
|
fields.push({ name, value });
|
|
1911
2030
|
}
|
|
1912
|
-
// Optional fields may be omitted: the
|
|
1913
|
-
//
|
|
1914
|
-
//
|
|
1915
|
-
//
|
|
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.
|
|
1916
2035
|
// A REQUIRED missing field keeps the shape-mismatch rejection (possible
|
|
1917
2036
|
// through `as`: the cast smuggles a narrower literal past freshness).
|
|
1918
2037
|
if (droppedNames.size > 0) {
|
|
@@ -1936,7 +2055,7 @@ export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
|
1936
2055
|
const absentHandle = f.type.kind === "jsval" && optional
|
|
1937
2056
|
? { kind: "jsOp", op: "undefLit", args: [], type: JSVAL, loc }
|
|
1938
2057
|
: null;
|
|
1939
|
-
const absent = lowerer.
|
|
2058
|
+
const absent = lowerer.absentFieldValue(f.type, loc) ??
|
|
1940
2059
|
(f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null) ??
|
|
1941
2060
|
absentHandle;
|
|
1942
2061
|
if (!absent)
|
|
@@ -2190,8 +2309,8 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
2190
2309
|
fenceAccessorSpreadSource(lowerer, prop, srcShape);
|
|
2191
2310
|
srcs.push({ value, shapeId: value.type.shapeId, shape: srcShape });
|
|
2192
2311
|
}
|
|
2193
|
-
// Every target field must be optional:
|
|
2194
|
-
//
|
|
2312
|
+
// Every target field must be optional: keys no source supplies stay
|
|
2313
|
+
// absent.
|
|
2195
2314
|
for (const f of shape.fields) {
|
|
2196
2315
|
if (f.type.kind !== "union" || lowerer.armTag(f.type.unionId, UNDEFINED_T) < 0) {
|
|
2197
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)`);
|
|
@@ -2309,7 +2428,7 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
2309
2428
|
kind: "recordLit",
|
|
2310
2429
|
fields: shape.fields.map((f) => ({
|
|
2311
2430
|
name: f.name,
|
|
2312
|
-
value: lowerer.
|
|
2431
|
+
value: lowerer.absentFieldValue(f.type, loc),
|
|
2313
2432
|
})),
|
|
2314
2433
|
type,
|
|
2315
2434
|
loc,
|
|
@@ -2365,26 +2484,13 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
2365
2484
|
value: lowerer.applyWidthLift(lift, raw, target.type, loc),
|
|
2366
2485
|
loc,
|
|
2367
2486
|
};
|
|
2368
|
-
// Optional declared fields
|
|
2487
|
+
// Optional declared fields copy only when present (an explicit
|
|
2488
|
+
// undefined is a real property and overwrites an earlier value).
|
|
2369
2489
|
// A dyn field, including a present undefined, is a real property;
|
|
2370
2490
|
// its checked conversion runs and can overwrite an earlier value.
|
|
2371
|
-
const
|
|
2372
|
-
if (
|
|
2373
|
-
body.push({
|
|
2374
|
-
kind: "if",
|
|
2375
|
-
cond: {
|
|
2376
|
-
kind: "unionIsTag",
|
|
2377
|
-
unionId: field.type.unionId,
|
|
2378
|
-
tag: absent,
|
|
2379
|
-
negated: true,
|
|
2380
|
-
value: raw,
|
|
2381
|
-
type: BOOL,
|
|
2382
|
-
loc,
|
|
2383
|
-
},
|
|
2384
|
-
then: [write],
|
|
2385
|
-
else_: null,
|
|
2386
|
-
loc,
|
|
2387
|
-
});
|
|
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 });
|
|
2388
2494
|
}
|
|
2389
2495
|
else
|
|
2390
2496
|
body.push(write);
|