@scriptc/compiler 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +5 -18
- package/dist/backend/cycle-analysis.d.ts +21 -9
- package/dist/backend/cycle-analysis.js +139 -67
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +283 -3
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +39 -0
- package/dist/backend/cycle-mutability.js +205 -0
- package/dist/backend/cycle-mutability.js.map +1 -0
- package/dist/backend/link-plan-core.d.ts +2 -1
- package/dist/backend/link-plan-core.js +15 -3
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +2 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +40 -0
- package/dist/backend/llvm/alloc.js +205 -0
- package/dist/backend/llvm/alloc.js.map +1 -0
- package/dist/backend/llvm/alloc.test.d.ts +1 -0
- package/dist/backend/llvm/alloc.test.js +102 -0
- package/dist/backend/llvm/alloc.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +15 -3
- package/dist/backend/llvm/call-lifetimes.js +42 -18
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +170 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +4 -1
- package/dist/backend/llvm/classes.js +35 -32
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +36 -3
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +13 -0
- package/dist/backend/llvm/common.js +30 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +19 -3
- package/dist/backend/llvm/constant-callbacks.js +289 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +140 -3
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +29 -0
- package/dist/backend/llvm/dense-array-access.js +335 -0
- package/dist/backend/llvm/dense-array-access.js.map +1 -0
- package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-access.test.js +149 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +34 -0
- package/dist/backend/llvm/dyn.js +189 -1
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +124 -4
- package/dist/backend/llvm/emitter.js +623 -105
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +68 -6
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +58 -4
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.d.ts +1 -0
- package/dist/backend/llvm/expr-async.test.js +62 -0
- package/dist/backend/llvm/expr-async.test.js.map +1 -0
- package/dist/backend/llvm/expr-calls.js +64 -6
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +16 -5
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +92 -2
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +174 -25
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +52 -24
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.js +3 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +59 -2
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/integer-remainder.d.ts +11 -0
- package/dist/backend/llvm/integer-remainder.js +91 -0
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +2 -1
- package/dist/backend/llvm/layouts.js +3 -2
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +16 -0
- package/dist/backend/llvm/lazy-captures.js +96 -0
- package/dist/backend/llvm/lazy-captures.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
- package/dist/backend/llvm/lazy-captures.test.js +78 -0
- package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
- package/dist/backend/llvm/lib-filesystem.js +3 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +5 -1
- package/dist/backend/llvm/local-array-reads.js +78 -17
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +78 -1
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +5 -1
- package/dist/backend/llvm/local-union-storage.js +48 -6
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +91 -4
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
- package/dist/backend/llvm/nullable-fields.d.ts +28 -0
- package/dist/backend/llvm/nullable-fields.js +45 -0
- package/dist/backend/llvm/nullable-fields.js.map +1 -0
- package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-fields.test.js +48 -0
- package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +69 -2
- package/dist/backend/llvm/shapes.js +259 -27
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +114 -5
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/stack-callbacks.js +2 -3
- package/dist/backend/llvm/stack-callbacks.js.map +1 -1
- package/dist/backend/llvm/stack-captures.d.ts +3 -1
- package/dist/backend/llvm/stack-captures.js +5 -3
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +38 -1
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-key-hash.d.ts +8 -0
- package/dist/backend/llvm/string-key-hash.js +59 -0
- package/dist/backend/llvm/string-key-hash.js.map +1 -0
- package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
- package/dist/backend/llvm/string-key-hash.test.js +34 -0
- package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +41 -4
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.js +1 -1
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +2 -2
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/may-throw.js +3 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +1 -1
- package/dist/backend/native/cache-warm.d.ts +2 -1
- package/dist/backend/native/cache-warm.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +3 -2
- package/dist/backend/native/contracts.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +2 -1
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +5 -0
- package/dist/backend/native-codegen.js +4 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +23 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +3 -2
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.d.ts +2 -1
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +2 -2
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +3 -1
- package/dist/backend/native-tools.js +0 -1
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/optimization.d.ts +25 -0
- package/dist/backend/optimization.js +21 -0
- package/dist/backend/optimization.js.map +1 -0
- package/dist/backend/optimization.test.d.ts +1 -0
- package/dist/backend/optimization.test.js +24 -0
- package/dist/backend/optimization.test.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +15 -4
- package/dist/backend/runtime-pack-core.js +23 -12
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +7 -3
- package/dist/backend/runtime-pack-native.js +0 -3
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.d.ts +20 -2
- package/dist/backend/runtime-pack.js +23 -0
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +115 -2
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/targets.d.ts +2 -1
- package/dist/backend/targets.js +1 -1
- package/dist/backend/targets.js.map +1 -1
- package/dist/cli/command.js +5 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +2 -1
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +5 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +5 -2
- package/dist/diagnostics/diagnostic.js +10 -8
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -2
- package/dist/executable/executable-cache.js +7 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +20 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +5 -49
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +23 -0
- package/dist/frontend/lowering/array-values.js +129 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +17 -2
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +6 -17
- package/dist/frontend/lowering/builtins/process.js +56 -29
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
- package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-assertions.d.ts +4 -0
- package/dist/frontend/lowering/class-assertions.js +12 -4
- package/dist/frontend/lowering/class-assertions.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
- package/dist/frontend/lowering/class-callbacks.js +18 -5
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
- package/dist/frontend/lowering/class-method-mutations.js +472 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.js +25 -5
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +8 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-unions.d.ts +16 -0
- package/dist/frontend/lowering/class-unions.js +127 -0
- package/dist/frontend/lowering/class-unions.js.map +1 -0
- package/dist/frontend/lowering/coercions/builders.js +8 -1
- package/dist/frontend/lowering/coercions/builders.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
- package/dist/frontend/lowering/coercions/identity.js +26 -0
- package/dist/frontend/lowering/coercions/identity.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural.js +9 -6
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
- package/dist/frontend/lowering/collection-narrowing.js +31 -0
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +363 -49
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-concat.js +130 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
- package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
- package/dist/frontend/lowering/containers/array-construction.js +95 -3
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
- package/dist/frontend/lowering/containers/array-methods.js +43 -132
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +10 -1
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
- package/dist/frontend/lowering/cycle-initialization.js +277 -0
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +138 -32
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
- package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
- package/dist/frontend/lowering/iterator-adapters.js +605 -0
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-array-sort.js +44 -5
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +7 -0
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +1 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +3 -3
- package/dist/frontend/lowering/lower-calls.js +162 -121
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +2 -0
- package/dist/frontend/lowering/lower-classes.js +45 -43
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
- package/dist/frontend/lowering/lower-exprs.js +390 -157
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +32 -19
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +26 -2
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +10 -2
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +46 -58
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +37 -0
- package/dist/frontend/lowering/lowerer.js +283 -18
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +3 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/strict-equality.d.ts +9 -0
- package/dist/frontend/lowering/strict-equality.js +116 -0
- package/dist/frontend/lowering/strict-equality.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +3 -0
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-comparison.d.ts +5 -0
- package/dist/frontend/lowering/union-comparison.js +47 -0
- package/dist/frontend/lowering/union-comparison.js.map +1 -0
- package/dist/frontend/program.d.ts +38 -2
- package/dist/frontend/program.js +440 -59
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +59 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +1 -1
- package/dist/frontend/type-mapper.js +89 -14
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +15 -3
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/index.js +25 -9
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +3 -1
- package/dist/ir/analysis.js +4 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/builtin-signatures.js +2 -3
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/ir.d.ts +78 -15
- package/dist/ir/ir.js +20 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +3 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +8 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +118 -20
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +269 -8
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +2 -1
- package/dist/library/library-profile.js +4 -3
- package/dist/library/library-profile.js.map +1 -1
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/library.d.ts +2 -1
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +27 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.d.ts +3 -2
- package/dist/native/sanitizer.js +3 -13
- package/dist/native/sanitizer.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +8 -2
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: [
|
|
@@ -358,7 +359,7 @@ test.each(["sortPrimitive", "toSortedPrimitive"])("primitive ordering %s validat
|
|
|
358
359
|
});
|
|
359
360
|
function expressionModule(expr, unions) {
|
|
360
361
|
return {
|
|
361
|
-
irVersion:
|
|
362
|
+
irVersion: 15,
|
|
362
363
|
sourceFile: loc.file,
|
|
363
364
|
entry: "main",
|
|
364
365
|
unions,
|
|
@@ -1143,7 +1144,7 @@ test.each([
|
|
|
1143
1144
|
function tdzModule(mutable = true) {
|
|
1144
1145
|
const value = { kind: "numLit", value: 0, type: F64, loc };
|
|
1145
1146
|
return {
|
|
1146
|
-
irVersion:
|
|
1147
|
+
irVersion: 15,
|
|
1147
1148
|
sourceFile: loc.file,
|
|
1148
1149
|
entry: "main",
|
|
1149
1150
|
functions: [
|
|
@@ -1266,6 +1267,79 @@ test.each(["receiver", "key", "result"])("overflow presence checks its %s type",
|
|
|
1266
1267
|
const message = slot === "result" ? "recordOvfHas must be bool" : `recordOvfHas ${slot}`;
|
|
1267
1268
|
expect(validateModule(mod).some((error) => error.message.includes(message))).toBe(true);
|
|
1268
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
|
+
});
|
|
1269
1343
|
test("TDZ locals require a shared box", () => {
|
|
1270
1344
|
const mod = tdzModule();
|
|
1271
1345
|
delete mod.functions[0].locals[0].boxed;
|
|
@@ -1273,7 +1347,7 @@ test("TDZ locals require a shared box", () => {
|
|
|
1273
1347
|
});
|
|
1274
1348
|
function discriminatedModule() {
|
|
1275
1349
|
return {
|
|
1276
|
-
irVersion:
|
|
1350
|
+
irVersion: 15,
|
|
1277
1351
|
sourceFile: loc.file,
|
|
1278
1352
|
entry: "main",
|
|
1279
1353
|
functions: [{ name: "main", params: [], locals: [], returnType: VOID, body: [], loc }],
|
|
@@ -1425,4 +1499,191 @@ test("typed-array brand tests serialize their element kind and reject misplaced
|
|
|
1425
1499
|
expr.test = "array";
|
|
1426
1500
|
expect(validateModule(mod).map((d) => d.message)).toContain("in main: dynTest bytesElem requires a valid bytes test");
|
|
1427
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
|
+
});
|
|
1428
1689
|
//# sourceMappingURL=validate.test.js.map
|