@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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
|
|
2
|
+
import { lowerArrayCallbackCall } from "./containers/array-callback-call.js";
|
|
1
3
|
/** Dispatch source calls, builtin members and receiver-specific operations.
|
|
2
4
|
* Signature collection, argument completion and function bodies have their
|
|
3
5
|
* own owners; this module selects the applicable call path. */
|
|
@@ -24,6 +26,7 @@ import { lowerGroupByStaticCall } from "./containers/collection-grouping.js";
|
|
|
24
26
|
import { lowerIteratorHelperCall } from "./containers/iterator-helpers.js";
|
|
25
27
|
import { lowerObjectAssignIndexShape, lowerObjectConstructor, lowerObjectFromEntriesCall, lowerObjectIterOverIndexShape, } from "./containers/indexed-objects.js";
|
|
26
28
|
import { lowerTupleReadMethodCall } from "./containers/array-methods.js";
|
|
29
|
+
import { tryFuseIndexRead } from "./array-values.js";
|
|
27
30
|
import { lowerBytesStaticCall } from "./containers/bytes.js";
|
|
28
31
|
import { lowerRegexMethodCall, lowerStringIndexCall, lowerStringMethodCall, lowerStringPaddingCall, lowerStringSplitCall, } from "./containers/string-and-regexp.js";
|
|
29
32
|
import { createRequireSpecOf } from "./builtins/module-bindings.js";
|
|
@@ -1143,6 +1146,23 @@ export function lowerCall(lowerer, expr) {
|
|
|
1143
1146
|
if (sig && !(jsSpreadArgs && spreadNeedsRuntimeArity(lowerer, sig.params, expr.arguments))) {
|
|
1144
1147
|
lowerer.noteEdge(sig.name);
|
|
1145
1148
|
const args = lowerer.completeArgs(expr.arguments, sig.params, loc, expr);
|
|
1149
|
+
const symbol = lowerer.resolveValueSymbol(expr.expression);
|
|
1150
|
+
const declaration = symbol ? lowerer.checker.valueDeclarationOf(symbol) : undefined;
|
|
1151
|
+
// A bare call supplies undefined as this, even inside a callback
|
|
1152
|
+
// currently carrying a receiver. The value-call ABI saves and
|
|
1153
|
+
// restores that ambient receiver around the function invocation.
|
|
1154
|
+
if (declaration &&
|
|
1155
|
+
ts.isFunctionDeclaration(declaration) &&
|
|
1156
|
+
declaration.parameters.some(isThisParameter)) {
|
|
1157
|
+
const callee = lowerer.lowerExpr(expr.expression);
|
|
1158
|
+
return reconcileOverloadReturn(lowerer, expr, {
|
|
1159
|
+
kind: "callValue",
|
|
1160
|
+
callee,
|
|
1161
|
+
args,
|
|
1162
|
+
type: sig.returnType,
|
|
1163
|
+
loc,
|
|
1164
|
+
});
|
|
1165
|
+
}
|
|
1146
1166
|
return reconcileOverloadReturn(lowerer, expr, {
|
|
1147
1167
|
kind: "call",
|
|
1148
1168
|
callee: sig.name,
|
|
@@ -1573,6 +1593,11 @@ export function lowerCall(lowerer, expr) {
|
|
|
1573
1593
|
!symbolFieldInfo(lowerer, expr.expression)) {
|
|
1574
1594
|
const access = expr.expression;
|
|
1575
1595
|
const value = tryLowerExpression(lowerer, access.expression);
|
|
1596
|
+
if (value?.type.kind === "array" && !isJsSourceFile(expr.getSourceFile())) {
|
|
1597
|
+
const callback = lowerArrayCallbackCall(lowerer, expr, access, value);
|
|
1598
|
+
if (callback)
|
|
1599
|
+
return callback;
|
|
1600
|
+
}
|
|
1576
1601
|
if (value?.type.kind === "dyn" ||
|
|
1577
1602
|
value?.type.kind === "generator" ||
|
|
1578
1603
|
(value &&
|
|
@@ -1996,6 +2021,23 @@ function lowerNumberConstructorValue(lowerer, argNode, loc) {
|
|
|
1996
2021
|
return { kind: "libCall", fn: "num.fromString", args: [arg], type: F64, loc };
|
|
1997
2022
|
if (arg.type.kind === "dyn")
|
|
1998
2023
|
return { kind: "libCall", fn: "dyn.numberConstructor", args: [arg], type: F64, loc };
|
|
2024
|
+
// Number(strings[i]) without boxing `string | undefined`: a missing slot
|
|
2025
|
+
// converts like undefined, to NaN.
|
|
2026
|
+
const indexedString = arg.type.kind === "union" &&
|
|
2027
|
+
arg.kind === "call" &&
|
|
2028
|
+
arg.args[0]?.type.kind === "array" &&
|
|
2029
|
+
arg.args[0].type.elem.kind === "string"
|
|
2030
|
+
? tryFuseIndexRead(lowerer, arg, F64, (read) => ({ kind: "libCall", fn: "num.fromString", args: [read], type: F64, loc }), {
|
|
2031
|
+
kind: "bin",
|
|
2032
|
+
op: "/",
|
|
2033
|
+
left: { kind: "numLit", value: 0, type: F64, loc },
|
|
2034
|
+
right: { kind: "numLit", value: 0, type: F64, loc },
|
|
2035
|
+
type: F64,
|
|
2036
|
+
loc,
|
|
2037
|
+
})
|
|
2038
|
+
: null;
|
|
2039
|
+
if (indexedString)
|
|
2040
|
+
return indexedString;
|
|
1999
2041
|
if (arg.type.kind === "union" && lowerer.dynConvertible(arg.type))
|
|
2000
2042
|
return {
|
|
2001
2043
|
kind: "libCall",
|
|
@@ -2871,14 +2913,28 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
|
|
|
2871
2913
|
function lowerDynReceiverMethodCall(lowerer, call, access) {
|
|
2872
2914
|
if (lowerer.chainBlocked(call, access))
|
|
2873
2915
|
return null;
|
|
2874
|
-
if (stdlibGlobalNameOf(lowerer, access.expression) !== null)
|
|
2875
|
-
|
|
2916
|
+
if (stdlibGlobalNameOf(lowerer, access.expression) !== null) {
|
|
2917
|
+
// A named builtin import can resolve to its ambient declaration, too.
|
|
2918
|
+
// parentPort is an instance value whose methods use the native handle;
|
|
2919
|
+
// it must work without a non-null assertion or a namespace spelling.
|
|
2920
|
+
const binding = ts.isIdentifier(access.expression)
|
|
2921
|
+
? lowerer.builtinImportOf(access.expression)
|
|
2922
|
+
: null;
|
|
2923
|
+
if (binding?.module !== "worker_threads" || binding.member !== "parentPort")
|
|
2924
|
+
return null;
|
|
2925
|
+
}
|
|
2876
2926
|
// Only checker-untyped receivers: `any`/`unknown`, or the `any[]` an
|
|
2877
2927
|
// Array.isArray guard narrows them to (the value is STILL the checked-dynamic tree
|
|
2878
2928
|
// array — scalar narrowings bridge through maybeNarrow's dynCheck and
|
|
2879
2929
|
// take the ordinary typed paths, but there is no static home for an
|
|
2880
2930
|
// any-elemented array). Typed receivers keep their own lowerings.
|
|
2881
2931
|
const recvTs = lowerer.typeOf(access.expression);
|
|
2932
|
+
if (lowerer.classImplementedProtocol(recvTs)) {
|
|
2933
|
+
const property = lowerer.checker.getPropertyOfType(recvTs, access.name.text);
|
|
2934
|
+
if (property &&
|
|
2935
|
+
isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(property), lowerer.checker))
|
|
2936
|
+
return lowerObjLitGenericMethodCall(lowerer, call, access);
|
|
2937
|
+
}
|
|
2882
2938
|
const recvSymbol = recvTs.getSymbol();
|
|
2883
2939
|
if (recvSymbol &&
|
|
2884
2940
|
["MapIterator", "SetIterator"].includes(recvSymbol.name) &&
|
|
@@ -3458,6 +3514,11 @@ const DYN_DISPATCH_METHODS = new Set([
|
|
|
3458
3514
|
"additionalHeaders",
|
|
3459
3515
|
"altsvc",
|
|
3460
3516
|
"origin",
|
|
3517
|
+
// Worker and MessagePort methods use the owning context's handle adapter.
|
|
3518
|
+
"postMessage",
|
|
3519
|
+
"terminate",
|
|
3520
|
+
"start",
|
|
3521
|
+
"hasRef",
|
|
3461
3522
|
]);
|
|
3462
3523
|
export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayReceiver) {
|
|
3463
3524
|
const method = access.name.text;
|
|
@@ -4180,13 +4241,13 @@ function implicitReceiverOverloadReturn(lowerer, expr) {
|
|
|
4180
4241
|
function reconcileOverloadReturn(lowerer, expr, call) {
|
|
4181
4242
|
const rsig = lowerer.checker.getResolvedSignature(expr);
|
|
4182
4243
|
const rdecl = rsig ? lowerer.checker.signatureDeclaration(rsig) : undefined;
|
|
4183
|
-
//
|
|
4184
|
-
//
|
|
4244
|
+
// Nominal covariant overrides share the base's return ABI, but retain
|
|
4245
|
+
// their declared subclass result at the call site. Unannotated fluent
|
|
4246
|
+
// JS overrides use the same bridge for their proven receiver result.
|
|
4185
4247
|
if (call.type.kind === "object" &&
|
|
4186
4248
|
rdecl &&
|
|
4187
4249
|
ts.isMethodDeclaration(rdecl) &&
|
|
4188
|
-
isJsSourceFile(rdecl.getSourceFile())
|
|
4189
|
-
returnsOnlyThis(rdecl)) {
|
|
4250
|
+
(!isJsSourceFile(rdecl.getSourceFile()) || returnsOnlyThis(rdecl))) {
|
|
4190
4251
|
call = lowerer.maybeNarrow(call, expr);
|
|
4191
4252
|
}
|
|
4192
4253
|
const resolvedOverload = rsig &&
|
|
@@ -5684,11 +5745,10 @@ function filterNarrowHelper(lowerer, test, elem, outElem, tag, loc) {
|
|
|
5684
5745
|
* no runtime walk. ORDER is the shape's first-seen DECLARATION order
|
|
5685
5746
|
* (threaded through the shape registry), which matches Node whenever
|
|
5686
5747
|
* objects are constructed in declaration order — the divergence for
|
|
5687
|
-
* reordered construction is SEMANTICS.md 36.
|
|
5688
|
-
*
|
|
5689
|
-
*
|
|
5690
|
-
*
|
|
5691
|
-
* it — same rule as jsonStringify, same SEMANTICS entry. Values wrap
|
|
5748
|
+
* reordered construction is SEMANTICS.md 36. Optional fields that are
|
|
5749
|
+
* absent (omitted or deleted) are SKIPPED at runtime, Node's missing key,
|
|
5750
|
+
* while an explicit `{ a: undefined }` is listed with its undefined
|
|
5751
|
+
* value. Values wrap
|
|
5692
5752
|
* into the checker's result-element type per field; a multi-arm field
|
|
5693
5753
|
* union that differs from the result union would need a re-tag — fenced.
|
|
5694
5754
|
* Null when this isn't an Object static over a fixed record (index
|
|
@@ -5807,9 +5867,9 @@ function lowerSymbolMethodCall(lowerer, call, access) {
|
|
|
5807
5867
|
}
|
|
5808
5868
|
/** The interned keys-array helper over a FIXED record shape: a call of a
|
|
5809
5869
|
* lifted helper whose body pushes each declared field name in first-seen
|
|
5810
|
-
* DECLARATION order, skipping fields
|
|
5811
|
-
*
|
|
5812
|
-
*
|
|
5870
|
+
* DECLARATION order, skipping optional fields that are currently absent
|
|
5871
|
+
* (omitted or deleted — Node's missing key; a field explicitly holding
|
|
5872
|
+
* undefined is present and listed). ONE
|
|
5813
5873
|
* construction, interned per shape, shared by Object.keys and for-in —
|
|
5814
5874
|
* for-in iterates exactly the keys Object.keys answers. */
|
|
5815
5875
|
export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
@@ -5858,32 +5918,11 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5858
5918
|
},
|
|
5859
5919
|
loc,
|
|
5860
5920
|
};
|
|
5861
|
-
//
|
|
5921
|
+
// Fields that can be absent push behind their presence test (the
|
|
5862
5922
|
// key exists exactly when Object.keys would list it).
|
|
5863
|
-
const
|
|
5864
|
-
body.push(
|
|
5865
|
-
? {
|
|
5866
|
-
kind: "if",
|
|
5867
|
-
cond: {
|
|
5868
|
-
kind: "unionIsTag",
|
|
5869
|
-
unionId: f.type.unionId,
|
|
5870
|
-
tag: utag,
|
|
5871
|
-
negated: true,
|
|
5872
|
-
value: {
|
|
5873
|
-
kind: "recordGet",
|
|
5874
|
-
obj: ref,
|
|
5875
|
-
shapeId: argIr.shapeId,
|
|
5876
|
-
field: f.name,
|
|
5877
|
-
type: f.type,
|
|
5878
|
-
loc,
|
|
5879
|
-
},
|
|
5880
|
-
type: BOOL,
|
|
5881
|
-
loc,
|
|
5882
|
-
},
|
|
5883
|
-
then: [pushStmt],
|
|
5884
|
-
else_: null,
|
|
5885
|
-
loc,
|
|
5886
|
-
}
|
|
5923
|
+
const present = lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc);
|
|
5924
|
+
body.push(present.kind === "recordHas"
|
|
5925
|
+
? { kind: "if", cond: present, then: [pushStmt], else_: null, loc }
|
|
5887
5926
|
: pushStmt);
|
|
5888
5927
|
}
|
|
5889
5928
|
body.push({ kind: "return", value: outRef, loc });
|
|
@@ -5897,9 +5936,9 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
|
|
|
5897
5936
|
}
|
|
5898
5937
|
/** Interned `%obj.hasOwn.<n>(r, k)` — Object.hasOwn's membership walk
|
|
5899
5938
|
* over a record shape: the key compares against each
|
|
5900
|
-
* declared field name,
|
|
5939
|
+
* declared field name, optional fields answering by their presence
|
|
5901
5940
|
* (a key is own exactly when Object.keys would list it — the two share
|
|
5902
|
-
* the
|
|
5941
|
+
* the test), everything else true. Unmatched keys probe the overflow
|
|
5903
5942
|
* map when present, so explicit undefined values remain own keys. */
|
|
5904
5943
|
function recordHasOwnHelper(lowerer, shapeId, loc) {
|
|
5905
5944
|
const key = `obj.hasOwn:${shapeId}`;
|
|
@@ -5914,18 +5953,7 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
|
|
|
5914
5953
|
const kRef = { kind: "varRef", localId: "k.0", type: STRING, loc };
|
|
5915
5954
|
const body = [];
|
|
5916
5955
|
for (const f of shape.fields) {
|
|
5917
|
-
const
|
|
5918
|
-
const answer = utag >= 0 && f.type.kind === "union"
|
|
5919
|
-
? {
|
|
5920
|
-
kind: "unionIsTag",
|
|
5921
|
-
unionId: f.type.unionId,
|
|
5922
|
-
tag: utag,
|
|
5923
|
-
negated: true,
|
|
5924
|
-
value: { kind: "recordGet", obj: rRef, shapeId, field: f.name, type: f.type, loc },
|
|
5925
|
-
type: BOOL,
|
|
5926
|
-
loc,
|
|
5927
|
-
}
|
|
5928
|
-
: { kind: "boolLit", value: true, type: BOOL, loc };
|
|
5956
|
+
const answer = lowerer.recordFieldPresent(rRef, shapeId, f.name, loc);
|
|
5929
5957
|
body.push({
|
|
5930
5958
|
kind: "if",
|
|
5931
5959
|
cond: {
|
|
@@ -5963,8 +5991,9 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
|
|
|
5963
5991
|
}
|
|
5964
5992
|
/** Interned `%obj.assign.<n>(t, s)` — Object.assign's per-field copy
|
|
5965
5993
|
* over signature-free records (every source field lands on a same-named,
|
|
5966
|
-
* same-typed target field — the caller's gate):
|
|
5967
|
-
*
|
|
5994
|
+
* same-typed target field — the caller's gate): optional source fields
|
|
5995
|
+
* copy only when present (an explicit undefined copies), everything else
|
|
5996
|
+
* straight,
|
|
5968
5997
|
* and the TARGET returns (JS's aliasing). */
|
|
5969
5998
|
function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
|
|
5970
5999
|
const key = `obj.assign:${targetShapeId}:${srcShapeId}`;
|
|
@@ -5996,23 +6025,9 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
|
|
|
5996
6025
|
value: get,
|
|
5997
6026
|
loc,
|
|
5998
6027
|
};
|
|
5999
|
-
const
|
|
6000
|
-
body.push(
|
|
6001
|
-
? {
|
|
6002
|
-
kind: "if",
|
|
6003
|
-
cond: {
|
|
6004
|
-
kind: "unionIsTag",
|
|
6005
|
-
unionId: f.type.unionId,
|
|
6006
|
-
tag: utag,
|
|
6007
|
-
negated: true,
|
|
6008
|
-
value: get,
|
|
6009
|
-
type: BOOL,
|
|
6010
|
-
loc,
|
|
6011
|
-
},
|
|
6012
|
-
then: [set],
|
|
6013
|
-
else_: null,
|
|
6014
|
-
loc,
|
|
6015
|
-
}
|
|
6028
|
+
const present = lowerer.recordFieldPresent(sRef, srcShapeId, f.name, loc);
|
|
6029
|
+
body.push(present.kind === "recordHas"
|
|
6030
|
+
? { kind: "if", cond: present, then: [set], else_: null, loc }
|
|
6016
6031
|
: set);
|
|
6017
6032
|
}
|
|
6018
6033
|
body.push({ kind: "return", value: tRef, loc });
|
|
@@ -6290,6 +6305,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6290
6305
|
};
|
|
6291
6306
|
}
|
|
6292
6307
|
if (left.type.kind === "union" || right.type.kind === "union") {
|
|
6308
|
+
const compared = lowerUnionEquality(lowerer, left, right, false, true, loc);
|
|
6309
|
+
if (compared)
|
|
6310
|
+
return compared;
|
|
6293
6311
|
const ut = left.type.kind === "union" ? left.type : right.type;
|
|
6294
6312
|
const bothUnion = left.type.kind === "union" && right.type.kind === "union";
|
|
6295
6313
|
const sameUnion = bothUnion && typeEquals(left.type, right.type);
|
|
@@ -6297,9 +6315,16 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6297
6315
|
const plain = left.type.kind === "union" ? right : left;
|
|
6298
6316
|
const arms = lowerer.unions.get(ut.unionId)?.arms ?? [];
|
|
6299
6317
|
// The plain side wraps into the union exactly like === when the
|
|
6300
|
-
// union holds its type
|
|
6301
|
-
//
|
|
6302
|
-
|
|
6318
|
+
// union holds its type, or when a plain class instance upcasts
|
|
6319
|
+
// into exactly one class arm (the same pointer under a base tag);
|
|
6320
|
+
// a plain PRIMITIVE the union has no arm for is the disjoint
|
|
6321
|
+
// constant false (coercing it would strand).
|
|
6322
|
+
const plainType = plain.type;
|
|
6323
|
+
const upcastArm = plainType.kind === "object" &&
|
|
6324
|
+
arms.filter((a) => a.kind === "object" && lowerer.isSubclassOf(plainType.className, a.className)).length === 1;
|
|
6325
|
+
if (bothUnion || upcastArm || arms.some((a) => typeEquals(a, plain.type))) {
|
|
6326
|
+
if (tagEqualityMayMissAlias(lowerer, ut))
|
|
6327
|
+
lowerer.noLowering("Object.is over related class values beside structural union members", call, NARROW_FIRST);
|
|
6303
6328
|
const sameValue = arms.some((a) => a.kind === "f64");
|
|
6304
6329
|
return {
|
|
6305
6330
|
kind: "unionEq",
|
|
@@ -6511,12 +6536,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6511
6536
|
// (the mockable-clock restore: `Object.assign(mocked,
|
|
6512
6537
|
// implementations)` over one shape): the per-field copy helper,
|
|
6513
6538
|
// returning the TARGET — JS's aliasing, the target mutates in
|
|
6514
|
-
// place.
|
|
6515
|
-
// not
|
|
6516
|
-
//
|
|
6517
|
-
//
|
|
6518
|
-
// the explicit-undefined-is-absent stance). Everything else keeps
|
|
6519
|
-
// the spread hint.
|
|
6539
|
+
// place. Optional source fields copy only when present (an omitted
|
|
6540
|
+
// optional field must not erase the target's value — Node copies own
|
|
6541
|
+
// keys only — while an explicit `k: undefined` does). Everything
|
|
6542
|
+
// else keeps the spread hint.
|
|
6520
6543
|
if (call.arguments.length === 2 && !call.arguments.some((a) => ts.isSpreadElement(a))) {
|
|
6521
6544
|
const tProbe = tryLowerExpression(lowerer, call.arguments[0]);
|
|
6522
6545
|
const sProbe = tryLowerExpression(lowerer, call.arguments[1]);
|
|
@@ -6893,11 +6916,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6893
6916
|
}
|
|
6894
6917
|
// `Object.hasOwn(r, k)` over a RECORD receiver: a record's own-key set
|
|
6895
6918
|
// is its declared field list, so membership is a compare chain against
|
|
6896
|
-
// the field names (interned per shape).
|
|
6897
|
-
//
|
|
6898
|
-
//
|
|
6899
|
-
// as NOT own, exactly Node's absent key (an EXPLICIT `k: undefined`
|
|
6900
|
-
// diverges — documented next to the child-env/JSON rule). Tuple
|
|
6919
|
+
// the field names (interned per shape). Optional fields answer by
|
|
6920
|
+
// their runtime presence: an omitted or deleted optional field is NOT
|
|
6921
|
+
// own, while an explicit `k: undefined` is, exactly Node's keys. Tuple
|
|
6901
6922
|
// and accessor-carrying shapes keep the SC2020 fence. Index-signature
|
|
6902
6923
|
// records additionally probe the overflow map; non-record receivers
|
|
6903
6924
|
// do too.
|
|
@@ -6907,6 +6928,19 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6907
6928
|
const recvNode = call.arguments[0];
|
|
6908
6929
|
const keyNode = call.arguments[1];
|
|
6909
6930
|
const probed = tryLowerExpression(lowerer, recvNode);
|
|
6931
|
+
const arrayKey = probed?.type.kind === "array" ? lowerer.lowerExpr(keyNode) : null;
|
|
6932
|
+
if (probed?.type.kind === "array" && arrayKey?.type.kind === "f64") {
|
|
6933
|
+
// Numeric own keys use the array's slot/property presence directly.
|
|
6934
|
+
// Unlike `in`, this never includes inherited properties. arrayHas
|
|
6935
|
+
// evaluates and keeps the receiver alive before evaluating the key.
|
|
6936
|
+
return {
|
|
6937
|
+
kind: "arrayHas",
|
|
6938
|
+
arr: probed,
|
|
6939
|
+
index: arrayKey,
|
|
6940
|
+
type: BOOL,
|
|
6941
|
+
loc: locOf(call),
|
|
6942
|
+
};
|
|
6943
|
+
}
|
|
6910
6944
|
const constructor = probed?.type.kind === "classval" ? lowerer.classes.get(probed.type.className) : undefined;
|
|
6911
6945
|
// A CHECKED-DYNAMIC receiver (the JS file-scope object-literal
|
|
6912
6946
|
// identity story): the runtime dyn probe — OBJ member presence, ARR
|
|
@@ -6918,7 +6952,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
6918
6952
|
(probed?.type.kind === "func" && lowerer.dynConvertible(probed.type))) {
|
|
6919
6953
|
const loc = locOf(call);
|
|
6920
6954
|
const receiver = lowerer.coerceToExpected(probed, DYN);
|
|
6921
|
-
const rawKey = lowerer.lowerExpr(keyNode);
|
|
6955
|
+
const rawKey = arrayKey ?? lowerer.lowerExpr(keyNode);
|
|
6922
6956
|
if (rawKey.type.kind === "dyn" ||
|
|
6923
6957
|
rawKey.type.kind === "symbol" ||
|
|
6924
6958
|
(rawKey.type.kind === "union" && lowerer.dynConvertible(rawKey.type)))
|
|
@@ -7163,8 +7197,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7163
7197
|
}
|
|
7164
7198
|
return null;
|
|
7165
7199
|
};
|
|
7166
|
-
// Undefined-armed fields: the push is guarded by
|
|
7167
|
-
//
|
|
7200
|
+
// Undefined-armed fields: the push is guarded by the field's
|
|
7201
|
+
// presence; a narrowed push re-tags the non-undefined arm.
|
|
7168
7202
|
let guardUndefTag = null;
|
|
7169
7203
|
let value = raw;
|
|
7170
7204
|
let vt = f.type;
|
|
@@ -7215,46 +7249,83 @@ function lowerObjectStaticCall(lowerer, call, access) {
|
|
|
7215
7249
|
lowerer.unsupported("SC1090", call, `Object.${member} over '${lowerer.fmt(argIr)}' (field '${f.name}' of type '${lowerer.fmt(f.type)}' ` +
|
|
7216
7250
|
`cannot flow into the '${lowerer.fmt(valueT)}' result element — read the fields directly)`);
|
|
7217
7251
|
}
|
|
7218
|
-
const
|
|
7219
|
-
? coerced
|
|
7220
|
-
: {
|
|
7221
|
-
kind: "recordLit",
|
|
7222
|
-
fields: [
|
|
7223
|
-
{ name: "0", value: { kind: "strLit", value: f.name, type: STRING, loc } },
|
|
7224
|
-
{ name: "1", value: coerced },
|
|
7225
|
-
],
|
|
7226
|
-
type: tupleT,
|
|
7227
|
-
loc,
|
|
7228
|
-
};
|
|
7229
|
-
const pushStmt = {
|
|
7252
|
+
const pushOf = (element) => ({
|
|
7230
7253
|
kind: "exprStmt",
|
|
7231
7254
|
expr: {
|
|
7232
7255
|
kind: "arrIntrinsic",
|
|
7233
7256
|
method: "push",
|
|
7234
7257
|
receiver: outRef,
|
|
7235
|
-
args: [
|
|
7258
|
+
args: [
|
|
7259
|
+
member === "values"
|
|
7260
|
+
? element
|
|
7261
|
+
: {
|
|
7262
|
+
kind: "recordLit",
|
|
7263
|
+
fields: [
|
|
7264
|
+
{ name: "0", value: { kind: "strLit", value: f.name, type: STRING, loc } },
|
|
7265
|
+
{ name: "1", value: element },
|
|
7266
|
+
],
|
|
7267
|
+
type: tupleT,
|
|
7268
|
+
loc,
|
|
7269
|
+
},
|
|
7270
|
+
],
|
|
7236
7271
|
type: F64,
|
|
7237
7272
|
loc,
|
|
7238
7273
|
},
|
|
7239
7274
|
loc,
|
|
7240
|
-
};
|
|
7241
|
-
|
|
7242
|
-
|
|
7243
|
-
|
|
7244
|
-
|
|
7245
|
-
|
|
7246
|
-
|
|
7247
|
-
|
|
7248
|
-
|
|
7249
|
-
|
|
7250
|
-
|
|
7275
|
+
});
|
|
7276
|
+
let stmt = pushOf(coerced);
|
|
7277
|
+
if (guardUndefTag !== null && f.type.kind === "union") {
|
|
7278
|
+
if (value !== raw) {
|
|
7279
|
+
// A narrowed push: a present field holding undefined pushes
|
|
7280
|
+
// the result element's own undefined when it has one; a values
|
|
7281
|
+
// array without one stores a present undefined element (a
|
|
7282
|
+
// runtime-optional field the checker typed as required). An
|
|
7283
|
+
// entries tuple slot has no spelling for it.
|
|
7284
|
+
const undefinedElement = valueT ? lowerer.wrappedUndefined(valueT, loc) : null;
|
|
7285
|
+
const undefinedPush = undefinedElement
|
|
7286
|
+
? pushOf(undefinedElement)
|
|
7287
|
+
: member === "values"
|
|
7288
|
+
? {
|
|
7289
|
+
kind: "arraySetUndefined",
|
|
7290
|
+
arr: outRef,
|
|
7291
|
+
index: {
|
|
7292
|
+
kind: "arrIntrinsic",
|
|
7293
|
+
method: "length",
|
|
7294
|
+
receiver: outRef,
|
|
7295
|
+
args: [],
|
|
7296
|
+
type: F64,
|
|
7297
|
+
loc,
|
|
7298
|
+
},
|
|
7299
|
+
loc,
|
|
7300
|
+
}
|
|
7301
|
+
: null;
|
|
7302
|
+
stmt = {
|
|
7303
|
+
kind: "if",
|
|
7304
|
+
cond: {
|
|
7305
|
+
kind: "unionIsTag",
|
|
7306
|
+
unionId: f.type.unionId,
|
|
7307
|
+
tag: guardUndefTag,
|
|
7308
|
+
negated: true,
|
|
7309
|
+
value: raw,
|
|
7310
|
+
type: BOOL,
|
|
7311
|
+
loc,
|
|
7312
|
+
},
|
|
7313
|
+
then: [stmt],
|
|
7314
|
+
else_: undefinedPush ? [undefinedPush] : null,
|
|
7251
7315
|
loc,
|
|
7252
|
-
}
|
|
7253
|
-
|
|
7316
|
+
};
|
|
7317
|
+
}
|
|
7318
|
+
// Absent fields contribute nothing; present ones push their
|
|
7319
|
+
// value, undefined included.
|
|
7320
|
+
stmt = {
|
|
7321
|
+
kind: "if",
|
|
7322
|
+
cond: lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc),
|
|
7323
|
+
then: [stmt],
|
|
7254
7324
|
else_: null,
|
|
7255
7325
|
loc,
|
|
7256
|
-
}
|
|
7257
|
-
|
|
7326
|
+
};
|
|
7327
|
+
}
|
|
7328
|
+
body.push(stmt);
|
|
7258
7329
|
}
|
|
7259
7330
|
body.push({ kind: "return", value: outRef, loc });
|
|
7260
7331
|
fn.body = body;
|
|
@@ -7323,7 +7394,7 @@ function lowerObjectAssignHybrid(lowerer, call) {
|
|
|
7323
7394
|
for (const f of shape.fields) {
|
|
7324
7395
|
const v = values.get(f.name);
|
|
7325
7396
|
if (!v) {
|
|
7326
|
-
const absent = lowerer.
|
|
7397
|
+
const absent = lowerer.absentFieldValue(f.type, loc);
|
|
7327
7398
|
if (!absent) {
|
|
7328
7399
|
lowerer.unsupported("SC1090", call, `Object.assign leaving the required field '${f.name}' of '${lowerer.fmt(mapped)}' unfilled`);
|
|
7329
7400
|
}
|
|
@@ -7801,6 +7872,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
7801
7872
|
// Use the lowered receiver's representation and retain its evaluation.
|
|
7802
7873
|
const probe = mappedReceiver?.kind !== "object" &&
|
|
7803
7874
|
(lowerer.implicitParamTypes !== null ||
|
|
7875
|
+
lowerer.classImplementedProtocol(lowerer.typeOf(access.expression)) ||
|
|
7804
7876
|
ts.isNewExpression(access.expression) ||
|
|
7805
7877
|
isJsSourceFile(call.getSourceFile()))
|
|
7806
7878
|
? ts.isNewExpression(access.expression)
|
|
@@ -7922,7 +7994,9 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
7922
7994
|
const receiverLocal = lowerer.declareHiddenLocal("%callReceiver", target.obj.type);
|
|
7923
7995
|
const init = { kind: "varDecl", localId: receiverLocal.id, init: target.obj, loc };
|
|
7924
7996
|
target.obj = { kind: "varRef", localId: receiverLocal.id, type: receiverLocal.type, loc };
|
|
7925
|
-
const receiver =
|
|
7997
|
+
const receiver = {};
|
|
7998
|
+
if (!lowerer.receiverFreeCallbackFields.has(access.name.text))
|
|
7999
|
+
receiver.receiver = lowerer.coerceToExpected(target.obj, DYN);
|
|
7926
8000
|
const finish = (result) => ({
|
|
7927
8001
|
kind: "seqExpr",
|
|
7928
8002
|
stmts: [init],
|
|
@@ -7951,12 +8025,12 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
7951
8025
|
const boxed = { kind: "dynFrom", value: callee, type: DYN, loc };
|
|
7952
8026
|
const spread = lowerSpreadArgsCall(lowerer, call, boxed, loc);
|
|
7953
8027
|
if (spread?.kind === "dynCall")
|
|
7954
|
-
return finish({ ...spread, receiver });
|
|
8028
|
+
return finish({ ...spread, ...receiver });
|
|
7955
8029
|
const args = call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
|
|
7956
8030
|
return finish({
|
|
7957
8031
|
kind: "dynCall",
|
|
7958
8032
|
callee: boxed,
|
|
7959
|
-
receiver,
|
|
8033
|
+
...receiver,
|
|
7960
8034
|
calleeName: access.getText(),
|
|
7961
8035
|
args,
|
|
7962
8036
|
type: DYN,
|
|
@@ -7964,7 +8038,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
7964
8038
|
});
|
|
7965
8039
|
}
|
|
7966
8040
|
const args = completeFuncValueArgs(lowerer, call, callee.type, locOf(call));
|
|
7967
|
-
return finish({ kind: "callValue", callee, receiver, args, type: callee.type.ret, loc });
|
|
8041
|
+
return finish({ kind: "callValue", callee, ...receiver, args, type: callee.type.ret, loc });
|
|
7968
8042
|
}
|
|
7969
8043
|
if (callee?.type.kind === "dyn") {
|
|
7970
8044
|
if (call.arguments.some((a) => ts.isSpreadElement(a))) {
|
|
@@ -7974,7 +8048,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
7974
8048
|
return finish({
|
|
7975
8049
|
kind: "dynCall",
|
|
7976
8050
|
callee,
|
|
7977
|
-
receiver,
|
|
8051
|
+
...receiver,
|
|
7978
8052
|
calleeName: access.getText(),
|
|
7979
8053
|
args,
|
|
7980
8054
|
type: DYN,
|
|
@@ -8056,7 +8130,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
|
|
|
8056
8130
|
type: found.sig.ret,
|
|
8057
8131
|
loc,
|
|
8058
8132
|
};
|
|
8059
|
-
const result = classCallbackCall(lowerer, value, method, call.arguments
|
|
8133
|
+
const result = classCallbackCall(lowerer, value, method, call.arguments, fallback, loc, access.getText());
|
|
8060
8134
|
return {
|
|
8061
8135
|
kind: "seqExpr",
|
|
8062
8136
|
stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],
|