@scriptc/compiler 0.4.7 → 0.4.8
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/node-fallback/child_process.d.ts +71 -22
- package/ambient/node-fallback/crypto.d.ts +15 -7
- package/ambient/node-fallback/events.d.ts +23 -5
- package/ambient/node-fallback/fs.d.ts +3 -2
- package/ambient/node-fallback/http.d.ts +23 -17
- package/ambient/node-fallback/https.d.ts +5 -2
- package/ambient/node-fallback/net.d.ts +6 -0
- package/ambient/node-fallback/os.d.ts +11 -1
- package/ambient/node-fallback/path-posix.d.ts +6 -0
- package/ambient/node-fallback/path-win32.d.ts +5 -0
- package/ambient/node-fallback/path.d.ts +2 -0
- package/ambient/node-fallback/zlib.d.ts +31 -2
- package/ambient/scriptc-node-fallback.d.ts +37 -7
- package/ambient/scriptc.d.ts +7 -2
- package/dist/backend/executable-features.js +11 -3
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.d.ts +6 -0
- package/dist/backend/library-pack.js +17 -6
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/library-pack.test.d.ts +1 -0
- package/dist/backend/library-pack.test.js +28 -0
- package/dist/backend/library-pack.test.js.map +1 -0
- package/dist/backend/linker.d.ts +9 -2
- package/dist/backend/linker.js +190 -32
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +8 -4
- package/dist/backend/lld.js +19 -13
- package/dist/backend/lld.js.map +1 -1
- package/dist/backend/lld.test.js +3 -1
- package/dist/backend/lld.test.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +15 -2
- package/dist/backend/llvm/alloc.js +172 -36
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +69 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/arenas.d.ts +17 -4
- package/dist/backend/llvm/arenas.js +105 -10
- package/dist/backend/llvm/arenas.js.map +1 -1
- package/dist/backend/llvm/arenas.test.js +229 -0
- package/dist/backend/llvm/arenas.test.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.js +10 -1
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-headers.js +6 -0
- package/dist/backend/llvm/bytes-headers.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +25 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.js +10 -0
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +16 -9
- package/dist/backend/llvm/classes.js +142 -37
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +42 -0
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
- package/dist/backend/llvm/cpu-dispatch.js +31 -7
- package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +12 -3
- package/dist/backend/llvm/dyn.js +31 -7
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +67 -4
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +90 -39
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-module.test.d.ts +1 -0
- package/dist/backend/llvm/emit-module.test.js +52 -0
- package/dist/backend/llvm/emit-module.test.js.map +1 -0
- package/dist/backend/llvm/emit-statements.js +99 -15
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +113 -8
- package/dist/backend/llvm/emitter.js +438 -67
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +31 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +19 -1
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +16 -1
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +18 -2
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +31 -10
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +31 -3
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +1 -1
- package/dist/backend/llvm/expr-records.js +124 -56
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +17 -0
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/js-groups.d.ts +21 -0
- package/dist/backend/llvm/js-groups.js +277 -0
- package/dist/backend/llvm/js-groups.js.map +1 -0
- package/dist/backend/llvm/js-ic.d.ts +19 -1
- package/dist/backend/llvm/js-ic.js +96 -23
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +132 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +33 -6
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +44 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +69 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +32 -0
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.js +7 -2
- package/dist/backend/llvm/loop-state.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +8 -0
- package/dist/backend/llvm/map-entry-fusion.js +3 -3
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +6 -6
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.js +7 -6
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.js +4 -1
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
- package/dist/backend/llvm/receivers.js +3 -0
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-entry-fusion.d.ts +32 -0
- package/dist/backend/llvm/record-entry-fusion.js +217 -0
- package/dist/backend/llvm/record-entry-fusion.js.map +1 -0
- package/dist/backend/llvm/record-results.d.ts +5 -2
- package/dist/backend/llvm/record-results.js +13 -12
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/record-views.js +12 -6
- package/dist/backend/llvm/record-views.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +1 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +3 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/region-ir.js +1 -0
- package/dist/backend/llvm/region-ir.js.map +1 -1
- package/dist/backend/llvm/region-sites.d.ts +18 -0
- package/dist/backend/llvm/region-sites.js +79 -1
- package/dist/backend/llvm/region-sites.js.map +1 -1
- package/dist/backend/llvm/runtime-registries.test.js +53 -6
- package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js +3 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +33 -3
- package/dist/backend/llvm/shapes.js +183 -13
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +1 -2
- package/dist/backend/llvm/stack-objects.js +8 -5
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +12 -0
- package/dist/backend/llvm/walkers.js +46 -2
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +12 -2
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +13 -0
- package/dist/backend/may-throw.test.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +48 -8
- package/dist/backend/native/executable.js +55 -13
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/helper-identity-record.d.ts +11 -0
- package/dist/backend/native/helper-identity-record.js +76 -0
- package/dist/backend/native/helper-identity-record.js.map +1 -0
- package/dist/backend/native/helper-identity-record.test.d.ts +1 -0
- package/dist/backend/native/helper-identity-record.test.js +101 -0
- package/dist/backend/native/helper-identity-record.test.js.map +1 -0
- package/dist/backend/native/library.js +9 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.js +4 -1
- package/dist/backend/native/runtime-inputs.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-codegen-core.d.ts +13 -10
- package/dist/backend/native-codegen-core.js +26 -13
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.js +27 -8
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +110 -14
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +37 -8
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/runtime-pack-core.d.ts +17 -2
- package/dist/backend/runtime-pack-core.js +18 -3
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +211 -2
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/tree-classes.d.ts +42 -0
- package/dist/backend/tree-classes.js +723 -0
- package/dist/backend/tree-classes.js.map +1 -0
- package/dist/backend/tree-classes.test.d.ts +1 -0
- package/dist/backend/tree-classes.test.js +338 -0
- package/dist/backend/tree-classes.test.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +5 -1
- package/dist/backend/vendor-archives.js +51 -7
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +25 -4
- package/dist/backend/vendor-inputs.js +68 -4
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/vendor-inputs.test.js +35 -1
- package/dist/backend/vendor-inputs.test.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -1
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/compat/fetch-profile.js +2 -2
- package/dist/coverage/report.js +47 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +1 -1
- package/dist/diagnostics/codes.d.ts +8 -0
- package/dist/diagnostics/codes.js +8 -0
- package/dist/diagnostics/codes.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +27 -9
- package/dist/diagnostics/diagnostic.js +60 -19
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +18 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +21 -2
- package/dist/executable/executable-cache.js +21 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +123 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +199 -248
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +200 -18
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +4 -0
- package/dist/frontend/builtin-modules.js +10 -0
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/early-errors.d.ts +12 -2
- package/dist/frontend/early-errors.js +535 -4
- package/dist/frontend/early-errors.js.map +1 -1
- package/dist/frontend/early-errors.test.js +165 -0
- package/dist/frontend/early-errors.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.test.js +65 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/jsx-opinion-sites.test.d.ts +1 -0
- package/dist/frontend/jsx-opinion-sites.test.js +86 -0
- package/dist/frontend/jsx-opinion-sites.test.js.map +1 -0
- package/dist/frontend/lib-exports.d.ts +23 -4
- package/dist/frontend/lib-exports.js +98 -26
- package/dist/frontend/lib-exports.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.js +21 -3
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/buffers.d.ts +8 -0
- package/dist/frontend/lowering/buffers.js +43 -0
- package/dist/frontend/lowering/buffers.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.js +4 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +3 -2
- package/dist/frontend/lowering/builtin-namespaces.js +24 -3
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
- package/dist/frontend/lowering/builtin-statics.d.ts +24 -0
- package/dist/frontend/lowering/builtin-statics.js +407 -0
- package/dist/frontend/lowering/builtin-statics.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
- package/dist/frontend/lowering/builtins/arguments.js +12 -0
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.d.ts +6 -1
- package/dist/frontend/lowering/builtins/atomics.js +87 -1
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +2 -2
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.d.ts +13 -0
- package/dist/frontend/lowering/builtins/child-process-sync.js +1 -13
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.d.ts +10 -4
- package/dist/frontend/lowering/builtins/child-process.js +560 -27
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +2 -2
- package/dist/frontend/lowering/builtins/compression.js +41 -21
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.js +7 -2
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +28 -2
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +4 -0
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +3 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.d.ts +4 -1
- package/dist/frontend/lowering/builtins/numbers.js +10 -2
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +6 -3
- package/dist/frontend/lowering/builtins/operating-system.js +96 -16
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +2 -2
- package/dist/frontend/lowering/builtins/process.js +103 -8
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +169 -8
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/properties.js +6 -2
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
- package/dist/frontend/lowering/builtins/readline.js +180 -36
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +35 -12
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +2 -0
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.d.ts +10 -0
- package/dist/frontend/lowering/call-arguments.js +37 -2
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +10 -0
- package/dist/frontend/lowering/call-signatures.js +103 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +14 -2
- package/dist/frontend/lowering/class-construction.js +99 -5
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +9 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1283 -1030
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +158 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +20 -15
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
- package/dist/frontend/lowering/class-runtime-statics.js +20 -1
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-unions.js +21 -4
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +9 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +8 -0
- package/dist/frontend/lowering/coercions/state.js +17 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +20 -5
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +10 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +2 -1
- package/dist/frontend/lowering/coercions/unions.js +54 -10
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/constructor-returns.d.ts +23 -2
- package/dist/frontend/lowering/constructor-returns.js +284 -58
- package/dist/frontend/lowering/constructor-returns.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +156 -62
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +21 -3
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-from-async.js +139 -3
- package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
- package/dist/frontend/lowering/containers/array-iteration.d.ts +14 -4
- package/dist/frontend/lowering/containers/array-iteration.js +24 -7
- package/dist/frontend/lowering/containers/array-iteration.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +14 -11
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +6 -0
- package/dist/frontend/lowering/containers/bytes.js +446 -86
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +5 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +21 -12
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +421 -2
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +52 -17
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +23 -0
- package/dist/frontend/lowering/containers/iterator-helpers.js +176 -10
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +5 -2
- package/dist/frontend/lowering/containers/string-and-regexp.js +45 -11
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
- package/dist/frontend/lowering/crypto-tables.js +5 -5
- package/dist/frontend/lowering/dispatch-sites.js +3 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.d.ts +40 -0
- package/dist/frontend/lowering/divergences.js +239 -20
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/effect-free.d.ts +12 -0
- package/dist/frontend/lowering/effect-free.js +44 -0
- package/dist/frontend/lowering/effect-free.js.map +1 -0
- package/dist/frontend/lowering/expressions/array-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/array-literals.js +62 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +115 -5
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +151 -7
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +15 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js +54 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +31 -2
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
- package/dist/frontend/lowering/expressions/narrowing.js +175 -22
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +173 -11
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +5 -1
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +8 -0
- package/dist/frontend/lowering/expressions/property-access.js +379 -109
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +237 -7
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +8 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.d.ts +20 -1
- package/dist/frontend/lowering/expressions/union-fields.js +103 -13
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +74 -55
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +37 -10
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/general-streams.js +5 -0
- package/dist/frontend/lowering/general-streams.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +15 -7
- package/dist/frontend/lowering/generator-delegation.js +301 -118
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +27 -1
- package/dist/frontend/lowering/generic-functions.js +432 -18
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/global-function-values.d.ts +25 -0
- package/dist/frontend/lowering/global-function-values.js +193 -0
- package/dist/frontend/lowering/global-function-values.js.map +1 -0
- package/dist/frontend/lowering/global-values.d.ts +6 -4
- package/dist/frontend/lowering/global-values.js +24 -10
- package/dist/frontend/lowering/global-values.js.map +1 -1
- package/dist/frontend/lowering/host-global-values.d.ts +31 -0
- package/dist/frontend/lowering/host-global-values.js +121 -0
- package/dist/frontend/lowering/host-global-values.js.map +1 -0
- package/dist/frontend/lowering/host-globals.d.ts +74 -0
- package/dist/frontend/lowering/host-globals.js +344 -0
- package/dist/frontend/lowering/host-globals.js.map +1 -0
- package/dist/frontend/lowering/http2-constants.js +1 -1
- package/dist/frontend/lowering/iterator-adapters.js +46 -17
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/iterator-prototype.d.ts +30 -0
- package/dist/frontend/lowering/iterator-prototype.js +160 -0
- package/dist/frontend/lowering/iterator-prototype.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.js +43 -22
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +1 -0
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +11 -3
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +30 -15
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +11 -0
- package/dist/frontend/lowering/lower-async-iteration.js +15 -0
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +11 -1
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +25 -0
- package/dist/frontend/lowering/lower-calls.js +929 -227
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.test.js +59 -16
- package/dist/frontend/lowering/lower-calls.test.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +20 -0
- package/dist/frontend/lowering/lower-classes.js +468 -44
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -2
- package/dist/frontend/lowering/lower-event-emitter.js +253 -83
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +1 -1
- package/dist/frontend/lowering/lower-exprs.js +71 -20
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +25 -6
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +57 -10
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.d.ts +6 -0
- package/dist/frontend/lowering/lower-global-value.js +14 -5
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
- package/dist/frontend/lowering/lower-inspect.js +638 -64
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +48 -2
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +18 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-island.js +16 -6
- package/dist/frontend/lowering/lower-node-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +303 -87
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.js +45 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +14 -11
- package/dist/frontend/lowering/lower-stmts.js +270 -52
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +110 -27
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lower-url.js +6 -3
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +227 -21
- package/dist/frontend/lowering/lowerer.js +651 -92
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +18 -0
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/lowering-facts.d.ts +110 -0
- package/dist/frontend/lowering/lowering-facts.js +323 -0
- package/dist/frontend/lowering/lowering-facts.js.map +1 -0
- package/dist/frontend/lowering/lowering-facts.test.d.ts +1 -0
- package/dist/frontend/lowering/lowering-facts.test.js +100 -0
- package/dist/frontend/lowering/lowering-facts.test.js.map +1 -0
- package/dist/frontend/lowering/nan-coded-reads.d.ts +27 -4
- package/dist/frontend/lowering/nan-coded-reads.js +112 -9
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.d.ts +4 -0
- package/dist/frontend/lowering/optional-arguments.js +26 -2
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/partial-assertions.d.ts +0 -3
- package/dist/frontend/lowering/partial-assertions.js +9 -15
- package/dist/frontend/lowering/partial-assertions.js.map +1 -1
- package/dist/frontend/lowering/primitive-throws.d.ts +100 -0
- package/dist/frontend/lowering/primitive-throws.js +241 -0
- package/dist/frontend/lowering/primitive-throws.js.map +1 -0
- package/dist/frontend/lowering/primitive-wrappers.js +1 -0
- package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
- package/dist/frontend/lowering/record-inherited.d.ts +17 -1
- package/dist/frontend/lowering/record-inherited.js +16 -2
- package/dist/frontend/lowering/record-inherited.js.map +1 -1
- package/dist/frontend/lowering/record-links.d.ts +73 -0
- package/dist/frontend/lowering/record-links.js +797 -0
- package/dist/frontend/lowering/record-links.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +27 -7
- package/dist/frontend/lowering/runtime-optional-provenance.js +25 -11
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-report.d.ts +40 -0
- package/dist/frontend/lowering/runtime-optional-report.js +300 -0
- package/dist/frontend/lowering/runtime-optional-report.js.map +1 -0
- package/dist/frontend/lowering/scoped-type-memo.test.d.ts +1 -0
- package/dist/frontend/lowering/scoped-type-memo.test.js +86 -0
- package/dist/frontend/lowering/scoped-type-memo.test.js.map +1 -0
- package/dist/frontend/lowering/static-typeof.d.ts +3 -1
- package/dist/frontend/lowering/static-typeof.js +6 -1
- package/dist/frontend/lowering/static-typeof.js.map +1 -1
- package/dist/frontend/lowering/strict-mode.d.ts +1 -5
- package/dist/frontend/lowering/strict-mode.js +4 -30
- package/dist/frontend/lowering/strict-mode.js.map +1 -1
- package/dist/frontend/lowering/structural-instances.d.ts +7 -0
- package/dist/frontend/lowering/structural-instances.js +23 -0
- package/dist/frontend/lowering/structural-instances.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +15 -1
- package/dist/frontend/lowering/surfaces.js +78 -10
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-retag.d.ts +13 -1
- package/dist/frontend/lowering/union-retag.js +55 -1
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +51 -0
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.d.ts +8 -0
- package/dist/frontend/lowering/unit-journal.js +14 -0
- package/dist/frontend/lowering/unit-journal.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.test.js +36 -1
- package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
- package/dist/frontend/lowering/zlib-constants.js +3 -2
- package/dist/frontend/lowering/zlib-constants.js.map +1 -1
- package/dist/frontend/npm-static.js +78 -9
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm-static.test.js +95 -2
- package/dist/frontend/npm-static.test.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +5 -4
- package/dist/frontend/pipeline.js +94 -31
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +68 -11
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program.d.ts +62 -2
- package/dist/frontend/program.js +695 -422
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +37 -1
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/services-node.d.ts +7 -0
- package/dist/frontend/services-node.js +32 -1
- package/dist/frontend/services-node.js.map +1 -1
- package/dist/frontend/services-node.test.js +51 -0
- package/dist/frontend/services-node.test.js.map +1 -1
- package/dist/frontend/shape-inference/overlay.js +68 -2
- package/dist/frontend/shape-inference/overlay.js.map +1 -1
- package/dist/frontend/tier-analysis.d.ts +9 -0
- package/dist/frontend/tier-analysis.js +1 -0
- package/dist/frontend/tier-analysis.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +57 -3
- package/dist/frontend/tsc-codes.js +935 -150
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/tsc-codes.test.js +221 -12
- package/dist/frontend/tsc-codes.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +91 -9
- package/dist/frontend/type-mapper.js +622 -181
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +80 -15
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +60 -0
- package/dist/index.test.js.map +1 -0
- package/dist/ir/builtin-effects.js +43 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +242 -16
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +3 -2
- package/dist/ir/callback-specialization.js +35 -25
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/capture-values.d.ts +8 -4
- package/dist/ir/capture-values.js +9 -6
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +6 -2
- package/dist/ir/char-unit-locals.js +11 -2
- package/dist/ir/char-unit-locals.js.map +1 -1
- package/dist/ir/class-key-index.d.ts +18 -0
- package/dist/ir/class-key-index.js +29 -0
- package/dist/ir/class-key-index.js.map +1 -0
- package/dist/ir/class-key-index.test.d.ts +1 -0
- package/dist/ir/class-key-index.test.js +25 -0
- package/dist/ir/class-key-index.test.js.map +1 -0
- package/dist/ir/codec.generated.d.ts +1 -1
- package/dist/ir/codec.generated.js +724 -648
- package/dist/ir/codec.generated.js.map +1 -1
- package/dist/ir/constant-globals.d.ts +5 -2
- package/dist/ir/constant-globals.js +25 -27
- package/dist/ir/constant-globals.js.map +1 -1
- package/dist/ir/expression-inlining.d.ts +4 -2
- package/dist/ir/expression-inlining.js +8 -2
- package/dist/ir/expression-inlining.js.map +1 -1
- package/dist/ir/field-values.d.ts +5 -2
- package/dist/ir/field-values.js +32 -21
- package/dist/ir/field-values.js.map +1 -1
- package/dist/ir/fields.generated.d.ts +11 -2
- package/dist/ir/fields.generated.js +8 -0
- package/dist/ir/fields.generated.js.map +1 -1
- package/dist/ir/final-fields.js +1 -1
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +5 -4
- package/dist/ir/function-references.js +7 -4
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +7 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.d.ts +4 -2
- package/dist/ir/init-only-globals.js +17 -18
- package/dist/ir/init-only-globals.js.map +1 -1
- package/dist/ir/inline-array-views.js +1 -0
- package/dist/ir/inline-array-views.js.map +1 -1
- package/dist/ir/int32-slots.js +7 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/ir.d.ts +59 -4
- package/dist/ir/ir.js +7 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-groups.d.ts +51 -0
- package/dist/ir/js-groups.js +394 -0
- package/dist/ir/js-groups.js.map +1 -0
- package/dist/ir/js-groups.test.d.ts +1 -0
- package/dist/ir/js-groups.test.js +555 -0
- package/dist/ir/js-groups.test.js.map +1 -0
- package/dist/ir/js-ic.js +30 -5
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +27 -1
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +23 -6
- package/dist/ir/node-index.js +126 -49
- package/dist/ir/node-index.js.map +1 -1
- package/dist/ir/numeric-call-specialization.d.ts +4 -2
- package/dist/ir/numeric-call-specialization.js +40 -26
- package/dist/ir/numeric-call-specialization.js.map +1 -1
- package/dist/ir/paired-while-loops.d.ts +4 -2
- package/dist/ir/paired-while-loops.js +8 -2
- package/dist/ir/paired-while-loops.js.map +1 -1
- package/dist/ir/parameter-versions.d.ts +13 -4
- package/dist/ir/parameter-versions.js +63 -42
- package/dist/ir/parameter-versions.js.map +1 -1
- package/dist/ir/property-bags.d.ts +4 -2
- package/dist/ir/property-bags.js +22 -17
- package/dist/ir/property-bags.js.map +1 -1
- package/dist/ir/row-pairs.d.ts +4 -2
- package/dist/ir/row-pairs.js +12 -11
- package/dist/ir/row-pairs.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +87 -12
- package/dist/ir/runtime-features.js +263 -160
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +109 -139
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/runtime-jam-loops.d.ts +35 -0
- package/dist/ir/runtime-jam-loops.js +604 -0
- package/dist/ir/runtime-jam-loops.js.map +1 -0
- package/dist/ir/runtime-jam-loops.test.d.ts +1 -0
- package/dist/ir/runtime-jam-loops.test.js +565 -0
- package/dist/ir/runtime-jam-loops.test.js.map +1 -0
- package/dist/ir/saturating-loop-jams.d.ts +4 -2
- package/dist/ir/saturating-loop-jams.js +11 -10
- package/dist/ir/saturating-loop-jams.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +5 -2
- package/dist/ir/scalar-records.js +12 -2
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/self-captures.d.ts +4 -2
- package/dist/ir/self-captures.js +32 -27
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/serialize.d.ts +6 -1
- package/dist/ir/serialize.js +87 -23
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +26 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/tiers.js +1 -0
- package/dist/ir/tiers.js.map +1 -1
- package/dist/ir/traverse.js +4 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/typed-argument-clones.d.ts +30 -0
- package/dist/ir/typed-argument-clones.js +789 -0
- package/dist/ir/typed-argument-clones.js.map +1 -0
- package/dist/ir/union-arm-loops.d.ts +3 -0
- package/dist/ir/union-arm-loops.js +373 -0
- package/dist/ir/union-arm-loops.js.map +1 -0
- package/dist/ir/union-arm-loops.test.d.ts +1 -0
- package/dist/ir/union-arm-loops.test.js +230 -0
- package/dist/ir/union-arm-loops.test.js.map +1 -0
- package/dist/ir/validate.js +88 -18
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/compiler-self-identity.d.ts +8 -2
- package/dist/library/compiler-self-identity.js +92 -18
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/compiler-self-identity.test.js +150 -3
- package/dist/library/compiler-self-identity.test.js.map +1 -1
- package/dist/library/int-infer.d.ts +5 -0
- package/dist/library/int-infer.js +15 -3
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +4 -0
- package/dist/library/library-cache.js +2 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +26 -0
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/prepare.js +99 -31
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cache.d.ts +7 -0
- package/dist/native/cache.js +47 -0
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +13 -1
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +1 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +18 -3
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache-open.test.js +31 -5
- package/dist/native/executable-cache-open.test.js.map +1 -1
- package/dist/native/executable-cache.d.ts +6 -1
- package/dist/native/executable-cache.js +7 -1
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -0
- package/dist/native/prepare.js +43 -26
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +25 -3
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.js +10 -1
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +7 -2
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/node-islands/boundary.d.ts +12 -0
- package/dist/node-islands/boundary.js +38 -6
- package/dist/node-islands/boundary.js.map +1 -1
- package/dist/node-islands/boundary.test.d.ts +1 -0
- package/dist/node-islands/boundary.test.js +76 -0
- package/dist/node-islands/boundary.test.js.map +1 -0
- package/dist/node-islands/detect.d.ts +9 -0
- package/dist/node-islands/detect.js +110 -0
- package/dist/node-islands/detect.js.map +1 -1
- package/dist/node-islands/detect.test.js +24 -0
- package/dist/node-islands/detect.test.js.map +1 -1
- package/dist/node-islands/graph-islands.d.ts +40 -0
- package/dist/node-islands/graph-islands.js +128 -0
- package/dist/node-islands/graph-islands.js.map +1 -0
- package/dist/node-islands/growth.d.ts +57 -0
- package/dist/node-islands/growth.js +205 -0
- package/dist/node-islands/growth.js.map +1 -0
- package/dist/node-islands/report.d.ts +12 -0
- package/dist/node-islands/report.js +28 -0
- package/dist/node-islands/report.js.map +1 -1
- package/dist/node-islands/report.test.js +2 -0
- package/dist/node-islands/report.test.js.map +1 -1
- package/dist/node-islands/rules.js +5 -0
- package/dist/node-islands/rules.js.map +1 -1
- package/dist/node-islands/scan.d.ts +11 -2
- package/dist/node-islands/scan.js +61 -9
- package/dist/node-islands/scan.js.map +1 -1
- package/dist/wasm/translate.js +11 -5
- package/dist/wasm/translate.js.map +1 -1
- package/dist/wasm/translate.test.js +35 -0
- package/dist/wasm/translate.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +184 -117
|
@@ -0,0 +1,723 @@
|
|
|
1
|
+
import { everyExprChild, everyStmtChild } from "../ir/traverse.js";
|
|
2
|
+
import { computeTraced } from "./cycle-analysis.js";
|
|
3
|
+
import { constructorEscapePoint } from "./cycle-mutability.js";
|
|
4
|
+
import { computeImmutableFields } from "./immutability.js";
|
|
5
|
+
import { computePublishedTypes } from "./publication.js";
|
|
6
|
+
/** Every class name that passes both analyses, plus one rejection reason
|
|
7
|
+
* list per class name that was considered. Pure: reads `mod` only. */
|
|
8
|
+
export function planTreeClasses(mod, facts) {
|
|
9
|
+
const rejected = new Map();
|
|
10
|
+
const classes = new Set();
|
|
11
|
+
const moves = new Set();
|
|
12
|
+
if (mod.lib !== undefined)
|
|
13
|
+
return { classes, moves, rejected };
|
|
14
|
+
const defs = mod.classes ?? [];
|
|
15
|
+
const unions = new Map((mod.unions ?? []).map((u) => [u.id, u]));
|
|
16
|
+
const functions = new Map(mod.functions.map((fn) => [fn.name, fn]));
|
|
17
|
+
const traced = facts.traced ?? computeTraced(mod);
|
|
18
|
+
const immutable = facts.immutable !== undefined ? facts.immutable : computeImmutableFields(mod);
|
|
19
|
+
const published = facts.published !== undefined ? facts.published : computePublishedTypes(mod);
|
|
20
|
+
const lifetime = new Set(mod.contracts?.programLifetime ?? []);
|
|
21
|
+
const bases = new Set(defs.flatMap((d) => (d.base === undefined ? [] : [d.base])));
|
|
22
|
+
const slots = collectTypeSlots(mod);
|
|
23
|
+
for (const def of defs) {
|
|
24
|
+
if (def.runtime === true)
|
|
25
|
+
continue;
|
|
26
|
+
const name = def.name;
|
|
27
|
+
const reasons = [];
|
|
28
|
+
const reject = (why) => {
|
|
29
|
+
if (reasons.length < 4)
|
|
30
|
+
reasons.push(why);
|
|
31
|
+
};
|
|
32
|
+
const finish = () => {
|
|
33
|
+
if (reasons.length === 0)
|
|
34
|
+
classes.add(name);
|
|
35
|
+
else
|
|
36
|
+
rejected.set(name, reasons);
|
|
37
|
+
};
|
|
38
|
+
// ── Analysis A: the shape of the class itself ───────────────────────
|
|
39
|
+
if (def.base !== undefined || bases.has(name))
|
|
40
|
+
reject("is part of a hierarchy");
|
|
41
|
+
if (def.arrayElem !== undefined)
|
|
42
|
+
reject("extends Array");
|
|
43
|
+
if (def.localCaptures !== undefined)
|
|
44
|
+
reject("is declared inside a function");
|
|
45
|
+
if (lifetime.has(name))
|
|
46
|
+
reject("implements ProgramLifetime");
|
|
47
|
+
if (def.fields.length === 0)
|
|
48
|
+
reject("declares no fields");
|
|
49
|
+
if (traced.shapes.has(`object:${name}`))
|
|
50
|
+
reject("is on a cycle or reaches one");
|
|
51
|
+
if (published?.classGuarded(name) === true)
|
|
52
|
+
reject("is published to package code");
|
|
53
|
+
if (mod.declBoundary === true)
|
|
54
|
+
reject("the module boxes values at declaration boundaries");
|
|
55
|
+
if (reasons.length > 0) {
|
|
56
|
+
finish();
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Reference fields must be written by the constructor alone: a node
|
|
60
|
+
// that can be rewired after construction can gain a second owner.
|
|
61
|
+
for (const field of def.fields) {
|
|
62
|
+
if (!mentions(field.type, name, unions))
|
|
63
|
+
continue;
|
|
64
|
+
if (immutable?.classField(name, field.name) !== true)
|
|
65
|
+
reject(`field ${field.name} is written after construction`);
|
|
66
|
+
}
|
|
67
|
+
// Only a constructor that never lets `this` out can be a node: every
|
|
68
|
+
// other path out of it would give the object a second owner.
|
|
69
|
+
const ctor = functions.get(`%${name}.constructor`);
|
|
70
|
+
if (ctor === undefined)
|
|
71
|
+
reject("has no constructor body");
|
|
72
|
+
else {
|
|
73
|
+
const thisId = ctor.params[0]?.localId;
|
|
74
|
+
if (thisId === undefined)
|
|
75
|
+
reject("has a constructor without this");
|
|
76
|
+
else if (constructorEscaped(ctor, thisId, null))
|
|
77
|
+
reject("its constructor lets this escape");
|
|
78
|
+
// A constructor whose body owns its `this` releases it on exit, which
|
|
79
|
+
// would destroy an instance its `new` expression still owns.
|
|
80
|
+
if (facts.borrowed.get(`%${name}.constructor`)?.has(0) !== true)
|
|
81
|
+
reject("its constructor body owns this");
|
|
82
|
+
}
|
|
83
|
+
// ── Analysis A: every type in the module that mentions the class ────
|
|
84
|
+
for (const slot of slots) {
|
|
85
|
+
if (!mentions(slot.type, name, unions))
|
|
86
|
+
continue;
|
|
87
|
+
const shape = treeShape(slot.type, name, unions);
|
|
88
|
+
if (shape === null) {
|
|
89
|
+
reject(`${slot.where} holds it in a type that is neither the class nor null or it`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (shape === "nullable" && traced.unions.has(unionIdOf(slot.type))) {
|
|
93
|
+
reject(`${slot.where} boxes it in a union that can reach a cycle`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!treeSlot(slot, name))
|
|
97
|
+
reject(`${slot.where} lets a reference escape the tree discipline`);
|
|
98
|
+
}
|
|
99
|
+
if (reasons.length > 0) {
|
|
100
|
+
finish();
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// ── Analysis B: whole-program linear use ───────────────────────────
|
|
104
|
+
const check = new LinearUse(name, unions, functions, facts);
|
|
105
|
+
for (const fn of mod.functions)
|
|
106
|
+
check.function(fn);
|
|
107
|
+
for (const why of check.reasons())
|
|
108
|
+
reject(why);
|
|
109
|
+
finish();
|
|
110
|
+
if (classes.has(name))
|
|
111
|
+
for (const move of check.moves())
|
|
112
|
+
moves.add(move);
|
|
113
|
+
}
|
|
114
|
+
return { classes, moves, rejected };
|
|
115
|
+
}
|
|
116
|
+
function treeSlot(slot, name) {
|
|
117
|
+
switch (slot.slot) {
|
|
118
|
+
// Values in flight: parameters arrive owned or borrowed, locals hold an
|
|
119
|
+
// owner for their scope, and a result leaves through a move.
|
|
120
|
+
case "expr":
|
|
121
|
+
case "param":
|
|
122
|
+
case "local":
|
|
123
|
+
case "result":
|
|
124
|
+
return true;
|
|
125
|
+
// Only the class's own fields may point at its nodes. Another class or
|
|
126
|
+
// record field would be a second owner the destroy walk cannot follow
|
|
127
|
+
// (it walks one shape), so the class stays counted.
|
|
128
|
+
case "classField":
|
|
129
|
+
return slot.owner === name;
|
|
130
|
+
case "recordField":
|
|
131
|
+
case "global":
|
|
132
|
+
case "capture":
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** `object:C`, `C | null`, or null when the type is anything else. */
|
|
137
|
+
function treeShape(type, name, unions) {
|
|
138
|
+
if (type.kind === "object")
|
|
139
|
+
return type.className === name ? "object" : null;
|
|
140
|
+
if (type.kind !== "union")
|
|
141
|
+
return null;
|
|
142
|
+
const arms = unions.get(type.unionId)?.arms;
|
|
143
|
+
if (arms === undefined || arms.length !== 2)
|
|
144
|
+
return null;
|
|
145
|
+
let object = false;
|
|
146
|
+
let nulled = false;
|
|
147
|
+
for (const arm of arms) {
|
|
148
|
+
if (arm.kind === "nullT")
|
|
149
|
+
nulled = true;
|
|
150
|
+
else if (arm.kind === "object" && arm.className === name)
|
|
151
|
+
object = true;
|
|
152
|
+
else
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
return object && nulled ? "nullable" : null;
|
|
156
|
+
}
|
|
157
|
+
function unionIdOf(type) {
|
|
158
|
+
return type.kind === "union" ? type.unionId : "";
|
|
159
|
+
}
|
|
160
|
+
/** Whether a value of this type can lead to an instance of `name`: directly,
|
|
161
|
+
* through a union arm, or through a container, closure or generator slot. */
|
|
162
|
+
export function mentions(type, name, unions) {
|
|
163
|
+
switch (type.kind) {
|
|
164
|
+
case "object":
|
|
165
|
+
case "classval":
|
|
166
|
+
return type.className === name;
|
|
167
|
+
case "union": {
|
|
168
|
+
const arms = unions.get(type.unionId)?.arms;
|
|
169
|
+
return arms !== undefined && arms.some((arm) => mentions(arm, name, unions));
|
|
170
|
+
}
|
|
171
|
+
case "array":
|
|
172
|
+
return mentions(type.elem, name, unions);
|
|
173
|
+
case "map":
|
|
174
|
+
return mentions(type.key, name, unions) || mentions(type.value, name, unions);
|
|
175
|
+
case "set":
|
|
176
|
+
return mentions(type.elem, name, unions);
|
|
177
|
+
case "promise":
|
|
178
|
+
return mentions(type.inner, name, unions);
|
|
179
|
+
case "func":
|
|
180
|
+
return (type.params.some((param) => mentions(param, name, unions)) ||
|
|
181
|
+
mentions(type.ret, name, unions));
|
|
182
|
+
case "generator":
|
|
183
|
+
return (mentions(type.yieldT, name, unions) ||
|
|
184
|
+
mentions(type.retT, name, unions) ||
|
|
185
|
+
mentions(type.nextT, name, unions));
|
|
186
|
+
case "record":
|
|
187
|
+
return false;
|
|
188
|
+
default:
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Whether `this` leaves the constructor for anywhere but a field of the
|
|
193
|
+
* object under construction. cycle-mutability's escape point is the index
|
|
194
|
+
* of the first body statement after which it did, so only a whole-body
|
|
195
|
+
* answer means it never did. */
|
|
196
|
+
function constructorEscaped(fn, thisId, baseCtor) {
|
|
197
|
+
return constructorEscapePoint(fn, thisId, baseCtor) < fn.body.length;
|
|
198
|
+
}
|
|
199
|
+
const MAX_REASONS = 4;
|
|
200
|
+
/** Linear use, one class at a time, over every function in the module.
|
|
201
|
+
* State is per local and per straight-line region; branch and loop bodies
|
|
202
|
+
* must leave the state of the locals they did not declare unchanged. */
|
|
203
|
+
class LinearUse {
|
|
204
|
+
cls;
|
|
205
|
+
unions;
|
|
206
|
+
functions;
|
|
207
|
+
facts;
|
|
208
|
+
found = [];
|
|
209
|
+
treeLocals = new Map();
|
|
210
|
+
moved = [];
|
|
211
|
+
fn = null;
|
|
212
|
+
constructor(cls, unions, functions, facts) {
|
|
213
|
+
this.cls = cls;
|
|
214
|
+
this.unions = unions;
|
|
215
|
+
this.functions = functions;
|
|
216
|
+
this.facts = facts;
|
|
217
|
+
}
|
|
218
|
+
reasons() {
|
|
219
|
+
return this.found;
|
|
220
|
+
}
|
|
221
|
+
/** The varRef reads that took a node out of a local (see TreeClassPlan). */
|
|
222
|
+
moves() {
|
|
223
|
+
return this.moved;
|
|
224
|
+
}
|
|
225
|
+
fail(what) {
|
|
226
|
+
if (this.found.length < MAX_REASONS) {
|
|
227
|
+
this.found.push(`${this.fn?.name ?? "module"}: ${what}`);
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
tree(type) {
|
|
232
|
+
return mentions(type, this.cls, this.unions);
|
|
233
|
+
}
|
|
234
|
+
function(fn) {
|
|
235
|
+
this.fn = fn;
|
|
236
|
+
this.treeLocals.clear();
|
|
237
|
+
for (const local of fn.locals)
|
|
238
|
+
if (this.tree(local.type))
|
|
239
|
+
this.treeLocals.set(local.id, local);
|
|
240
|
+
// A function with no tree local and no tree result can still build or
|
|
241
|
+
// read a node inside an expression; walk it when the body mentions the
|
|
242
|
+
// class so the temporary rules reject the class instead of letting the
|
|
243
|
+
// lowering copy a value this analysis never saw moved.
|
|
244
|
+
if (this.treeLocals.size === 0 &&
|
|
245
|
+
!this.tree(fn.returnType) &&
|
|
246
|
+
!fn.body.some((stmt) => this.holdsTree(stmt)))
|
|
247
|
+
return;
|
|
248
|
+
if (fn.generator !== undefined) {
|
|
249
|
+
this.fail("a generator holds it");
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (this.tree(fn.returnType)) {
|
|
253
|
+
const borrowed = this.facts.borrowedReturns;
|
|
254
|
+
if (borrowed?.has(fn.name) === true)
|
|
255
|
+
this.fail("returns a node it only borrows");
|
|
256
|
+
}
|
|
257
|
+
for (const capture of [...(fn.captures ?? []), ...(fn.classCaptures ?? [])])
|
|
258
|
+
if (this.tree(capture.type))
|
|
259
|
+
this.fail("a closure captures it");
|
|
260
|
+
const params = new Set(fn.params.map((param) => param.localId));
|
|
261
|
+
const ctorThis = fn.name === `%${this.cls}.constructor` ? fn.params[0]?.localId : undefined;
|
|
262
|
+
// A tree local that a later assignment could rebind needs the store
|
|
263
|
+
// path the lowering does not have; parameters are the exception, since
|
|
264
|
+
// their binding never changes.
|
|
265
|
+
for (const local of this.treeLocals.values())
|
|
266
|
+
if (!params.has(local.id) && local.mutable)
|
|
267
|
+
this.fail(`local ${local.id} is rebound`);
|
|
268
|
+
const state = new Map();
|
|
269
|
+
const borrowedParams = this.facts.borrowed.get(fn.name);
|
|
270
|
+
for (const [index, param] of fn.params.entries()) {
|
|
271
|
+
if (!this.tree(param.type))
|
|
272
|
+
continue;
|
|
273
|
+
// A parameter the callee borrows is a read-only view; one it owns is
|
|
274
|
+
// released at exit unless the body moves it on.
|
|
275
|
+
state.set(param.localId, param.localId === ctorThis
|
|
276
|
+
? "borrowed"
|
|
277
|
+
: this.pending(param, fn)
|
|
278
|
+
? "pending"
|
|
279
|
+
: borrowedParams?.has(index) === true
|
|
280
|
+
? "borrowed"
|
|
281
|
+
: "owned");
|
|
282
|
+
}
|
|
283
|
+
if (!this.statements(fn.body, state))
|
|
284
|
+
return;
|
|
285
|
+
// The `new` expression hands each constructor argument over as an
|
|
286
|
+
// owned child; a parameter the body never stores in a field would leak
|
|
287
|
+
// the subtree it points at.
|
|
288
|
+
for (const [id, held] of state)
|
|
289
|
+
if (held === "pending")
|
|
290
|
+
this.fail(`constructor parameter ${id} is never stored`);
|
|
291
|
+
}
|
|
292
|
+
/** A constructor parameter other than `this` arrives owned by the new
|
|
293
|
+
* object: the body stores it in a field or destroys it. */
|
|
294
|
+
pending(param, fn) {
|
|
295
|
+
return fn.name === `%${this.cls}.constructor` && param.localId !== fn.params[0]?.localId;
|
|
296
|
+
}
|
|
297
|
+
statements(list, state) {
|
|
298
|
+
for (const stmt of list)
|
|
299
|
+
if (!this.statement(stmt, state))
|
|
300
|
+
return false;
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
statement(stmt, state) {
|
|
304
|
+
switch (stmt.kind) {
|
|
305
|
+
case "varDecl": {
|
|
306
|
+
if (!this.tree(this.treeLocals.get(stmt.localId)?.type ?? NO_TYPE)) {
|
|
307
|
+
return stmt.init === null ? true : this.expr(stmt.init, "borrow", state) !== null;
|
|
308
|
+
}
|
|
309
|
+
if (stmt.init === null)
|
|
310
|
+
return this.fail(`local ${stmt.localId} is declared without a value`) !== null;
|
|
311
|
+
const provenance = this.expr(stmt.init, "move", state);
|
|
312
|
+
if (provenance === null)
|
|
313
|
+
return false;
|
|
314
|
+
if (provenance === "borrowed")
|
|
315
|
+
return this.fail(`local ${stmt.localId} aliases a node it does not own`) !== null;
|
|
316
|
+
state.set(stmt.localId, "owned");
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
case "assign": {
|
|
320
|
+
if (this.treeLocals.has(stmt.localId) || this.tree(stmt.value.type))
|
|
321
|
+
return this.fail("a tree local is assigned a second value") !== null;
|
|
322
|
+
return this.expr(stmt.value, "borrow", state) !== null;
|
|
323
|
+
}
|
|
324
|
+
case "exprStmt": {
|
|
325
|
+
// A statement that drops its value keeps only what it allocated;
|
|
326
|
+
// a node read out of a local or a field would be destroyed while
|
|
327
|
+
// its owner still holds it.
|
|
328
|
+
const provenance = this.expr(stmt.expr, "borrow", state);
|
|
329
|
+
if (provenance === null)
|
|
330
|
+
return false;
|
|
331
|
+
if (provenance === "fresh" || provenance === "none")
|
|
332
|
+
return true;
|
|
333
|
+
return this.fail("drops a node it does not own") !== null;
|
|
334
|
+
}
|
|
335
|
+
case "if": {
|
|
336
|
+
if (!this.borrowOnly(stmt.cond, state))
|
|
337
|
+
return false;
|
|
338
|
+
const then = new Map(state);
|
|
339
|
+
if (!this.statements(stmt.then, then))
|
|
340
|
+
return false;
|
|
341
|
+
const otherwise = stmt.else_ === null ? state : new Map(state);
|
|
342
|
+
if (stmt.else_ !== null && !this.statements(stmt.else_, otherwise))
|
|
343
|
+
return false;
|
|
344
|
+
return this.join(state, then, otherwise);
|
|
345
|
+
}
|
|
346
|
+
case "block":
|
|
347
|
+
return this.statements(stmt.body, state);
|
|
348
|
+
case "while":
|
|
349
|
+
case "doWhile": {
|
|
350
|
+
if (stmt.kind === "while" && !this.borrowOnly(stmt.cond, state))
|
|
351
|
+
return false;
|
|
352
|
+
const body = new Map(state);
|
|
353
|
+
if (!this.statements(stmt.body, body))
|
|
354
|
+
return false;
|
|
355
|
+
if (stmt.kind === "doWhile" && !this.borrowOnly(stmt.cond, body))
|
|
356
|
+
return false;
|
|
357
|
+
return this.join(state, state, body);
|
|
358
|
+
}
|
|
359
|
+
case "for": {
|
|
360
|
+
const body = new Map(state);
|
|
361
|
+
if (stmt.init !== null && !this.statement(stmt.init, body))
|
|
362
|
+
return false;
|
|
363
|
+
if (stmt.cond !== null && !this.borrowOnly(stmt.cond, body))
|
|
364
|
+
return false;
|
|
365
|
+
if (stmt.update !== null && !this.statement(stmt.update, body))
|
|
366
|
+
return false;
|
|
367
|
+
if (!this.statements(stmt.body, body))
|
|
368
|
+
return false;
|
|
369
|
+
return this.join(state, state, body);
|
|
370
|
+
}
|
|
371
|
+
case "switch": {
|
|
372
|
+
// A discriminant is compared by value; a node has no such compare.
|
|
373
|
+
if (this.tree(stmt.disc.type))
|
|
374
|
+
return this.fail("switches on a node") !== null;
|
|
375
|
+
if (!this.borrowOnly(stmt.disc, state))
|
|
376
|
+
return false;
|
|
377
|
+
for (const arm of stmt.cases) {
|
|
378
|
+
if (arm.test !== null && this.tree(arm.test.type))
|
|
379
|
+
return this.fail("compares a node in a case label") !== null;
|
|
380
|
+
if (arm.test !== null && !this.borrowOnly(arm.test, state))
|
|
381
|
+
return false;
|
|
382
|
+
const body = new Map(state);
|
|
383
|
+
if (!this.statements(arm.body, body))
|
|
384
|
+
return false;
|
|
385
|
+
if (!this.join(state, state, body))
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
case "forOf": {
|
|
391
|
+
if (this.tree(stmt.iterable.type))
|
|
392
|
+
return this.fail("iterates a value that holds it") !== null;
|
|
393
|
+
if (!this.expr(stmt.iterable, "borrow", state))
|
|
394
|
+
return false;
|
|
395
|
+
const body = new Map(state);
|
|
396
|
+
if (!this.statements(stmt.body, body))
|
|
397
|
+
return false;
|
|
398
|
+
return this.join(state, state, body);
|
|
399
|
+
}
|
|
400
|
+
case "fieldSet": {
|
|
401
|
+
if (!this.expr(stmt.obj, "borrow", state))
|
|
402
|
+
return false;
|
|
403
|
+
if (!this.tree(stmt.value.type))
|
|
404
|
+
return this.expr(stmt.value, "borrow", state) !== null;
|
|
405
|
+
const provenance = this.expr(stmt.value, "move", state);
|
|
406
|
+
if (provenance === null)
|
|
407
|
+
return false;
|
|
408
|
+
if (provenance === "borrowed")
|
|
409
|
+
return (this.fail(`field ${stmt.field} takes a node from a field it does not own`) !== null);
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
case "return": {
|
|
413
|
+
if (stmt.value === null || !this.tree(stmt.value.type))
|
|
414
|
+
return stmt.value === null || this.expr(stmt.value, "borrow", state) !== null;
|
|
415
|
+
if (!this.tree(this.fn?.returnType ?? NO_TYPE))
|
|
416
|
+
return this.fail("returns a node from a function that does not declare one") !== null;
|
|
417
|
+
const provenance = this.expr(stmt.value, "move", state);
|
|
418
|
+
if (provenance === null)
|
|
419
|
+
return false;
|
|
420
|
+
if (provenance === "borrowed")
|
|
421
|
+
return this.fail("returns a node it only borrows") !== null;
|
|
422
|
+
return true;
|
|
423
|
+
}
|
|
424
|
+
case "throw":
|
|
425
|
+
if (this.tree(stmt.value.type))
|
|
426
|
+
return this.fail("throws a node") !== null;
|
|
427
|
+
return this.expr(stmt.value, "borrow", state) !== null;
|
|
428
|
+
case "tryCatch":
|
|
429
|
+
// A catch, a finally or a disposal can run with a partially
|
|
430
|
+
// transferred owner; the store path the lowering adds does not
|
|
431
|
+
// unwind. Keep the class counted instead.
|
|
432
|
+
if (this.holdsTree(stmt))
|
|
433
|
+
return this.fail("a try statement holds one") !== null;
|
|
434
|
+
return true;
|
|
435
|
+
case "recordSet":
|
|
436
|
+
case "recordKeySet":
|
|
437
|
+
case "recordKeyDelete":
|
|
438
|
+
case "arraySet":
|
|
439
|
+
case "arraySetLength":
|
|
440
|
+
case "arraySetUndefined":
|
|
441
|
+
case "arrayDelete":
|
|
442
|
+
case "bytesSet":
|
|
443
|
+
if (this.holdsTree(stmt))
|
|
444
|
+
return this.fail(`a ${stmt.kind} holds one`) !== null;
|
|
445
|
+
return true;
|
|
446
|
+
default:
|
|
447
|
+
// Everything else either touches no tree value or does so in a
|
|
448
|
+
// position this analysis does not model.
|
|
449
|
+
return this.holdsTree(stmt)
|
|
450
|
+
? this.fail(`a ${stmt.kind} statement holds one`) !== null
|
|
451
|
+
: true;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
/** Branch or loop merge: the state of every local that existed before the
|
|
455
|
+
* region must be the same on every path out of it. The agreed state becomes
|
|
456
|
+
* the state after the region, so a local both branches moved stays moved.
|
|
457
|
+
* Locals the region declared are scoped to it (each iteration allocates a
|
|
458
|
+
* fresh object). */
|
|
459
|
+
join(before, a, b) {
|
|
460
|
+
for (const [id, was] of before) {
|
|
461
|
+
const left = a.get(id) ?? was;
|
|
462
|
+
const right = b.get(id) ?? was;
|
|
463
|
+
if (left === right) {
|
|
464
|
+
before.set(id, left);
|
|
465
|
+
continue;
|
|
466
|
+
}
|
|
467
|
+
return this.fail(`local ${id} is transferred on only one path`) !== null;
|
|
468
|
+
}
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
borrowOnly(expr, state) {
|
|
472
|
+
return this.expr(expr, "borrow", state) !== null;
|
|
473
|
+
}
|
|
474
|
+
expr(expr, mode, state) {
|
|
475
|
+
switch (expr.kind) {
|
|
476
|
+
case "varRef": {
|
|
477
|
+
if (!this.tree(expr.type))
|
|
478
|
+
return "none";
|
|
479
|
+
const held = state.get(expr.localId);
|
|
480
|
+
if (held === undefined || held === "moved")
|
|
481
|
+
return this.fail(`local ${expr.localId} is used after it was moved`);
|
|
482
|
+
if (mode === "borrow")
|
|
483
|
+
return held === "pending" ? "borrowed" : held;
|
|
484
|
+
if (held === "borrowed")
|
|
485
|
+
return this.fail(`local ${expr.localId} is moved but only borrowed`);
|
|
486
|
+
this.moved.push(expr);
|
|
487
|
+
state.set(expr.localId, "moved");
|
|
488
|
+
return held === "pending" ? "pending" : "owned";
|
|
489
|
+
}
|
|
490
|
+
case "new": {
|
|
491
|
+
const involves = this.tree(expr.type) || expr.args.some((arg) => this.tree(arg.type));
|
|
492
|
+
if (!involves) {
|
|
493
|
+
for (const arg of expr.args)
|
|
494
|
+
if (!this.borrowOnly(arg, state))
|
|
495
|
+
return null;
|
|
496
|
+
return "none";
|
|
497
|
+
}
|
|
498
|
+
if (expr.className !== this.cls)
|
|
499
|
+
return this.fail(`another class's constructor, ${expr.className}, holds it`);
|
|
500
|
+
for (const arg of expr.args) {
|
|
501
|
+
if (!this.tree(arg.type)) {
|
|
502
|
+
if (!this.borrowOnly(arg, state))
|
|
503
|
+
return null;
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
const provenance = this.expr(arg, "move", state);
|
|
507
|
+
if (provenance === null)
|
|
508
|
+
return null;
|
|
509
|
+
if (provenance === "borrowed")
|
|
510
|
+
return this.fail(`an argument from a field becomes a second owner`);
|
|
511
|
+
}
|
|
512
|
+
return "fresh";
|
|
513
|
+
}
|
|
514
|
+
case "call": {
|
|
515
|
+
const consumes = expr.args.some((arg) => this.tree(arg.type));
|
|
516
|
+
if (!this.tree(expr.type) && !consumes) {
|
|
517
|
+
for (const arg of expr.args)
|
|
518
|
+
if (!this.borrowOnly(arg, state))
|
|
519
|
+
return null;
|
|
520
|
+
return "none";
|
|
521
|
+
}
|
|
522
|
+
const callee = this.functions.get(expr.callee);
|
|
523
|
+
if (callee === undefined)
|
|
524
|
+
return this.fail(`callee ${expr.callee} is not a module function`);
|
|
525
|
+
// A borrowed-return helper hands back a reference it does not own;
|
|
526
|
+
// the caller would treat it as a fresh node.
|
|
527
|
+
if (this.tree(expr.type) && this.facts.borrowedReturns?.has(expr.callee) === true)
|
|
528
|
+
return this.fail(`callee ${expr.callee} lends the node it returns`);
|
|
529
|
+
const borrowed = this.facts.borrowed.get(expr.callee);
|
|
530
|
+
for (let i = 0; i < expr.args.length; i++) {
|
|
531
|
+
const arg = expr.args[i];
|
|
532
|
+
if (!this.tree(arg.type)) {
|
|
533
|
+
if (!this.borrowOnly(arg, state))
|
|
534
|
+
return null;
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
const borrows = borrowed?.has(i) === true;
|
|
538
|
+
const provenance = this.expr(arg, borrows ? "borrow" : "move", state);
|
|
539
|
+
if (provenance === null)
|
|
540
|
+
return null;
|
|
541
|
+
if (!borrows && provenance === "borrowed")
|
|
542
|
+
return this.fail(`callee ${expr.callee} consumes a node that comes from a field`);
|
|
543
|
+
}
|
|
544
|
+
return this.tree(expr.type) ? "fresh" : "none";
|
|
545
|
+
}
|
|
546
|
+
case "fieldGet": {
|
|
547
|
+
if (this.tree(expr.obj.type)) {
|
|
548
|
+
const provenance = this.expr(expr.obj, "borrow", state);
|
|
549
|
+
if (provenance === null)
|
|
550
|
+
return null;
|
|
551
|
+
if (provenance === "fresh")
|
|
552
|
+
return this.fail(`field ${expr.field} is read from a node the statement owns`);
|
|
553
|
+
}
|
|
554
|
+
else if (!this.borrowOnly(expr.obj, state))
|
|
555
|
+
return null;
|
|
556
|
+
return this.tree(expr.type) ? "borrowed" : "none";
|
|
557
|
+
}
|
|
558
|
+
// Wrappers that move no ownership: unboxing, narrowing, upcasts and
|
|
559
|
+
// the tag test of a nullable slot.
|
|
560
|
+
case "unionWrap":
|
|
561
|
+
case "unionNarrow":
|
|
562
|
+
case "upcast":
|
|
563
|
+
if (expr.value.kind === "unitLit")
|
|
564
|
+
return "none";
|
|
565
|
+
return this.expr(expr.value, mode, state);
|
|
566
|
+
case "unionIsTag": {
|
|
567
|
+
const provenance = this.expr(expr.value, "borrow", state);
|
|
568
|
+
return provenance === null ? null : "none";
|
|
569
|
+
}
|
|
570
|
+
// Arithmetic and condition combining: the operands are read, never
|
|
571
|
+
// moved, and the result is a scalar.
|
|
572
|
+
case "logical":
|
|
573
|
+
if (!this.borrowOnly(expr.left, state) || !this.borrowOnly(expr.right, state))
|
|
574
|
+
return null;
|
|
575
|
+
return "none";
|
|
576
|
+
case "bin":
|
|
577
|
+
if (this.tree(expr.type))
|
|
578
|
+
return this.fail("an operator produces it");
|
|
579
|
+
if (!this.borrowOnly(expr.left, state) || !this.borrowOnly(expr.right, state))
|
|
580
|
+
return null;
|
|
581
|
+
return "none";
|
|
582
|
+
// Scalar operations over values that may be computed from a node
|
|
583
|
+
// (`nodeCount(build(d))`): the operands are read and the result is a
|
|
584
|
+
// number, a string or a bool. None of these can retain a node.
|
|
585
|
+
case "toString":
|
|
586
|
+
if (this.tree(expr.operand.type))
|
|
587
|
+
return this.fail("converts a node to text");
|
|
588
|
+
return this.borrowOnly(expr.operand, state) ? "none" : null;
|
|
589
|
+
case "strConcat":
|
|
590
|
+
case "strEq":
|
|
591
|
+
case "strCmp":
|
|
592
|
+
if (!this.borrowOnly(expr.left, state) || !this.borrowOnly(expr.right, state))
|
|
593
|
+
return null;
|
|
594
|
+
return "none";
|
|
595
|
+
case "intrinsic":
|
|
596
|
+
case "libCall":
|
|
597
|
+
for (const arg of expr.args) {
|
|
598
|
+
if (this.tree(arg.type))
|
|
599
|
+
return this.fail(`a ${expr.kind} takes a node by value`);
|
|
600
|
+
if (!this.borrowOnly(arg, state))
|
|
601
|
+
return null;
|
|
602
|
+
}
|
|
603
|
+
return this.tree(expr.type) ? this.fail(`a ${expr.kind} produces one`) : "none";
|
|
604
|
+
case "seqExpr": {
|
|
605
|
+
for (const stmt of expr.stmts)
|
|
606
|
+
if (!this.statement(stmt, state))
|
|
607
|
+
return null;
|
|
608
|
+
return this.expr(expr.result, mode, state);
|
|
609
|
+
}
|
|
610
|
+
case "unitLit":
|
|
611
|
+
return "none";
|
|
612
|
+
default:
|
|
613
|
+
return this.holdsTree(expr) ? this.fail(`a ${expr.kind} expression holds one`) : "none";
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
/** Whether the value or any value inside it can reach a node. */
|
|
617
|
+
holdsTree(node) {
|
|
618
|
+
let found = false;
|
|
619
|
+
const exprVisitor = (e) => {
|
|
620
|
+
if (this.tree(e.type)) {
|
|
621
|
+
found = true;
|
|
622
|
+
return false;
|
|
623
|
+
}
|
|
624
|
+
return everyExprChild(e, exprVisitor, stmtVisitor);
|
|
625
|
+
};
|
|
626
|
+
const stmtVisitor = (s) => !found && everyStmtChild(s, exprVisitor, stmtVisitor);
|
|
627
|
+
if (isExpr(node))
|
|
628
|
+
exprVisitor(node);
|
|
629
|
+
else
|
|
630
|
+
everyStmtChild(node, exprVisitor, stmtVisitor);
|
|
631
|
+
return found;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
const NO_TYPE = { kind: "void" };
|
|
635
|
+
/** Every kind of the IR's statement union, which is the only list of them:
|
|
636
|
+
* the traversal walks anything else as an expression, so a statement kind
|
|
637
|
+
* missing here reaches `everyExprChild` as an expression and throws. */
|
|
638
|
+
const STATEMENT_KINDS = new Set([
|
|
639
|
+
"varDecl",
|
|
640
|
+
"assign",
|
|
641
|
+
"exprStmt",
|
|
642
|
+
"if",
|
|
643
|
+
"while",
|
|
644
|
+
"doWhile",
|
|
645
|
+
"for",
|
|
646
|
+
"forOf",
|
|
647
|
+
"switch",
|
|
648
|
+
"block",
|
|
649
|
+
"return",
|
|
650
|
+
"throw",
|
|
651
|
+
"tryCatch",
|
|
652
|
+
"break",
|
|
653
|
+
"continue",
|
|
654
|
+
"genBindBarrier",
|
|
655
|
+
"rethrow",
|
|
656
|
+
"runtimeFence",
|
|
657
|
+
"fieldSet",
|
|
658
|
+
"recordSet",
|
|
659
|
+
"recordKeySet",
|
|
660
|
+
"recordKeyDelete",
|
|
661
|
+
"arraySet",
|
|
662
|
+
"arraySetLength",
|
|
663
|
+
"arraySetUndefined",
|
|
664
|
+
"arrayDelete",
|
|
665
|
+
"bytesSet",
|
|
666
|
+
]);
|
|
667
|
+
function isExpr(node) {
|
|
668
|
+
return !STATEMENT_KINDS.has(node.kind);
|
|
669
|
+
}
|
|
670
|
+
/** Every typed slot of the module, with where it sits. Root types only:
|
|
671
|
+
* `mentions` looks through the containers itself. */
|
|
672
|
+
function collectTypeSlots(mod) {
|
|
673
|
+
const slots = [];
|
|
674
|
+
const add = (type, where, slot, owner) => {
|
|
675
|
+
slots.push(owner === undefined ? { type, where, slot } : { type, where, slot, owner });
|
|
676
|
+
};
|
|
677
|
+
for (const fn of mod.functions) {
|
|
678
|
+
for (const param of fn.params)
|
|
679
|
+
add(param.type, `${fn.name} parameter ${param.name}`, "param");
|
|
680
|
+
add(fn.returnType, `${fn.name} result`, "result");
|
|
681
|
+
for (const local of fn.locals)
|
|
682
|
+
add(local.type, `${fn.name} local ${local.name}`, "local");
|
|
683
|
+
for (const capture of fn.captures ?? [])
|
|
684
|
+
add(capture.type, `${fn.name} capture ${capture.name}`, "capture");
|
|
685
|
+
for (const capture of fn.classCaptures ?? [])
|
|
686
|
+
add(capture.type, `${fn.name} class capture ${capture.name}`, "capture");
|
|
687
|
+
if (fn.generator !== undefined) {
|
|
688
|
+
add(fn.generator.yieldT, `${fn.name} yield`, "capture");
|
|
689
|
+
add(fn.generator.nextT, `${fn.name} next`, "capture");
|
|
690
|
+
add(fn.generator.resultType, `${fn.name} generator result`, "capture");
|
|
691
|
+
}
|
|
692
|
+
for (const stmt of fn.body)
|
|
693
|
+
exprSlots(stmt, `${fn.name}`, add);
|
|
694
|
+
}
|
|
695
|
+
for (const def of mod.classes ?? []) {
|
|
696
|
+
for (const field of def.fields)
|
|
697
|
+
add(field.type, `${def.name} field ${field.name}`, "classField", def.name);
|
|
698
|
+
for (const capture of def.localCaptures ?? [])
|
|
699
|
+
add(capture.type, `${def.name} capture ${capture.name}`, "capture");
|
|
700
|
+
if (def.arrayElem !== undefined)
|
|
701
|
+
add(def.arrayElem, `${def.name} element`, "capture");
|
|
702
|
+
}
|
|
703
|
+
for (const record of mod.records ?? [])
|
|
704
|
+
for (const field of record.fields)
|
|
705
|
+
add(field.type, `record ${record.id} field ${field.name}`, "recordField");
|
|
706
|
+
for (const global of mod.globals ?? [])
|
|
707
|
+
add(global.type, `global ${global.name}`, "global");
|
|
708
|
+
for (const union of mod.unions ?? [])
|
|
709
|
+
for (const arm of union.arms)
|
|
710
|
+
add(arm, `union ${union.id}`, "expr");
|
|
711
|
+
return slots;
|
|
712
|
+
}
|
|
713
|
+
/** Expression types inside a statement, which must stay in the in-flight
|
|
714
|
+
* forms (the class itself or `C | null`). */
|
|
715
|
+
function exprSlots(stmt, where, add) {
|
|
716
|
+
const expr = (e) => {
|
|
717
|
+
add(e.type, `${where} expression ${e.kind}`, "expr");
|
|
718
|
+
return everyExprChild(e, expr, stmtVisitor);
|
|
719
|
+
};
|
|
720
|
+
const stmtVisitor = (s) => everyStmtChild(s, expr, stmtVisitor);
|
|
721
|
+
return everyStmtChild(stmt, expr, stmtVisitor);
|
|
722
|
+
}
|
|
723
|
+
//# sourceMappingURL=tree-classes.js.map
|