@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
|
@@ -22,6 +22,8 @@ export declare const DYN_KIND: {
|
|
|
22
22
|
* unit instances (undefined-armed dynCheck targets build them). */
|
|
23
23
|
export interface DynHost extends WalkerHost {
|
|
24
24
|
unitInstanceRef(unionId: string, tag: number): string;
|
|
25
|
+
/** The immortal ABSENT field-slot state of an undefined-armed union. */
|
|
26
|
+
absentInstanceRef(unionId: string): string;
|
|
25
27
|
liveDynRefAdapter(t: IrType): {
|
|
26
28
|
snapshot: string;
|
|
27
29
|
commit: string;
|
|
@@ -82,6 +84,19 @@ export declare class LlDyn {
|
|
|
82
84
|
private undef;
|
|
83
85
|
/** scr_dyn_obj_get with a compile-time key: borrowed member or null. */
|
|
84
86
|
private objGetLit;
|
|
87
|
+
/** Branches past the caller's next emission when an undefined-armed
|
|
88
|
+
* field value is the ABSENT state. Returns the label the caller must branch
|
|
89
|
+
* to and start after its emission, or null when the type has no
|
|
90
|
+
* undefined arm. */
|
|
91
|
+
private skipIfAbsent;
|
|
92
|
+
/** A checked undefined-armed field value, or the field's ABSENT state
|
|
93
|
+
* when the value is undefined because the source object has no own
|
|
94
|
+
* property of that name (a missing JSON key stays missing; an explicit
|
|
95
|
+
* undefined stays present). Proxy sources answer through their reads, so
|
|
96
|
+
* they count as present. The checked value is a +1 union; replacing it
|
|
97
|
+
* with the immortal absent instance releases nothing (unit instances are
|
|
98
|
+
* immortal too). */
|
|
99
|
+
private presenceOf;
|
|
85
100
|
/** Ordinary property lookup, including inherited data and accessors (+1). */
|
|
86
101
|
private objReadLit;
|
|
87
102
|
/** Appends a borrowed string, preserving its full byte length. */
|
|
@@ -99,6 +114,25 @@ export declare class LlDyn {
|
|
|
99
114
|
private typedRefMatches;
|
|
100
115
|
/** `sc_dm_<n>(ptr d) -> i1` — does this dyn fit T? Never throws. */
|
|
101
116
|
dynMatchHelper(t: IrType, preserveRefs?: boolean): string;
|
|
117
|
+
private readonly jsonSchemas;
|
|
118
|
+
private readonly jsonParsers;
|
|
119
|
+
/** Targets the one-pass parser (scr_json_parse_schema) can build
|
|
120
|
+
* directly: number, boolean and string leaves inside arrays and plain
|
|
121
|
+
* records (no tuple, index signature, internal '%' slot or `__proto__`
|
|
122
|
+
* member; 1..64 fields). Everything else keeps the checked-dynamic
|
|
123
|
+
* route alone. */
|
|
124
|
+
private jsonSchemaSupported;
|
|
125
|
+
/** The ScrJsonSchema constant for t (scr_runtime.h layout). Records list
|
|
126
|
+
* fields in declaration order — the order JSON.stringify writes — so the
|
|
127
|
+
* runtime's next-field guess usually matches without a scan. */
|
|
128
|
+
private jsonSchema;
|
|
129
|
+
/** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
|
|
130
|
+
* is not a schema target. Tries the one-pass schema parser; when it
|
|
131
|
+
* declines (any input the checked route might reject or read
|
|
132
|
+
* differently), runs the checked-dynamic route — scr_json_parse plus the
|
|
133
|
+
* dynCheck builder — which reports the exact error. Returns +1, or null
|
|
134
|
+
* with the pending flag set. */
|
|
135
|
+
jsonParseHelper(t: IrType): string | null;
|
|
102
136
|
/** `sc_dc_<n>(ptr d, ptr path) -> T` — validate the checked-dynamic tree against T and
|
|
103
137
|
* BUILD the typed value (+1), or throw the catchable path-annotated
|
|
104
138
|
* TypeError and return a dummy with the pending flag set. */
|
package/dist/backend/llvm/dyn.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { typedRefConstructor } from "./shapes.js";
|
|
2
|
-
import { BYTES_ELEM_NUM, f64Lit } from "./common.js";
|
|
2
|
+
import { BYTES_ELEM_NUM, emitFieldAbsentTest, f64Lit } from "./common.js";
|
|
3
3
|
import { InternalCompilerError } from "../../errors.js";
|
|
4
4
|
import { DYN_HANDLE_KINDS, isDynTypedRefType, isRefCounted, typeKey } from "../../ir/ir.js";
|
|
5
5
|
import { dynDesc, streamTypedRefEligible } from "../../ir/analysis.js";
|
|
@@ -254,6 +254,64 @@ export class LlDyn {
|
|
|
254
254
|
B.line(`${t} = call ptr @scr_dyn_obj_get(ptr ${d}, ptr ${this.host.cstr(key)}, ${this.S} ${len}) ; .${llvmCommentText(key)}`);
|
|
255
255
|
return t;
|
|
256
256
|
}
|
|
257
|
+
/** Branches past the caller's next emission when an undefined-armed
|
|
258
|
+
* field value is the ABSENT state. Returns the label the caller must branch
|
|
259
|
+
* to and start after its emission, or null when the type has no
|
|
260
|
+
* undefined arm. */
|
|
261
|
+
skipIfAbsent(B, value, t) {
|
|
262
|
+
const def = this.host.unionsById.get(t.unionId);
|
|
263
|
+
const utag = def ? def.arms.findIndex((arm) => arm.kind === "undefinedT") : -1;
|
|
264
|
+
if (utag < 0)
|
|
265
|
+
return null;
|
|
266
|
+
const absent = emitFieldAbsentTest(B, value, utag);
|
|
267
|
+
const lSkip = B.newLabel("tdr.absent");
|
|
268
|
+
const lSet = B.newLabel("tdr.set");
|
|
269
|
+
B.condBr(absent, lSkip, lSet);
|
|
270
|
+
B.startBlock(lSet);
|
|
271
|
+
return lSkip;
|
|
272
|
+
}
|
|
273
|
+
/** A checked undefined-armed field value, or the field's ABSENT state
|
|
274
|
+
* when the value is undefined because the source object has no own
|
|
275
|
+
* property of that name (a missing JSON key stays missing; an explicit
|
|
276
|
+
* undefined stays present). Proxy sources answer through their reads, so
|
|
277
|
+
* they count as present. The checked value is a +1 union; replacing it
|
|
278
|
+
* with the immortal absent instance releases nothing (unit instances are
|
|
279
|
+
* immortal too). */
|
|
280
|
+
presenceOf(B, d, key, t, value) {
|
|
281
|
+
const def = this.host.unionsById.get(t.unionId);
|
|
282
|
+
const utag = def ? def.arms.findIndex((arm) => arm.kind === "undefinedT") : -1;
|
|
283
|
+
if (utag < 0)
|
|
284
|
+
return value;
|
|
285
|
+
const tp = B.tmp();
|
|
286
|
+
const tag = B.tmp();
|
|
287
|
+
const isUndef = B.tmp();
|
|
288
|
+
B.line(`${tp} = getelementptr inbounds %ScrUnion, ptr ${value}, i64 0, i32 1`);
|
|
289
|
+
B.line(`${tag} = load i32, ptr ${tp}`);
|
|
290
|
+
B.line(`${isUndef} = icmp eq i32 ${tag}, ${utag}`);
|
|
291
|
+
const kind = this.kindOf(B, d);
|
|
292
|
+
const isObj = B.tmp();
|
|
293
|
+
B.line(`${isObj} = icmp eq i32 ${kind}, ${DYN_KIND.OBJ}`);
|
|
294
|
+
const probe = B.tmp();
|
|
295
|
+
B.line(`${probe} = and i1 ${isUndef}, ${isObj}`);
|
|
296
|
+
const slot = B.slot();
|
|
297
|
+
B.entryAllocas.push(`${slot} = alloca ptr`);
|
|
298
|
+
B.line(`store ptr ${value}, ptr ${slot}`);
|
|
299
|
+
const lProbe = B.newLabel("dcr.has");
|
|
300
|
+
const lJoin = B.newLabel("dcr.hasj");
|
|
301
|
+
B.condBr(probe, lProbe, lJoin);
|
|
302
|
+
B.startBlock(lProbe);
|
|
303
|
+
const own = this.objGetLit(B, d, key);
|
|
304
|
+
const missing = B.tmp();
|
|
305
|
+
const chosen = B.tmp();
|
|
306
|
+
B.line(`${missing} = icmp eq ptr ${own}, null`);
|
|
307
|
+
B.line(`${chosen} = select i1 ${missing}, ptr ${this.host.absentInstanceRef(t.unionId)}, ptr ${value}`);
|
|
308
|
+
B.line(`store ptr ${chosen}, ptr ${slot}`);
|
|
309
|
+
B.br(lJoin);
|
|
310
|
+
B.startBlock(lJoin);
|
|
311
|
+
const out = B.tmp();
|
|
312
|
+
B.line(`${out} = load ptr, ptr ${slot}`);
|
|
313
|
+
return out;
|
|
314
|
+
}
|
|
257
315
|
/** Ordinary property lookup, including inherited data and accessors (+1). */
|
|
258
316
|
objReadLit(B, d, key) {
|
|
259
317
|
this.host.declare(`declare ptr @scr_dyn_obj_read(ptr, ptr, ${this.S})`);
|
|
@@ -676,6 +734,121 @@ export class LlDyn {
|
|
|
676
734
|
this.defs.push(`define internal zeroext i1 @${name}(ptr %d) ${FN_ATTRS} { ; matches ${key}`, B.render(), `}`, ``);
|
|
677
735
|
return name;
|
|
678
736
|
}
|
|
737
|
+
/* ── schema-directed JSON.parse ───────────────────────────────── */
|
|
738
|
+
jsonSchemas = new Map();
|
|
739
|
+
jsonParsers = new Map();
|
|
740
|
+
/** Targets the one-pass parser (scr_json_parse_schema) can build
|
|
741
|
+
* directly: number, boolean and string leaves inside arrays and plain
|
|
742
|
+
* records (no tuple, index signature, internal '%' slot or `__proto__`
|
|
743
|
+
* member; 1..64 fields). Everything else keeps the checked-dynamic
|
|
744
|
+
* route alone. */
|
|
745
|
+
jsonSchemaSupported(t, visiting) {
|
|
746
|
+
switch (t.kind) {
|
|
747
|
+
case "f64":
|
|
748
|
+
case "bool":
|
|
749
|
+
case "string":
|
|
750
|
+
return true;
|
|
751
|
+
case "array":
|
|
752
|
+
return this.jsonSchemaSupported(t.elem, visiting);
|
|
753
|
+
case "record": {
|
|
754
|
+
if (visiting.has(t.shapeId))
|
|
755
|
+
return true;
|
|
756
|
+
const shape = this.host.recordsById.get(t.shapeId);
|
|
757
|
+
if (!shape || shape.tuple || shape.indexValue)
|
|
758
|
+
return false;
|
|
759
|
+
if (shape.fields.length === 0 || shape.fields.length > 64)
|
|
760
|
+
return false;
|
|
761
|
+
visiting.add(t.shapeId);
|
|
762
|
+
return shape.fields.every((f) => !f.name.startsWith("%") &&
|
|
763
|
+
f.name !== "__proto__" &&
|
|
764
|
+
this.jsonSchemaSupported(f.type, visiting));
|
|
765
|
+
}
|
|
766
|
+
default:
|
|
767
|
+
return false;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
/** The ScrJsonSchema constant for t (scr_runtime.h layout). Records list
|
|
771
|
+
* fields in declaration order — the order JSON.stringify writes — so the
|
|
772
|
+
* runtime's next-field guess usually matches without a scan. */
|
|
773
|
+
jsonSchema(t) {
|
|
774
|
+
const key = typeKey(t);
|
|
775
|
+
const existing = this.jsonSchemas.get(key);
|
|
776
|
+
if (existing)
|
|
777
|
+
return existing;
|
|
778
|
+
const host = this.host;
|
|
779
|
+
const S = host.sizeType;
|
|
780
|
+
const name = `sc_jsch_${this.jsonSchemas.size}`;
|
|
781
|
+
this.jsonSchemas.set(key, name);
|
|
782
|
+
let body;
|
|
783
|
+
switch (t.kind) {
|
|
784
|
+
case "f64":
|
|
785
|
+
case "bool":
|
|
786
|
+
case "string": {
|
|
787
|
+
const kind = t.kind === "f64" ? 0 : t.kind === "bool" ? 1 : 2;
|
|
788
|
+
body = `${S} ${kind}, ${S} 0, ptr null, ptr null, ptr null, ptr null, ptr null`;
|
|
789
|
+
break;
|
|
790
|
+
}
|
|
791
|
+
case "array": {
|
|
792
|
+
const elem = this.jsonSchema(t.elem);
|
|
793
|
+
const ctor = `${name}_new`;
|
|
794
|
+
this.defs.push(`define internal ptr @${ctor}(${S} %cap) ${FN_ATTRS} {`, `entry:`, ` %a = ${arrNewCall(host, t.elem, "%cap")}`, ` ret ptr %a`, `}`, ``);
|
|
795
|
+
body = `${S} 4, ${S} 0, ptr null, ptr @${elem}, ptr null, ptr @${ctor}, ptr ${vAdapters(host, t).release}`;
|
|
796
|
+
break;
|
|
797
|
+
}
|
|
798
|
+
case "record": {
|
|
799
|
+
const shape = host.recordsById.get(t.shapeId);
|
|
800
|
+
if (!shape)
|
|
801
|
+
throw new InternalCompilerError(`llvm emitter bug: JSON schema of unknown shape ${t.shapeId}`);
|
|
802
|
+
const struct = mangleRecordStruct(t.shapeId);
|
|
803
|
+
const index = new Map(shape.fields.map((f, i) => [f.name, i + 1]));
|
|
804
|
+
const order = [...(shape.declaredOrder ?? []).filter((n) => index.has(n))];
|
|
805
|
+
for (const f of shape.fields)
|
|
806
|
+
if (!order.includes(f.name))
|
|
807
|
+
order.push(f.name);
|
|
808
|
+
const fieldTy = `{ ptr, ${S}, ${S}, ptr }`;
|
|
809
|
+
const entries = order.map((fieldName) => {
|
|
810
|
+
const field = shape.fields[index.get(fieldName) - 1];
|
|
811
|
+
const sub = this.jsonSchema(field.type);
|
|
812
|
+
const offset = `ptrtoint (ptr getelementptr (%${struct}, ptr null, i64 0, i32 ${index.get(fieldName)}) to ${S})`;
|
|
813
|
+
return `${fieldTy} { ptr ${host.cstr(fieldName)}, ${S} ${Buffer.byteLength(fieldName, "utf8")}, ${S} ${offset}, ptr @${sub} }`;
|
|
814
|
+
});
|
|
815
|
+
const fields = `${name}_fields`;
|
|
816
|
+
this.defs.push(`@${fields} = internal constant [${entries.length} x ${fieldTy}] [${entries.join(", ")}]`, ``);
|
|
817
|
+
body = `${S} 3, ${S} ${entries.length}, ptr @${fields}, ptr null, ptr @${mangleRecordNew(t.shapeId)}, ptr null, ptr ${vAdapters(host, t).release}`;
|
|
818
|
+
break;
|
|
819
|
+
}
|
|
820
|
+
default:
|
|
821
|
+
throw new InternalCompilerError(`llvm emitter bug: JSON schema of ${t.kind}`);
|
|
822
|
+
}
|
|
823
|
+
this.defs.push(`@${name} = internal constant { ${S}, ${S}, ptr, ptr, ptr, ptr, ptr } { ${body} }`, ``);
|
|
824
|
+
return name;
|
|
825
|
+
}
|
|
826
|
+
/** `sc_jp_<n>(ptr text) -> T` for `JSON.parse(text) as T`, or null when T
|
|
827
|
+
* is not a schema target. Tries the one-pass schema parser; when it
|
|
828
|
+
* declines (any input the checked route might reject or read
|
|
829
|
+
* differently), runs the checked-dynamic route — scr_json_parse plus the
|
|
830
|
+
* dynCheck builder — which reports the exact error. Returns +1, or null
|
|
831
|
+
* with the pending flag set. */
|
|
832
|
+
jsonParseHelper(t) {
|
|
833
|
+
if (t.kind !== "record" && t.kind !== "array")
|
|
834
|
+
return null;
|
|
835
|
+
const key = typeKey(t);
|
|
836
|
+
const existing = this.jsonParsers.get(key);
|
|
837
|
+
if (existing)
|
|
838
|
+
return existing;
|
|
839
|
+
if (!this.jsonSchemaSupported(t, new Set()))
|
|
840
|
+
return null;
|
|
841
|
+
const host = this.host;
|
|
842
|
+
const name = `sc_jp_${this.jsonParsers.size}`;
|
|
843
|
+
this.jsonParsers.set(key, name);
|
|
844
|
+
const schema = this.jsonSchema(t);
|
|
845
|
+
const check = this.dynCheckHelper(t);
|
|
846
|
+
host.declare(`declare ptr @scr_json_parse_schema(ptr, ptr)`);
|
|
847
|
+
host.declare(`declare ptr @scr_json_parse(ptr)`);
|
|
848
|
+
host.declare(`declare void @scr_dyn_release(ptr)`);
|
|
849
|
+
this.defs.push(`define internal ptr @${name}(ptr %text) ${FN_ATTRS} { ; JSON.parse as ${llvmCommentText(key)}`, `entry:`, ` %fast = call ptr @scr_json_parse_schema(ptr %text, ptr @${schema})`, ` %hit = icmp ne ptr %fast, null`, ` br i1 %hit, label %done, label %slow`, `done:`, ` ret ptr %fast`, `slow:`, ` %d = call ptr @scr_json_parse(ptr %text)`, ` %bad = icmp eq ptr %d, null`, ` br i1 %bad, label %fail, label %check`, `fail:`, ` ret ptr null`, `check:`, ` %v = call ptr @${check}(ptr %d, ptr null)`, ` call void @scr_dyn_release(ptr %d)`, ` ret ptr %v`, `}`, ``);
|
|
850
|
+
return name;
|
|
851
|
+
}
|
|
679
852
|
/* ── dynCheckHelper (walkers.ts, ported) ──────────────────────── */
|
|
680
853
|
/** `sc_dc_<n>(ptr d, ptr path) -> T` — validate the checked-dynamic tree against T and
|
|
681
854
|
* BUILD the typed value (+1), or throw the catchable path-annotated
|
|
@@ -1147,6 +1320,11 @@ export class LlDyn {
|
|
|
1147
1320
|
B.line(`call void @scr_dyn_release(ptr ${m})`);
|
|
1148
1321
|
storeInto(f.name, f.type, value);
|
|
1149
1322
|
this.pendingBail(B, "dcr", releaseR, "ptr null");
|
|
1323
|
+
if (f.type.kind === "union") {
|
|
1324
|
+
const stored = this.presenceOf(B, "%d", f.name, f.type, value);
|
|
1325
|
+
if (stored !== value)
|
|
1326
|
+
storeInto(f.name, f.type, stored);
|
|
1327
|
+
}
|
|
1150
1328
|
}
|
|
1151
1329
|
// Index-signature shapes CAPTURE undeclared keys into the
|
|
1152
1330
|
// overflow map.
|
|
@@ -1457,6 +1635,10 @@ export class LlDyn {
|
|
|
1457
1635
|
B.line(`store ptr ${box}, ptr ${capp}`);
|
|
1458
1636
|
const rd = this.retainDyn(B, "%d");
|
|
1459
1637
|
B.line(`call void @scr_box_set_ref(ptr ${box}, ptr ${rd})`);
|
|
1638
|
+
// The shim is the same JS function under another signature: it
|
|
1639
|
+
// takes the boxed closure's identity (kept alive through caps[0]).
|
|
1640
|
+
host.declare(`declare void @scr_dyn_adopt_identity(ptr, ptr)`);
|
|
1641
|
+
B.line(`call void @scr_dyn_adopt_identity(ptr ${a}, ptr %d)`);
|
|
1460
1642
|
B.terminate(`ret ptr ${a}`);
|
|
1461
1643
|
break;
|
|
1462
1644
|
}
|
|
@@ -1695,9 +1877,15 @@ export class LlDyn {
|
|
|
1695
1877
|
for (const f of dynFields) {
|
|
1696
1878
|
const klen = Buffer.byteLength(f.name, "utf8");
|
|
1697
1879
|
const fv = loadFieldOf(f.name, f.type);
|
|
1880
|
+
// An ABSENT optional field contributes no key.
|
|
1881
|
+
const lSkip = f.type.kind === "union" ? this.skipIfAbsent(B, fv, f.type) : null;
|
|
1698
1882
|
const conv = B.tmp();
|
|
1699
1883
|
B.line(`${conv} = call ptr @${this.toDynHelper(f.type)}(${this.valTy(f.type)} ${fv})`);
|
|
1700
1884
|
B.line(`call void @scr_dyn_obj_set(ptr ${d}, ptr ${host.cstr(f.name)}, ${host.sizeType} ${klen}, ptr ${conv}) ; ${llvmCommentText(f.name)}`);
|
|
1885
|
+
if (lSkip !== null) {
|
|
1886
|
+
B.br(lSkip);
|
|
1887
|
+
B.startBlock(lSkip);
|
|
1888
|
+
}
|
|
1701
1889
|
}
|
|
1702
1890
|
if (shape.indexValue) {
|
|
1703
1891
|
const iv = shape.indexValue;
|