@scriptc/compiler 0.4.6 → 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 +29 -6
- package/ambient/node-fallback/fs-promises.d.ts +1 -1
- package/ambient/node-fallback/fs.d.ts +57 -12
- package/ambient/node-fallback/http.d.ts +26 -18
- package/ambient/node-fallback/https.d.ts +5 -2
- package/ambient/node-fallback/net.d.ts +25 -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/querystring.d.ts +3 -3
- package/ambient/node-fallback/zlib.d.ts +31 -2
- package/ambient/scriptc-node-fallback.d.ts +95 -20
- package/ambient/scriptc.d.ts +7 -2
- package/dist/backend/executable-features.js +22 -1
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +12 -1
- package/dist/backend/immutability.js +50 -4
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/immutability.test.js +95 -1
- package/dist/backend/immutability.test.js.map +1 -1
- package/dist/backend/library-pack.d.ts +6 -0
- package/dist/backend/library-pack.js +18 -5
- 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 +20 -2
- package/dist/backend/linker.js +221 -35
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +15 -6
- package/dist/backend/lld.js +24 -16
- package/dist/backend/lld.js.map +1 -1
- package/dist/backend/lld.test.js +13 -5
- 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/constant-callbacks.test.js +50 -1
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
- package/dist/backend/llvm/cpu-dispatch.js +34 -9
- package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +64 -3
- package/dist/backend/llvm/dyn.js +251 -15
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +68 -5
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +226 -77
- 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 +138 -34
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +142 -10
- package/dist/backend/llvm/emitter.js +523 -73
- 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.d.ts +4 -1
- package/dist/backend/llvm/expr-calls.js +38 -6
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +237 -23
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +123 -12
- 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.d.ts +8 -0
- package/dist/backend/llvm/expr-stream-bridges.js +59 -2
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/integer-values.d.ts +2 -0
- package/dist/backend/llvm/integer-values.js +6 -0
- package/dist/backend/llvm/integer-values.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 +57 -1
- package/dist/backend/llvm/js-ic.js +389 -22
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +152 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +116 -11
- package/dist/backend/llvm/lib-filesystem.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 +180 -27
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +139 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +67 -0
- package/dist/backend/llvm/lib-stream.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-entry-versions.d.ts +2 -2
- package/dist/backend/llvm/loop-entry-versions.js +43 -21
- package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +7 -1
- package/dist/backend/llvm/loop-state.js +26 -3
- 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.d.ts +3 -1
- package/dist/backend/llvm/map-number-lookup.js +7 -3
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +58 -17
- 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/receiver-brackets.test.d.ts +1 -0
- package/dist/backend/llvm/receiver-brackets.test.js +68 -0
- package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
- 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.d.ts +22 -2
- package/dist/backend/llvm/record-views.js +147 -12
- package/dist/backend/llvm/record-views.js.map +1 -1
- package/dist/backend/llvm/record-views.test.js +76 -0
- package/dist/backend/llvm/record-views.test.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 +4 -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 +36 -3
- package/dist/backend/llvm/shapes.js +201 -16
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +4 -0
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +10 -1
- package/dist/backend/llvm/speculative-integers.js +59 -8
- package/dist/backend/llvm/speculative-integers.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/unwind-abi.d.ts +3 -3
- package/dist/backend/llvm/unwind-abi.js +8 -3
- package/dist/backend/llvm/unwind-abi.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +12 -0
- package/dist/backend/llvm/walkers.js +47 -3
- 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 +94 -0
- package/dist/backend/native/executable.js +134 -10
- 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 +10 -2
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.js +8 -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 +30 -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 +72 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.js +1 -0
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-profile.d.ts +4 -1
- package/dist/backend/native-profile.js +12 -1
- package/dist/backend/native-profile.js.map +1 -1
- package/dist/backend/native-profile.test.js +10 -0
- package/dist/backend/native-profile.test.js.map +1 -1
- package/dist/backend/publication.d.ts +4 -1
- package/dist/backend/publication.js +4 -2
- package/dist/backend/publication.js.map +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 +46 -7
- package/dist/backend/runtime-pack-core.js +37 -2
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +18 -1
- package/dist/backend/runtime-pack-native.js +138 -29
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.js +166 -4
- package/dist/backend/runtime-pack-native.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +3 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +7 -0
- package/dist/backend/runtime-pack.js +25 -3
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +213 -12
- 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 +8 -1
- package/dist/backend/vendor-archives.js +313 -8
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +60 -3
- package/dist/backend/vendor-inputs.js +109 -3
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/vendor-inputs.test.js +62 -1
- package/dist/backend/vendor-inputs.test.js.map +1 -1
- package/dist/backend/warm-cache.js +2 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +7 -1
- package/dist/compat/fetch-profile.js +25 -12
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- package/dist/contracts/check.d.ts +3 -0
- package/dist/contracts/check.js +18 -5
- package/dist/contracts/check.js.map +1 -1
- 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/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/codes.d.ts +14 -0
- package/dist/diagnostics/codes.js +14 -0
- package/dist/diagnostics/codes.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +68 -0
- package/dist/diagnostics/diagnostic.js +186 -6
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/dynamic-tier.js +3 -1
- package/dist/diagnostics/dynamic-tier.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 +48 -0
- package/dist/executable/executable-cache.js +38 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +127 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +13 -3
- package/dist/executable/prepare.js +438 -234
- 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 +24 -0
- package/dist/frontend/early-errors.js +836 -0
- package/dist/frontend/early-errors.js.map +1 -0
- package/dist/frontend/early-errors.test.d.ts +1 -0
- package/dist/frontend/early-errors.test.js +207 -0
- package/dist/frontend/early-errors.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +88 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +47 -0
- package/dist/frontend/input-tracker.js +173 -36
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +86 -2
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/js-inference.d.ts +2 -0
- package/dist/frontend/js-inference.js +18 -0
- package/dist/frontend/js-inference.js.map +1 -0
- 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.d.ts +2 -1
- package/dist/frontend/lowering/binding-analysis.js +86 -4
- 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 +13 -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 +41 -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.d.ts +7 -0
- package/dist/frontend/lowering/builtins/child-process-methods.js +52 -12
- 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 +565 -28
- 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/dates.d.ts +1 -1
- package/dist/frontend/lowering/builtins/dates.js +23 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
- package/dist/frontend/lowering/builtins/environment.js +213 -2
- package/dist/frontend/lowering/builtins/environment.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +75 -18
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
- package/dist/frontend/lowering/builtins/filesystem.js +185 -16
- package/dist/frontend/lowering/builtins/filesystem.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 +42 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
- package/dist/frontend/lowering/builtins/module-resolution.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 +9 -5
- package/dist/frontend/lowering/builtins/operating-system.js +101 -20
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +18 -2
- package/dist/frontend/lowering/builtins/process.js +386 -25
- 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/querystring.d.ts +8 -0
- package/dist/frontend/lowering/builtins/querystring.js +202 -18
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
- package/dist/frontend/lowering/builtins/readline.js +200 -38
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +60 -1
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +55 -13
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
- package/dist/frontend/lowering/builtins/v8.js +7 -5
- package/dist/frontend/lowering/builtins/v8.js.map +1 -1
- package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
- package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
- package/dist/frontend/lowering/builtins/web-streams-dyn.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 +180 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.js +5 -0
- package/dist/frontend/lowering/cjs-inline-require.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 +14 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1376 -1009
- 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-protocols.js +59 -10
- package/dist/frontend/lowering/class-protocols.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 +35 -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/class-views.d.ts +13 -0
- package/dist/frontend/lowering/class-views.js +51 -0
- package/dist/frontend/lowering/class-views.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +63 -10
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +15 -0
- package/dist/frontend/lowering/coercions/state.js +24 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +75 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +39 -2
- 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.d.ts +8 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +288 -90
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +37 -8
- 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 +30 -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 +450 -86
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +16 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +74 -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/filter-predicates.d.ts +10 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
- package/dist/frontend/lowering/containers/indexed-objects.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 +24 -0
- package/dist/frontend/lowering/expressions/array-literals.js +88 -10
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +216 -14
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +272 -11
- 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 +173 -4
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
- package/dist/frontend/lowering/expressions/narrowing.js +195 -18
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
- package/dist/frontend/lowering/expressions/object-literals.js +951 -240
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +71 -21
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +39 -0
- package/dist/frontend/lowering/expressions/property-access.js +1141 -87
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +262 -4
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +25 -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 +156 -22
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +6 -0
- package/dist/frontend/lowering/frozen-records.js +10 -4
- package/dist/frontend/lowering/frozen-records.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
- package/dist/frontend/lowering/frozen-records.test.js +44 -0
- package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
- package/dist/frontend/lowering/function-names.d.ts +9 -0
- package/dist/frontend/lowering/function-names.js +95 -0
- package/dist/frontend/lowering/function-names.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +42 -13
- 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 +75 -0
- package/dist/frontend/lowering/generic-functions.js +790 -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 +15 -4
- package/dist/frontend/lowering/global-values.js +67 -9
- package/dist/frontend/lowering/global-values.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.js +34 -1
- package/dist/frontend/lowering/handle-properties.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.d.ts +54 -0
- package/dist/frontend/lowering/key-order-witness.js +571 -9
- 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 +25 -3
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +140 -16
- 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.d.ts +36 -6
- package/dist/frontend/lowering/lower-builtin-values.js +342 -58
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +47 -1
- package/dist/frontend/lowering/lower-calls.js +1354 -273
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-calls.test.js +121 -0
- package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
- package/dist/frontend/lowering/lower-classes.d.ts +36 -5
- package/dist/frontend/lowering/lower-classes.js +630 -89
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +15 -2
- package/dist/frontend/lowering/lower-event-emitter.js +610 -98
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +15 -1
- package/dist/frontend/lowering/lower-exprs.js +96 -20
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +27 -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 +713 -92
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +135 -27
- 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.d.ts +35 -4
- package/dist/frontend/lowering/lower-node-island.js +472 -67
- package/dist/frontend/lowering/lower-node-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +463 -96
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-shared-modules.js +13 -1
- package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
- package/dist/frontend/lowering/lower-stdlib.js +77 -18
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +24 -4
- package/dist/frontend/lowering/lower-stmts.js +831 -136
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +126 -8
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +243 -48
- 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 +363 -21
- package/dist/frontend/lowering/lowerer.js +1224 -129
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +19 -1
- 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/module-namespace-elements.js +15 -0
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- 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/new-target.js +2 -2
- package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
- package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
- package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
- 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 +36 -0
- package/dist/frontend/lowering/partial-assertions.js +189 -0
- package/dist/frontend/lowering/partial-assertions.js.map +1 -0
- 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.d.ts +34 -0
- package/dist/frontend/lowering/primitive-wrappers.js +221 -0
- package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
- package/dist/frontend/lowering/private-statics.d.ts +46 -0
- package/dist/frontend/lowering/private-statics.js +322 -0
- package/dist/frontend/lowering/private-statics.js.map +1 -0
- 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/record-sources.d.ts +12 -1
- package/dist/frontend/lowering/record-sources.js +60 -0
- package/dist/frontend/lowering/record-sources.js.map +1 -1
- 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-equality.d.ts +4 -0
- package/dist/frontend/lowering/strict-equality.js +14 -0
- package/dist/frontend/lowering/strict-equality.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 +42 -1
- package/dist/frontend/lowering/surfaces.js +212 -71
- 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 +136 -17
- package/dist/frontend/lowering/unit-journal.js +324 -53
- package/dist/frontend/lowering/unit-journal.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.test.js +126 -3
- package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
- package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
- package/dist/frontend/lowering/unit-reuse.js +1008 -0
- package/dist/frontend/lowering/unit-reuse.js.map +1 -0
- package/dist/frontend/lowering/width-lift.d.ts +12 -0
- package/dist/frontend/lowering/zlib-constants.js +3 -2
- package/dist/frontend/lowering/zlib-constants.js.map +1 -1
- package/dist/frontend/npm-file-import.test.d.ts +1 -0
- package/dist/frontend/npm-file-import.test.js +76 -0
- package/dist/frontend/npm-file-import.test.js.map +1 -0
- package/dist/frontend/npm-static.js +95 -11
- 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/npm.d.ts +9 -0
- package/dist/frontend/npm.js +82 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/pipeline-native.js +2 -1
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +9 -4
- package/dist/frontend/pipeline.js +162 -38
- 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-node.d.ts +3 -0
- package/dist/frontend/program-node.js +13 -6
- package/dist/frontend/program-node.js.map +1 -1
- package/dist/frontend/program.d.ts +71 -2
- package/dist/frontend/program.js +836 -411
- 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/provenance-core.js +4 -0
- package/dist/frontend/provenance-core.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/services.d.ts +14 -0
- package/dist/frontend/services.js +52 -2
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +61 -1
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/shape-inference/analyze.d.ts +5 -0
- package/dist/frontend/shape-inference/analyze.js +104 -4
- package/dist/frontend/shape-inference/analyze.js.map +1 -1
- package/dist/frontend/shape-inference/domain.js +0 -1
- package/dist/frontend/shape-inference/domain.js.map +1 -1
- package/dist/frontend/shape-inference/index.js +5 -1
- package/dist/frontend/shape-inference/index.js.map +1 -1
- package/dist/frontend/shape-inference/memo.d.ts +2 -1
- package/dist/frontend/shape-inference/memo.js +6 -2
- package/dist/frontend/shape-inference/memo.js.map +1 -1
- package/dist/frontend/shape-inference/overlay.d.ts +1 -1
- package/dist/frontend/shape-inference/overlay.js +184 -4
- package/dist/frontend/shape-inference/overlay.js.map +1 -1
- package/dist/frontend/shape-inference/static-objects.js +11 -6
- package/dist/frontend/shape-inference/static-objects.js.map +1 -1
- package/dist/frontend/source-phase-imports.test.d.ts +1 -0
- package/dist/frontend/source-phase-imports.test.js +37 -0
- package/dist/frontend/source-phase-imports.test.js.map +1 -0
- 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/ts7/ast-node.d.ts +6 -1
- package/dist/frontend/ts7/ast-node.js +12 -0
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
- package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.js +3 -5
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +13 -0
- package/dist/frontend/ts7/checker-backend.js +84 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +126 -2
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +22 -1
- package/dist/frontend/ts7/program-host.js +49 -4
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +83 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.d.ts +16 -1
- package/dist/frontend/ts7/rpc-process.js +170 -92
- package/dist/frontend/ts7/rpc-process.js.map +1 -1
- package/dist/frontend/ts7/rpc-process.test.js +49 -21
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +57 -3
- package/dist/frontend/tsc-codes.js +956 -101
- 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 +98 -11
- package/dist/frontend/type-mapper.js +770 -182
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +224 -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/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/build.d.ts +3 -2
- package/dist/ir/build.js +4 -2
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.js +96 -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 +453 -26
- 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.d.ts +82 -0
- package/dist/ir/codec.generated.d.ts +13 -0
- package/dist/ir/codec.generated.js +5350 -0
- package/dist/ir/codec.generated.js.map +1 -0
- package/dist/ir/codec.js +325 -0
- package/dist/ir/codec.js.map +1 -0
- package/dist/ir/codec.test.d.ts +1 -0
- package/dist/ir/codec.test.js +225 -0
- package/dist/ir/codec.test.js.map +1 -0
- 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 +29 -10
- package/dist/ir/fields.generated.js +1039 -11
- package/dist/ir/fields.generated.js.map +1 -1
- package/dist/ir/fields.test.js +46 -2
- package/dist/ir/fields.test.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 +6 -4
- package/dist/ir/function-references.js +11 -4
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +14 -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-sources.js +4 -1
- package/dist/ir/inline-array-sources.js.map +1 -1
- package/dist/ir/inline-array-views.d.ts +13 -0
- package/dist/ir/inline-array-views.js +945 -0
- package/dist/ir/inline-array-views.js.map +1 -0
- package/dist/ir/inline-arrays.d.ts +7 -0
- package/dist/ir/inline-arrays.js +190 -55
- package/dist/ir/inline-arrays.js.map +1 -1
- package/dist/ir/inline-arrays.test.js +140 -2
- package/dist/ir/inline-arrays.test.js.map +1 -1
- package/dist/ir/int32-slots.js +7 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/integer-ranges.js +16 -6
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +130 -44
- 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.d.ts +10 -9
- package/dist/ir/js-ic.js +58 -25
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +37 -3
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/jsval.js +374 -63
- package/dist/ir/jsval.js.map +1 -1
- package/dist/ir/jsval.test.js +96 -2
- package/dist/ir/jsval.test.js.map +1 -1
- package/dist/ir/loop-entry-ranges.js +112 -9
- package/dist/ir/loop-entry-ranges.js.map +1 -1
- package/dist/ir/loop-entry-ranges.test.js +40 -0
- package/dist/ir/loop-entry-ranges.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 -3
- package/dist/ir/parameter-versions.js +63 -40
- 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/receiver-readers.js +58 -2
- package/dist/ir/receiver-readers.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 +139 -5
- package/dist/ir/runtime-features.js +397 -19
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +135 -1
- 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 +11 -2
- package/dist/ir/saturating-loop-jams.js +56 -16
- package/dist/ir/saturating-loop-jams.js.map +1 -1
- package/dist/ir/saturating-loop-jams.test.js +39 -1
- package/dist/ir/saturating-loop-jams.test.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 +40 -28
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/self-captures.test.js +15 -0
- package/dist/ir/self-captures.test.js.map +1 -1
- package/dist/ir/serialize.d.ts +8 -2
- package/dist/ir/serialize.js +92 -24
- 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 +170 -22
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +46 -0
- package/dist/ir/validate.test.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 +4 -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 +49 -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 +2 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +26 -5
- 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 +74 -28
- 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 +63 -4
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +93 -2
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/toolchain.js +9 -2
- package/dist/native/toolchain.js.map +1 -1
- package/dist/node-islands/boundary.d.ts +37 -1
- package/dist/node-islands/boundary.js +65 -7
- 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 +27 -1
- package/dist/node-islands/detect.js +475 -40
- package/dist/node-islands/detect.js.map +1 -1
- package/dist/node-islands/detect.test.js +175 -4
- package/dist/node-islands/detect.test.js.map +1 -1
- package/dist/node-islands/effect-gate.js +30 -20
- package/dist/node-islands/effect-gate.js.map +1 -1
- package/dist/node-islands/effect-gate.test.js +4 -1
- package/dist/node-islands/effect-gate.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/libnode.d.ts +1 -1
- package/dist/node-islands/libnode.js +1 -1
- package/dist/node-islands/libnode.js.map +1 -1
- package/dist/node-islands/modules.d.ts +28 -0
- package/dist/node-islands/modules.js +156 -0
- package/dist/node-islands/modules.js.map +1 -1
- package/dist/node-islands/modules.test.js +105 -1
- package/dist/node-islands/modules.test.js.map +1 -1
- package/dist/node-islands/policy.js +2 -3
- package/dist/node-islands/policy.js.map +1 -1
- package/dist/node-islands/probe-recorder.d.ts +1 -0
- package/dist/node-islands/probe-recorder.js +596 -0
- package/dist/node-islands/probe-recorder.js.map +1 -0
- package/dist/node-islands/probe-recorder.test.d.ts +1 -0
- package/dist/node-islands/probe-recorder.test.js +80 -0
- package/dist/node-islands/probe-recorder.test.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 +4 -0
- package/dist/node-islands/report.test.js.map +1 -1
- package/dist/node-islands/rules.js +9 -0
- package/dist/node-islands/rules.js.map +1 -1
- package/dist/node-islands/scan.d.ts +16 -1
- package/dist/node-islands/scan.js +110 -9
- package/dist/node-islands/scan.js.map +1 -1
- package/dist/node-islands/snapshot.d.ts +38 -1
- package/dist/node-islands/snapshot.js +165 -161
- package/dist/node-islands/snapshot.js.map +1 -1
- package/dist/node-islands/snapshot.test.js +63 -2
- package/dist/node-islands/snapshot.test.js.map +1 -1
- package/dist/node-islands/summary.js +8 -0
- package/dist/node-islands/summary.js.map +1 -1
- package/dist/node-islands/type-strip.d.ts +11 -0
- package/dist/node-islands/type-strip.js +157 -0
- package/dist/node-islands/type-strip.js.map +1 -0
- package/dist/node-islands/type-strip.test.d.ts +1 -0
- package/dist/node-islands/type-strip.test.js +31 -0
- package/dist/node-islands/type-strip.test.js.map +1 -0
- package/dist/project-config.d.ts +4 -0
- package/dist/project-config.js +19 -0
- package/dist/project-config.js.map +1 -1
- package/dist/project-config.test.js +10 -0
- package/dist/project-config.test.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 +221 -122
|
@@ -0,0 +1,945 @@
|
|
|
1
|
+
/* Dynamic values of instances that may hold an InlineArray field
|
|
2
|
+
* (ir/inline-arrays.ts).
|
|
3
|
+
*
|
|
4
|
+
* Boxing an instance into a dynamic value (dynFrom, caughtToDyn) keeps the
|
|
5
|
+
* instance: a checked cast or a class test on the value gives the instance
|
|
6
|
+
* back, and the compiler's class dispatch for a dynamic member read or
|
|
7
|
+
* method call is IR that uses the instance as typed code does (a read of the
|
|
8
|
+
* inline field there is followed by inline-array-sources.ts like any
|
|
9
|
+
* other). Generic dynamic operations instead read the fields through a view
|
|
10
|
+
* of the instance, where the inline field gives a new array over the
|
|
11
|
+
* elements each time, and Node.js gives the field's one array. The two agree
|
|
12
|
+
* as long as no such operation reads the field by name, enumerates the
|
|
13
|
+
* instance's properties for code that can keep or write them, or writes the
|
|
14
|
+
* field.
|
|
15
|
+
*
|
|
16
|
+
* This pass follows the dynamic values that may hold such an instance from
|
|
17
|
+
* the boxings, through the slots that hold dynamic values (locals,
|
|
18
|
+
* parameters, results, globals, class and record fields, the elements of
|
|
19
|
+
* arrays, Maps and Sets, the members of dynamic objects and arrays, and the
|
|
20
|
+
* receivers and arguments of calls through function values and of the
|
|
21
|
+
* callbacks of array methods, whose callees it follows from the closures
|
|
22
|
+
* that reach them), and reports the first operation on one of them that is
|
|
23
|
+
* not known to keep those reads away from the field: a keyed read or write
|
|
24
|
+
* whose key is the field's name or not a literal, a checked cast to a type
|
|
25
|
+
* that has a record member of the field's name or holds a dynamic value, a
|
|
26
|
+
* call through a value no compiled function reaches, or a library call
|
|
27
|
+
* other than printing, JSON.stringify without a replacer, publishing,
|
|
28
|
+
* cloning for a worker, and the class tests and checked casts that give the
|
|
29
|
+
* instance back. */
|
|
30
|
+
import { readsArguments } from "./inline-arrays.js";
|
|
31
|
+
import { everyExprChild, everyStmtChild } from "./traverse.js";
|
|
32
|
+
/** The class dispatch's normalization of a capsule (class-dynamic-dispatch.ts):
|
|
33
|
+
* its result holds the instance its argument holds. */
|
|
34
|
+
export const NORMALIZE = "%dyn.class.normalize";
|
|
35
|
+
const DYN_KINDS = new Set(["dyn", "jsval", "caught"]);
|
|
36
|
+
/** Expressions whose value is one of their children's. */
|
|
37
|
+
const PASS_THROUGH = new Set([
|
|
38
|
+
"upcast",
|
|
39
|
+
"downcast",
|
|
40
|
+
"unionWrap",
|
|
41
|
+
"unionRetype",
|
|
42
|
+
"unionNarrow",
|
|
43
|
+
"ternary",
|
|
44
|
+
"logical",
|
|
45
|
+
"nullish",
|
|
46
|
+
"orDefault",
|
|
47
|
+
"seqExpr",
|
|
48
|
+
"chainRecv",
|
|
49
|
+
"optChain",
|
|
50
|
+
"dynDestrCheck",
|
|
51
|
+
]);
|
|
52
|
+
/** Expressions that only look at a dynamic value: kind tests and
|
|
53
|
+
* comparisons. */
|
|
54
|
+
const OBSERVE = new Set([
|
|
55
|
+
"dynTest",
|
|
56
|
+
"dynScalarEq",
|
|
57
|
+
"dynHasKey",
|
|
58
|
+
"toBool",
|
|
59
|
+
"strEq",
|
|
60
|
+
"unionEq",
|
|
61
|
+
"unionIsTag",
|
|
62
|
+
"unionDisc",
|
|
63
|
+
"instanceOf",
|
|
64
|
+
"instanceOfValue",
|
|
65
|
+
"bin",
|
|
66
|
+
"unary",
|
|
67
|
+
]);
|
|
68
|
+
/** Library calls that look at a dynamic value without handing its members
|
|
69
|
+
* to other code, or give the instance back. */
|
|
70
|
+
const READS = new Set([
|
|
71
|
+
"js.fromDyn",
|
|
72
|
+
"js.toDyn",
|
|
73
|
+
"dyn.this",
|
|
74
|
+
"dyn.typedRefIs",
|
|
75
|
+
"dyn.typedRefKeyIs",
|
|
76
|
+
"dyn.classHash",
|
|
77
|
+
"dyn.getPrototypeForIdentity",
|
|
78
|
+
"dyn.hasKey",
|
|
79
|
+
"dyn.hasOwn",
|
|
80
|
+
"dyn.in",
|
|
81
|
+
"dyn.arrLen",
|
|
82
|
+
"dyn.typeof",
|
|
83
|
+
"dyn.objectTag",
|
|
84
|
+
// Keys alone.
|
|
85
|
+
"dyn.forInKeyStrings",
|
|
86
|
+
"dyn.forInKeys",
|
|
87
|
+
"dyn.forInStable",
|
|
88
|
+
"dyn.objKeys",
|
|
89
|
+
"dyn.objKeyStrings",
|
|
90
|
+
"dyn.ownKeys",
|
|
91
|
+
"dyn.getOwnPropertyNames",
|
|
92
|
+
// The operators and conversions that make a number, string or bigint of
|
|
93
|
+
// a value: an instance converts through its class's own methods.
|
|
94
|
+
"js.add",
|
|
95
|
+
"js.arithmetic",
|
|
96
|
+
"js.bitwise",
|
|
97
|
+
"js.compare",
|
|
98
|
+
"js.increment",
|
|
99
|
+
"js.toF64",
|
|
100
|
+
"js.toNumberCoerce",
|
|
101
|
+
"js.toNumeric",
|
|
102
|
+
"dyn.add",
|
|
103
|
+
"dyn.abstractEq",
|
|
104
|
+
"dyn.arithmetic",
|
|
105
|
+
"dyn.bitwise",
|
|
106
|
+
"dyn.compare",
|
|
107
|
+
"dyn.increment",
|
|
108
|
+
"dyn.numberConstructor",
|
|
109
|
+
"dyn.stringConstructor",
|
|
110
|
+
"dyn.toNumberCoerce",
|
|
111
|
+
"dyn.toNumeric",
|
|
112
|
+
"dyn.toString",
|
|
113
|
+
"dyn.toStringCoerce",
|
|
114
|
+
// Adoption turns shared source nodes into capsules of the native value;
|
|
115
|
+
// it reads nothing the program sees.
|
|
116
|
+
"dyn.adoptShared",
|
|
117
|
+
// A worker's data is a structured clone, as in Node.js: the clone holds
|
|
118
|
+
// the elements, not the field.
|
|
119
|
+
"worker.new",
|
|
120
|
+
]);
|
|
121
|
+
/** Library calls that read a member of a dynamic value by the key in their
|
|
122
|
+
* second argument: the member is followed as the value's. */
|
|
123
|
+
const KEYED_READS = new Set(["dyn.bagGet", "dyn.arrAt"]);
|
|
124
|
+
/** Library calls that iterate their first argument: an array's elements, or
|
|
125
|
+
* what an iterable class's own iterator gives. Their results are followed as
|
|
126
|
+
* the argument's members. */
|
|
127
|
+
const ITERATES = new Set([
|
|
128
|
+
"dyn.iterator",
|
|
129
|
+
"dyn.iteratorStep",
|
|
130
|
+
"dyn.iteratorStepDone",
|
|
131
|
+
"dyn.iteratorResult",
|
|
132
|
+
"dyn.iteratorCanStep",
|
|
133
|
+
]);
|
|
134
|
+
/** Library calls that store their third argument into a member of their
|
|
135
|
+
* first, keyed by their second. */
|
|
136
|
+
const KEYED_WRITES = new Set(["dyn.keySet", "dyn.keyDelete"]);
|
|
137
|
+
/** The callee name of the iterator protocol's calls the lowering makes for
|
|
138
|
+
* `for...of`, spreads and `yield*` over a dynamic iterable: the iterator's
|
|
139
|
+
* `next`, `return` and `throw`. */
|
|
140
|
+
const ITERATOR_METHOD = "iterator method";
|
|
141
|
+
/** Methods of arrays, Maps and Sets a dynamic call may run that give the
|
|
142
|
+
* receiver's elements, or iterators over them, without keeping or writing
|
|
143
|
+
* them: their results are followed as the receiver's members. */
|
|
144
|
+
const ELEMENT_METHODS = new Set([
|
|
145
|
+
"values",
|
|
146
|
+
"keys",
|
|
147
|
+
"entries",
|
|
148
|
+
"get",
|
|
149
|
+
"has",
|
|
150
|
+
"at",
|
|
151
|
+
"indexOf",
|
|
152
|
+
"includes",
|
|
153
|
+
"slice",
|
|
154
|
+
]);
|
|
155
|
+
/** Methods of arrays, Maps and Sets a dynamic call may run that call their
|
|
156
|
+
* first argument with each element (or value and key), its index (or key)
|
|
157
|
+
* and the receiver, and what their results hold: the receiver's members,
|
|
158
|
+
* the callback's results, or neither. */
|
|
159
|
+
const CALLBACK_METHODS = new Map([
|
|
160
|
+
["forEach", "none"],
|
|
161
|
+
["some", "none"],
|
|
162
|
+
["every", "none"],
|
|
163
|
+
["findIndex", "none"],
|
|
164
|
+
["findLastIndex", "none"],
|
|
165
|
+
["filter", "members"],
|
|
166
|
+
["find", "members"],
|
|
167
|
+
["findLast", "members"],
|
|
168
|
+
["map", "results"],
|
|
169
|
+
]);
|
|
170
|
+
/** Methods a dynamic call may run on a dynamic receiver whose arguments it
|
|
171
|
+
* only copies as a structured clone or publishes. */
|
|
172
|
+
const CLONING_METHODS = new Set(["postMessage"]);
|
|
173
|
+
/** The first operation that may let generic dynamic code read or write the
|
|
174
|
+
* inline field `field` of an instance boxed at one of `boxings`, or null. */
|
|
175
|
+
export function inlineArrayViewIssue(mod, boxings, field) {
|
|
176
|
+
if (boxings.size === 0)
|
|
177
|
+
return null;
|
|
178
|
+
return new ViewAnalysis(mod, boxings, field).run();
|
|
179
|
+
}
|
|
180
|
+
class ViewAnalysis {
|
|
181
|
+
mod;
|
|
182
|
+
boxings;
|
|
183
|
+
field;
|
|
184
|
+
functions = new Map();
|
|
185
|
+
methodImpls = new Map();
|
|
186
|
+
bases = new Map();
|
|
187
|
+
recordFields = new Map();
|
|
188
|
+
unions = new Map();
|
|
189
|
+
edges = new Map();
|
|
190
|
+
/** `edges` reversed: where a slot's values come from. */
|
|
191
|
+
sources = new Map();
|
|
192
|
+
sites = new Map();
|
|
193
|
+
/** The function each closure's site makes. */
|
|
194
|
+
closures = new Map();
|
|
195
|
+
valueCalls = [];
|
|
196
|
+
callbackCalls = [];
|
|
197
|
+
/** The compiled functions each value call, or each callback method call's
|
|
198
|
+
* callback, may run. */
|
|
199
|
+
targets = new Map();
|
|
200
|
+
held = new Set();
|
|
201
|
+
/** Whether values of each record shape and union (`r:` and `u:` keys)
|
|
202
|
+
* hold dynamic values (`dynish`), and whether checked casts to them
|
|
203
|
+
* recover (`recovers`). */
|
|
204
|
+
dynParts = new Map();
|
|
205
|
+
recoveringParts = new Map();
|
|
206
|
+
/** The slots each function's return statements return. */
|
|
207
|
+
returns = new Map();
|
|
208
|
+
/** The parameters (by index) a function may return as they came. */
|
|
209
|
+
returnedParams = new Map();
|
|
210
|
+
edgeCount = 0;
|
|
211
|
+
constructor(mod, boxings, field) {
|
|
212
|
+
this.mod = mod;
|
|
213
|
+
this.boxings = boxings;
|
|
214
|
+
this.field = field;
|
|
215
|
+
for (const fn of mod.functions)
|
|
216
|
+
this.functions.set(fn.name, fn);
|
|
217
|
+
for (const cls of mod.classes ?? []) {
|
|
218
|
+
this.bases.set(cls.name, cls.base);
|
|
219
|
+
for (const m of cls.methods ?? []) {
|
|
220
|
+
let list = this.methodImpls.get(m);
|
|
221
|
+
if (!list)
|
|
222
|
+
this.methodImpls.set(m, (list = []));
|
|
223
|
+
list.push(`%${cls.name}.${m}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
for (const r of mod.records ?? [])
|
|
227
|
+
this.recordFields.set(r.id, r.fields.map((f) => f.name));
|
|
228
|
+
for (const u of mod.unions ?? [])
|
|
229
|
+
this.unions.set(u.id, u.arms);
|
|
230
|
+
}
|
|
231
|
+
run() {
|
|
232
|
+
// A function that returns one of its parameters as it came gives each
|
|
233
|
+
// caller that caller's argument back, so one call's argument does not
|
|
234
|
+
// reach every caller's result. Which parameters a function returns
|
|
235
|
+
// depends on the graph, which depends on the calls' results: the graph
|
|
236
|
+
// grows until both settle.
|
|
237
|
+
for (let changed = true; changed;) {
|
|
238
|
+
this.returns.clear();
|
|
239
|
+
this.valueCalls.length = 0;
|
|
240
|
+
this.callbackCalls.length = 0;
|
|
241
|
+
const before = this.edgeCount;
|
|
242
|
+
for (const fn of this.mod.functions)
|
|
243
|
+
this.flow(fn, null);
|
|
244
|
+
// Calls through values run the closures that reach their callees; the
|
|
245
|
+
// edges to their parameters can bring more closures to other calls.
|
|
246
|
+
for (let resolved = true; resolved;) {
|
|
247
|
+
resolved = false;
|
|
248
|
+
for (const { fn, call } of this.valueCalls)
|
|
249
|
+
resolved = this.resolve(fn, call) || resolved;
|
|
250
|
+
for (const { fn, call } of this.callbackCalls)
|
|
251
|
+
resolved = this.resolveCallback(fn, call) || resolved;
|
|
252
|
+
}
|
|
253
|
+
changed = this.settleReturns() || this.edgeCount !== before;
|
|
254
|
+
}
|
|
255
|
+
const queue = [...this.boxings].map((e) => this.site(e));
|
|
256
|
+
for (const slot of queue)
|
|
257
|
+
this.held.add(slot);
|
|
258
|
+
while (queue.length > 0) {
|
|
259
|
+
const slot = queue.pop();
|
|
260
|
+
for (const next of this.edges.get(slot) ?? [])
|
|
261
|
+
if (!this.held.has(next)) {
|
|
262
|
+
this.held.add(next);
|
|
263
|
+
queue.push(next);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
let issue = null;
|
|
267
|
+
for (const fn of this.mod.functions) {
|
|
268
|
+
this.flow(fn, (found) => (issue ??= found));
|
|
269
|
+
if (issue !== null)
|
|
270
|
+
return issue;
|
|
271
|
+
}
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
// ── Types and slots ──
|
|
275
|
+
/** Whether values of `t` are, or contain, dynamic values. */
|
|
276
|
+
dynish(t, depth = 0, within = new Set()) {
|
|
277
|
+
if (DYN_KINDS.has(t.kind))
|
|
278
|
+
return true;
|
|
279
|
+
// A type too deep to look through counts as one that holds them.
|
|
280
|
+
if (depth > 32)
|
|
281
|
+
return true;
|
|
282
|
+
const part = (p, inside = within) => this.dynish(p, depth + 1, inside);
|
|
283
|
+
switch (t.kind) {
|
|
284
|
+
case "array":
|
|
285
|
+
case "set":
|
|
286
|
+
return part(t.elem);
|
|
287
|
+
case "map":
|
|
288
|
+
return part(t.key) || part(t.value);
|
|
289
|
+
case "union":
|
|
290
|
+
case "record": {
|
|
291
|
+
// A record or union type that holds itself holds dynamic values
|
|
292
|
+
// when its other parts do. Only a result that assumed nothing about
|
|
293
|
+
// an enclosing type is kept.
|
|
294
|
+
const key = t.kind === "union" ? `u:${t.unionId}` : `r:${t.shapeId}`;
|
|
295
|
+
if (within.has(key))
|
|
296
|
+
return false;
|
|
297
|
+
const known = this.dynParts.get(key);
|
|
298
|
+
if (known !== undefined)
|
|
299
|
+
return known;
|
|
300
|
+
const inside = new Set(within).add(key);
|
|
301
|
+
const result = t.kind === "union"
|
|
302
|
+
? (this.unions.get(t.unionId) ?? []).some((arm) => part(arm, inside))
|
|
303
|
+
: ((this.mod.records ?? [])
|
|
304
|
+
.find((r) => r.id === t.shapeId)
|
|
305
|
+
?.fields.some((f) => part(f.type, inside)) ?? false);
|
|
306
|
+
if (within.size === 0)
|
|
307
|
+
this.dynParts.set(key, result);
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
default:
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/** Whether a checked cast to `t` takes no member of the value that can
|
|
315
|
+
* hold the field's array: a class instance comes back as itself, a scalar
|
|
316
|
+
* or a function is converted, and a dynamic value stays one; a record is
|
|
317
|
+
* built from the members its fields name, and an array, Map or Set from
|
|
318
|
+
* the elements, each converted by its own type. The members and elements
|
|
319
|
+
* convert this way too, the field's name names none, and none holds a
|
|
320
|
+
* dynamic value, which would not be followed. A record or union type that
|
|
321
|
+
* holds itself recovers when its other parts do. */
|
|
322
|
+
recovers(t, depth = 0, within = new Set()) {
|
|
323
|
+
if (depth > 32)
|
|
324
|
+
return false;
|
|
325
|
+
const part = (p, inside = within) => !this.dynish(p) && this.recovers(p, depth + 1, inside);
|
|
326
|
+
switch (t.kind) {
|
|
327
|
+
case "array":
|
|
328
|
+
case "set":
|
|
329
|
+
return part(t.elem);
|
|
330
|
+
case "map":
|
|
331
|
+
return part(t.key) && part(t.value);
|
|
332
|
+
case "union":
|
|
333
|
+
case "record": {
|
|
334
|
+
// Only a result that assumed nothing about an enclosing type is
|
|
335
|
+
// kept.
|
|
336
|
+
const key = t.kind === "union" ? `u:${t.unionId}` : `r:${t.shapeId}`;
|
|
337
|
+
if (within.has(key))
|
|
338
|
+
return true;
|
|
339
|
+
const known = this.recoveringParts.get(key);
|
|
340
|
+
if (known !== undefined)
|
|
341
|
+
return known;
|
|
342
|
+
const inside = new Set(within).add(key);
|
|
343
|
+
let result;
|
|
344
|
+
if (t.kind === "union")
|
|
345
|
+
result = (this.unions.get(t.unionId) ?? []).every((arm) => this.recovers(arm, depth + 1, inside));
|
|
346
|
+
else {
|
|
347
|
+
const shape = (this.mod.records ?? []).find((r) => r.id === t.shapeId);
|
|
348
|
+
result =
|
|
349
|
+
shape !== undefined &&
|
|
350
|
+
shape.fields.every((f) => f.name !== this.field && part(f.type, inside));
|
|
351
|
+
}
|
|
352
|
+
if (within.size === 0)
|
|
353
|
+
this.recoveringParts.set(key, result);
|
|
354
|
+
return result;
|
|
355
|
+
}
|
|
356
|
+
default:
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/** Whether the graph follows values of `t`: dynamic values, and function
|
|
361
|
+
* values, which calls through values need. */
|
|
362
|
+
followed(t) {
|
|
363
|
+
return t.kind === "func" || this.dynish(t);
|
|
364
|
+
}
|
|
365
|
+
rootOf(className) {
|
|
366
|
+
let name = className;
|
|
367
|
+
for (let base = this.bases.get(name); base !== undefined; base = this.bases.get(name))
|
|
368
|
+
name = base;
|
|
369
|
+
return name;
|
|
370
|
+
}
|
|
371
|
+
localSlot(fn, id) {
|
|
372
|
+
return id.startsWith("%g.") ? `g:${id}` : `l:${fn.name}\0${id}`;
|
|
373
|
+
}
|
|
374
|
+
site(e) {
|
|
375
|
+
let slot = this.sites.get(e);
|
|
376
|
+
if (slot === undefined)
|
|
377
|
+
this.sites.set(e, (slot = `x:${this.sites.size}`));
|
|
378
|
+
return slot;
|
|
379
|
+
}
|
|
380
|
+
/** A dynamic value's slots and the slots of what it holds: a member read
|
|
381
|
+
* from it may be any of them. */
|
|
382
|
+
deep(slots) {
|
|
383
|
+
return [...slots, ...slots.map((s) => `c:${s}`)];
|
|
384
|
+
}
|
|
385
|
+
recordSlots(t) {
|
|
386
|
+
if (t.kind !== "record")
|
|
387
|
+
return [];
|
|
388
|
+
return (this.recordFields.get(t.shapeId) ?? []).map((f) => `s:${t.shapeId}\0${f}`);
|
|
389
|
+
}
|
|
390
|
+
/** The slots the value of `e` may come from. */
|
|
391
|
+
slotsOf(fn, e) {
|
|
392
|
+
const children = () => {
|
|
393
|
+
const out = [];
|
|
394
|
+
everyExprChild(e, (child) => {
|
|
395
|
+
out.push(...this.slotsOf(fn, child));
|
|
396
|
+
return true;
|
|
397
|
+
}, () => true);
|
|
398
|
+
return out;
|
|
399
|
+
};
|
|
400
|
+
switch (e.kind) {
|
|
401
|
+
case "varRef":
|
|
402
|
+
return [this.localSlot(fn, e.localId)];
|
|
403
|
+
case "dynFrom":
|
|
404
|
+
case "caughtToDyn":
|
|
405
|
+
if (this.boxings.has(e))
|
|
406
|
+
return [this.site(e)];
|
|
407
|
+
return [...this.slotsOf(fn, e.value), ...this.recordSlots(e.value.type)];
|
|
408
|
+
case "closure":
|
|
409
|
+
return [this.site(e)];
|
|
410
|
+
case "call":
|
|
411
|
+
// Normalization boxes the instance of a capsule at its own class.
|
|
412
|
+
if (e.callee === NORMALIZE && e.args[0] !== undefined)
|
|
413
|
+
return this.slotsOf(fn, e.args[0]);
|
|
414
|
+
return this.results(fn, e);
|
|
415
|
+
case "virtualCall":
|
|
416
|
+
return this.results(fn, e);
|
|
417
|
+
case "callValue":
|
|
418
|
+
return [this.site(e)];
|
|
419
|
+
case "dynCall":
|
|
420
|
+
// An iterator step gives what the iterator iterates.
|
|
421
|
+
return e.calleeName === ITERATOR_METHOD && e.receiver !== undefined
|
|
422
|
+
? [this.site(e), ...this.deep(this.slotsOf(fn, e.receiver))]
|
|
423
|
+
: [this.site(e)];
|
|
424
|
+
case "fieldGet":
|
|
425
|
+
return [`f:${this.rootOf(e.className)}\0${e.field}`];
|
|
426
|
+
case "recordGet":
|
|
427
|
+
return e.obj.type.kind === "record" ? [`s:${e.obj.type.shapeId}\0${e.field}`] : [];
|
|
428
|
+
case "arrayGet":
|
|
429
|
+
return this.slotsOf(fn, e.arr).map((s) => `c:${s}`);
|
|
430
|
+
case "mapIntrinsic":
|
|
431
|
+
case "setIntrinsic":
|
|
432
|
+
case "arrIntrinsic":
|
|
433
|
+
return this.slotsOf(fn, e.receiver).map((s) => `c:${s}`);
|
|
434
|
+
case "dynKeyGet":
|
|
435
|
+
case "dynIterN":
|
|
436
|
+
return this.deep(this.slotsOf(fn, e.value));
|
|
437
|
+
case "dynInvoke":
|
|
438
|
+
if (ELEMENT_METHODS.has(e.method) || CALLBACK_METHODS.get(e.method) === "members")
|
|
439
|
+
return this.deep(this.slotsOf(fn, e.recv));
|
|
440
|
+
return CALLBACK_METHODS.get(e.method) === "results" ? [this.site(e)] : [];
|
|
441
|
+
case "dynCheck":
|
|
442
|
+
return this.followed(e.type) ? this.deep(this.slotsOf(fn, e.value)) : [];
|
|
443
|
+
case "libCall":
|
|
444
|
+
if (e.fn === "dyn.this")
|
|
445
|
+
return [`t:${fn.name}`];
|
|
446
|
+
if ((KEYED_READS.has(e.fn) || ITERATES.has(e.fn)) && e.args[0] !== undefined)
|
|
447
|
+
return this.deep(this.slotsOf(fn, e.args[0]));
|
|
448
|
+
if ((e.fn === "js.toDyn" || e.fn === "js.fromDyn") && e.args[0] !== undefined)
|
|
449
|
+
return this.slotsOf(fn, e.args[0]);
|
|
450
|
+
return [];
|
|
451
|
+
case "arrayLit":
|
|
452
|
+
case "dynObjLit":
|
|
453
|
+
case "dynArrLit":
|
|
454
|
+
case "recordLit":
|
|
455
|
+
case "setNew":
|
|
456
|
+
case "mapNew":
|
|
457
|
+
return [this.site(e)];
|
|
458
|
+
default:
|
|
459
|
+
return PASS_THROUGH.has(e.kind) ? children() : [];
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/** The slots a call's value may come from: its callees' results, and the
|
|
463
|
+
* arguments at the parameters they return. */
|
|
464
|
+
results(fn, e) {
|
|
465
|
+
const slots = [];
|
|
466
|
+
for (const { callee, offset } of this.callees(e)) {
|
|
467
|
+
slots.push(`r:${callee}`);
|
|
468
|
+
for (const i of this.returnedParams.get(callee) ?? [])
|
|
469
|
+
if (e.args[i - offset] !== undefined)
|
|
470
|
+
slots.push(...this.slotsOf(fn, e.args[i - offset]));
|
|
471
|
+
}
|
|
472
|
+
return slots;
|
|
473
|
+
}
|
|
474
|
+
/** Decides each function's returns: a returned slot that holds only what
|
|
475
|
+
* the function's parameters came with (a parameter, or a local every
|
|
476
|
+
* value of which comes from such slots) makes those parameters returned;
|
|
477
|
+
* any other returned slot flows to the function's result. Returns whether
|
|
478
|
+
* a parameter became returned. */
|
|
479
|
+
settleReturns() {
|
|
480
|
+
let changed = false;
|
|
481
|
+
for (const [name, returned] of this.returns) {
|
|
482
|
+
const fn = this.functions.get(name);
|
|
483
|
+
const params = new Map(fn.params.map((p, i) => [this.localSlot(fn, p.localId), i]));
|
|
484
|
+
const own = new Set(fn.locals.map((l) => this.localSlot(fn, l.id)));
|
|
485
|
+
// The carriers: parameters, and locals all of whose sources are
|
|
486
|
+
// carriers.
|
|
487
|
+
const carriers = new Set(params.keys());
|
|
488
|
+
for (let grew = true; grew;) {
|
|
489
|
+
grew = false;
|
|
490
|
+
for (const slot of own) {
|
|
491
|
+
if (carriers.has(slot))
|
|
492
|
+
continue;
|
|
493
|
+
const sources = this.sources.get(slot);
|
|
494
|
+
if (sources !== undefined &&
|
|
495
|
+
sources.size > 0 &&
|
|
496
|
+
[...sources].every((s) => carriers.has(s))) {
|
|
497
|
+
carriers.add(slot);
|
|
498
|
+
grew = true;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
let set = this.returnedParams.get(name);
|
|
503
|
+
for (const slots of returned)
|
|
504
|
+
for (const slot of slots) {
|
|
505
|
+
if (!carriers.has(slot)) {
|
|
506
|
+
this.edge(slot, `r:${name}`);
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
// The parameters the carrier's values come from.
|
|
510
|
+
const queue = [slot];
|
|
511
|
+
const seen = new Set(queue);
|
|
512
|
+
while (queue.length > 0) {
|
|
513
|
+
const at = queue.pop();
|
|
514
|
+
const index = params.get(at);
|
|
515
|
+
if (index !== undefined) {
|
|
516
|
+
if (set === undefined)
|
|
517
|
+
this.returnedParams.set(name, (set = new Set()));
|
|
518
|
+
if (!set.has(index)) {
|
|
519
|
+
set.add(index);
|
|
520
|
+
changed = true;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
for (const from of this.sources.get(at) ?? [])
|
|
524
|
+
if (carriers.has(from) && !seen.has(from)) {
|
|
525
|
+
seen.add(from);
|
|
526
|
+
queue.push(from);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return changed;
|
|
532
|
+
}
|
|
533
|
+
edge(from, to) {
|
|
534
|
+
let list = this.edges.get(from);
|
|
535
|
+
if (!list)
|
|
536
|
+
this.edges.set(from, (list = new Set()));
|
|
537
|
+
if (list.has(to))
|
|
538
|
+
return false;
|
|
539
|
+
list.add(to);
|
|
540
|
+
this.edgeCount++;
|
|
541
|
+
let back = this.sources.get(to);
|
|
542
|
+
if (!back)
|
|
543
|
+
this.sources.set(to, (back = new Set()));
|
|
544
|
+
back.add(from);
|
|
545
|
+
return true;
|
|
546
|
+
}
|
|
547
|
+
holds(fn, e) {
|
|
548
|
+
return this.slotsOf(fn, e).some((s) => this.held.has(s));
|
|
549
|
+
}
|
|
550
|
+
/** Whether `e`, or a member of it, may be a closure's value: a method
|
|
551
|
+
* call on it may run that closure with it as `this`. */
|
|
552
|
+
mayHoldFunction(fn, e) {
|
|
553
|
+
return this.closuresAt(this.deep(this.slotsOf(fn, e)));
|
|
554
|
+
}
|
|
555
|
+
// ── Calls ──
|
|
556
|
+
/** The functions a call, construction or method call may run, with the
|
|
557
|
+
* offset of its first argument in their parameters. */
|
|
558
|
+
callees(e) {
|
|
559
|
+
switch (e.kind) {
|
|
560
|
+
case "call":
|
|
561
|
+
return [{ callee: e.callee, offset: 0 }];
|
|
562
|
+
case "new":
|
|
563
|
+
return [{ callee: `%${e.className}.constructor`, offset: 1 }];
|
|
564
|
+
case "virtualCall": {
|
|
565
|
+
const impls = e.targets !== undefined
|
|
566
|
+
? e.targets.map((c) => `%${c}.${e.method}`)
|
|
567
|
+
: (this.methodImpls.get(e.method) ?? []);
|
|
568
|
+
return impls.map((callee) => ({ callee, offset: 0 }));
|
|
569
|
+
}
|
|
570
|
+
default:
|
|
571
|
+
return [];
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
/** Connects a call through a value to the closures that reach its
|
|
575
|
+
* callee: its receiver to their `this`, its arguments to their
|
|
576
|
+
* parameters that take dynamic or function values (a typed parameter
|
|
577
|
+
* takes its argument through a checked cast), and their results to the
|
|
578
|
+
* call's. Returns whether it added an edge. */
|
|
579
|
+
resolve(fn, call) {
|
|
580
|
+
let targets = this.targets.get(call);
|
|
581
|
+
if (targets === undefined)
|
|
582
|
+
this.targets.set(call, (targets = new Set()));
|
|
583
|
+
this.closuresAt(this.slotsOf(fn, call.callee), targets);
|
|
584
|
+
let changed = false;
|
|
585
|
+
const site = this.site(call);
|
|
586
|
+
for (const name of targets) {
|
|
587
|
+
const target = this.functions.get(name);
|
|
588
|
+
if (target === undefined)
|
|
589
|
+
continue;
|
|
590
|
+
changed = this.edge(`r:${name}`, site) || changed;
|
|
591
|
+
if (call.kind === "dynCall" && call.receiver !== undefined)
|
|
592
|
+
for (const from of this.slotsOf(fn, call.receiver))
|
|
593
|
+
changed = this.edge(from, `t:${name}`) || changed;
|
|
594
|
+
call.args.forEach((arg, i) => {
|
|
595
|
+
const param = target.params[i];
|
|
596
|
+
if (param === undefined || !this.followed(param.type) || !this.followed(arg.type))
|
|
597
|
+
return;
|
|
598
|
+
for (const from of this.slotsOf(fn, arg))
|
|
599
|
+
changed = this.edge(from, this.localSlot(target, param.localId)) || changed;
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
return changed;
|
|
603
|
+
}
|
|
604
|
+
/** Adds to `into` the functions of the closures whose values may reach
|
|
605
|
+
* `slots`; returns whether there is one. */
|
|
606
|
+
closuresAt(slots, into) {
|
|
607
|
+
const seen = new Set(slots);
|
|
608
|
+
const queue = [...slots];
|
|
609
|
+
let found = false;
|
|
610
|
+
while (queue.length > 0) {
|
|
611
|
+
const slot = queue.pop();
|
|
612
|
+
const closure = this.closures.get(slot);
|
|
613
|
+
if (closure !== undefined) {
|
|
614
|
+
found = true;
|
|
615
|
+
if (into === undefined)
|
|
616
|
+
return true;
|
|
617
|
+
into.add(closure);
|
|
618
|
+
}
|
|
619
|
+
for (const from of this.sources.get(slot) ?? [])
|
|
620
|
+
if (!seen.has(from)) {
|
|
621
|
+
seen.add(from);
|
|
622
|
+
queue.push(from);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return found;
|
|
626
|
+
}
|
|
627
|
+
/** Connects a callback method call to the closures that reach its first
|
|
628
|
+
* argument: the receiver's members to their first two parameters, the
|
|
629
|
+
* receiver to their third, and for `map` their results to the call's.
|
|
630
|
+
* Returns whether it added an edge. */
|
|
631
|
+
resolveCallback(fn, call) {
|
|
632
|
+
let targets = this.targets.get(call);
|
|
633
|
+
if (targets === undefined)
|
|
634
|
+
this.targets.set(call, (targets = new Set()));
|
|
635
|
+
const callback = call.args[0];
|
|
636
|
+
if (callback === undefined)
|
|
637
|
+
return false;
|
|
638
|
+
this.closuresAt(this.slotsOf(fn, callback), targets);
|
|
639
|
+
const receiver = this.slotsOf(fn, call.recv);
|
|
640
|
+
const members = this.deep(receiver);
|
|
641
|
+
let changed = false;
|
|
642
|
+
for (const name of targets) {
|
|
643
|
+
const target = this.functions.get(name);
|
|
644
|
+
if (target === undefined)
|
|
645
|
+
continue;
|
|
646
|
+
if (CALLBACK_METHODS.get(call.method) === "results")
|
|
647
|
+
changed = this.edge(`r:${name}`, this.site(call)) || changed;
|
|
648
|
+
[members, members, receiver].forEach((slots, i) => {
|
|
649
|
+
const param = target.params[i];
|
|
650
|
+
if (param === undefined || !this.followed(param.type))
|
|
651
|
+
return;
|
|
652
|
+
for (const from of slots)
|
|
653
|
+
changed = this.edge(from, this.localSlot(target, param.localId)) || changed;
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
return changed;
|
|
657
|
+
}
|
|
658
|
+
// ── The walk ──
|
|
659
|
+
/** Builds the slot graph (`check` null), or reports the first operation
|
|
660
|
+
* that takes a held dynamic value where generic code may read or write the
|
|
661
|
+
* field. */
|
|
662
|
+
flow(fn, check) {
|
|
663
|
+
const hold = (to, value) => {
|
|
664
|
+
if (check !== null || (!this.followed(value.type) && !this.boxings.has(value)))
|
|
665
|
+
return;
|
|
666
|
+
for (const from of this.slotsOf(fn, value))
|
|
667
|
+
this.edge(from, to);
|
|
668
|
+
};
|
|
669
|
+
const holdIn = (container, value) => {
|
|
670
|
+
for (const slot of this.slotsOf(fn, container))
|
|
671
|
+
hold(`c:${slot}`, value);
|
|
672
|
+
};
|
|
673
|
+
const report = (value, loc, what) => {
|
|
674
|
+
if (check !== null && this.holds(fn, value))
|
|
675
|
+
check({
|
|
676
|
+
loc,
|
|
677
|
+
reason: `an instance, or a value that can hold one, becomes a dynamic value that reaches ${what}, where a dynamic view of an inline field would read it as a new array each time`,
|
|
678
|
+
});
|
|
679
|
+
};
|
|
680
|
+
// A keyed read or write names the field, or any member when its key is
|
|
681
|
+
// not a literal.
|
|
682
|
+
const keyed = (receiver, key, loc, what) => {
|
|
683
|
+
if (key === undefined || key.kind !== "strLit" || key.value === this.field)
|
|
684
|
+
report(receiver, loc, `${what} of a member that may be the field`);
|
|
685
|
+
};
|
|
686
|
+
// A write may also be an array's: an element, or its length.
|
|
687
|
+
const keyedWrite = (receiver, key, loc, what) => {
|
|
688
|
+
keyed(receiver, key, loc, what);
|
|
689
|
+
if (key?.kind === "strLit" && (key.value === "length" || /^(0|[1-9][0-9]*)$/.test(key.value)))
|
|
690
|
+
report(receiver, loc, `${what} of an array element or length`);
|
|
691
|
+
};
|
|
692
|
+
const args = (call) => {
|
|
693
|
+
const callees = this.callees(call);
|
|
694
|
+
for (const { callee, offset } of callees) {
|
|
695
|
+
const target = this.functions.get(callee);
|
|
696
|
+
call.args.forEach((arg, i) => {
|
|
697
|
+
const param = target?.params[i + offset];
|
|
698
|
+
if (target === undefined || param === undefined)
|
|
699
|
+
return report(arg, call.loc, `a call to ${callee}`);
|
|
700
|
+
hold(this.localSlot(target, param.localId), arg);
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
if (callees.length === 0)
|
|
704
|
+
for (const arg of call.args)
|
|
705
|
+
report(arg, call.loc, "a method call");
|
|
706
|
+
};
|
|
707
|
+
// A call through a value no compiled function reaches may run library
|
|
708
|
+
// code.
|
|
709
|
+
const valueCall = (call) => {
|
|
710
|
+
if (check === null) {
|
|
711
|
+
this.valueCalls.push({ fn, call });
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
if ((this.targets.get(call)?.size ?? 0) > 0)
|
|
715
|
+
return;
|
|
716
|
+
// An iterator that is no compiled function's is the runtime's, over
|
|
717
|
+
// an array, a string or a collection.
|
|
718
|
+
if (call.kind === "dynCall" && call.calleeName === ITERATOR_METHOD)
|
|
719
|
+
return;
|
|
720
|
+
const what = "a call through a value no compiled function reaches";
|
|
721
|
+
for (const a of call.args)
|
|
722
|
+
report(a, call.loc, what);
|
|
723
|
+
if (call.kind === "dynCall" && call.receiver !== undefined)
|
|
724
|
+
report(call.receiver, call.loc, what);
|
|
725
|
+
};
|
|
726
|
+
// A callback method of an array, Map or Set runs its callback, which a
|
|
727
|
+
// compiled function must be; the receiver's own method of that name
|
|
728
|
+
// instead, a function it holds, may be any code.
|
|
729
|
+
const callbackCall = (call) => {
|
|
730
|
+
if (check === null) {
|
|
731
|
+
this.callbackCalls.push({ fn, call });
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
const what = `the dynamic method call '${call.method}'`;
|
|
735
|
+
if ((this.targets.get(call)?.size ?? 0) === 0)
|
|
736
|
+
report(call.recv, call.loc, `${what} with a callback no compiled function reaches`);
|
|
737
|
+
else if (this.mayHoldFunction(fn, call.recv))
|
|
738
|
+
report(call.recv, call.loc, `${what} on a value that may hold a function`);
|
|
739
|
+
for (const a of call.args.slice(1))
|
|
740
|
+
report(a, call.loc, what);
|
|
741
|
+
};
|
|
742
|
+
const expr = (e) => {
|
|
743
|
+
switch (e.kind) {
|
|
744
|
+
case "assignExpr":
|
|
745
|
+
hold(this.localSlot(fn, e.localId), e.value);
|
|
746
|
+
break;
|
|
747
|
+
case "call":
|
|
748
|
+
case "new":
|
|
749
|
+
case "virtualCall":
|
|
750
|
+
args(e);
|
|
751
|
+
break;
|
|
752
|
+
case "callValue":
|
|
753
|
+
case "dynCall":
|
|
754
|
+
valueCall(e);
|
|
755
|
+
break;
|
|
756
|
+
case "closure": {
|
|
757
|
+
if (check !== null)
|
|
758
|
+
break;
|
|
759
|
+
this.closures.set(this.site(e), e.fnName);
|
|
760
|
+
const lifted = this.functions.get(e.fnName);
|
|
761
|
+
// A captured local is one binding on both sides.
|
|
762
|
+
e.captures.forEach((id, i) => {
|
|
763
|
+
const inner = lifted?.captures?.[i];
|
|
764
|
+
if (inner === undefined)
|
|
765
|
+
return;
|
|
766
|
+
const outer = this.localSlot(fn, id);
|
|
767
|
+
const captured = this.localSlot(lifted, inner.localId);
|
|
768
|
+
this.edge(outer, captured);
|
|
769
|
+
this.edge(captured, outer);
|
|
770
|
+
});
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
case "recordLit":
|
|
774
|
+
if (e.type.kind === "record") {
|
|
775
|
+
const shape = e.type.shapeId;
|
|
776
|
+
for (const f of e.fields)
|
|
777
|
+
hold(`s:${shape}\0${f.name}`, f.value);
|
|
778
|
+
}
|
|
779
|
+
break;
|
|
780
|
+
case "arrayLit":
|
|
781
|
+
for (const x of e.elems)
|
|
782
|
+
hold(`c:${this.site(e)}`, x);
|
|
783
|
+
break;
|
|
784
|
+
case "dynArrLit":
|
|
785
|
+
for (const x of e.elems)
|
|
786
|
+
hold(this.site(e), x);
|
|
787
|
+
break;
|
|
788
|
+
case "dynObjLit":
|
|
789
|
+
for (const f of e.fields ?? [])
|
|
790
|
+
hold(this.site(e), f.value);
|
|
791
|
+
break;
|
|
792
|
+
case "mapNew":
|
|
793
|
+
for (const { key, value } of e.seed ?? []) {
|
|
794
|
+
hold(`c:${this.site(e)}`, key);
|
|
795
|
+
hold(`c:${this.site(e)}`, value);
|
|
796
|
+
}
|
|
797
|
+
break;
|
|
798
|
+
case "setNew":
|
|
799
|
+
// The seed's elements become the Set's.
|
|
800
|
+
if (e.seed && check === null)
|
|
801
|
+
for (const from of this.slotsOf(fn, e.seed))
|
|
802
|
+
this.edge(`c:${from}`, `c:${this.site(e)}`);
|
|
803
|
+
break;
|
|
804
|
+
case "arrIntrinsic":
|
|
805
|
+
case "mapIntrinsic":
|
|
806
|
+
case "setIntrinsic":
|
|
807
|
+
for (const a of e.args)
|
|
808
|
+
holdIn(e.receiver, a);
|
|
809
|
+
break;
|
|
810
|
+
case "dynKeyGet":
|
|
811
|
+
keyed(e.value, e.key, e.loc, "a keyed read");
|
|
812
|
+
break;
|
|
813
|
+
case "dynCheck":
|
|
814
|
+
// A cast to a class gives the instance back; a cast to a record,
|
|
815
|
+
// array or collection type builds it from the members it names
|
|
816
|
+
// or the elements.
|
|
817
|
+
if (!this.recovers(e.type))
|
|
818
|
+
report(e.value, e.loc, "a checked cast to a structured type");
|
|
819
|
+
break;
|
|
820
|
+
case "dynInvoke":
|
|
821
|
+
if (CALLBACK_METHODS.has(e.method)) {
|
|
822
|
+
callbackCall(e);
|
|
823
|
+
break;
|
|
824
|
+
}
|
|
825
|
+
if (!ELEMENT_METHODS.has(e.method))
|
|
826
|
+
report(e.recv, e.loc, `the dynamic method call '${e.method}'`);
|
|
827
|
+
else if (check !== null && this.mayHoldFunction(fn, e.recv))
|
|
828
|
+
report(e.recv, e.loc, `the dynamic method call '${e.method}' on a value that may hold a function`);
|
|
829
|
+
if (!CLONING_METHODS.has(e.method))
|
|
830
|
+
for (const a of e.args)
|
|
831
|
+
report(a, e.loc, `the dynamic method call '${e.method}'`);
|
|
832
|
+
break;
|
|
833
|
+
case "libCall":
|
|
834
|
+
if (KEYED_READS.has(e.fn))
|
|
835
|
+
keyed(e.args[0], e.args[1], e.loc, `the library call ${e.fn}`);
|
|
836
|
+
else if (KEYED_WRITES.has(e.fn)) {
|
|
837
|
+
keyedWrite(e.args[0], e.args[1], e.loc, `the library call ${e.fn}`);
|
|
838
|
+
if (e.args[2] !== undefined)
|
|
839
|
+
for (const slot of this.slotsOf(fn, e.args[0]))
|
|
840
|
+
hold(slot, e.args[2]);
|
|
841
|
+
}
|
|
842
|
+
else if (!READS.has(e.fn) && !ITERATES.has(e.fn) && !readsArguments(e))
|
|
843
|
+
for (const a of e.args)
|
|
844
|
+
report(a, e.loc, `the library call ${e.fn}`);
|
|
845
|
+
break;
|
|
846
|
+
case "intrinsic":
|
|
847
|
+
// Printing reads its arguments; publishing freezes them.
|
|
848
|
+
if (!e.name.startsWith("console.") && e.name !== "threads.publish")
|
|
849
|
+
for (const a of e.args)
|
|
850
|
+
report(a, e.loc, `'${e.name}'`);
|
|
851
|
+
break;
|
|
852
|
+
default:
|
|
853
|
+
if (!PASS_THROUGH.has(e.kind) && !OBSERVE.has(e.kind) && !MODELLED.has(e.kind))
|
|
854
|
+
everyExprChild(e, (child) => {
|
|
855
|
+
report(child, e.loc, `a '${e.kind}' expression`);
|
|
856
|
+
return true;
|
|
857
|
+
}, () => true);
|
|
858
|
+
}
|
|
859
|
+
return everyExprChild(e, expr, stmt);
|
|
860
|
+
};
|
|
861
|
+
const stmt = (s) => {
|
|
862
|
+
switch (s.kind) {
|
|
863
|
+
case "varDecl":
|
|
864
|
+
if (s.init)
|
|
865
|
+
hold(this.localSlot(fn, s.localId), s.init);
|
|
866
|
+
break;
|
|
867
|
+
case "assign":
|
|
868
|
+
hold(this.localSlot(fn, s.localId), s.value);
|
|
869
|
+
break;
|
|
870
|
+
case "return":
|
|
871
|
+
if (s.value !== null &&
|
|
872
|
+
check === null &&
|
|
873
|
+
(this.followed(s.value.type) || this.boxings.has(s.value))) {
|
|
874
|
+
let list = this.returns.get(fn.name);
|
|
875
|
+
if (!list)
|
|
876
|
+
this.returns.set(fn.name, (list = []));
|
|
877
|
+
list.push(this.slotsOf(fn, s.value));
|
|
878
|
+
}
|
|
879
|
+
break;
|
|
880
|
+
case "fieldSet":
|
|
881
|
+
hold(`f:${this.rootOf(s.className)}\0${s.field}`, s.value);
|
|
882
|
+
break;
|
|
883
|
+
case "recordSet":
|
|
884
|
+
hold(`s:${s.shapeId}\0${s.field}`, s.value);
|
|
885
|
+
break;
|
|
886
|
+
case "arraySet":
|
|
887
|
+
holdIn(s.arr, s.value);
|
|
888
|
+
break;
|
|
889
|
+
case "forOf":
|
|
890
|
+
if (check === null)
|
|
891
|
+
for (const from of this.slotsOf(fn, s.iterable))
|
|
892
|
+
for (const slot of [from, `c:${from}`])
|
|
893
|
+
this.edge(slot, this.localSlot(fn, s.localId));
|
|
894
|
+
break;
|
|
895
|
+
case "throw":
|
|
896
|
+
hold("e:", s.value);
|
|
897
|
+
break;
|
|
898
|
+
case "tryCatch":
|
|
899
|
+
if (check === null && s.catchLocalId !== null)
|
|
900
|
+
this.edge("e:", this.localSlot(fn, s.catchLocalId));
|
|
901
|
+
break;
|
|
902
|
+
case "recordKeySet":
|
|
903
|
+
report(s.value, s.loc, "a dynamically keyed property");
|
|
904
|
+
break;
|
|
905
|
+
}
|
|
906
|
+
return everyStmtChild(s, expr, stmt);
|
|
907
|
+
};
|
|
908
|
+
for (const s of fn.body)
|
|
909
|
+
stmt(s);
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
/** Expressions the walk follows or checks itself. */
|
|
913
|
+
const MODELLED = new Set([
|
|
914
|
+
"varRef",
|
|
915
|
+
"assignExpr",
|
|
916
|
+
"call",
|
|
917
|
+
"new",
|
|
918
|
+
"virtualCall",
|
|
919
|
+
"callValue",
|
|
920
|
+
"closure",
|
|
921
|
+
"recordLit",
|
|
922
|
+
"arrayLit",
|
|
923
|
+
"dynArrLit",
|
|
924
|
+
"dynObjLit",
|
|
925
|
+
"mapNew",
|
|
926
|
+
"setNew",
|
|
927
|
+
"arrIntrinsic",
|
|
928
|
+
"mapIntrinsic",
|
|
929
|
+
"setIntrinsic",
|
|
930
|
+
"arrayGet",
|
|
931
|
+
"arrayHas",
|
|
932
|
+
"arrayState",
|
|
933
|
+
"fieldGet",
|
|
934
|
+
"recordGet",
|
|
935
|
+
"dynKeyGet",
|
|
936
|
+
"dynIterN",
|
|
937
|
+
"dynCheck",
|
|
938
|
+
"dynCall",
|
|
939
|
+
"dynInvoke",
|
|
940
|
+
"dynFrom",
|
|
941
|
+
"caughtToDyn",
|
|
942
|
+
"libCall",
|
|
943
|
+
"intrinsic",
|
|
944
|
+
]);
|
|
945
|
+
//# sourceMappingURL=inline-array-views.js.map
|