@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.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
|
-
import { BOOL, DYN, DYN_CLASS_PROPERTIES, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, mapOf, setOf, } from "./ir.js";
|
|
2
|
+
import { BOOL, DYN, DYN_CLASS_PROPERTIES, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, funcOf, mapOf, setOf, } from "./ir.js";
|
|
3
3
|
import { deserializeModule, serializeModule } from "./serialize.js";
|
|
4
4
|
import { validateModule } from "./validate.js";
|
|
5
5
|
const loc = { file: "numeric-read.ts", start: 0, end: 0 };
|
|
@@ -263,17 +263,18 @@ test.each([mapOf(STRING, F64), setOf(STRING), { kind: "promise", inner: F64 }])(
|
|
|
263
263
|
expect(validateModule(mod)).toEqual([]);
|
|
264
264
|
expect(deserializeModule(serializeModule(mod))).toEqual(mod);
|
|
265
265
|
});
|
|
266
|
-
test.each([
|
|
266
|
+
test.each([{ kind: "promise", inner: F64 }])("%j payloads still refuse unrelated data siblings", (type) => {
|
|
267
267
|
const mod = expressionModule({ kind: "numLit", value: 0, type: F64, loc }, [
|
|
268
268
|
{ id: "mixed", arms: [type, STRING, UNDEFINED_T] },
|
|
269
269
|
]);
|
|
270
270
|
expect(validateModule(mod).map((error) => error.message)).toContain(`union mixed: ${type.kind} arm 0 beside non-unit arms`);
|
|
271
271
|
});
|
|
272
|
-
test("
|
|
272
|
+
test("differently typed collection payloads preserve separate union tags", () => {
|
|
273
273
|
const mod = expressionModule({ kind: "numLit", value: 0, type: F64, loc }, [
|
|
274
274
|
{ id: "maps", arms: [mapOf(STRING, F64), mapOf(STRING, STRING), UNDEFINED_T] },
|
|
275
275
|
]);
|
|
276
|
-
expect(validateModule(mod)
|
|
276
|
+
expect(validateModule(mod)).toEqual([]);
|
|
277
|
+
expect(deserializeModule(serializeModule(mod))).toEqual(mod);
|
|
277
278
|
});
|
|
278
279
|
function numericReadModule(overrides = {}) {
|
|
279
280
|
const read = {
|
|
@@ -286,7 +287,7 @@ function numericReadModule(overrides = {}) {
|
|
|
286
287
|
...overrides,
|
|
287
288
|
};
|
|
288
289
|
return {
|
|
289
|
-
irVersion:
|
|
290
|
+
irVersion: 15,
|
|
290
291
|
sourceFile: loc.file,
|
|
291
292
|
entry: "main",
|
|
292
293
|
functions: [
|
|
@@ -330,9 +331,35 @@ test.each(["copyWithin", "fill", "fillUndefined"])("indexed array mutation %s va
|
|
|
330
331
|
expect(validateModule(deserializeModule(serializeModule(invalid))).length).toBeGreaterThan(0);
|
|
331
332
|
}
|
|
332
333
|
});
|
|
334
|
+
test.each(["sortPrimitive", "toSortedPrimitive"])("primitive ordering %s validates its serialized element and result contract", (method) => {
|
|
335
|
+
for (const elem of [STRING, F64, BOOL]) {
|
|
336
|
+
const type = arrayOf(elem);
|
|
337
|
+
const expr = {
|
|
338
|
+
kind: "arrIntrinsic",
|
|
339
|
+
method,
|
|
340
|
+
receiver: { kind: "arrayLit", elems: [], type, loc },
|
|
341
|
+
args: [],
|
|
342
|
+
type,
|
|
343
|
+
loc,
|
|
344
|
+
};
|
|
345
|
+
const mod = expressionModule(expr, []);
|
|
346
|
+
expect(validateModule(mod)).toEqual([]);
|
|
347
|
+
expect(deserializeModule(serializeModule(mod))).toEqual(mod);
|
|
348
|
+
for (const change of [
|
|
349
|
+
{ args: [{ kind: "numLit", value: 1, type: F64, loc }] },
|
|
350
|
+
{ type: F64 },
|
|
351
|
+
{
|
|
352
|
+
receiver: { kind: "arrayLit", elems: [], type: arrayOf(type), loc },
|
|
353
|
+
type: arrayOf(type),
|
|
354
|
+
},
|
|
355
|
+
]) {
|
|
356
|
+
expect(validateModule(expressionModule({ ...expr, ...change }, [])).length).toBeGreaterThan(0);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
});
|
|
333
360
|
function expressionModule(expr, unions) {
|
|
334
361
|
return {
|
|
335
|
-
irVersion:
|
|
362
|
+
irVersion: 15,
|
|
336
363
|
sourceFile: loc.file,
|
|
337
364
|
entry: "main",
|
|
338
365
|
unions,
|
|
@@ -743,6 +770,67 @@ test("virtual-call validation uses the nearest concrete ancestor instead of an o
|
|
|
743
770
|
mod.classes.find((cls) => cls.name === "Root").methods = [];
|
|
744
771
|
expect(validateModule(mod)).toEqual([]);
|
|
745
772
|
});
|
|
773
|
+
test("erased generic families admit compatible object views without supplying virtual slots", () => {
|
|
774
|
+
const concrete = { kind: "object", className: "Concrete" };
|
|
775
|
+
const family = { kind: "object", className: "Family" };
|
|
776
|
+
const mod = expressionModule({
|
|
777
|
+
kind: "upcast",
|
|
778
|
+
value: { kind: "varRef", localId: "value", type: concrete, loc },
|
|
779
|
+
type: family,
|
|
780
|
+
loc,
|
|
781
|
+
}, []);
|
|
782
|
+
mod.functions[0].params = [{ localId: "value", name: "value", type: concrete }];
|
|
783
|
+
mod.functions[0].locals = [{ id: "value", name: "value", type: concrete, mutable: false }];
|
|
784
|
+
mod.classes = [
|
|
785
|
+
{ name: "Root", fields: [{ name: "value", type: F64 }], methods: [], loc },
|
|
786
|
+
{ name: "Family", base: "Root", fields: [{ name: "value", type: F64 }], methods: [], loc },
|
|
787
|
+
{ name: "Storage", base: "Root", fields: [{ name: "value", type: F64 }], methods: [], loc },
|
|
788
|
+
{
|
|
789
|
+
name: "Concrete",
|
|
790
|
+
base: "Storage",
|
|
791
|
+
genericOf: "Family",
|
|
792
|
+
fields: [{ name: "value", type: F64 }],
|
|
793
|
+
methods: [],
|
|
794
|
+
loc,
|
|
795
|
+
},
|
|
796
|
+
];
|
|
797
|
+
expect(validateModule(deserializeModule(serializeModule(mod)))).toEqual([]);
|
|
798
|
+
mod.classes[3].fields[0].type = STRING;
|
|
799
|
+
expect(validateModule(mod).map((error) => error.message)).toContain('class Concrete: generic family "Family" has an incompatible prefix');
|
|
800
|
+
mod.classes[3].fields[0].type = F64;
|
|
801
|
+
delete mod.classes[3].base;
|
|
802
|
+
expect(validateModule(mod).map((error) => error.message)).toContain('class Concrete: generic family "Family" has a different storage root');
|
|
803
|
+
mod.classes[3].base = "Storage";
|
|
804
|
+
mod.classes[1].genericOf = "Concrete";
|
|
805
|
+
expect(validateModule(mod).map((error) => error.message)).toContain('class Concrete: generic family "Family" must name an erased declaration');
|
|
806
|
+
const calls = virtualCallModule();
|
|
807
|
+
calls.classes = calls.classes.filter((cls) => cls.name !== "Second");
|
|
808
|
+
const first = calls.classes.find((cls) => cls.name === "First");
|
|
809
|
+
delete first.base;
|
|
810
|
+
first.genericOf = "Base";
|
|
811
|
+
expect(validateModule(calls).map((error) => error.message)).toContain("in caller0: virtualCall Base.run: no concrete override below the static class");
|
|
812
|
+
});
|
|
813
|
+
test("erased family membership cannot reinterpret a specialized constructor ABI", () => {
|
|
814
|
+
const mod = expressionModule({
|
|
815
|
+
kind: "upcast",
|
|
816
|
+
value: {
|
|
817
|
+
kind: "varRef",
|
|
818
|
+
localId: "ctor",
|
|
819
|
+
type: { kind: "classval", className: "Concrete" },
|
|
820
|
+
loc,
|
|
821
|
+
},
|
|
822
|
+
type: { kind: "classval", className: "Family" },
|
|
823
|
+
loc,
|
|
824
|
+
}, []);
|
|
825
|
+
const ctor = { kind: "classval", className: "Concrete" };
|
|
826
|
+
mod.functions[0].params = [{ localId: "ctor", name: "ctor", type: ctor }];
|
|
827
|
+
mod.functions[0].locals = [{ id: "ctor", name: "ctor", type: ctor, mutable: false }];
|
|
828
|
+
mod.classes = [
|
|
829
|
+
{ name: "Family", fields: [], methods: [], loc },
|
|
830
|
+
{ name: "Concrete", genericOf: "Family", fields: [], methods: [], loc },
|
|
831
|
+
];
|
|
832
|
+
expect(validateModule(mod).map((error) => error.message)).toContain('in main: upcast: "Concrete" does not extend "Family"');
|
|
833
|
+
});
|
|
746
834
|
test("library callbacks retain child, specialized, and generic result diagnostics", () => {
|
|
747
835
|
const expr = {
|
|
748
836
|
kind: "libCall",
|
|
@@ -1056,7 +1144,7 @@ test.each([
|
|
|
1056
1144
|
function tdzModule(mutable = true) {
|
|
1057
1145
|
const value = { kind: "numLit", value: 0, type: F64, loc };
|
|
1058
1146
|
return {
|
|
1059
|
-
irVersion:
|
|
1147
|
+
irVersion: 15,
|
|
1060
1148
|
sourceFile: loc.file,
|
|
1061
1149
|
entry: "main",
|
|
1062
1150
|
functions: [
|
|
@@ -1179,6 +1267,79 @@ test.each(["receiver", "key", "result"])("overflow presence checks its %s type",
|
|
|
1179
1267
|
const message = slot === "result" ? "recordOvfHas must be bool" : `recordOvfHas ${slot}`;
|
|
1180
1268
|
expect(validateModule(mod).some((error) => error.message.includes(message))).toBe(true);
|
|
1181
1269
|
});
|
|
1270
|
+
function fieldPresenceModule(absentInLiteral) {
|
|
1271
|
+
const optional = { kind: "union", unionId: "maybeCount" };
|
|
1272
|
+
const record = { kind: "record", shapeId: "item" };
|
|
1273
|
+
const absent = { kind: "fieldAbsent", unionId: "maybeCount", type: optional, loc };
|
|
1274
|
+
const literal = {
|
|
1275
|
+
kind: "recordLit",
|
|
1276
|
+
fields: [
|
|
1277
|
+
{
|
|
1278
|
+
name: "count",
|
|
1279
|
+
value: absentInLiteral
|
|
1280
|
+
? {
|
|
1281
|
+
kind: "ternary",
|
|
1282
|
+
cond: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
1283
|
+
then: {
|
|
1284
|
+
kind: "unionWrap",
|
|
1285
|
+
unionId: "maybeCount",
|
|
1286
|
+
tag: 0,
|
|
1287
|
+
value: { kind: "numLit", value: 1, type: F64, loc },
|
|
1288
|
+
type: optional,
|
|
1289
|
+
loc,
|
|
1290
|
+
},
|
|
1291
|
+
else_: absent,
|
|
1292
|
+
type: optional,
|
|
1293
|
+
loc,
|
|
1294
|
+
}
|
|
1295
|
+
: {
|
|
1296
|
+
kind: "unionWrap",
|
|
1297
|
+
unionId: "maybeCount",
|
|
1298
|
+
tag: 1,
|
|
1299
|
+
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
1300
|
+
type: optional,
|
|
1301
|
+
loc,
|
|
1302
|
+
},
|
|
1303
|
+
},
|
|
1304
|
+
],
|
|
1305
|
+
type: record,
|
|
1306
|
+
loc,
|
|
1307
|
+
};
|
|
1308
|
+
const check = {
|
|
1309
|
+
kind: "recordHas",
|
|
1310
|
+
obj: literal,
|
|
1311
|
+
shapeId: "item",
|
|
1312
|
+
field: "count",
|
|
1313
|
+
type: BOOL,
|
|
1314
|
+
loc,
|
|
1315
|
+
};
|
|
1316
|
+
const mod = expressionModule(check, [{ id: "maybeCount", arms: [F64, UNDEFINED_T] }]);
|
|
1317
|
+
mod.records = [{ id: "item", fields: [{ name: "count", type: optional }] }];
|
|
1318
|
+
if (!absentInLiteral)
|
|
1319
|
+
mod.functions[0].body.push({ kind: "exprStmt", expr: absent, loc });
|
|
1320
|
+
return mod;
|
|
1321
|
+
}
|
|
1322
|
+
test("field presence checks and absent field states validate and serialize", () => {
|
|
1323
|
+
const mod = fieldPresenceModule(true);
|
|
1324
|
+
expect(validateModule(mod)).toEqual([]);
|
|
1325
|
+
expect(deserializeModule(serializeModule(mod))).toEqual(mod);
|
|
1326
|
+
});
|
|
1327
|
+
test("the absent field state is confined to field writes", () => {
|
|
1328
|
+
expect(validateModule(fieldPresenceModule(false)).some((error) => error.message.includes("fieldAbsent outside a record field write"))).toBe(true);
|
|
1329
|
+
});
|
|
1330
|
+
test("the absent field state requires an undefined arm", () => {
|
|
1331
|
+
const mod = fieldPresenceModule(true);
|
|
1332
|
+
mod.unions = [{ id: "maybeCount", arms: [F64, STRING] }];
|
|
1333
|
+
expect(validateModule(mod).some((error) => error.message.includes("the union has no undefined arm"))).toBe(true);
|
|
1334
|
+
});
|
|
1335
|
+
test("field presence checks name a declared field", () => {
|
|
1336
|
+
const mod = fieldPresenceModule(true);
|
|
1337
|
+
const statement = mod.functions[0].body[0];
|
|
1338
|
+
if (statement.kind !== "exprStmt" || statement.expr.kind !== "recordHas")
|
|
1339
|
+
throw new Error("fixture");
|
|
1340
|
+
statement.expr.field = "missing";
|
|
1341
|
+
expect(validateModule(mod).some((error) => error.message.includes('has no field "missing"'))).toBe(true);
|
|
1342
|
+
});
|
|
1182
1343
|
test("TDZ locals require a shared box", () => {
|
|
1183
1344
|
const mod = tdzModule();
|
|
1184
1345
|
delete mod.functions[0].locals[0].boxed;
|
|
@@ -1186,7 +1347,7 @@ test("TDZ locals require a shared box", () => {
|
|
|
1186
1347
|
});
|
|
1187
1348
|
function discriminatedModule() {
|
|
1188
1349
|
return {
|
|
1189
|
-
irVersion:
|
|
1350
|
+
irVersion: 15,
|
|
1190
1351
|
sourceFile: loc.file,
|
|
1191
1352
|
entry: "main",
|
|
1192
1353
|
functions: [{ name: "main", params: [], locals: [], returnType: VOID, body: [], loc }],
|
|
@@ -1338,4 +1499,191 @@ test("typed-array brand tests serialize their element kind and reject misplaced
|
|
|
1338
1499
|
expr.test = "array";
|
|
1339
1500
|
expect(validateModule(mod).map((d) => d.message)).toContain("in main: dynTest bytesElem requires a valid bytes test");
|
|
1340
1501
|
});
|
|
1502
|
+
test("function result views preserve the parameter ABI and reject reversed covariance", () => {
|
|
1503
|
+
const source = {
|
|
1504
|
+
kind: "func",
|
|
1505
|
+
params: [F64],
|
|
1506
|
+
ret: { kind: "object", className: "Child" },
|
|
1507
|
+
};
|
|
1508
|
+
const target = {
|
|
1509
|
+
kind: "func",
|
|
1510
|
+
params: [F64],
|
|
1511
|
+
ret: { kind: "object", className: "Base" },
|
|
1512
|
+
};
|
|
1513
|
+
const mod = expressionModule({
|
|
1514
|
+
kind: "upcast",
|
|
1515
|
+
value: { kind: "varRef", localId: "callback", type: source, loc },
|
|
1516
|
+
type: target,
|
|
1517
|
+
loc,
|
|
1518
|
+
}, []);
|
|
1519
|
+
mod.classes = [
|
|
1520
|
+
{ name: "Base", fields: [], loc },
|
|
1521
|
+
{ name: "Child", base: "Base", fields: [], loc },
|
|
1522
|
+
{ name: "Other", fields: [], loc },
|
|
1523
|
+
];
|
|
1524
|
+
mod.functions[0].params = [{ localId: "callback", name: "callback", type: source }];
|
|
1525
|
+
mod.functions[0].locals = [{ id: "callback", name: "callback", type: source, mutable: false }];
|
|
1526
|
+
expect(validateModule(deserializeModule(serializeModule(mod)))).toEqual([]);
|
|
1527
|
+
for (const variant of [
|
|
1528
|
+
"parameter",
|
|
1529
|
+
"arity",
|
|
1530
|
+
"rest",
|
|
1531
|
+
"rest-abi",
|
|
1532
|
+
"arguments",
|
|
1533
|
+
"return",
|
|
1534
|
+
"unrelated",
|
|
1535
|
+
"reverse",
|
|
1536
|
+
]) {
|
|
1537
|
+
const bad = structuredClone(mod);
|
|
1538
|
+
const stmt = bad.functions[0].body[0];
|
|
1539
|
+
if (stmt.kind !== "exprStmt" || stmt.expr.kind !== "upcast" || stmt.expr.type.kind !== "func")
|
|
1540
|
+
throw new Error("fixture");
|
|
1541
|
+
const type = stmt.expr.type;
|
|
1542
|
+
if (variant === "parameter")
|
|
1543
|
+
type.params[0] = STRING;
|
|
1544
|
+
if (variant === "arity")
|
|
1545
|
+
type.params.push(F64);
|
|
1546
|
+
if (variant === "rest")
|
|
1547
|
+
type.rest = true;
|
|
1548
|
+
if (variant === "rest-abi")
|
|
1549
|
+
type.restAbi = "jsval";
|
|
1550
|
+
if (variant === "arguments")
|
|
1551
|
+
type.argumentsAll = true;
|
|
1552
|
+
if (variant === "return")
|
|
1553
|
+
type.ret = F64;
|
|
1554
|
+
if (variant === "unrelated")
|
|
1555
|
+
type.ret = { kind: "object", className: "Other" };
|
|
1556
|
+
if (variant === "reverse") {
|
|
1557
|
+
if (stmt.expr.value.type.kind !== "func")
|
|
1558
|
+
throw new Error("fixture");
|
|
1559
|
+
stmt.expr.value.type.ret = { kind: "object", className: "Base" };
|
|
1560
|
+
type.ret = { kind: "object", className: "Child" };
|
|
1561
|
+
}
|
|
1562
|
+
expect(validateModule(bad).map((error) => error.message), variant).toContain("in main: function upcast requires identical parameters and a covariant class return");
|
|
1563
|
+
}
|
|
1564
|
+
});
|
|
1565
|
+
test("abstract virtual slots admit subclass returns without admitting unrelated return layouts", () => {
|
|
1566
|
+
const mod = virtualCallModule();
|
|
1567
|
+
const base = { kind: "object", className: "Base" };
|
|
1568
|
+
const child = { kind: "object", className: "First" };
|
|
1569
|
+
for (const fn of mod.functions.filter((fn) => fn.name.startsWith("%"))) {
|
|
1570
|
+
fn.params.push({ localId: "result", name: "result", type: child });
|
|
1571
|
+
fn.locals.push({ id: "result", name: "result", type: child, mutable: false });
|
|
1572
|
+
fn.returnType = child;
|
|
1573
|
+
fn.body = [
|
|
1574
|
+
{ kind: "return", value: { kind: "varRef", localId: "result", type: child, loc }, loc },
|
|
1575
|
+
];
|
|
1576
|
+
}
|
|
1577
|
+
for (const fn of mod.functions.filter((fn) => fn.name.startsWith("caller"))) {
|
|
1578
|
+
fn.params.push({ localId: "result", name: "result", type: child });
|
|
1579
|
+
fn.locals.push({ id: "result", name: "result", type: child, mutable: false });
|
|
1580
|
+
const stmt = fn.body[0];
|
|
1581
|
+
if (stmt.kind !== "exprStmt" || stmt.expr.kind !== "virtualCall")
|
|
1582
|
+
throw new Error("fixture");
|
|
1583
|
+
stmt.expr.type = base;
|
|
1584
|
+
stmt.expr.args.push({ kind: "varRef", localId: "result", type: child, loc });
|
|
1585
|
+
}
|
|
1586
|
+
expect(validateModule(deserializeModule(serializeModule(mod)))).toEqual([]);
|
|
1587
|
+
mod.classes.find((cls) => cls.name === "First").base = "Unrelated";
|
|
1588
|
+
expect(validateModule(mod).map((error) => error.message)).toEqual([
|
|
1589
|
+
"in caller0: virtualCall Base.run result type mismatch",
|
|
1590
|
+
"in caller1: virtualCall Base.run result type mismatch",
|
|
1591
|
+
]);
|
|
1592
|
+
});
|
|
1593
|
+
test("signature adapters capture the function whose identity they share", () => {
|
|
1594
|
+
const source = { kind: "func", params: [F64], ret: VOID };
|
|
1595
|
+
const target = { kind: "func", params: [F64, F64], ret: VOID };
|
|
1596
|
+
const adapter = {
|
|
1597
|
+
kind: "closure",
|
|
1598
|
+
fnName: "view",
|
|
1599
|
+
captures: ["f.0"],
|
|
1600
|
+
adapts: true,
|
|
1601
|
+
type: target,
|
|
1602
|
+
loc,
|
|
1603
|
+
};
|
|
1604
|
+
const mod = expressionModule(adapter, []);
|
|
1605
|
+
mod.functions[0].locals.push({
|
|
1606
|
+
id: "f.0",
|
|
1607
|
+
name: "f",
|
|
1608
|
+
type: source,
|
|
1609
|
+
mutable: false,
|
|
1610
|
+
boxed: true,
|
|
1611
|
+
});
|
|
1612
|
+
mod.functions.push({
|
|
1613
|
+
name: "view",
|
|
1614
|
+
params: [
|
|
1615
|
+
{ localId: "a.0", name: "a", type: F64 },
|
|
1616
|
+
{ localId: "b.0", name: "b", type: F64 },
|
|
1617
|
+
],
|
|
1618
|
+
captures: [{ localId: "f.0", name: "f", type: source }],
|
|
1619
|
+
locals: [
|
|
1620
|
+
{ id: "f.0", name: "f", type: source, mutable: false, boxed: true },
|
|
1621
|
+
{ id: "a.0", name: "a", type: F64, mutable: false },
|
|
1622
|
+
{ id: "b.0", name: "b", type: F64, mutable: false },
|
|
1623
|
+
],
|
|
1624
|
+
returnType: VOID,
|
|
1625
|
+
body: [],
|
|
1626
|
+
loc,
|
|
1627
|
+
});
|
|
1628
|
+
expect(validateModule(mod)).toEqual([]);
|
|
1629
|
+
expect(deserializeModule(serializeModule(mod))).toEqual(mod);
|
|
1630
|
+
const numeric = structuredClone(mod);
|
|
1631
|
+
for (const fn of numeric.functions)
|
|
1632
|
+
for (const local of fn.locals)
|
|
1633
|
+
if (local.id === "f.0")
|
|
1634
|
+
local.type = F64;
|
|
1635
|
+
numeric.functions[1].captures = [{ localId: "f.0", name: "f", type: F64 }];
|
|
1636
|
+
expect(validateModule(numeric).some((error) => error.message.includes("an adapter's first capture must be a function"))).toBe(true);
|
|
1637
|
+
});
|
|
1638
|
+
test("runtime comparator sort validates element kinds and the comparator shape", () => {
|
|
1639
|
+
const comparator = (params, ret = F64) => ({
|
|
1640
|
+
kind: "closure",
|
|
1641
|
+
fnName: "cmp",
|
|
1642
|
+
captures: [],
|
|
1643
|
+
type: funcOf(params, ret),
|
|
1644
|
+
loc,
|
|
1645
|
+
});
|
|
1646
|
+
const sortModule = (elem, cmp, arms) => {
|
|
1647
|
+
const mod = numericReadModule({
|
|
1648
|
+
method: "sortValues",
|
|
1649
|
+
receiver: { kind: "arrayLit", elems: [], type: arrayOf(elem), loc },
|
|
1650
|
+
args: [{ kind: "numLit", value: 0, type: F64, loc }, cmp],
|
|
1651
|
+
type: VOID,
|
|
1652
|
+
});
|
|
1653
|
+
const params = cmp.type.kind === "func" ? cmp.type.params : [];
|
|
1654
|
+
mod.functions.push({
|
|
1655
|
+
name: "cmp",
|
|
1656
|
+
params: params.map((type, index) => ({ localId: `p${index}`, name: `p${index}`, type })),
|
|
1657
|
+
locals: params.map((type, index) => ({
|
|
1658
|
+
id: `p${index}`,
|
|
1659
|
+
name: `p${index}`,
|
|
1660
|
+
type,
|
|
1661
|
+
mutable: false,
|
|
1662
|
+
})),
|
|
1663
|
+
returnType: F64,
|
|
1664
|
+
body: [{ kind: "return", value: { kind: "numLit", value: 0, type: F64, loc }, loc }],
|
|
1665
|
+
loc,
|
|
1666
|
+
});
|
|
1667
|
+
if (arms)
|
|
1668
|
+
mod.unions = [{ id: "u", arms }];
|
|
1669
|
+
return mod;
|
|
1670
|
+
};
|
|
1671
|
+
const union = { kind: "union", unionId: "u" };
|
|
1672
|
+
for (const mod of [
|
|
1673
|
+
sortModule(F64, comparator([F64, F64])),
|
|
1674
|
+
sortModule(STRING, comparator([STRING])),
|
|
1675
|
+
sortModule(union, comparator([union, union]), [STRING, F64]),
|
|
1676
|
+
]) {
|
|
1677
|
+
expect(validateModule(mod)).toEqual([]);
|
|
1678
|
+
expect(deserializeModule(serializeModule(mod))).toEqual(mod);
|
|
1679
|
+
}
|
|
1680
|
+
for (const [mod, message] of [
|
|
1681
|
+
[sortModule(BOOL, comparator([BOOL, BOOL])), "sortValues on bool"],
|
|
1682
|
+
[sortModule(union, comparator([union, union]), [STRING, UNDEFINED_T]), "sortValues on union"],
|
|
1683
|
+
[sortModule(F64, comparator([STRING, STRING])), "comparator must be"],
|
|
1684
|
+
[sortModule(F64, comparator([F64, F64, F64])), "comparator must be"],
|
|
1685
|
+
]) {
|
|
1686
|
+
expect(validateModule(mod).some((error) => error.message.includes(message))).toBe(true);
|
|
1687
|
+
}
|
|
1688
|
+
});
|
|
1341
1689
|
//# sourceMappingURL=validate.test.js.map
|