@scriptc/compiler 0.2.9 → 0.3.0
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 +2 -36
- package/ambient/scriptc-overrides.d.ts +1 -25
- package/ambient/scriptc.d.ts +1 -9
- package/dist/backend/cycle-analysis.d.ts +56 -0
- package/dist/backend/cycle-analysis.js +175 -14
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +95 -2
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +3 -7
- package/dist/backend/cycle-mutability.js +4 -30
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.d.ts +1 -1
- package/dist/backend/executable-features.js +3 -8
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +57 -0
- package/dist/backend/immutability.js +178 -0
- package/dist/backend/immutability.js.map +1 -0
- package/dist/backend/immutability.test.js +131 -0
- package/dist/backend/immutability.test.js.map +1 -0
- package/dist/backend/library-pack.js +0 -2
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.js +1 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/llvm/borrowed-inputs.d.ts +9 -2
- package/dist/backend/llvm/borrowed-inputs.js +31 -3
- package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.test.js +1 -1
- package/dist/backend/llvm/classes.d.ts +28 -0
- package/dist/backend/llvm/classes.js +48 -14
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +134 -6
- 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 +13 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +1 -1
- package/dist/backend/llvm/constant-callbacks.js +3 -3
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +1 -1
- package/dist/backend/llvm/dense-array-access.js +5 -4
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +10 -2
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +2 -1
- package/dist/backend/llvm/dyn.js +3 -76
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +67 -19
- package/dist/backend/llvm/emitter.js +443 -226
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +21 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.js +1 -1
- package/dist/backend/llvm/expr-calls.js +14 -6
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +41 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +4 -107
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.d.ts +1 -2
- package/dist/backend/llvm/expr-dispatch.js +0 -41
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
- package/dist/backend/llvm/expr-dynamic.js +13 -27
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +30 -3
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +55 -2
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +4 -4
- 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/lib-dispatch.js +0 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +0 -13
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +0 -8
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +3 -3
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +5 -2
- package/dist/backend/llvm/loop-array-borrows.js +27 -8
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +14 -0
- package/dist/backend/llvm/map-number-lookup.js +33 -2
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
- package/dist/backend/llvm/map-read-lifetimes.js +20 -4
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +25 -3
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +124 -0
- package/dist/backend/llvm/reference-writes.js +1090 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +8 -5
- package/dist/backend/llvm/shapes.js +37 -13
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +3 -3
- package/dist/backend/llvm/stack-unions.test.js +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +40 -11
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +3 -0
- package/dist/backend/llvm/string-reads.js +31 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.d.ts +2 -2
- package/dist/backend/llvm/switch-dispatch.js +35 -22
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +29 -11
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +8 -1
- package/dist/backend/llvm/walk-borrows.js +15 -4
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/may-throw.d.ts +36 -2
- package/dist/backend/may-throw.js +308 -21
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +147 -2
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native/artifact-stamps.js +0 -2
- package/dist/backend/native/artifact-stamps.js.map +1 -1
- package/dist/backend/native/cache-warm.d.ts +1 -1
- package/dist/backend/native/cache-warm.js +2 -3
- package/dist/backend/native/cache-warm.js.map +1 -1
- package/dist/backend/native/compiler-fingerprint.d.ts +1 -1
- package/dist/backend/native/compiler-fingerprint.js +4 -7
- package/dist/backend/native/compiler-fingerprint.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +3 -28
- package/dist/backend/native/driver.js +1 -3
- package/dist/backend/native/driver.js.map +1 -1
- package/dist/backend/native/executable.d.ts +0 -15
- package/dist/backend/native/executable.js +17 -172
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/tool-identity.js +0 -1
- package/dist/backend/native/tool-identity.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +0 -2
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +23 -33
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/publication.d.ts +5 -0
- package/dist/backend/publication.js +10 -0
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +1 -1
- 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 +1 -2
- package/dist/backend/runtime-pack-core.js +5 -14
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +3 -8
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +22 -19
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.d.ts +0 -5
- package/dist/backend/target-diagnostics.js +1 -11
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/vendor-archives.d.ts +1 -7
- package/dist/backend/vendor-archives.js +9 -189
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +0 -1
- package/dist/backend/vendor-inputs.js +0 -1
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/warm-cache.js +3 -5
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +4 -8
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +1 -1
- package/dist/cli/usage.d.ts +1 -5
- package/dist/cli/usage.js +4 -9
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +2 -2
- package/dist/compat/fetch-profile.js +16 -25
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +2 -17
- package/dist/contracts/check.d.ts +8 -0
- package/dist/contracts/check.js +1573 -0
- package/dist/contracts/check.js.map +1 -0
- package/dist/coverage/report.d.ts +5 -22
- package/dist/coverage/report.js +12 -76
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.d.ts +3 -3
- package/dist/coverage/surface-manifest.js +22 -27
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +1 -3
- package/dist/coverage/verdict-cache.js +2 -7
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +11 -60
- package/dist/diagnostics/diagnostic.js +39 -118
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -4
- package/dist/diagnostics/envelope.js +0 -9
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/envelope.test.js +1 -1
- package/dist/diagnostics/envelope.test.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +0 -3
- package/dist/executable/executable-cache.js +2 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +0 -4
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +14 -2
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +10 -10
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/cjs-syntax.js +0 -88
- package/dist/frontend/cjs-syntax.js.map +1 -1
- package/dist/frontend/contract-types.d.ts +50 -0
- package/dist/frontend/contract-types.js +232 -0
- package/dist/frontend/contract-types.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +1 -1
- package/dist/frontend/dts-paths.js +1 -1
- package/dist/frontend/lowering/abstract-equality.js +1 -4
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +4 -11
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/arguments.js +0 -13
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +0 -4
- package/dist/frontend/lowering/builtins/crypto.js +0 -4
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +1 -39
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +0 -15
- package/dist/frontend/lowering/builtins/module-resolution.js +5 -44
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.d.ts +0 -6
- package/dist/frontend/lowering/builtins/numbers.js +6 -57
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +4 -67
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.js +1 -1
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.d.ts +1 -37
- package/dist/frontend/lowering/call-arguments.js +11 -94
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +1 -6
- package/dist/frontend/lowering/call-signatures.js +16 -68
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +19 -4
- package/dist/frontend/lowering/class-dynamic-dispatch.js +168 -98
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +44 -4
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +0 -2
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.js +1 -1
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +5 -35
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +0 -1
- package/dist/frontend/lowering/coercions/state.js +0 -1
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +2 -4
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +2 -12
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +12 -0
- package/dist/frontend/lowering/coercions/unions.js +63 -1
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +9 -28
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +2 -3
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +10 -54
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +0 -1
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +2 -10
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +1 -6
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +0 -2
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +0 -6
- package/dist/frontend/lowering/containers/string-and-regexp.js +2 -10
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/expressions/evaluation-safety.js +0 -3
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/native-proxy.js +1 -1
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +0 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -8
- package/dist/frontend/lowering/expressions/object-literals.js +8 -35
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +0 -4
- package/dist/frontend/lowering/expressions/optional-chains.js +7 -67
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/function-context.js +0 -1
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +0 -1
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +10 -77
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.js +1 -10
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +2 -2
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +2 -3
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +2 -27
- package/dist/frontend/lowering/lower-calls.js +56 -465
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +11 -49
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.js +2 -3
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.js +5 -8
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +3 -4
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.js +3 -5
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +0 -8
- package/dist/frontend/lowering/lower-exprs.js +133 -908
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +2 -5
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +1 -50
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +0 -43
- package/dist/frontend/lowering/lower-modules.js +25 -329
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.js +5 -5
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +0 -30
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +98 -0
- package/dist/frontend/lowering/{lower-island.js → lower-stdlib.js} +97 -1160
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -0
- package/dist/frontend/lowering/lower-stmts.d.ts +0 -16
- package/dist/frontend/lowering/lower-stmts.js +58 -1016
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js +1 -1
- package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +1 -3
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +26 -151
- package/dist/frontend/lowering/lowerer.js +120 -770
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +4 -51
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.d.ts +100 -0
- package/dist/frontend/lowering/narrowing-stability.js +1174 -0
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -0
- package/dist/frontend/lowering/narrowing-stability.test.js +150 -0
- package/dist/frontend/lowering/narrowing-stability.test.js.map +1 -0
- package/dist/frontend/lowering/optional-arguments.js +0 -2
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/strict-equality.js +1 -1
- package/dist/frontend/lowering/strict-equality.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +6 -45
- package/dist/frontend/lowering/surfaces.js +5 -65
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/module-syntax.d.ts +0 -3
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/npm-node.d.ts +0 -7
- package/dist/frontend/npm-node.js +0 -7
- package/dist/frontend/npm-node.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +6 -82
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.d.ts +1 -1
- package/dist/frontend/npm-static.js +6 -71
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +3 -319
- package/dist/frontend/npm.js +6 -1007
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +2 -197
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.js +1 -2
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +3 -11
- package/dist/frontend/pipeline.js +37 -56
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +12 -6
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program.d.ts +0 -34
- package/dist/frontend/program.js +13 -98
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/provenance-core.d.ts +0 -4
- package/dist/frontend/provenance-core.js +4 -37
- package/dist/frontend/provenance-core.js.map +1 -1
- package/dist/frontend/provenance-registry.d.ts +0 -4
- package/dist/frontend/provenance-registry.js +0 -20
- package/dist/frontend/provenance-registry.js.map +1 -1
- package/dist/frontend/resolve.d.ts +0 -12
- package/dist/frontend/resolve.js +0 -34
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.js +2 -2
- package/dist/frontend/runtime-resolve.js.map +1 -1
- package/dist/frontend/services-node.js +2 -3
- package/dist/frontend/services-node.js.map +1 -1
- package/dist/frontend/services.d.ts +1 -8
- package/dist/frontend/services.js +2 -22
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +0 -38
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/tsc-codes.js +0 -11
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +2 -27
- package/dist/frontend/type-mapper.js +85 -153
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -10
- package/dist/index.js.map +1 -1
- package/dist/ir/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/builtin-effects.js +0 -5
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +1 -55
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/constant-globals.test.js +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/final-fields.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/int32-slots.d.ts +29 -3
- package/dist/ir/int32-slots.js +152 -66
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +1 -1
- package/dist/ir/integer-loops.js +3 -0
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +26 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +20 -0
- package/dist/ir/integer-ranges.js +178 -21
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +148 -3
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +44 -284
- package/dist/ir/ir.js +10 -259
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +2 -7
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +3 -30
- package/dist/ir/runtime-features.js +5 -41
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +6 -2
- package/dist/ir/serialize.js +11 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +0 -21
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/unshare.d.ts +14 -0
- package/dist/ir/unshare.js +60 -0
- package/dist/ir/unshare.js.map +1 -0
- package/dist/ir/unshare.test.js +115 -0
- package/dist/ir/unshare.test.js.map +1 -0
- package/dist/ir/validate.js +9 -207
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +6 -6
- 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/prepare.js +14 -20
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cli.js +0 -2
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.test.js +2 -4
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/prepare.js +2 -4
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.js +2 -16
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +0 -3
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/startup-cache.js +0 -2
- package/dist/startup-cache.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +80 -88
- package/dist/backend/llvm/expr-island.d.ts +0 -15
- package/dist/backend/llvm/expr-island.js +0 -709
- package/dist/backend/llvm/expr-island.js.map +0 -1
- package/dist/frontend/lowering/coercions/island.d.ts +0 -37
- package/dist/frontend/lowering/coercions/island.js +0 -350
- package/dist/frontend/lowering/coercions/island.js.map +0 -1
- package/dist/frontend/lowering/lower-island.d.ts +0 -229
- package/dist/frontend/lowering/lower-island.js.map +0 -1
- package/dist/frontend/lowering/lower-island.test.js +0 -56
- package/dist/frontend/lowering/lower-island.test.js.map +0 -1
- package/dist/frontend/npm-fetch-analysis.d.ts +0 -17
- package/dist/frontend/npm-fetch-analysis.js +0 -109
- package/dist/frontend/npm-fetch-analysis.js.map +0 -1
- package/dist/frontend/npm-fetch-analysis.test.js +0 -130
- package/dist/frontend/npm-fetch-analysis.test.js.map +0 -1
- package/dist/frontend/npm-fetch-node.d.ts +0 -2
- package/dist/frontend/npm-fetch-node.js +0 -12
- package/dist/frontend/npm-fetch-node.js.map +0 -1
- package/dist/frontend/npm-fetch-syntax.d.ts +0 -6
- package/dist/frontend/npm-fetch-syntax.js +0 -202
- package/dist/frontend/npm-fetch-syntax.js.map +0 -1
- package/dist/native/runtime-typescript.d.ts +0 -4
- package/dist/native/runtime-typescript.js +0 -74
- package/dist/native/runtime-typescript.js.map +0 -1
- package/dist/native/runtime-typescript.test.js +0 -41
- package/dist/native/runtime-typescript.test.js.map +0 -1
- /package/dist/{frontend/lowering/lower-island.test.d.ts → backend/immutability.test.d.ts} +0 -0
- /package/dist/frontend/{npm-fetch-analysis.test.d.ts → lowering/narrowing-stability.test.d.ts} +0 -0
- /package/dist/{native/runtime-typescript.test.d.ts → ir/unshare.test.d.ts} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { reparseExpr, reparseStmt } from "./serialize.js";
|
|
2
|
+
import { everyExprChild, everyStmtChild, mapExprChildren, mapStmtChildren } from "./traverse.js";
|
|
3
|
+
/** Give every occurrence of an executable node its own object.
|
|
4
|
+
*
|
|
5
|
+
* Lowering helpers may place one node at several sites (a binding's varRef
|
|
6
|
+
* read in a loop condition and in its body, a shared `break`). Analyses key
|
|
7
|
+
* their facts by node identity (integer ranges, int32 write proofs, borrow
|
|
8
|
+
* and lifetime facts), so a shared node carries one fact for all of its
|
|
9
|
+
* sites: integer ranges keep the join, which loses what one site proves. A
|
|
10
|
+
* serialized module gives every occurrence its own node; this makes the
|
|
11
|
+
* in-memory module equivalent, so analyses and emission behave the same on
|
|
12
|
+
* a module lowered in memory and on one read back from its artifact.
|
|
13
|
+
* Functions without a repeated node are kept as they are; the input is
|
|
14
|
+
* never mutated. */
|
|
15
|
+
export function unshareNodes(mod) {
|
|
16
|
+
const seen = new Set();
|
|
17
|
+
const repeated = new Set();
|
|
18
|
+
const affected = new Set();
|
|
19
|
+
let current = null;
|
|
20
|
+
// A repeated node marks the function holding the later occurrence. Its
|
|
21
|
+
// subtree is walked again, so every node under it is repeated as well.
|
|
22
|
+
const visit = (node) => {
|
|
23
|
+
if (!seen.has(node))
|
|
24
|
+
seen.add(node);
|
|
25
|
+
else {
|
|
26
|
+
repeated.add(node);
|
|
27
|
+
affected.add(current);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const findExpr = (node) => {
|
|
31
|
+
visit(node);
|
|
32
|
+
return everyExprChild(node, findExpr, findStmt);
|
|
33
|
+
};
|
|
34
|
+
const findStmt = (node) => {
|
|
35
|
+
visit(node);
|
|
36
|
+
return everyStmtChild(node, findExpr, findStmt);
|
|
37
|
+
};
|
|
38
|
+
for (const fn of mod.functions) {
|
|
39
|
+
current = fn;
|
|
40
|
+
for (const node of fn.body)
|
|
41
|
+
findStmt(node);
|
|
42
|
+
}
|
|
43
|
+
if (affected.size === 0)
|
|
44
|
+
return mod;
|
|
45
|
+
// Rebuilding a function copies every node that has children; a repeated
|
|
46
|
+
// childless node reads back as a fresh object at each of its sites there.
|
|
47
|
+
const expr = (node) => {
|
|
48
|
+
const copy = mapExprChildren(node, expr, stmt);
|
|
49
|
+
return copy !== node || !repeated.has(node) ? copy : reparseExpr(node);
|
|
50
|
+
};
|
|
51
|
+
const stmt = (node) => {
|
|
52
|
+
const copy = mapStmtChildren(node, expr, stmt);
|
|
53
|
+
return copy !== node || !repeated.has(node) ? copy : reparseStmt(node);
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
...mod,
|
|
57
|
+
functions: mod.functions.map((fn) => affected.has(fn) ? { ...fn, body: fn.body.map(stmt) } : fn),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=unshare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unshare.js","sourceRoot":"","sources":["../../src/ir/unshare.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEjG;;;;;;;;;;;oBAWoB;AACpB,MAAM,UAAU,YAAY,CAAC,GAAa;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAc,CAAC;IACvC,IAAI,OAAO,GAAsB,IAAI,CAAC;IACtC,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,KAAK,GAAG,CAAC,IAAqB,EAAQ,EAAE;QAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aAC/B,CAAC;YACJ,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,OAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAW,EAAE;QACzC,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAW,EAAE;QACzC,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC;IACF,OAAO;QACL,GAAG,GAAG;QACN,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAC3D;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { emitLlvmModule } from "../backend/llvm/emitter.js";
|
|
3
|
+
import { analyzeIntegerRanges } from "./integer-ranges.js";
|
|
4
|
+
import { F64, VOID } from "./ir.js";
|
|
5
|
+
import { deserializeModule, serializeModule } from "./serialize.js";
|
|
6
|
+
import { everyStmtList } from "./traverse.js";
|
|
7
|
+
import { unshareNodes } from "./unshare.js";
|
|
8
|
+
import { validateModule } from "./validate.js";
|
|
9
|
+
const loc = { file: "unshare.ts", start: 0, end: 1 };
|
|
10
|
+
const num = (value) => ({
|
|
11
|
+
kind: "numLit",
|
|
12
|
+
value,
|
|
13
|
+
type: F64,
|
|
14
|
+
loc,
|
|
15
|
+
});
|
|
16
|
+
const add = (left, right) => ({
|
|
17
|
+
kind: "bin",
|
|
18
|
+
op: "+",
|
|
19
|
+
left,
|
|
20
|
+
right,
|
|
21
|
+
type: F64,
|
|
22
|
+
loc,
|
|
23
|
+
});
|
|
24
|
+
/** One varRef object read at two sites: `x` is unknown at the first and
|
|
25
|
+
* exactly 5 at the second, as lowering helpers that reuse a read produce;
|
|
26
|
+
* and one `p + 2` expression stored at two sites. */
|
|
27
|
+
function sharedRead() {
|
|
28
|
+
const read = { kind: "varRef", localId: "x", type: F64, loc };
|
|
29
|
+
const twice = add({ kind: "varRef", localId: "p", type: F64, loc }, num(2));
|
|
30
|
+
const body = [
|
|
31
|
+
{
|
|
32
|
+
kind: "varDecl",
|
|
33
|
+
localId: "x",
|
|
34
|
+
init: { kind: "varRef", localId: "p", type: F64, loc },
|
|
35
|
+
loc,
|
|
36
|
+
},
|
|
37
|
+
{ kind: "varDecl", localId: "a", init: add(read, num(1)), loc },
|
|
38
|
+
{ kind: "assign", localId: "x", value: num(5), loc },
|
|
39
|
+
{ kind: "varDecl", localId: "b", init: add(read, num(1)), loc },
|
|
40
|
+
// A repeated node with children: its leaves repeat with it.
|
|
41
|
+
{ kind: "varDecl", localId: "c", init: twice, loc },
|
|
42
|
+
{ kind: "assign", localId: "c", value: twice, loc },
|
|
43
|
+
{
|
|
44
|
+
kind: "return",
|
|
45
|
+
value: add({ kind: "varRef", localId: "a", type: F64, loc }, {
|
|
46
|
+
kind: "varRef",
|
|
47
|
+
localId: "b",
|
|
48
|
+
type: F64,
|
|
49
|
+
loc,
|
|
50
|
+
}),
|
|
51
|
+
loc,
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
const mod = {
|
|
55
|
+
irVersion: 16,
|
|
56
|
+
sourceFile: loc.file,
|
|
57
|
+
entry: "main",
|
|
58
|
+
functions: [
|
|
59
|
+
{ name: "main", loc, params: [], locals: [], returnType: VOID, body: [] },
|
|
60
|
+
{
|
|
61
|
+
name: "f",
|
|
62
|
+
loc,
|
|
63
|
+
params: [{ name: "p", localId: "p", type: F64 }],
|
|
64
|
+
locals: ["p", "x", "a", "b", "c"].map((id) => ({
|
|
65
|
+
id,
|
|
66
|
+
name: id,
|
|
67
|
+
type: F64,
|
|
68
|
+
mutable: true,
|
|
69
|
+
})),
|
|
70
|
+
returnType: F64,
|
|
71
|
+
body,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
return { mod, read };
|
|
76
|
+
}
|
|
77
|
+
function nodes(mod) {
|
|
78
|
+
const out = [];
|
|
79
|
+
const visit = (node) => (out.push(node), true);
|
|
80
|
+
for (const fn of mod.functions)
|
|
81
|
+
everyStmtList(fn.body, { expr: visit, stmt: visit });
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
test("every occurrence gets its own node without mutating the input", () => {
|
|
85
|
+
const { mod, read } = sharedRead();
|
|
86
|
+
const before = serializeModule(mod);
|
|
87
|
+
const tree = unshareNodes(mod);
|
|
88
|
+
expect(serializeModule(mod)).toBe(before);
|
|
89
|
+
expect(serializeModule(tree)).toBe(before);
|
|
90
|
+
const all = nodes(tree);
|
|
91
|
+
expect(new Set(all).size).toBe(all.length);
|
|
92
|
+
expect(all).not.toContain(read);
|
|
93
|
+
// The entry function had no shared node and is kept as it is.
|
|
94
|
+
expect(tree.functions[0]).toBe(mod.functions[0]);
|
|
95
|
+
expect(unshareNodes(tree)).toBe(tree);
|
|
96
|
+
});
|
|
97
|
+
test("ranges are per occurrence once nodes are unshared", () => {
|
|
98
|
+
const { mod, read } = sharedRead();
|
|
99
|
+
// Keyed by identity, the shared read holds the join of both sites.
|
|
100
|
+
expect(analyzeIntegerRanges(mod.functions[1]).get(read)).toBeNull();
|
|
101
|
+
const fn = unshareNodes(mod).functions[1];
|
|
102
|
+
const reads = nodes({ ...mod, functions: [fn] }).filter((node) => node.kind === "varRef" && node.localId === "x");
|
|
103
|
+
const ranges = analyzeIntegerRanges(fn);
|
|
104
|
+
expect(reads.map((node) => ranges.get(node) ?? null)).toEqual([
|
|
105
|
+
null,
|
|
106
|
+
{ min: 5, max: 5 },
|
|
107
|
+
]);
|
|
108
|
+
});
|
|
109
|
+
test("emission matches the module read back from its serialized form", () => {
|
|
110
|
+
const { mod } = sharedRead();
|
|
111
|
+
expect(validateModule(mod)).toEqual([]);
|
|
112
|
+
const restored = deserializeModule(serializeModule(mod, true));
|
|
113
|
+
expect(emitLlvmModule(mod)).toBe(emitLlvmModule(restored));
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=unshare.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unshare.test.js","sourceRoot":"","sources":["../../src/ir/unshare.test.ts"],"names":[],"mappings":"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"}
|
package/dist/ir/validate.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* an ICE that points at source is a gift to whoever debugs it.
|
|
5
5
|
*/
|
|
6
6
|
import { validByteNumberToken } from "./byte-numbers.js";
|
|
7
|
-
import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn,
|
|
7
|
+
import { arrayOf, BYTES_ELEMENT_NAME, BOOL, BYTES_U8, bytesOf, canAdaptDynFuncTo, canDynCheckTo, canConvertToDyn, DYN, DYN_HANDLE_KINDS, F64, ffiClassType, ffiSourceParamTypes, isDynTypedRefType, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isJsonSafeType, isJsonStringifySafeType, isRefCounted, isSortValuesElement, isSupportedArrayElem, isSupportedIndexValue, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, REF_TRUTHY_KINDS, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, shapeHasAccessorSlots, STRING, typeEquals, typeKey, unionContainerArmsOk, VOID, } from "./ir.js";
|
|
8
8
|
import { DYN_CLASS_PROPERTIES } from "./ir.js";
|
|
9
9
|
import { unionWideningTags } from "./analysis.js";
|
|
10
10
|
import { alwaysReturns } from "./control-flow.js";
|
|
@@ -55,7 +55,7 @@ export function validateModule(mod) {
|
|
|
55
55
|
const moduleLoc = { file: mod.sourceFile, start: 0, end: 0 };
|
|
56
56
|
if (mod.workers !== undefined && typeof mod.workers !== "boolean")
|
|
57
57
|
errors.push({ message: "worker execution mode must be a boolean", loc: moduleLoc });
|
|
58
|
-
if (mod.workers &&
|
|
58
|
+
if (mod.workers && mod.lib !== undefined)
|
|
59
59
|
errors.push({
|
|
60
60
|
message: "worker execution requires a native static executable",
|
|
61
61
|
loc: moduleLoc,
|
|
@@ -545,9 +545,8 @@ export function validateModule(mod) {
|
|
|
545
545
|
}
|
|
546
546
|
else
|
|
547
547
|
fields.set(f.name, f.type);
|
|
548
|
-
//
|
|
549
|
-
//
|
|
550
|
-
// are valid; both are refcounted values held by the record shape.
|
|
548
|
+
// Bare unit and void types have no record-field storage; unit values
|
|
549
|
+
// use their union representation.
|
|
551
550
|
if (f.type.kind === "void" || isUnitType(f.type)) {
|
|
552
551
|
errors.push({
|
|
553
552
|
message: `record ${rec.id}: field "${f.name}" is ${f.type.kind}`,
|
|
@@ -688,7 +687,6 @@ export function validateModule(mod) {
|
|
|
688
687
|
if (arm.kind === "void" ||
|
|
689
688
|
arm.kind === "union" ||
|
|
690
689
|
arm.kind === "dyn" ||
|
|
691
|
-
arm.kind === "jsval" ||
|
|
692
690
|
arm.kind === "date" ||
|
|
693
691
|
arm.kind === "generator") {
|
|
694
692
|
errors.push({ message: `union ${u.id}: arm ${i} is ${arm.kind}`, loc: noLoc });
|
|
@@ -1017,10 +1015,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1017
1015
|
err(`${what}: expected ${want.kind}, got ${expr.type.kind}${detail}`, expr.loc);
|
|
1018
1016
|
}
|
|
1019
1017
|
};
|
|
1020
|
-
/** Union arms a truthiness helper can answer: units (false), scalars and
|
|
1021
|
-
* strings (per-value), ref kinds (always true), jsval (the engine
|
|
1022
|
-
* answers). dyn/caught arms have no ToBoolean — the frontend fences them
|
|
1023
|
-
* before emitting toBool/logical over the union. */
|
|
1024
1018
|
const checkTruthyUnion = (unionId, loc) => {
|
|
1025
1019
|
const def = unions.get(unionId);
|
|
1026
1020
|
if (!def) {
|
|
@@ -1050,13 +1044,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1050
1044
|
};
|
|
1051
1045
|
function checkNullishOperands(e) {
|
|
1052
1046
|
expectType(e.right, e.type, "nullish right operand");
|
|
1053
|
-
// The ISLAND form: `a ?? b` over an engine value — left, right,
|
|
1054
|
-
// and result are all handles (the emitters' jsval nullish arm).
|
|
1055
|
-
if (e.left.type.kind === "jsval") {
|
|
1056
|
-
if (e.type.kind !== "jsval")
|
|
1057
|
-
err("jsval nullish must answer jsval", e.loc);
|
|
1058
|
-
return;
|
|
1059
|
-
}
|
|
1060
1047
|
// The CHECKED-DYNAMIC form: the runtime kind decides (the
|
|
1061
1048
|
// emitters' scr_dyn_is_nullish arm) — left, right, and result
|
|
1062
1049
|
// all live in the checked-dynamic tree.
|
|
@@ -1115,10 +1102,9 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1115
1102
|
if (e.type.kind !== "f64" &&
|
|
1116
1103
|
e.type.kind !== "string" &&
|
|
1117
1104
|
e.type.kind !== "bool" &&
|
|
1118
|
-
e.type.kind !== "jsval" &&
|
|
1119
1105
|
e.type.kind !== "union" &&
|
|
1120
1106
|
e.type.kind !== "dyn") {
|
|
1121
|
-
err(`logical ${e.op} must be f64|string|bool|
|
|
1107
|
+
err(`logical ${e.op} must be f64|string|bool|union|dyn, got ${e.type.kind}`, e.loc);
|
|
1122
1108
|
}
|
|
1123
1109
|
if (e.type.kind === "union")
|
|
1124
1110
|
checkTruthyUnion(e.type.unionId, e.loc);
|
|
@@ -1232,7 +1218,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1232
1218
|
case "fieldAbsent":
|
|
1233
1219
|
return checkRecordExpr(e);
|
|
1234
1220
|
case "dynFrom":
|
|
1235
|
-
case "dynFromJsval":
|
|
1236
1221
|
case "dynCall":
|
|
1237
1222
|
case "dynInvoke":
|
|
1238
1223
|
case "dynObjLit":
|
|
@@ -1266,11 +1251,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1266
1251
|
case "newPromise":
|
|
1267
1252
|
case "promiseWithResolvers":
|
|
1268
1253
|
return checkAsyncExpr(e);
|
|
1269
|
-
case "jsMarshal":
|
|
1270
|
-
case "jsOp":
|
|
1271
|
-
case "jsExit":
|
|
1272
|
-
case "jsBridgePromise":
|
|
1273
|
-
return checkIslandExpr(e);
|
|
1274
1254
|
default: {
|
|
1275
1255
|
const _exhaustive = e;
|
|
1276
1256
|
void _exhaustive;
|
|
@@ -1517,16 +1497,16 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1517
1497
|
}
|
|
1518
1498
|
case "dynDestrCheck": {
|
|
1519
1499
|
checkExpr(e.value);
|
|
1520
|
-
if (e.value.type.kind !== "dyn"
|
|
1521
|
-
err("dynDestrCheck value must be dyn
|
|
1500
|
+
if (e.value.type.kind !== "dyn")
|
|
1501
|
+
err("dynDestrCheck value must be dyn", e.loc);
|
|
1522
1502
|
if (e.type.kind !== e.value.type.kind)
|
|
1523
1503
|
err("dynDestrCheck must have its value's type", e.loc);
|
|
1524
1504
|
break;
|
|
1525
1505
|
}
|
|
1526
1506
|
case "dynIterN": {
|
|
1527
1507
|
checkExpr(e.value);
|
|
1528
|
-
if (e.value.type.kind !== "dyn"
|
|
1529
|
-
err("dynIterN value must be dyn
|
|
1508
|
+
if (e.value.type.kind !== "dyn")
|
|
1509
|
+
err("dynIterN value must be dyn", e.loc);
|
|
1530
1510
|
if (e.type.kind !== e.value.type.kind)
|
|
1531
1511
|
err("dynIterN must have its value's type", e.loc);
|
|
1532
1512
|
if (!Number.isInteger(e.count) || e.count < 0)
|
|
@@ -1611,24 +1591,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
1611
1591
|
break;
|
|
1612
1592
|
case "optChain": {
|
|
1613
1593
|
checkExpr(e.receiver);
|
|
1614
|
-
// An island-handle chain (`x?.y` on 'any'): the nullish test is a
|
|
1615
|
-
// runtime ask of the engine value; the body is the plain island
|
|
1616
|
-
// operation over the bound handle, and both body and result stay
|
|
1617
|
-
// jsval (the unit path is the engine's undefined).
|
|
1618
|
-
if (e.receiver.type.kind === "jsval") {
|
|
1619
|
-
if (activeChains.has(e.id))
|
|
1620
|
-
err(`optChain id "${e.id}" shadows an active chain`, e.loc);
|
|
1621
|
-
activeChains.set(e.id, JSVAL);
|
|
1622
|
-
checkExpr(e.body);
|
|
1623
|
-
activeChains.delete(e.id);
|
|
1624
|
-
if (e.body.type.kind !== "jsval") {
|
|
1625
|
-
err(`jsval optChain with ${e.body.type.kind} body`, e.loc);
|
|
1626
|
-
}
|
|
1627
|
-
if (e.type.kind !== "jsval") {
|
|
1628
|
-
err(`jsval optChain must be jsval, got ${e.type.kind}`, e.loc);
|
|
1629
|
-
}
|
|
1630
|
-
break;
|
|
1631
|
-
}
|
|
1632
1594
|
// A dyn (dyn) chain (`rawName?.match(re)` on a JSON.parse result):
|
|
1633
1595
|
// the nullish test reads the node's kind tag; the body is the
|
|
1634
1596
|
// validated dynamic dispatch, its result converted back into the
|
|
@@ -2480,7 +2442,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
2480
2442
|
// declared params plus that one must match.
|
|
2481
2443
|
if (e.type.kind === "func") {
|
|
2482
2444
|
const wantRet = callSiteReturnType(target);
|
|
2483
|
-
// ISLAND-REST types (restAbi jsval) SPELL their trailing engine
|
|
2484
2445
|
// array param — the lifted signature matches directly, no
|
|
2485
2446
|
// hidden slot.
|
|
2486
2447
|
const hiddenRest = e.type.rest === true && e.type.restAbi === undefined;
|
|
@@ -3037,18 +2998,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
3037
2998
|
}
|
|
3038
2999
|
break;
|
|
3039
3000
|
}
|
|
3040
|
-
case "dynFromJsval": {
|
|
3041
|
-
// The jsval→dyn crossing: exactly a jsval operand into a dyn
|
|
3042
|
-
// result (the by-reference island wrap; scalars normalize at
|
|
3043
|
-
// runtime).
|
|
3044
|
-
checkExpr(e.value);
|
|
3045
|
-
if (e.type.kind !== "dyn")
|
|
3046
|
-
err(`dynFromJsval must be dyn-typed, got ${e.type.kind}`, e.loc);
|
|
3047
|
-
if (e.value.type.kind !== "jsval") {
|
|
3048
|
-
err(`dynFromJsval operand must be jsval, got ${e.value.type.kind}`, e.loc);
|
|
3049
|
-
}
|
|
3050
|
-
break;
|
|
3051
|
-
}
|
|
3052
3001
|
case "dynCall": {
|
|
3053
3002
|
checkExpr(e.callee);
|
|
3054
3003
|
if (e.calleeNameValue !== undefined) {
|
|
@@ -4548,14 +4497,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
4548
4497
|
return false;
|
|
4549
4498
|
}
|
|
4550
4499
|
function checkLibSpecialCall(e) {
|
|
4551
|
-
if (e.fn === "island.castFail") {
|
|
4552
|
-
// The deferred boundary failure's typed dummy: a promise (the
|
|
4553
|
-
// only cast shape the frontend defers).
|
|
4554
|
-
if (e.type.kind !== "promise") {
|
|
4555
|
-
err(`libCall island.castFail must return a promise type, got ${e.type.kind}`, e.loc);
|
|
4556
|
-
}
|
|
4557
|
-
return true;
|
|
4558
|
-
}
|
|
4559
4500
|
if (e.fn === "global.undefRead") {
|
|
4560
4501
|
// Always throws — the result type is whatever the declared type
|
|
4561
4502
|
// of the undefined global mapped to (never materialized).
|
|
@@ -5211,145 +5152,6 @@ function validateFunction(fn, functions, ffiByName, classes, records, recordVali
|
|
|
5211
5152
|
}
|
|
5212
5153
|
}
|
|
5213
5154
|
}
|
|
5214
|
-
function checkIslandExpr(e) {
|
|
5215
|
-
switch (e.kind) {
|
|
5216
|
-
case "jsMarshal": {
|
|
5217
|
-
checkExpr(e.value);
|
|
5218
|
-
if (e.type.kind !== "jsval")
|
|
5219
|
-
err(`jsMarshal must be jsval, got ${e.type.kind}`, e.loc);
|
|
5220
|
-
const src = e.value.type;
|
|
5221
|
-
// The marshal direction admits qualifying closures (host-function
|
|
5222
|
-
// wrapping) on top of the JSON-safe set; jsExit does not. Typed
|
|
5223
|
-
// closures (per-param call-time conversion through the exit
|
|
5224
|
-
// machinery) are the wider func shape.
|
|
5225
|
-
// Typed arrays and URLs marshal IN (an engine typed-array copy /
|
|
5226
|
-
// an engine URL built from the components) without ever joining
|
|
5227
|
-
// the round-trip (JSON) set — the frontend's union lift narrows
|
|
5228
|
-
// union arms before marshaling, so bare bytes/url operands are
|
|
5229
|
-
// exactly what it produces.
|
|
5230
|
-
if (src.kind !== "bytes" &&
|
|
5231
|
-
src.kind !== "url" &&
|
|
5232
|
-
src.kind !== "dyn" && // dyn values deep-copy in (data kinds; the runtime throws on boxes)
|
|
5233
|
-
// A STATIC promise crosses as a real engine thenable when its
|
|
5234
|
-
// fulfillment is in the reverse bridge's payload domain
|
|
5235
|
-
// (scr_jsval_from_promise — the async-callback return bridge).
|
|
5236
|
-
!(src.kind === "promise" && islandPromisePayloadTag(src.inner) !== null) &&
|
|
5237
|
-
!canMarshalIntoIsland(src, (id) => records.get(id), (id) => unions.get(id)) &&
|
|
5238
|
-
!canMarshalTypedFuncIntoIsland(src, (id) => records.get(id), (id) => unions.get(id))) {
|
|
5239
|
-
err(`jsMarshal of unmarshalable type ${src.kind}`, e.loc);
|
|
5240
|
-
}
|
|
5241
|
-
break;
|
|
5242
|
-
}
|
|
5243
|
-
case "jsOp": {
|
|
5244
|
-
for (const a of e.args)
|
|
5245
|
-
checkExpr(a);
|
|
5246
|
-
if (e.type.kind !== jsOpResultKind(e.op)) {
|
|
5247
|
-
err(`jsOp ${e.op} must be ${jsOpResultKind(e.op)}, got ${e.type.kind}`, e.loc);
|
|
5248
|
-
}
|
|
5249
|
-
const named = e.op === "getProp" ||
|
|
5250
|
-
e.op === "setProp" ||
|
|
5251
|
-
e.op === "callMethod" ||
|
|
5252
|
-
e.op === "optCallMethod" ||
|
|
5253
|
-
e.op === "globalGet" ||
|
|
5254
|
-
e.op === "callSpread"; // the spread expression's source spelling (V8's nullish text spells it)
|
|
5255
|
-
if (named !== (e.name !== undefined)) {
|
|
5256
|
-
err(`jsOp ${e.op} ${named ? "requires" : "forbids"} a name`, e.loc);
|
|
5257
|
-
}
|
|
5258
|
-
const arity = {
|
|
5259
|
-
add: 2,
|
|
5260
|
-
sub: 2,
|
|
5261
|
-
mul: 2,
|
|
5262
|
-
div: 2,
|
|
5263
|
-
mod: 2,
|
|
5264
|
-
pow: 2,
|
|
5265
|
-
lt: 2,
|
|
5266
|
-
le: 2,
|
|
5267
|
-
gt: 2,
|
|
5268
|
-
ge: 2,
|
|
5269
|
-
eq: 2,
|
|
5270
|
-
neq: 2,
|
|
5271
|
-
instanceOf: 2,
|
|
5272
|
-
neg: 1,
|
|
5273
|
-
plus: 1,
|
|
5274
|
-
truthy: 1,
|
|
5275
|
-
not: 1,
|
|
5276
|
-
typeof: 1,
|
|
5277
|
-
toStr: 1,
|
|
5278
|
-
getProp: 1,
|
|
5279
|
-
setProp: 2,
|
|
5280
|
-
getIdx: 2,
|
|
5281
|
-
setIdx: 3,
|
|
5282
|
-
globalGet: 0,
|
|
5283
|
-
undefLit: 0,
|
|
5284
|
-
nullLit: 0,
|
|
5285
|
-
iterNew: 1,
|
|
5286
|
-
defineGetter: 3,
|
|
5287
|
-
objSpread: 2,
|
|
5288
|
-
callSpread: 3, // callee + pre array + spread source
|
|
5289
|
-
callMethod: null,
|
|
5290
|
-
optCallMethod: null,
|
|
5291
|
-
callFn: null,
|
|
5292
|
-
callFnThis: null,
|
|
5293
|
-
construct: null, // receiver/callee + any number of args
|
|
5294
|
-
objLit: null,
|
|
5295
|
-
arrLit: null,
|
|
5296
|
-
tplStrings: null, // variable length (objLit: key/value pairs; tplStrings: n cooked + n raw)
|
|
5297
|
-
};
|
|
5298
|
-
const want = arity[e.op];
|
|
5299
|
-
if (want !== null && want !== undefined && e.args.length !== want) {
|
|
5300
|
-
err(`jsOp ${e.op} takes ${want} arg(s), got ${e.args.length}`, e.loc);
|
|
5301
|
-
}
|
|
5302
|
-
if (want === null &&
|
|
5303
|
-
e.op !== "objLit" &&
|
|
5304
|
-
e.op !== "arrLit" &&
|
|
5305
|
-
e.op !== "tplStrings" &&
|
|
5306
|
-
e.args.length < 1) {
|
|
5307
|
-
err(`jsOp ${e.op} needs a receiver/callee arg`, e.loc);
|
|
5308
|
-
}
|
|
5309
|
-
if (e.op === "callFnThis" && e.args.length < 2) {
|
|
5310
|
-
err("jsOp callFnThis needs a callee and receiver", e.loc);
|
|
5311
|
-
}
|
|
5312
|
-
if (e.op === "objLit" && e.args.length % 2 !== 0) {
|
|
5313
|
-
err("jsOp objLit takes key/value pairs", e.loc);
|
|
5314
|
-
}
|
|
5315
|
-
if (e.op === "tplStrings" && e.args.length % 2 !== 0) {
|
|
5316
|
-
err("jsOp tplStrings takes n cooked + n raw strings", e.loc);
|
|
5317
|
-
}
|
|
5318
|
-
for (const a of e.args) {
|
|
5319
|
-
if (a.type.kind !== "jsval")
|
|
5320
|
-
err(`jsOp ${e.op} arg must be jsval, got ${a.type.kind}`, e.loc);
|
|
5321
|
-
}
|
|
5322
|
-
break;
|
|
5323
|
-
}
|
|
5324
|
-
case "jsExit": {
|
|
5325
|
-
checkExpr(e.value);
|
|
5326
|
-
expectType(e.value, JSVAL, "jsExit operand");
|
|
5327
|
-
if (!canExitIslandToType(e.type, (id) => records.get(id), (id) => unions.get(id))) {
|
|
5328
|
-
err(`jsExit to non-extractable type ${e.type.kind}`, e.loc);
|
|
5329
|
-
}
|
|
5330
|
-
break;
|
|
5331
|
-
}
|
|
5332
|
-
case "jsBridgePromise": {
|
|
5333
|
-
checkExpr(e.value);
|
|
5334
|
-
expectType(e.value, JSVAL, "jsBridgePromise operand");
|
|
5335
|
-
// The settled engine value crosses as a HANDLE (or not at all) —
|
|
5336
|
-
// plus the ONE converting payload: an `any[]`-declared
|
|
5337
|
-
// fulfillment exits Array.isArray-gated by reference AT THE
|
|
5338
|
-
// SETTLE (SCR_ISLP_JSVAL_ARR); every other typed use exits later.
|
|
5339
|
-
if (e.type.kind !== "promise" ||
|
|
5340
|
-
(e.type.inner.kind !== "jsval" &&
|
|
5341
|
-
e.type.inner.kind !== "void" &&
|
|
5342
|
-
!(e.type.inner.kind === "array" && e.type.inner.elem.kind === "jsval"))) {
|
|
5343
|
-
err("jsBridgePromise must be a promise of jsval, void, or jsval-element array", e.loc);
|
|
5344
|
-
}
|
|
5345
|
-
break;
|
|
5346
|
-
}
|
|
5347
|
-
default: {
|
|
5348
|
-
const _exhaustive = e;
|
|
5349
|
-
void _exhaustive;
|
|
5350
|
-
}
|
|
5351
|
-
}
|
|
5352
|
-
}
|
|
5353
5155
|
// `continue` needs an enclosing loop; `break` an enclosing loop OR switch.
|
|
5354
5156
|
let loopDepth = 0;
|
|
5355
5157
|
let breakableDepth = 0;
|