@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
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { dynUndefinedExpr, strLit } from "../../ir/build.js";
|
|
2
|
+
import { BOOL, DYN, F64, KEY_ORDER_FIELD, shapeHasAccessorSlots, typeEquals, UNDEFINED_T, VOID, } from "../../ir/ir.js";
|
|
2
3
|
import { everyExprChild, everyStmtChild, everyTypeChild, transformStmtList, } from "../../ir/traverse.js";
|
|
3
4
|
import * as ts from "../ts7/adapter.js";
|
|
4
5
|
import { ALWAYS_THROW_LIB_FNS } from "../../ir/builtin-effects.js";
|
|
5
|
-
import {
|
|
6
|
+
import { replaceChildExpr } from "../../ir/fields.generated.js";
|
|
7
|
+
import { InternalCompilerError } from "../../errors.js";
|
|
8
|
+
import { recordMayKeepSource, recordSourceTest } from "./record-sources.js";
|
|
6
9
|
/** The statements a key-order helper runs for record `ref`: `walks[0]`,
|
|
7
10
|
* its walk over the shape's table, or, for a shape with orderVariants, a
|
|
8
11
|
* branch per order (walks[i] for order i) on the value's KEY_ORDER_FIELD.
|
|
@@ -39,25 +42,77 @@ export class KeyOrderNotes {
|
|
|
39
42
|
literals = new Map();
|
|
40
43
|
copies = new Map();
|
|
41
44
|
methodResults = new Map();
|
|
45
|
+
/** Literals whose spreads copy source keys the target does not declare
|
|
46
|
+
* (a width spread), with their contributors (keepWidthSpreads), and
|
|
47
|
+
* every spread literal over a shape that can keep a source (same-shape
|
|
48
|
+
* copies, which keep the source's undeclared keys when it has any). */
|
|
49
|
+
widths = new Map();
|
|
50
|
+
/** `"k" in r` answers over a closed record whose literal key the shape
|
|
51
|
+
* does not declare, with the receiver the static form evaluated
|
|
52
|
+
* (keepSourceProbes). */
|
|
53
|
+
sourceProbes = new Map();
|
|
54
|
+
/** Same-shape `{ ...r, k: v }` clones (lowerObjectLiteral's recordClone
|
|
55
|
+
* fast path), which copy the source's own keys too (keepRecordClones). */
|
|
56
|
+
clones = new Set();
|
|
42
57
|
/** Shapes a frontend order surface (keys, values/entries, inspect,
|
|
43
58
|
* index-signature merges) walks. */
|
|
44
59
|
observed = new Set();
|
|
45
60
|
/** Shapes whose table this pass replaced. */
|
|
46
61
|
changed = new Set();
|
|
62
|
+
/** Width-spread literals this pass kept as a record's source
|
|
63
|
+
* (keepWidthSpreads). A kept copy holds undeclared keys, so the
|
|
64
|
+
* index-signature capture must consult it (lowerer.ts). */
|
|
65
|
+
keptWidthSpreads = 0;
|
|
66
|
+
/** The shapes those kept copies build. A width spread or clone only
|
|
67
|
+
* keeps a source on a shape in here, so the reflective helpers
|
|
68
|
+
* (lower-calls.ts) stay static for every other shape, and the pass reads
|
|
69
|
+
* it back as a spread source that can already hold one. */
|
|
70
|
+
keptSourceShapes = new Set();
|
|
47
71
|
/** The sizes of the notes' tables (unit-journal.ts). */
|
|
48
72
|
journalSizes() {
|
|
49
73
|
return [
|
|
50
74
|
this.literals.size,
|
|
51
75
|
this.copies.size,
|
|
52
76
|
this.methodResults.size,
|
|
77
|
+
this.widths.size,
|
|
78
|
+
this.sourceProbes.size,
|
|
79
|
+
this.clones.size,
|
|
53
80
|
this.observed.size,
|
|
54
81
|
this.changed.size,
|
|
82
|
+
this.keptSourceShapes.size,
|
|
55
83
|
];
|
|
56
84
|
}
|
|
57
85
|
literal(node, segments) {
|
|
58
86
|
this.literals.set(node, segments);
|
|
59
87
|
return node;
|
|
60
88
|
}
|
|
89
|
+
/** A record literal whose spreads copy source keys the target does not
|
|
90
|
+
* declare (`drops`), with its contributors. */
|
|
91
|
+
width(node, segments, drops) {
|
|
92
|
+
this.widths.set(node, { segments, drops });
|
|
93
|
+
return node;
|
|
94
|
+
}
|
|
95
|
+
widthOf(node) {
|
|
96
|
+
return this.widths.get(node);
|
|
97
|
+
}
|
|
98
|
+
/** A statically-false `"k" in r` over a closed record, which a kept
|
|
99
|
+
* source can make true. */
|
|
100
|
+
sourceProbe(node, receiver, key) {
|
|
101
|
+
this.sourceProbes.set(node, { receiver, key });
|
|
102
|
+
return node;
|
|
103
|
+
}
|
|
104
|
+
sourceProbeOf(node) {
|
|
105
|
+
return this.sourceProbes.get(node);
|
|
106
|
+
}
|
|
107
|
+
/** A same-shape `{ ...r, k: v }` clone, which copies the source's own
|
|
108
|
+
* keys as Node does. */
|
|
109
|
+
clone(node) {
|
|
110
|
+
this.clones.add(node);
|
|
111
|
+
return node;
|
|
112
|
+
}
|
|
113
|
+
isClone(node) {
|
|
114
|
+
return this.clones.has(node);
|
|
115
|
+
}
|
|
61
116
|
copy(node, sourceShapeId) {
|
|
62
117
|
this.copies.set(node, sourceShapeId);
|
|
63
118
|
return node;
|
|
@@ -80,6 +135,14 @@ export class KeyOrderNotes {
|
|
|
80
135
|
const method = this.methodResults.get(from);
|
|
81
136
|
if (method !== undefined)
|
|
82
137
|
this.methodResults.set(to, method);
|
|
138
|
+
const width = this.widths.get(from);
|
|
139
|
+
if (width !== undefined)
|
|
140
|
+
this.widths.set(to, width);
|
|
141
|
+
const probe = this.sourceProbes.get(from);
|
|
142
|
+
if (probe !== undefined)
|
|
143
|
+
this.sourceProbes.set(to, probe);
|
|
144
|
+
if (this.clones.has(from))
|
|
145
|
+
this.clones.add(to);
|
|
83
146
|
}
|
|
84
147
|
observe(type) {
|
|
85
148
|
if (type.kind === "record")
|
|
@@ -201,6 +264,8 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
201
264
|
return f;
|
|
202
265
|
};
|
|
203
266
|
const observedRoots = [];
|
|
267
|
+
/** The receivers of the program's own-key presence tests. */
|
|
268
|
+
const presenceRoots = [];
|
|
204
269
|
const inits = new Map();
|
|
205
270
|
const undefinedArmed = (t) => t.kind === "union" && lowerer.armTag(t.unionId, UNDEFINED_T) >= 0;
|
|
206
271
|
const containsAbsent = (value) => value.kind === "fieldAbsent" ||
|
|
@@ -303,6 +368,12 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
303
368
|
else
|
|
304
369
|
shapesIn(type, runtimeShapes, runtimeSeen, true);
|
|
305
370
|
};
|
|
371
|
+
/** The shapes a checked conversion in this program builds, which are the
|
|
372
|
+
* only values that already hold a source when this pass runs (the ones
|
|
373
|
+
* this pass keeps join keptSourceShapes as it decides). Collected by the
|
|
374
|
+
* walk below, which already meets every conversion. */
|
|
375
|
+
const convertedShapes = new Set();
|
|
376
|
+
const convertedSeen = new Set();
|
|
306
377
|
// ── collection ──────────────────────────────────────────────────────
|
|
307
378
|
let pos = 0;
|
|
308
379
|
let fnName = "";
|
|
@@ -311,6 +382,13 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
311
382
|
* each one is built. A literal's notes are shared by its rebuilt copies,
|
|
312
383
|
* so `literalSites` counts every literal of each witness. */
|
|
313
384
|
const leadingSpreads = new Map();
|
|
385
|
+
/** Width literals (KeyOrderNotes.width), where each is built. */
|
|
386
|
+
const widthSites = [];
|
|
387
|
+
/** `"k" in r` sites a kept source can answer true (keepSourceProbes). */
|
|
388
|
+
const probeSites = [];
|
|
389
|
+
/** Same-shape `{ ...r, k: v }` clones that copy the source's own keys
|
|
390
|
+
* (keepRecordClones). */
|
|
391
|
+
const cloneSites = [];
|
|
314
392
|
const literalSites = new Map();
|
|
315
393
|
const loops = [];
|
|
316
394
|
let loopIds = 0;
|
|
@@ -349,6 +427,13 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
349
427
|
inits.set(id, { count: 1, fn: fnName, loop: loopKey(), pos, fresh });
|
|
350
428
|
};
|
|
351
429
|
const visitExpr = (e) => {
|
|
430
|
+
const probe = notes.sourceProbeOf(e);
|
|
431
|
+
if (probe !== undefined && currentFn !== null) {
|
|
432
|
+
probeSites.push({ node: e, fn: currentFn });
|
|
433
|
+
presenceRoots.push(probe.receiver.type);
|
|
434
|
+
}
|
|
435
|
+
if (e.kind === "call" && e.callee.startsWith("%obj.hasOwn") && e.args[0] !== undefined)
|
|
436
|
+
presenceRoots.push(e.args[0].type);
|
|
352
437
|
switch (e.kind) {
|
|
353
438
|
case "recordLit": {
|
|
354
439
|
if (e.type.kind !== "record")
|
|
@@ -382,6 +467,8 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
382
467
|
case "recordClone": {
|
|
383
468
|
if (e.type.kind !== "record")
|
|
384
469
|
return;
|
|
470
|
+
if (notes.isClone(e) && currentFn !== null)
|
|
471
|
+
cloneSites.push({ node: e, fn: currentFn });
|
|
385
472
|
const f = factsOf(e.type.shapeId);
|
|
386
473
|
f.clones = true;
|
|
387
474
|
for (const o of e.overrides)
|
|
@@ -396,6 +483,9 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
396
483
|
const literal = e.result;
|
|
397
484
|
if (literal.kind !== "recordLit" || currentFn === null)
|
|
398
485
|
return;
|
|
486
|
+
const width = notes.widthOf(literal);
|
|
487
|
+
if (width !== undefined)
|
|
488
|
+
widthSites.push({ wrapper: e, literal, fn: currentFn, note: width });
|
|
399
489
|
const segments = notes.literalOf(literal);
|
|
400
490
|
const first = segments?.[0];
|
|
401
491
|
if (segments === undefined || first?.kind !== "spread" || first.value === undefined)
|
|
@@ -465,6 +555,7 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
465
555
|
return;
|
|
466
556
|
}
|
|
467
557
|
case "dynCheck":
|
|
558
|
+
conversionShapes(lowerer, e.type, convertedShapes, convertedSeen);
|
|
468
559
|
if (e.adopt === true)
|
|
469
560
|
shapesIn(e.type, declaredShapes, declaredSeen);
|
|
470
561
|
// Conversions that build no record: a boxed primitive, and a
|
|
@@ -540,6 +631,151 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
540
631
|
for (const id of declaredShapes)
|
|
541
632
|
if (!runtimeShapes.has(id))
|
|
542
633
|
factsOf(id).pinned = true;
|
|
634
|
+
// ── width spreads ───────────────────────────────────────────────────
|
|
635
|
+
// A width spread keeps the copy's own keys when an order surface can
|
|
636
|
+
// observe its target (keepWidthSpreads). The observation is the one the
|
|
637
|
+
// tables use below, before ordered spreads join it. A source can be
|
|
638
|
+
// another width spread's target, so this runs until no site joins.
|
|
639
|
+
const keptWidths = new Set();
|
|
640
|
+
const keptClones = new Set();
|
|
641
|
+
/** The statements each kept site's literal evaluates in (the wrapper's
|
|
642
|
+
* prologue), which the per-instance order plan reads a spread's source
|
|
643
|
+
* binding from after keepWidthSpreads moved the literal into a
|
|
644
|
+
* declaration of its own. */
|
|
645
|
+
const keptLiteralStmts = new Map();
|
|
646
|
+
/** Shapes a kept dropping copy builds: the copy holds keys the shape has
|
|
647
|
+
* no slot for, so its order is its kept source's, and the shape keeps
|
|
648
|
+
* today's table (as a literal with a dropped field does without the
|
|
649
|
+
* kept source). */
|
|
650
|
+
const keptDropShapes = new Set();
|
|
651
|
+
{
|
|
652
|
+
const early = new Set();
|
|
653
|
+
const earlySeen = new Set();
|
|
654
|
+
for (const id of notes.observed)
|
|
655
|
+
shapesIn({ kind: "record", shapeId: id }, early, earlySeen);
|
|
656
|
+
for (const root of observedRoots)
|
|
657
|
+
shapesIn(root, early, earlySeen);
|
|
658
|
+
// A presence test (`"k" in r`, Object.hasOwn) observes a record's own
|
|
659
|
+
// keys as an order surface does.
|
|
660
|
+
for (const root of presenceRoots)
|
|
661
|
+
shapesIn(root, early, earlySeen);
|
|
662
|
+
// An observed copy shows the own keys of each record it spreads, so a
|
|
663
|
+
// spread source is observed through it, transitively.
|
|
664
|
+
for (let grew = true; grew;) {
|
|
665
|
+
grew = false;
|
|
666
|
+
for (const { literal, note } of widthSites) {
|
|
667
|
+
if (literal.type.kind !== "record" || !early.has(literal.type.shapeId))
|
|
668
|
+
continue;
|
|
669
|
+
for (const segment of note.segments) {
|
|
670
|
+
if (segment.kind !== "spread")
|
|
671
|
+
continue;
|
|
672
|
+
const before = early.size;
|
|
673
|
+
shapesIn(segment.value.type, early, earlySeen);
|
|
674
|
+
if (early.size !== before)
|
|
675
|
+
grew = true;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
// A copy narrowed from a record links to it (record-links.ts) and
|
|
679
|
+
// shows the record's own keys, so the record is observed through it.
|
|
680
|
+
for (const link of lowerer.recordLinks.values()) {
|
|
681
|
+
if (!early.has(link.to))
|
|
682
|
+
continue;
|
|
683
|
+
const before = early.size;
|
|
684
|
+
shapesIn({ kind: "record", shapeId: link.from }, early, earlySeen);
|
|
685
|
+
if (early.size !== before)
|
|
686
|
+
grew = true;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
for (let grew = true; grew;) {
|
|
690
|
+
grew = false;
|
|
691
|
+
for (const { wrapper, literal, note } of widthSites) {
|
|
692
|
+
if (!note.drops || keptWidths.has(wrapper) || literal.type.kind !== "record")
|
|
693
|
+
continue;
|
|
694
|
+
if (!early.has(literal.type.shapeId) || !widthKeepable(lowerer, wrapper, note.segments))
|
|
695
|
+
continue;
|
|
696
|
+
keptWidths.add(wrapper);
|
|
697
|
+
notes.keptSourceShapes.add(literal.type.shapeId);
|
|
698
|
+
grew = true;
|
|
699
|
+
for (const segment of note.segments)
|
|
700
|
+
if (segment.kind === "spread")
|
|
701
|
+
shapesIn(segment.value.type, early, earlySeen);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
// A same-shape copy (`{ ...r }`, `{ ...r, ...s }`) of a record that
|
|
705
|
+
// kept undeclared keys copies them too. A copy keeps its source's own
|
|
706
|
+
// keys, so a source can itself be such a copy; admit a non-dropping
|
|
707
|
+
// site only when a spread source of it can actually hold a source (a
|
|
708
|
+
// shape a checked conversion builds or an earlier kept copy's), so a
|
|
709
|
+
// program — or a copy of a shape no conversion ever produces — stays
|
|
710
|
+
// byte-identical.
|
|
711
|
+
if (lowerer.recordSourcesPossible || keptWidths.size > 0) {
|
|
712
|
+
for (let grew = true; grew;) {
|
|
713
|
+
grew = false;
|
|
714
|
+
for (const { wrapper, literal, note } of widthSites) {
|
|
715
|
+
if (note.drops || keptWidths.has(wrapper) || literal.type.kind !== "record")
|
|
716
|
+
continue;
|
|
717
|
+
if (!early.has(literal.type.shapeId) || !widthKeepable(lowerer, wrapper, note.segments))
|
|
718
|
+
continue;
|
|
719
|
+
if (!note.segments.some((segment) => segment.kind === "spread" &&
|
|
720
|
+
reachesKeptSource(lowerer, segment.value.type, convertedShapes)))
|
|
721
|
+
continue;
|
|
722
|
+
keptWidths.add(wrapper);
|
|
723
|
+
notes.keptSourceShapes.add(literal.type.shapeId);
|
|
724
|
+
grew = true;
|
|
725
|
+
for (const segment of note.segments)
|
|
726
|
+
if (segment.kind === "spread")
|
|
727
|
+
shapesIn(segment.value.type, early, earlySeen);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
for (const { wrapper, literal, note } of widthSites) {
|
|
732
|
+
if (!keptWidths.has(wrapper) || literal.type.kind !== "record")
|
|
733
|
+
continue;
|
|
734
|
+
const shapeId = literal.type.shapeId;
|
|
735
|
+
notes.keptSourceShapes.add(shapeId);
|
|
736
|
+
if (!note.drops) {
|
|
737
|
+
// A same-shape copy keeps its own order (a spread of the literal's
|
|
738
|
+
// own shape reads its source's index): its witness stays, and the
|
|
739
|
+
// plan finds the source binding through the wrapper's prologue.
|
|
740
|
+
keptLiteralStmts.set(literal, wrapper.stmts);
|
|
741
|
+
continue;
|
|
742
|
+
}
|
|
743
|
+
// A kept copy that drops keys enumerates through its own kept source,
|
|
744
|
+
// so like a checked conversion it contributes no order to its shape's
|
|
745
|
+
// table, and the shape keeps today's table.
|
|
746
|
+
const segments = notes.literalOf(literal);
|
|
747
|
+
const literals = facts.get(shapeId)?.literals;
|
|
748
|
+
const at = segments === undefined || literals === undefined ? -1 : literals.indexOf(segments);
|
|
749
|
+
if (at >= 0)
|
|
750
|
+
literals.splice(at, 1);
|
|
751
|
+
keptDropShapes.add(shapeId);
|
|
752
|
+
}
|
|
753
|
+
// Same-shape clones of a record that can keep keys copy them too, when
|
|
754
|
+
// the program converts checked values or keeps a width spread and the
|
|
755
|
+
// shape is observed. The source, not the clone, decides: a clone of a
|
|
756
|
+
// shape no conversion produces finds no keys to keep.
|
|
757
|
+
if (lowerer.recordSourcesPossible || keptWidths.size > 0) {
|
|
758
|
+
for (const { node } of cloneSites) {
|
|
759
|
+
if (node.kind !== "recordClone")
|
|
760
|
+
continue;
|
|
761
|
+
const cloneT = node.type;
|
|
762
|
+
if (cloneT.kind !== "record" || !early.has(cloneT.shapeId))
|
|
763
|
+
continue;
|
|
764
|
+
if (!recordMayKeepSource(lowerer, cloneT))
|
|
765
|
+
continue;
|
|
766
|
+
if (!reachesKeptSource(lowerer, node.source.type, convertedShapes))
|
|
767
|
+
continue;
|
|
768
|
+
keptClones.add(node);
|
|
769
|
+
notes.keptSourceShapes.add(cloneT.shapeId);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
// A program that keeps no width spread is byte-identical to main: the
|
|
774
|
+
// reflective surfaces below (and the two helper finalizers in
|
|
775
|
+
// lower-calls.ts, which consult keptSourceShapes) stay static there, as
|
|
776
|
+
// they did before this pass.
|
|
777
|
+
keepSourceProbes(lowerer, notes, probeSites, keptWidths.size > 0 || keptClones.size > 0);
|
|
778
|
+
keepRecordClones(lowerer, cloneSites, keptClones);
|
|
543
779
|
// ── scope ───────────────────────────────────────────────────────────
|
|
544
780
|
// Only plain declared-field shapes with a table take part.
|
|
545
781
|
const inScope = (shape) => shape !== undefined &&
|
|
@@ -580,8 +816,10 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
580
816
|
return keys.join("\0") !== table;
|
|
581
817
|
});
|
|
582
818
|
});
|
|
583
|
-
if (!interesting)
|
|
819
|
+
if (!interesting) {
|
|
820
|
+
keepWidthSpreads(notes, widthSites, keptWidths, new Set());
|
|
584
821
|
return;
|
|
822
|
+
}
|
|
585
823
|
// ── presence classes and late-write constraints ─────────────────────
|
|
586
824
|
const maybeAbsent = (id, key) => {
|
|
587
825
|
const shape = shapes.get(id);
|
|
@@ -758,7 +996,12 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
758
996
|
}
|
|
759
997
|
return out;
|
|
760
998
|
};
|
|
761
|
-
/** Today's table with every witness edge applied, or "unknown".
|
|
999
|
+
/** Today's table with every witness edge applied, or "unknown".
|
|
1000
|
+
*
|
|
1001
|
+
* Kahn's algorithm takes the ready key the table holds first, which is
|
|
1002
|
+
* the order the tables have always used. Ranks are unique, so a scan for
|
|
1003
|
+
* the smallest ready rank settles each step exactly as reordering the
|
|
1004
|
+
* whole ready set did. */
|
|
762
1005
|
const merge = (table, edges) => {
|
|
763
1006
|
const rank = new Map(table.map((k, i) => [k, i]));
|
|
764
1007
|
const succ = new Map(table.map((k) => [k, new Set()]));
|
|
@@ -775,8 +1018,18 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
775
1018
|
const order = [];
|
|
776
1019
|
const ready = table.filter((k) => indeg.get(k) === 0);
|
|
777
1020
|
while (ready.length > 0) {
|
|
778
|
-
|
|
779
|
-
|
|
1021
|
+
let at = 0;
|
|
1022
|
+
let best = rank.get(ready[0]);
|
|
1023
|
+
for (let i = 1; i < ready.length; i++) {
|
|
1024
|
+
const r = rank.get(ready[i]);
|
|
1025
|
+
if (r < best) {
|
|
1026
|
+
best = r;
|
|
1027
|
+
at = i;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
const k = ready[at];
|
|
1031
|
+
ready[at] = ready[ready.length - 1];
|
|
1032
|
+
ready.pop();
|
|
780
1033
|
order.push(k);
|
|
781
1034
|
for (const next of succ.get(k)) {
|
|
782
1035
|
indeg.set(next, indeg.get(next) - 1);
|
|
@@ -792,6 +1045,9 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
792
1045
|
};
|
|
793
1046
|
// ── resolution over inheritance edges ───────────────────────────────
|
|
794
1047
|
const result = new Map();
|
|
1048
|
+
/** A shape's late-write edges: they read that shape's facts only, so they
|
|
1049
|
+
* stay valid until the facts change (a shape becomes built at run time,
|
|
1050
|
+
* below). */
|
|
795
1051
|
const late = new Map();
|
|
796
1052
|
const dependencies = (id) => {
|
|
797
1053
|
const f = facts.get(id);
|
|
@@ -910,7 +1166,6 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
910
1166
|
};
|
|
911
1167
|
const resolveAll = () => {
|
|
912
1168
|
result.clear();
|
|
913
|
-
late.clear();
|
|
914
1169
|
for (const scc of sccs) {
|
|
915
1170
|
const members = new Set(scc);
|
|
916
1171
|
const guess = new Map();
|
|
@@ -955,8 +1210,11 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
955
1210
|
if ((source === "unknown" && !self) || !ordersSpread(segments, sites))
|
|
956
1211
|
continue;
|
|
957
1212
|
orderedSpreads.add(segments);
|
|
958
|
-
if (target.kind === "record")
|
|
1213
|
+
if (target.kind === "record") {
|
|
959
1214
|
factsOf(target.shapeId).runtime = true;
|
|
1215
|
+
// Its presence answers and late-write edges just changed.
|
|
1216
|
+
late.delete(target.shapeId);
|
|
1217
|
+
}
|
|
960
1218
|
grew = true;
|
|
961
1219
|
}
|
|
962
1220
|
if (grew)
|
|
@@ -969,6 +1227,15 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
969
1227
|
shapesIn({ kind: "record", shapeId: id }, observed, observedSeen);
|
|
970
1228
|
for (const root of observedRoots)
|
|
971
1229
|
shapesIn(root, observed, observedSeen);
|
|
1230
|
+
// A kept width spread snapshots its sources' own keys, an order surface
|
|
1231
|
+
// over each source.
|
|
1232
|
+
for (const { wrapper, note } of widthSites) {
|
|
1233
|
+
if (!keptWidths.has(wrapper))
|
|
1234
|
+
continue;
|
|
1235
|
+
for (const segment of note.segments)
|
|
1236
|
+
if (segment.kind === "spread")
|
|
1237
|
+
shapesIn(segment.value.type, observed, observedSeen);
|
|
1238
|
+
}
|
|
972
1239
|
// An ordered spread's copies of values without a source take the source's
|
|
973
1240
|
// order from its table, which must then hold the resolved order.
|
|
974
1241
|
const orderedTarget = (sites) => {
|
|
@@ -998,6 +1265,7 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
998
1265
|
// Ordered spreads carry their source's order over (see above).
|
|
999
1266
|
let orderedResults = 0;
|
|
1000
1267
|
const rewritten = new Set();
|
|
1268
|
+
keepWidthSpreads(notes, widthSites, keptWidths, rewritten);
|
|
1001
1269
|
for (const [segments, sites] of leadingSpreads) {
|
|
1002
1270
|
const first = segments[0];
|
|
1003
1271
|
if (!orderedSpreads.has(segments) || first?.kind !== "spread" || first.value === undefined)
|
|
@@ -1307,6 +1575,12 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
1307
1575
|
const siteOf = (e) => {
|
|
1308
1576
|
if (e.kind === "seqExpr" && e.result.kind === "recordLit")
|
|
1309
1577
|
prologues.set(e.result, e.stmts);
|
|
1578
|
+
// A kept width spread's literal now initializes its own declaration, but
|
|
1579
|
+
// it still evaluates the spread's source binding in the wrapper's
|
|
1580
|
+
// prologue (keepWidthSpreads).
|
|
1581
|
+
const host = keptLiteralStmts.get(e);
|
|
1582
|
+
if (host !== undefined && e.kind === "recordLit")
|
|
1583
|
+
prologues.set(e, host);
|
|
1310
1584
|
if (e.kind === "recordLit" && e.type.kind === "record" && variants.has(e.type.shapeId)) {
|
|
1311
1585
|
const list = sites.get(e.type.shapeId) ?? [];
|
|
1312
1586
|
list.push(e);
|
|
@@ -1436,7 +1710,7 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
1436
1710
|
return indexOfOrder(orders, complete(resolved.order.filter((k) => keys.has(k)), orders[0]));
|
|
1437
1711
|
};
|
|
1438
1712
|
const plan = new Map();
|
|
1439
|
-
const dropped = new Set();
|
|
1713
|
+
const dropped = new Set(keptDropShapes);
|
|
1440
1714
|
for (const [id, list] of sites) {
|
|
1441
1715
|
for (const lit of list) {
|
|
1442
1716
|
const index = orderIndex(id, lit);
|
|
@@ -1591,4 +1865,292 @@ export function applyKeyOrderWitnesses(lowerer, fns) {
|
|
|
1591
1865
|
shape.orderVariants = tables;
|
|
1592
1866
|
}
|
|
1593
1867
|
}
|
|
1868
|
+
/** The replacements recorded for `fn`. */
|
|
1869
|
+
function replacementsIn(byFn, fn) {
|
|
1870
|
+
let replacements = byFn.get(fn);
|
|
1871
|
+
if (replacements === undefined)
|
|
1872
|
+
byFn.set(fn, (replacements = new Map()));
|
|
1873
|
+
return replacements;
|
|
1874
|
+
}
|
|
1875
|
+
/** Replaces each node of `replacements` in `fn` through the node that holds
|
|
1876
|
+
* it (replaceChildExpr), and the nodes under a replacement in turn. A node
|
|
1877
|
+
* is never rewritten into another kind in place: the compiler compiles this
|
|
1878
|
+
* file too, and a node it builds keeps its kind's fields. */
|
|
1879
|
+
function replaceThroughParents(fn, replacements) {
|
|
1880
|
+
if (replacements.size === 0)
|
|
1881
|
+
return;
|
|
1882
|
+
let replaced = 0;
|
|
1883
|
+
const children = (parent) => ({
|
|
1884
|
+
expr: (child) => {
|
|
1885
|
+
const to = replacements.get(child);
|
|
1886
|
+
if (to !== undefined && replaceChildExpr(parent, child, to))
|
|
1887
|
+
replaced++;
|
|
1888
|
+
visitExpr(to ?? child);
|
|
1889
|
+
return true;
|
|
1890
|
+
},
|
|
1891
|
+
stmt: (child) => {
|
|
1892
|
+
visitStmt(child);
|
|
1893
|
+
return true;
|
|
1894
|
+
},
|
|
1895
|
+
});
|
|
1896
|
+
function visitExpr(node) {
|
|
1897
|
+
const { expr, stmt } = children(node);
|
|
1898
|
+
everyExprChild(node, expr, stmt);
|
|
1899
|
+
}
|
|
1900
|
+
function visitStmt(node) {
|
|
1901
|
+
const { expr, stmt } = children(node);
|
|
1902
|
+
everyStmtChild(node, expr, stmt);
|
|
1903
|
+
}
|
|
1904
|
+
for (const stmt of fn.body)
|
|
1905
|
+
visitStmt(stmt);
|
|
1906
|
+
if (replaced !== replacements.size)
|
|
1907
|
+
throw new InternalCompilerError(`key-order-witness: ${replacements.size - replaced} kept site(s) not found in ${fn.name}`);
|
|
1908
|
+
}
|
|
1909
|
+
/** Width spreads: `{ ...wide }` into a narrower declared record. Node's copy
|
|
1910
|
+
* holds every own key of the source; the static copy holds the declared
|
|
1911
|
+
* ones. When an order surface can observe the target shape (the same
|
|
1912
|
+
* observation the order tables use), the literal keeps the copy's whole
|
|
1913
|
+
* own-key list as the record's kept source (scr_record_source_note): each
|
|
1914
|
+
* spread source's own keys are snapshot as the spread runs, explicit keys
|
|
1915
|
+
* hold placeholders at their position, and the record stays the source of
|
|
1916
|
+
* truth for every declared key. Programs no surface observes keep the
|
|
1917
|
+
* static copy byte for byte. */
|
|
1918
|
+
function widthKeepable(lowerer, wrapper, width) {
|
|
1919
|
+
return width.every((segment) => segment.kind === "key" ||
|
|
1920
|
+
((segment.value.type.kind === "dyn" || lowerer.dynConvertible(segment.value.type)) &&
|
|
1921
|
+
wrapper.stmts.some((stmt) => stmt.kind === "varDecl" && stmt.localId === segment.value.localId)));
|
|
1922
|
+
}
|
|
1923
|
+
function keepWidthSpreads(notes, sites, kept, rewritten) {
|
|
1924
|
+
let index = 0;
|
|
1925
|
+
for (const { wrapper, literal, fn, note } of sites) {
|
|
1926
|
+
if (!kept.has(wrapper) || rewritten.has(wrapper))
|
|
1927
|
+
continue;
|
|
1928
|
+
rewritten.add(wrapper);
|
|
1929
|
+
notes.keptWidthSpreads++;
|
|
1930
|
+
const width = note.segments;
|
|
1931
|
+
const loc = literal.loc;
|
|
1932
|
+
const site = index++;
|
|
1933
|
+
const empty = () => ({ kind: "dynObjLit", fields: [], type: DYN, loc });
|
|
1934
|
+
const assign = (target, from) => ({
|
|
1935
|
+
kind: "libCall",
|
|
1936
|
+
fn: "dyn.assign",
|
|
1937
|
+
args: [target, from],
|
|
1938
|
+
type: DYN,
|
|
1939
|
+
loc,
|
|
1940
|
+
});
|
|
1941
|
+
let mirror = empty();
|
|
1942
|
+
let spreadIndex = 0;
|
|
1943
|
+
for (const segment of width) {
|
|
1944
|
+
if (segment.kind === "key") {
|
|
1945
|
+
mirror = assign(mirror, {
|
|
1946
|
+
kind: "dynObjLit",
|
|
1947
|
+
fields: [{ key: strLit(segment.name, loc), value: dynUndefinedExpr(loc) }],
|
|
1948
|
+
type: DYN,
|
|
1949
|
+
loc,
|
|
1950
|
+
});
|
|
1951
|
+
continue;
|
|
1952
|
+
}
|
|
1953
|
+
// The spread copies the source's own keys when it runs: snapshot them
|
|
1954
|
+
// right after the literal evaluated the source.
|
|
1955
|
+
const localId = `%widthKeys.${site}.${spreadIndex++}`;
|
|
1956
|
+
fn.locals.push({ id: localId, name: "%widthKeys", type: DYN, mutable: false });
|
|
1957
|
+
const boxed = segment.value.type.kind === "dyn"
|
|
1958
|
+
? segment.value
|
|
1959
|
+
: { kind: "dynFrom", value: segment.value, liveRef: true, type: DYN, loc };
|
|
1960
|
+
const at = wrapper.stmts.findIndex((stmt) => stmt.kind === "varDecl" && stmt.localId === segment.value.localId);
|
|
1961
|
+
wrapper.stmts.splice(at + 1, 0, {
|
|
1962
|
+
kind: "varDecl",
|
|
1963
|
+
localId,
|
|
1964
|
+
init: assign(empty(), boxed),
|
|
1965
|
+
loc,
|
|
1966
|
+
});
|
|
1967
|
+
mirror = assign(mirror, { kind: "varRef", localId, type: DYN, loc });
|
|
1968
|
+
}
|
|
1969
|
+
const builtId = `%widthKept.${site}`;
|
|
1970
|
+
fn.locals.push({ id: builtId, name: "%widthKept", type: literal.type, mutable: false });
|
|
1971
|
+
const built = { kind: "varRef", localId: builtId, type: literal.type, loc };
|
|
1972
|
+
wrapper.stmts.push({ kind: "varDecl", localId: builtId, init: literal, loc }, {
|
|
1973
|
+
kind: "exprStmt",
|
|
1974
|
+
expr: { kind: "libCall", fn: "record.sourceNote", args: [built, mirror], type: VOID, loc },
|
|
1975
|
+
loc,
|
|
1976
|
+
});
|
|
1977
|
+
wrapper.result = built;
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
/** Whether a value of this type reaches a record layout that holds a kept
|
|
1981
|
+
* source: a plain record a checked conversion builds or an earlier kept
|
|
1982
|
+
* copy's shape, or a union with such an arm. */
|
|
1983
|
+
function reachesKeptSource(lowerer, type, converted) {
|
|
1984
|
+
if (type.kind === "record")
|
|
1985
|
+
return (recordMayKeepSource(lowerer, type) &&
|
|
1986
|
+
(converted.has(type.shapeId) || lowerer.keyOrder.keptSourceShapes.has(type.shapeId)));
|
|
1987
|
+
if (type.kind === "union")
|
|
1988
|
+
return (lowerer.unions.get(type.unionId)?.arms ?? []).some((arm) => reachesKeptSource(lowerer, arm, converted));
|
|
1989
|
+
return false;
|
|
1990
|
+
}
|
|
1991
|
+
/** Add the record shapes a checked conversion's target can hold a source
|
|
1992
|
+
* in: the target itself when it is a plain record, or the records nested in
|
|
1993
|
+
* a union arm, an array element, a promise or an index signature's values
|
|
1994
|
+
* (the layouts the checked builder notes sources for). */
|
|
1995
|
+
function conversionShapes(lowerer, target, out, seen) {
|
|
1996
|
+
if (target.kind === "promise")
|
|
1997
|
+
return conversionShapes(lowerer, target.inner, out, seen);
|
|
1998
|
+
if (target.kind === "array")
|
|
1999
|
+
return conversionShapes(lowerer, target.elem, out, seen);
|
|
2000
|
+
if (target.kind === "record") {
|
|
2001
|
+
if (seen.has(target.shapeId))
|
|
2002
|
+
return;
|
|
2003
|
+
seen.add(target.shapeId);
|
|
2004
|
+
// A conversion builds the records of its nested fields too, each with
|
|
2005
|
+
// its own kept source.
|
|
2006
|
+
if (recordMayKeepSource(lowerer, target))
|
|
2007
|
+
out.add(target.shapeId);
|
|
2008
|
+
const shape = lowerer.shapes.get(target.shapeId);
|
|
2009
|
+
for (const field of shape?.fields ?? [])
|
|
2010
|
+
conversionShapes(lowerer, field.type, out, seen);
|
|
2011
|
+
if (shape?.indexValue !== undefined)
|
|
2012
|
+
conversionShapes(lowerer, shape.indexValue, out, seen);
|
|
2013
|
+
return;
|
|
2014
|
+
}
|
|
2015
|
+
if (target.kind !== "union" || seen.has(target.unionId))
|
|
2016
|
+
return;
|
|
2017
|
+
seen.add(target.unionId);
|
|
2018
|
+
for (const arm of lowerer.unions.get(target.unionId)?.arms ?? [])
|
|
2019
|
+
conversionShapes(lowerer, arm, out, seen);
|
|
2020
|
+
}
|
|
2021
|
+
/** `"k" in r` over a closed record answers statically false for a literal
|
|
2022
|
+
* key the shape does not declare. A kept source can hold it (a checked
|
|
2023
|
+
* conversion's undeclared keys, a width spread's extras), so when the
|
|
2024
|
+
* program keeps record sources the site answers through the record's own
|
|
2025
|
+
* kept view instead. The receiver evaluates exactly once, as the static
|
|
2026
|
+
* form evaluated it. */
|
|
2027
|
+
function keepSourceProbes(lowerer, notes, sites, possible) {
|
|
2028
|
+
if (!possible)
|
|
2029
|
+
return;
|
|
2030
|
+
let index = 0;
|
|
2031
|
+
const byFn = new Map();
|
|
2032
|
+
for (const { node, fn } of sites) {
|
|
2033
|
+
const probe = notes.sourceProbeOf(node);
|
|
2034
|
+
if (probe === undefined)
|
|
2035
|
+
continue;
|
|
2036
|
+
const recT = probe.receiver.type;
|
|
2037
|
+
if (recT.kind !== "record")
|
|
2038
|
+
continue;
|
|
2039
|
+
if (!recordMayKeepSource(lowerer, recT))
|
|
2040
|
+
continue;
|
|
2041
|
+
const loc = node.loc;
|
|
2042
|
+
const id = `%inSource.${index++}`;
|
|
2043
|
+
fn.locals.push({ id, name: "%inSource", type: recT, mutable: false });
|
|
2044
|
+
const ref = { kind: "varRef", localId: id, type: recT, loc };
|
|
2045
|
+
const replacement = {
|
|
2046
|
+
kind: "seqExpr",
|
|
2047
|
+
stmts: [{ kind: "varDecl", localId: id, init: probe.receiver, loc }],
|
|
2048
|
+
result: {
|
|
2049
|
+
kind: "logical",
|
|
2050
|
+
op: "&&",
|
|
2051
|
+
left: recordSourceTest(ref, loc),
|
|
2052
|
+
right: {
|
|
2053
|
+
kind: "dynHasKey",
|
|
2054
|
+
key: probe.key,
|
|
2055
|
+
value: { kind: "dynFrom", value: ref, liveRef: true, type: DYN, loc },
|
|
2056
|
+
type: BOOL,
|
|
2057
|
+
loc,
|
|
2058
|
+
},
|
|
2059
|
+
type: BOOL,
|
|
2060
|
+
loc,
|
|
2061
|
+
},
|
|
2062
|
+
type: BOOL,
|
|
2063
|
+
loc,
|
|
2064
|
+
};
|
|
2065
|
+
replacementsIn(byFn, fn).set(node, replacement);
|
|
2066
|
+
}
|
|
2067
|
+
for (const [fn, replacements] of byFn)
|
|
2068
|
+
replaceThroughParents(fn, replacements);
|
|
2069
|
+
}
|
|
2070
|
+
/** Same-shape `{ ...r, k: v }` clones: Node's copy holds every own key of
|
|
2071
|
+
* the source, and the recordClone fast path copies the declared fields
|
|
2072
|
+
* only. A clone over a shape that can keep a source, in a program that
|
|
2073
|
+
* keeps one, snapshots the source's own keys and notes them on the built
|
|
2074
|
+
* record; the overrides keep their source position (a placeholder for an
|
|
2075
|
+
* existing key keeps its place, a new one follows the source's keys). The
|
|
2076
|
+
* override values still evaluate after the source, as before. */
|
|
2077
|
+
function keepRecordClones(lowerer, sites, kept) {
|
|
2078
|
+
let index = 0;
|
|
2079
|
+
const byFn = new Map();
|
|
2080
|
+
for (const { node, fn } of sites) {
|
|
2081
|
+
if (!kept.has(node) || node.kind !== "recordClone")
|
|
2082
|
+
continue;
|
|
2083
|
+
const cloneT = node.type;
|
|
2084
|
+
if (cloneT.kind !== "record" || !recordMayKeepSource(lowerer, cloneT))
|
|
2085
|
+
continue;
|
|
2086
|
+
const loc = node.loc;
|
|
2087
|
+
const n = index++;
|
|
2088
|
+
const srcId = `%cloneSrc.${n}`;
|
|
2089
|
+
const keysId = `%cloneKeys.${n}`;
|
|
2090
|
+
const builtId = `%cloneKept.${n}`;
|
|
2091
|
+
fn.locals.push({ id: srcId, name: "%cloneSrc", type: node.source.type, mutable: false });
|
|
2092
|
+
fn.locals.push({ id: keysId, name: "%cloneKeys", type: DYN, mutable: false });
|
|
2093
|
+
fn.locals.push({ id: builtId, name: "%cloneKept", type: cloneT, mutable: false });
|
|
2094
|
+
const srcRef = { kind: "varRef", localId: srcId, type: node.source.type, loc };
|
|
2095
|
+
const assign = (target, from) => ({
|
|
2096
|
+
kind: "libCall",
|
|
2097
|
+
fn: "dyn.assign",
|
|
2098
|
+
args: [target, from],
|
|
2099
|
+
type: DYN,
|
|
2100
|
+
loc,
|
|
2101
|
+
});
|
|
2102
|
+
const placeholder = (name) => ({
|
|
2103
|
+
kind: "dynObjLit",
|
|
2104
|
+
fields: [{ key: strLit(name, loc), value: dynUndefinedExpr(loc) }],
|
|
2105
|
+
type: DYN,
|
|
2106
|
+
loc,
|
|
2107
|
+
});
|
|
2108
|
+
let mirror = { kind: "varRef", localId: keysId, type: DYN, loc };
|
|
2109
|
+
for (const override of node.overrides)
|
|
2110
|
+
mirror = assign(mirror, placeholder(override.name));
|
|
2111
|
+
const built = { kind: "varRef", localId: builtId, type: cloneT, loc };
|
|
2112
|
+
const overrides = node.overrides;
|
|
2113
|
+
const replacement = {
|
|
2114
|
+
kind: "seqExpr",
|
|
2115
|
+
stmts: [
|
|
2116
|
+
{ kind: "varDecl", localId: srcId, init: node.source, loc },
|
|
2117
|
+
{
|
|
2118
|
+
kind: "varDecl",
|
|
2119
|
+
localId: keysId,
|
|
2120
|
+
init: assign({ kind: "dynObjLit", fields: [], type: DYN, loc }, {
|
|
2121
|
+
kind: "dynFrom",
|
|
2122
|
+
value: srcRef,
|
|
2123
|
+
liveRef: true,
|
|
2124
|
+
type: DYN,
|
|
2125
|
+
loc,
|
|
2126
|
+
}),
|
|
2127
|
+
loc,
|
|
2128
|
+
},
|
|
2129
|
+
{
|
|
2130
|
+
kind: "varDecl",
|
|
2131
|
+
localId: builtId,
|
|
2132
|
+
init: { kind: "recordClone", source: srcRef, overrides, type: cloneT, loc },
|
|
2133
|
+
loc,
|
|
2134
|
+
},
|
|
2135
|
+
{
|
|
2136
|
+
kind: "exprStmt",
|
|
2137
|
+
expr: {
|
|
2138
|
+
kind: "libCall",
|
|
2139
|
+
fn: "record.sourceNote",
|
|
2140
|
+
args: [built, mirror],
|
|
2141
|
+
type: VOID,
|
|
2142
|
+
loc,
|
|
2143
|
+
},
|
|
2144
|
+
loc,
|
|
2145
|
+
},
|
|
2146
|
+
],
|
|
2147
|
+
result: built,
|
|
2148
|
+
type: cloneT,
|
|
2149
|
+
loc,
|
|
2150
|
+
};
|
|
2151
|
+
replacementsIn(byFn, fn).set(node, replacement);
|
|
2152
|
+
}
|
|
2153
|
+
for (const [fn, replacements] of byFn)
|
|
2154
|
+
replaceThroughParents(fn, replacements);
|
|
2155
|
+
}
|
|
1594
2156
|
//# sourceMappingURL=key-order-witness.js.map
|