@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
package/dist/ir/validate.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* an ICE that points at source is a gift to whoever debugs it.
|
|
5
5
|
*/
|
|
6
6
|
import { validByteNumberToken } from "./byte-numbers.js";
|
|
7
|
-
import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, islandPromisePayloadTag, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, REF_TRUTHY_KINDS, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, shapeHasAccessorSlots, STRING, typeEquals, typeKey, unionContainerArmsOk, VOID, } from "./ir.js";
|
|
7
|
+
import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, canExitIslandToType, canMarshalIntoIsland, canMarshalTypedFuncIntoIsland, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, islandPromisePayloadTag, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSortValuesElement, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, jsOpResultKind, JSVAL, REF_TRUTHY_KINDS, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, shapeHasAccessorSlots, STRING, typeEquals, typeKey, unionContainerArmsOk, VOID, } from "./ir.js";
|
|
8
8
|
import { DYN_CLASS_PROPERTIES } from "./ir.js";
|
|
9
9
|
import { unionWideningTags } from "./analysis.js";
|
|
10
10
|
import { alwaysReturns } from "./control-flow.js";
|
|
@@ -53,7 +53,20 @@ export function validateModule(mod) {
|
|
|
53
53
|
const ffiByName = new Map();
|
|
54
54
|
const ffiSymbols = new Set();
|
|
55
55
|
const moduleLoc = { file: mod.sourceFile, start: 0, end: 0 };
|
|
56
|
+
if (mod.workers !== undefined && typeof mod.workers !== "boolean")
|
|
57
|
+
errors.push({ message: "worker execution mode must be a boolean", loc: moduleLoc });
|
|
58
|
+
if (mod.workers && (mod.lib !== undefined || mod.embedded !== undefined))
|
|
59
|
+
errors.push({
|
|
60
|
+
message: "worker execution requires a native static executable",
|
|
61
|
+
loc: moduleLoc,
|
|
62
|
+
});
|
|
56
63
|
for (const entry of mod.ffiImports ?? []) {
|
|
64
|
+
if (mod.workers &&
|
|
65
|
+
entry.params.some((parameter) => isFfiCallbackParam(parameter) && parameter.callback.invoke === "foreign"))
|
|
66
|
+
errors.push({
|
|
67
|
+
message: "worker execution cannot install foreign-thread callbacks",
|
|
68
|
+
loc: moduleLoc,
|
|
69
|
+
});
|
|
57
70
|
if (ffiByName.has(entry.name)) {
|
|
58
71
|
errors.push({ message: `duplicate FFI binding "${entry.name}"`, loc: moduleLoc });
|
|
59
72
|
}
|
|
@@ -473,8 +486,19 @@ export function validateModule(mod) {
|
|
|
473
486
|
});
|
|
474
487
|
}
|
|
475
488
|
}
|
|
476
|
-
//
|
|
477
|
-
//
|
|
489
|
+
// Family membership is nominal; an instance may have a separately
|
|
490
|
+
// specialized base. The family's inherited prefix must remain valid.
|
|
491
|
+
const physicalRoot = (cls) => {
|
|
492
|
+
const seen = new Set();
|
|
493
|
+
let current = cls;
|
|
494
|
+
while (current?.base !== undefined) {
|
|
495
|
+
if (seen.has(current.name))
|
|
496
|
+
return undefined;
|
|
497
|
+
seen.add(current.name);
|
|
498
|
+
current = classesByName.get(current.base);
|
|
499
|
+
}
|
|
500
|
+
return current;
|
|
501
|
+
};
|
|
478
502
|
for (const cls of mod.classes ?? []) {
|
|
479
503
|
if (cls.genericOf === undefined)
|
|
480
504
|
continue;
|
|
@@ -484,20 +508,23 @@ export function validateModule(mod) {
|
|
|
484
508
|
message: `class ${cls.name}: undeclared generic family "${cls.genericOf}"`,
|
|
485
509
|
loc: cls.loc,
|
|
486
510
|
});
|
|
487
|
-
continue;
|
|
488
511
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
ancestor = true;
|
|
495
|
-
break;
|
|
496
|
-
}
|
|
512
|
+
else if (family === cls || family.genericOf !== undefined) {
|
|
513
|
+
errors.push({
|
|
514
|
+
message: `class ${cls.name}: generic family "${cls.genericOf}" must name an erased declaration`,
|
|
515
|
+
loc: cls.loc,
|
|
516
|
+
});
|
|
497
517
|
}
|
|
498
|
-
if (
|
|
518
|
+
else if (physicalRoot(cls) !== physicalRoot(family)) {
|
|
499
519
|
errors.push({
|
|
500
|
-
message: `class ${cls.name}: generic family "${cls.genericOf}"
|
|
520
|
+
message: `class ${cls.name}: generic family "${cls.genericOf}" has a different storage root`,
|
|
521
|
+
loc: cls.loc,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
else if (family.fields.some((field, index) => cls.fields[index]?.name !== field.name ||
|
|
525
|
+
!typeEquals(cls.fields[index].type, field.type))) {
|
|
526
|
+
errors.push({
|
|
527
|
+
message: `class ${cls.name}: generic family "${cls.genericOf}" has an incompatible prefix`,
|
|
501
528
|
loc: cls.loc,
|
|
502
529
|
});
|
|
503
530
|
}
|
|
@@ -656,9 +683,8 @@ export function validateModule(mod) {
|
|
|
656
683
|
}
|
|
657
684
|
u.arms.forEach((arm, i) => {
|
|
658
685
|
// The unit kinds (undefinedT/nullT) are valid arms — union membership
|
|
659
|
-
// is the ONLY place they may appear.
|
|
660
|
-
//
|
|
661
|
-
// payload preserves identity. The shared rule refuses data siblings.
|
|
686
|
+
// is the ONLY place they may appear. Container payloads preserve
|
|
687
|
+
// identity; promise data siblings retain their separate fence.
|
|
662
688
|
if (arm.kind === "void" ||
|
|
663
689
|
arm.kind === "union" ||
|
|
664
690
|
arm.kind === "dyn" ||
|
|
@@ -667,8 +693,7 @@ export function validateModule(mod) {
|
|
|
667
693
|
arm.kind === "generator") {
|
|
668
694
|
errors.push({ message: `union ${u.id}: arm ${i} is ${arm.kind}`, loc: noLoc });
|
|
669
695
|
}
|
|
670
|
-
if (
|
|
671
|
-
!unionContainerArmsOk(u.arms)) {
|
|
696
|
+
if (arm.kind === "promise" && !unionContainerArmsOk(u.arms)) {
|
|
672
697
|
errors.push({
|
|
673
698
|
message: `union ${u.id}: ${arm.kind} arm ${i} beside non-unit arms`,
|
|
674
699
|
loc: noLoc,
|
|
@@ -831,11 +856,11 @@ export function validateModule(mod) {
|
|
|
831
856
|
}
|
|
832
857
|
}
|
|
833
858
|
for (const fn of mod.functions) {
|
|
834
|
-
validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors);
|
|
859
|
+
validateFunction(fn, functionsByName, ffiByName, classesByName, recordsById, recordValidation, unionsById, globalsById, classValidation, errors, mod.workers === true);
|
|
835
860
|
}
|
|
836
861
|
return errors;
|
|
837
862
|
}
|
|
838
|
-
function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors) {
|
|
863
|
+
function validateFunction(fn, functions, ffiByName, classes, records, recordValidation, unions, globals, classValidation, errors, workers) {
|
|
839
864
|
const locals = new Map(fn.locals.map((l) => [l.id, l]));
|
|
840
865
|
const err = (message, loc) => errors.push({ message: `in ${fn.name}: ${message}`, loc });
|
|
841
866
|
const asyncCaches = [
|
|
@@ -868,13 +893,37 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
868
893
|
if (fn.asyncCycleCacheGlobal !== undefined && fn.asyncCacheGlobal === undefined) {
|
|
869
894
|
err("an asyncCycleCacheGlobal requires a module asyncCacheGlobal", fn.loc);
|
|
870
895
|
}
|
|
871
|
-
//
|
|
872
|
-
//
|
|
873
|
-
|
|
896
|
+
// Virtual slots and constructor ABIs follow physical inheritance only.
|
|
897
|
+
// Erased family identity does not supply their specialized layout or ABI.
|
|
898
|
+
const isPhysicalSubclass = (sub, sup) => {
|
|
899
|
+
const seen = new Set([sub]);
|
|
900
|
+
for (let c = classes.get(sub)?.base; c !== undefined; c = classes.get(c)?.base) {
|
|
901
|
+
if (seen.has(c))
|
|
902
|
+
return false;
|
|
903
|
+
seen.add(c);
|
|
904
|
+
if (c === sup)
|
|
905
|
+
return true;
|
|
906
|
+
}
|
|
907
|
+
return false;
|
|
908
|
+
};
|
|
909
|
+
// Object casts may also recover an erased family. The module-level
|
|
910
|
+
// prefix check validates the fields exposed by that view.
|
|
874
911
|
const isStrictSubclass = (sub, sup) => {
|
|
875
|
-
|
|
876
|
-
|
|
912
|
+
const seen = new Set();
|
|
913
|
+
for (let c = classes.get(sub); c; c = c.base === undefined ? undefined : classes.get(c.base)) {
|
|
914
|
+
if (seen.has(c.name))
|
|
915
|
+
return false;
|
|
916
|
+
seen.add(c.name);
|
|
917
|
+
if (c.name !== sub && c.name === sup)
|
|
877
918
|
return true;
|
|
919
|
+
const families = new Set();
|
|
920
|
+
for (let family = c.genericOf === undefined ? undefined : classes.get(c.genericOf); family; family = family.base === undefined ? undefined : classes.get(family.base)) {
|
|
921
|
+
if (families.has(family.name))
|
|
922
|
+
return false;
|
|
923
|
+
families.add(family.name);
|
|
924
|
+
if (family.name === sup)
|
|
925
|
+
return true;
|
|
926
|
+
}
|
|
878
927
|
}
|
|
879
928
|
return false;
|
|
880
929
|
};
|
|
@@ -901,7 +950,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
901
950
|
if (declared) {
|
|
902
951
|
// Preserve class-table order when choosing an abstract slot's ABI.
|
|
903
952
|
for (const c of classValidation.implementations.get(method) ?? []) {
|
|
904
|
-
if (!
|
|
953
|
+
if (!isPhysicalSubclass(c.name, className))
|
|
905
954
|
continue;
|
|
906
955
|
hasOverride = true;
|
|
907
956
|
implementation ??= functions.get(`%${c.name}.${method}`);
|
|
@@ -924,16 +973,16 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
924
973
|
if (isUnitType(fn.returnType)) {
|
|
925
974
|
err(`return type is bare unit type ${fn.returnType.kind}`, fn.loc);
|
|
926
975
|
}
|
|
927
|
-
// Exception snapshots may be captured
|
|
928
|
-
//
|
|
976
|
+
// Exception snapshots may be captured or passed to internal conversion
|
|
977
|
+
// helpers. They are not source-level types and never return as values.
|
|
929
978
|
if (fn.returnType.kind === "caught")
|
|
930
979
|
err("return type is caught", fn.loc);
|
|
931
980
|
for (const p of fn.params) {
|
|
981
|
+
if (p.type.kind === "caught" && fn.name !== "%caught.dynamicValue")
|
|
982
|
+
err(`param "${p.name}" is caught-typed`, fn.loc);
|
|
932
983
|
if (!locals.has(p.localId)) {
|
|
933
984
|
err(`param "${p.name}" has no local entry "${p.localId}"`, fn.loc);
|
|
934
985
|
}
|
|
935
|
-
if (p.type.kind === "caught")
|
|
936
|
-
err(`param "${p.name}" is caught-typed`, fn.loc);
|
|
937
986
|
}
|
|
938
987
|
for (const c of [...(fn.captures ?? []), ...(fn.classCaptures ?? [])]) {
|
|
939
988
|
const local = locals.get(c.localId);
|
|
@@ -1090,6 +1139,23 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1090
1139
|
}
|
|
1091
1140
|
// Keep expression families in separate functions so native bootstrap builds
|
|
1092
1141
|
// do not feed LLVM a single control-flow graph containing every IR check.
|
|
1142
|
+
/** fieldAbsent nodes that sit directly in a field-slot write (a
|
|
1143
|
+
* recordLit field, recordSet value, recordClone override, or a ternary
|
|
1144
|
+
* arm in one of those positions) — the only places the absent state may
|
|
1145
|
+
* appear. */
|
|
1146
|
+
const fieldSlotValues = new Set();
|
|
1147
|
+
function checkSlotValue(e) {
|
|
1148
|
+
const mark = (v) => {
|
|
1149
|
+
if (v.kind === "fieldAbsent")
|
|
1150
|
+
fieldSlotValues.add(v);
|
|
1151
|
+
else if (v.kind === "ternary") {
|
|
1152
|
+
mark(v.then);
|
|
1153
|
+
mark(v.else_);
|
|
1154
|
+
}
|
|
1155
|
+
};
|
|
1156
|
+
mark(e);
|
|
1157
|
+
checkExpr(e);
|
|
1158
|
+
}
|
|
1093
1159
|
function checkExpr(e) {
|
|
1094
1160
|
switch (e.kind) {
|
|
1095
1161
|
case "numLit":
|
|
@@ -1162,6 +1228,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1162
1228
|
case "recordKeyGet":
|
|
1163
1229
|
case "recordOvfHas":
|
|
1164
1230
|
case "recordOvfKeys":
|
|
1231
|
+
case "recordHas":
|
|
1232
|
+
case "fieldAbsent":
|
|
1165
1233
|
return checkRecordExpr(e);
|
|
1166
1234
|
case "dynFrom":
|
|
1167
1235
|
case "dynFromJsval":
|
|
@@ -1409,6 +1477,12 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1409
1477
|
allowed.add("throw");
|
|
1410
1478
|
allowed.add("runtimeFence");
|
|
1411
1479
|
}
|
|
1480
|
+
if (e.diverges) {
|
|
1481
|
+
const last = e.stmts[e.stmts.length - 1];
|
|
1482
|
+
if (last?.kind !== "runtimeFence")
|
|
1483
|
+
err("diverging seqExpr must end in a runtimeFence", e.loc);
|
|
1484
|
+
allowed.add("runtimeFence");
|
|
1485
|
+
}
|
|
1412
1486
|
const flat = (ss) => {
|
|
1413
1487
|
for (const s of ss) {
|
|
1414
1488
|
if (!allowed.has(s.kind)) {
|
|
@@ -2047,7 +2121,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2047
2121
|
? { argTypes: [STRING], result: STRING }
|
|
2048
2122
|
: e.method === "slice"
|
|
2049
2123
|
? { argTypes: [F64, F64], result: e.receiver.type }
|
|
2050
|
-
: e.method === "toReversed"
|
|
2124
|
+
: e.method === "toReversed" ||
|
|
2125
|
+
e.method === "sortPrimitive" ||
|
|
2126
|
+
e.method === "toSortedPrimitive"
|
|
2051
2127
|
? { argTypes: [], result: e.receiver.type }
|
|
2052
2128
|
: e.method === "reverse"
|
|
2053
2129
|
? { argTypes: [], result: e.receiver.type }
|
|
@@ -2071,7 +2147,27 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2071
2147
|
? { argTypes: [e.type], result: e.type }
|
|
2072
2148
|
: e.method === "shift"
|
|
2073
2149
|
? { argTypes: [], result: e.type } // union-checked below
|
|
2074
|
-
:
|
|
2150
|
+
: e.method === "sortValues"
|
|
2151
|
+
? { argTypes: [F64, null], result: VOID }
|
|
2152
|
+
: { argTypes: [], result: F64 }; // length
|
|
2153
|
+
if ((e.method === "sortPrimitive" || e.method === "toSortedPrimitive") &&
|
|
2154
|
+
elem.kind !== "string" &&
|
|
2155
|
+
elem.kind !== "f64" &&
|
|
2156
|
+
elem.kind !== "bool") {
|
|
2157
|
+
err(`arrIntrinsic ${e.method} requires primitive elements, got ${elem.kind}`, e.loc);
|
|
2158
|
+
}
|
|
2159
|
+
if (e.method === "sortValues") {
|
|
2160
|
+
const arms = elem.kind === "union" ? unions.get(elem.unionId)?.arms : undefined;
|
|
2161
|
+
if (!isSortValuesElement(elem, arms))
|
|
2162
|
+
err(`arrIntrinsic sortValues on ${elem.kind} elements`, e.loc);
|
|
2163
|
+
const cmp = e.args[1]?.type;
|
|
2164
|
+
if (!cmp ||
|
|
2165
|
+
cmp.kind !== "func" ||
|
|
2166
|
+
cmp.params.length > 2 ||
|
|
2167
|
+
!cmp.params.every((param) => typeEquals(param, elem)) ||
|
|
2168
|
+
cmp.ret.kind !== "f64")
|
|
2169
|
+
err("arrIntrinsic sortValues comparator must be (elem, elem) => number", e.loc);
|
|
2170
|
+
}
|
|
2075
2171
|
if (e.method === "getNumber" && elem.kind !== "f64") {
|
|
2076
2172
|
err(`arrIntrinsic getNumber requires f64 elements, got ${elem.kind}`, e.loc);
|
|
2077
2173
|
}
|
|
@@ -2354,6 +2450,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2354
2450
|
break;
|
|
2355
2451
|
}
|
|
2356
2452
|
const wantCaps = target.captures ?? [];
|
|
2453
|
+
if (e.adapts === true && locals.get(e.captures[0] ?? "")?.type.kind !== "func") {
|
|
2454
|
+
err(`closure ${e.fnName}: an adapter's first capture must be a function`, e.loc);
|
|
2455
|
+
}
|
|
2357
2456
|
if (target.captures === undefined && e.captures.length > 0) {
|
|
2358
2457
|
err(`closure over plain function "${e.fnName}" cannot capture`, e.loc);
|
|
2359
2458
|
}
|
|
@@ -2503,9 +2602,23 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2503
2602
|
// exactly when D strictly descends from C AND the two completed
|
|
2504
2603
|
// constructor ABIs agree (what newValue completion rests on).
|
|
2505
2604
|
checkExpr(e.value);
|
|
2605
|
+
if (e.kind === "upcast" && e.type.kind === "func" && e.value.type.kind === "func") {
|
|
2606
|
+
const source = e.value.type;
|
|
2607
|
+
const target = e.type;
|
|
2608
|
+
if (source.rest !== target.rest ||
|
|
2609
|
+
source.restAbi !== target.restAbi ||
|
|
2610
|
+
source.argumentsAll !== target.argumentsAll ||
|
|
2611
|
+
source.params.length !== target.params.length ||
|
|
2612
|
+
!source.params.every((param, i) => typeEquals(param, target.params[i])) ||
|
|
2613
|
+
source.ret.kind !== "object" ||
|
|
2614
|
+
target.ret.kind !== "object" ||
|
|
2615
|
+
!isStrictSubclass(source.ret.className, target.ret.className))
|
|
2616
|
+
err("function upcast requires identical parameters and a covariant class return", e.loc);
|
|
2617
|
+
break;
|
|
2618
|
+
}
|
|
2506
2619
|
if (e.kind === "upcast" && e.type.kind === "classval" && e.value.type.kind === "classval") {
|
|
2507
2620
|
const [sub, sup] = [e.value.type.className, e.type.className];
|
|
2508
|
-
if (!
|
|
2621
|
+
if (!isPhysicalSubclass(sub, sup)) {
|
|
2509
2622
|
err(`upcast: "${sub}" does not extend "${sup}"`, e.loc);
|
|
2510
2623
|
break;
|
|
2511
2624
|
}
|
|
@@ -2670,7 +2783,11 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2670
2783
|
if (p)
|
|
2671
2784
|
expectType(a, p.type, `virtualCall ${e.className}.${e.method} arg ${i}`);
|
|
2672
2785
|
});
|
|
2673
|
-
|
|
2786
|
+
const returned = callSiteReturnType(impl);
|
|
2787
|
+
if (!typeEquals(e.type, returned) &&
|
|
2788
|
+
!(e.type.kind === "object" &&
|
|
2789
|
+
returned.kind === "object" &&
|
|
2790
|
+
isStrictSubclass(returned.className, e.type.className))) {
|
|
2674
2791
|
err(`virtualCall ${e.className}.${e.method} result type mismatch`, e.loc);
|
|
2675
2792
|
}
|
|
2676
2793
|
break;
|
|
@@ -2696,7 +2813,10 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2696
2813
|
const want = recordValidation.get(shape.id).initializationFields;
|
|
2697
2814
|
const seen = new Set();
|
|
2698
2815
|
for (const f of e.fields) {
|
|
2699
|
-
|
|
2816
|
+
if (f.drop || f.overflow)
|
|
2817
|
+
checkExpr(f.value);
|
|
2818
|
+
else
|
|
2819
|
+
checkSlotValue(f.value);
|
|
2700
2820
|
if (seen.has(f.name))
|
|
2701
2821
|
err(`recordLit initializes field "${f.name}" twice`, e.loc);
|
|
2702
2822
|
seen.add(f.name);
|
|
@@ -2756,7 +2876,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2756
2876
|
const want = recordValidation.get(shape.id).initializationFields;
|
|
2757
2877
|
const seen = new Set();
|
|
2758
2878
|
for (const f of e.overrides) {
|
|
2759
|
-
|
|
2879
|
+
checkSlotValue(f.value);
|
|
2760
2880
|
if (seen.has(f.name))
|
|
2761
2881
|
err(`recordClone overrides field "${f.name}" twice`, e.loc);
|
|
2762
2882
|
seen.add(f.name);
|
|
@@ -2768,6 +2888,30 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2768
2888
|
}
|
|
2769
2889
|
break;
|
|
2770
2890
|
}
|
|
2891
|
+
case "recordHas": {
|
|
2892
|
+
checkExpr(e.obj);
|
|
2893
|
+
const shape = records.get(e.shapeId);
|
|
2894
|
+
if (!shape)
|
|
2895
|
+
err(`recordHas on undeclared shape "${e.shapeId}"`, e.loc);
|
|
2896
|
+
else if (!recordValidation.get(e.shapeId)?.fields.has(e.field))
|
|
2897
|
+
err(`shape ${e.shapeId} has no field "${e.field}"`, e.loc);
|
|
2898
|
+
expectType(e.obj, { kind: "record", shapeId: e.shapeId }, "recordHas receiver");
|
|
2899
|
+
if (e.type.kind !== "bool")
|
|
2900
|
+
err("recordHas must be bool", e.loc);
|
|
2901
|
+
break;
|
|
2902
|
+
}
|
|
2903
|
+
case "fieldAbsent": {
|
|
2904
|
+
const def = unions.get(e.unionId);
|
|
2905
|
+
if (!def)
|
|
2906
|
+
err(`fieldAbsent of undeclared union "${e.unionId}"`, e.loc);
|
|
2907
|
+
else if (!def.arms.some((arm) => arm.kind === "undefinedT"))
|
|
2908
|
+
err(`fieldAbsent of ${e.unionId}: the union has no undefined arm`, e.loc);
|
|
2909
|
+
if (e.type.kind !== "union" || e.type.unionId !== e.unionId)
|
|
2910
|
+
err("fieldAbsent must have its union type", e.loc);
|
|
2911
|
+
if (!fieldSlotValues.has(e))
|
|
2912
|
+
err("fieldAbsent outside a record field write", e.loc);
|
|
2913
|
+
break;
|
|
2914
|
+
}
|
|
2771
2915
|
case "recordGet": {
|
|
2772
2916
|
checkExpr(e.obj);
|
|
2773
2917
|
const shape = records.get(e.shapeId);
|
|
@@ -3065,8 +3209,8 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3065
3209
|
if (e.test === "instanceof") {
|
|
3066
3210
|
if (!e.className)
|
|
3067
3211
|
err("caughtTest instanceof without a class", e.loc);
|
|
3068
|
-
else if (!
|
|
3069
|
-
err(`caughtTest instanceof against
|
|
3212
|
+
else if (!classes.has(e.className)) {
|
|
3213
|
+
err(`caughtTest instanceof against undeclared class "${e.className}"`, e.loc);
|
|
3070
3214
|
}
|
|
3071
3215
|
}
|
|
3072
3216
|
else if (e.className !== undefined) {
|
|
@@ -3102,9 +3246,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3102
3246
|
const ok = t.kind === "f64" ||
|
|
3103
3247
|
t.kind === "bool" ||
|
|
3104
3248
|
t.kind === "string" ||
|
|
3105
|
-
(t.kind === "object" &&
|
|
3249
|
+
(t.kind === "object" && classes.has(t.className));
|
|
3106
3250
|
if (!ok) {
|
|
3107
|
-
err(`caughtNarrow to ${t.kind === "object" ? `
|
|
3251
|
+
err(`caughtNarrow to ${t.kind === "object" ? `undeclared class "${t.className}"` : t.kind}`, e.loc);
|
|
3108
3252
|
}
|
|
3109
3253
|
break;
|
|
3110
3254
|
}
|
|
@@ -3258,6 +3402,19 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3258
3402
|
}
|
|
3259
3403
|
}
|
|
3260
3404
|
function checkIntrinsicExpr(e) {
|
|
3405
|
+
if (e.name === "module.tdzCheck") {
|
|
3406
|
+
const [flag, name] = e.args;
|
|
3407
|
+
if (e.args.length !== 2 || flag === undefined || name?.kind !== "strLit") {
|
|
3408
|
+
err("module.tdzCheck takes a flag and a binding-name literal", e.loc);
|
|
3409
|
+
return;
|
|
3410
|
+
}
|
|
3411
|
+
checkExpr(flag);
|
|
3412
|
+
if (flag.type.kind !== "bool")
|
|
3413
|
+
err("module.tdzCheck flag must be bool", e.loc);
|
|
3414
|
+
if (e.type.kind !== "void")
|
|
3415
|
+
err("module.tdzCheck must be void", e.loc);
|
|
3416
|
+
return;
|
|
3417
|
+
}
|
|
3261
3418
|
if (e.name === "module.await") {
|
|
3262
3419
|
if (e.args.length !== 1)
|
|
3263
3420
|
err("module.await takes exactly one argument", e.loc);
|
|
@@ -3365,6 +3522,13 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3365
3522
|
err(`${e.name} must be void`, e.loc);
|
|
3366
3523
|
}
|
|
3367
3524
|
function checkLibCall(e) {
|
|
3525
|
+
if (e.fn === "atomics.op" &&
|
|
3526
|
+
(e.args[0]?.type.kind !== "bytes" ||
|
|
3527
|
+
!["u8", "i8", "u16", "i16", "u32", "i32"].includes(e.args[0].type.elem))) {
|
|
3528
|
+
errors.push({ message: "integer Atomics require an integer typed array", loc: e.loc });
|
|
3529
|
+
}
|
|
3530
|
+
if (e.fn === "worker.new" && !workers)
|
|
3531
|
+
errors.push({ message: "Worker construction requires worker execution mode", loc: e.loc });
|
|
3368
3532
|
const sig = LIB_FN_SIGS[e.fn];
|
|
3369
3533
|
if (!sig) {
|
|
3370
3534
|
err(`libCall of unknown library function "${e.fn}"`, e.loc);
|
|
@@ -5226,7 +5390,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
5226
5390
|
}
|
|
5227
5391
|
case "assign": {
|
|
5228
5392
|
const binding = locals.get(s.localId) ?? globals.get(s.localId);
|
|
5229
|
-
if (s.initializes && !binding?.tdz) {
|
|
5393
|
+
if (s.initializes && !binding?.tdz && globals.get(s.localId)?.initFlag === undefined) {
|
|
5230
5394
|
err(`initializing assign requires a TDZ binding "${s.localId}"`, s.loc);
|
|
5231
5395
|
}
|
|
5232
5396
|
if (!binding)
|
|
@@ -5364,7 +5528,7 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
5364
5528
|
}
|
|
5365
5529
|
case "recordSet": {
|
|
5366
5530
|
checkExpr(s.obj);
|
|
5367
|
-
|
|
5531
|
+
checkSlotValue(s.value);
|
|
5368
5532
|
const shape = records.get(s.shapeId);
|
|
5369
5533
|
const field = recordValidation.get(s.shapeId)?.fields.get(s.field);
|
|
5370
5534
|
if (!shape)
|