@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
|
@@ -10,11 +10,12 @@ import { isJsSourceFile, locOf } from "../../program.js";
|
|
|
10
10
|
import { buildArraySortFn, buildSortKeyFn, closureKeyOrder, sortKeysId, sortKeysOrder, } from "../lower-array-sort.js";
|
|
11
11
|
import { arrayIndexPresent, arraySlotSnapshot, arraySnapshotAppend, arraySnapshotValue, arrayValueRead, arrayValueStore, arrayValueType, currentArrayIndexPresent, elementMayBeForeign, foreignElementThrow, primitiveElement, slotSnapshotLocals, unreadArgument, } from "../array-values.js";
|
|
12
12
|
import { typeKey } from "../../type-mapper.js";
|
|
13
|
-
import { lowerArrayCallback, requireProducedArrayElement, callbackArrayElement, truthyFilterCallback, } from "./callback-arguments.js";
|
|
13
|
+
import { lowerArrayCallback, requireProducedArrayElement, unitOnlyArrayElement, callbackArrayElement, truthyFilterCallback, } from "./callback-arguments.js";
|
|
14
14
|
import { reverseArrayLoop, arrayLengthDeclaration, arrayCallbackParams, arrayCallbackLocals, callArrayCallback, } from "./array-iteration.js";
|
|
15
15
|
import { dynamicReceiverThrows } from "./dynamic-receivers.js";
|
|
16
16
|
import { defaultAfterUndefined, lowerStaticallyUndefinedArgument } from "../optional-arguments.js";
|
|
17
|
-
import { checkedFilterNarrowing } from "./filter-predicates.js";
|
|
17
|
+
import { checkedFilterNarrowing, supersetGuardFields } from "./filter-predicates.js";
|
|
18
|
+
import { omittableTrailingParam } from "../coercions/function-adapters.js";
|
|
18
19
|
/** `a.map(fn)` / `a.filter(fn)` / `a.forEach(fn)` desugar to a direct
|
|
19
20
|
* call of a synthetic module function — one per method + element/result
|
|
20
21
|
* type + callback-arity combination, interned — whose body is a plain
|
|
@@ -37,6 +38,7 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
|
|
|
37
38
|
lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(argNode) ?? undefined);
|
|
38
39
|
const present = !booleanFilter && presentElements(lowerer, call, elem);
|
|
39
40
|
const valueT = callbackValueType(lowerer, elem, present);
|
|
41
|
+
const thisArg = hofThisArg(lowerer, call);
|
|
40
42
|
if (booleanFilter) {
|
|
41
43
|
if (valueT.kind === "union")
|
|
42
44
|
lowerer.requireTruthyUnion(valueT.unionId, argNode);
|
|
@@ -48,7 +50,7 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
|
|
|
48
50
|
}
|
|
49
51
|
const callback = booleanFilter
|
|
50
52
|
? { fnArg: truthyFilterCallback(lowerer, valueT, loc), arity: 1, unread: false }
|
|
51
|
-
: lowerArrayCallback(lowerer, argNode, [valueT], arrayOf(elem));
|
|
53
|
+
: lowerArrayCallback(lowerer, argNode, [valueT], arrayOf(elem), false, method === "map" ? (unitOnlyArrayElement(lowerer, call) ?? undefined) : undefined);
|
|
52
54
|
const { fnArg, arity } = callback;
|
|
53
55
|
// Only an array that can hold elements outside its element type needs to
|
|
54
56
|
// leave an element its callback ignores unread.
|
|
@@ -81,15 +83,19 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
|
|
|
81
83
|
const outElem = filtered !== null ? filtered.elem : callbackArrayElement(lowerer, call, fnRet);
|
|
82
84
|
// A filter that re-tags its elements keeps the single union-typed visit.
|
|
83
85
|
// A callback that never reads its element has no use for a typed one.
|
|
84
|
-
const fast = present ||
|
|
86
|
+
const fast = present ||
|
|
87
|
+
booleanFilter ||
|
|
88
|
+
unread ||
|
|
89
|
+
thisArg !== null ||
|
|
90
|
+
(method === "filter" && !typeEquals(outElem, elem))
|
|
85
91
|
? null
|
|
86
92
|
: lowerFastCallback(lowerer, argNode, [valueT], 0, elem, arrayOf(elem), callback);
|
|
87
|
-
const helper = arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread);
|
|
93
|
+
const helper = arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread, thisArg !== null);
|
|
88
94
|
const resultType = method === "map" || method === "filter" ? arrayOf(outElem) : VOID;
|
|
89
95
|
const result = {
|
|
90
96
|
kind: "call",
|
|
91
97
|
callee: helper,
|
|
92
|
-
args: [receiver, fnArg, ...(fast ? [fast] : [])],
|
|
98
|
+
args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
|
|
93
99
|
type: resultType,
|
|
94
100
|
loc,
|
|
95
101
|
};
|
|
@@ -104,6 +110,20 @@ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
|
|
|
104
110
|
loc,
|
|
105
111
|
};
|
|
106
112
|
}
|
|
113
|
+
/** The thisArg of a callback HOF call (`a.map(f, thisArg)`), lowered as the
|
|
114
|
+
* checked-dynamic value the helper hands the callback as its call-site
|
|
115
|
+
* receiver. Null when the call has no second argument, in which case the
|
|
116
|
+
* helper keeps the two-slot frame and the callback's `this` is the ambient
|
|
117
|
+
* one, exactly as before. */
|
|
118
|
+
function hofThisArg(lowerer, call) {
|
|
119
|
+
const node = call.arguments.nodes[1];
|
|
120
|
+
if (node === undefined)
|
|
121
|
+
return null;
|
|
122
|
+
if (call.arguments.nodes.length > 2) {
|
|
123
|
+
lowerer.noLowering(`.${ts.isPropertyAccessExpression(call.expression) ? call.expression.name.text : ""} with ${call.arguments.nodes.length} arguments`, call, "the supported form takes the callback and an optional thisArg");
|
|
124
|
+
}
|
|
125
|
+
return lowerer.lowerExprExpecting(node, DYN);
|
|
126
|
+
}
|
|
107
127
|
/** The element a filter keeps, and the checked conversion of the result
|
|
108
128
|
* to the checker's narrower element when the predicate does not prove it.
|
|
109
129
|
* An inferred inline type predicate proves one source arm, or a class
|
|
@@ -158,6 +178,18 @@ function filterKeptElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
|
|
|
158
178
|
const annotateEscape = "keep the receiver's element type instead — annotate the callback's return ': boolean' " +
|
|
159
179
|
"(the checker then skips the predicate) or annotate the result with the receiver's own " +
|
|
160
180
|
"element type — and narrow the elements after";
|
|
181
|
+
// A record target that declares fields the receiver's record element has no
|
|
182
|
+
// slot for: the elements were narrowed when they were stored, so those
|
|
183
|
+
// fields no longer exist at runtime and no per-field check can recover them.
|
|
184
|
+
const widened = supersetGuardFields(lowerer, elem, outElem);
|
|
185
|
+
const missingFields = widened === null
|
|
186
|
+
? ""
|
|
187
|
+
: ` (the receiver's element type has no slot for ${widened
|
|
188
|
+
.slice(0, 4)
|
|
189
|
+
.map((field) => `'${field}'`)
|
|
190
|
+
.join(", ")}${widened.length > 4 ? ` and ${widened.length - 4} more` : ""} — each ` +
|
|
191
|
+
`element was narrowed when it was stored, so those fields do not exist at runtime and ` +
|
|
192
|
+
`the predicate cannot make them real)`;
|
|
161
193
|
const written = !booleanFilter &&
|
|
162
194
|
((!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) ||
|
|
163
195
|
argNode.type !== undefined);
|
|
@@ -170,10 +202,10 @@ function filterKeptElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
|
|
|
170
202
|
return helper;
|
|
171
203
|
if (!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) {
|
|
172
204
|
lowerer.unsupported("SC1090", argNode, `narrowing '.filter' to '${lowerer.fmt(outElem)}' through a callback VALUE (no checked ` +
|
|
173
|
-
`conversion from '${lowerer.fmt(elem)}' — ${annotateEscape})`);
|
|
205
|
+
`conversion from '${lowerer.fmt(elem)}'${missingFields} — ${annotateEscape})`);
|
|
174
206
|
}
|
|
175
207
|
lowerer.unsupported("SC1090", argNode, `narrowing '.filter' to '${lowerer.fmt(outElem)}' with a hand-written type predicate (no ` +
|
|
176
|
-
`checked conversion from '${lowerer.fmt(elem)}' — ${annotateEscape})`);
|
|
208
|
+
`checked conversion from '${lowerer.fmt(elem)}'${missingFields} — ${annotateEscape})`);
|
|
177
209
|
}
|
|
178
210
|
const classRefinement = !booleanFilter && outElem.kind === "object" && canAssertClassValue(lowerer, valueT, outElem);
|
|
179
211
|
if (!classRefinement &&
|
|
@@ -439,8 +471,8 @@ const FILTER_SNAPSHOT = { isForeign: "vf.0", value: "v.0", foreign: "vd.0" };
|
|
|
439
471
|
* combo. Named `%arr.<method>.<n>` ('%' keeps it out of the user
|
|
440
472
|
* namespace); rides `liftedFns` into the module like a lifted lambda (it
|
|
441
473
|
* is a plain function — no captures). */
|
|
442
|
-
function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRet, site = "", fastT = null, present = false, unread = false) {
|
|
443
|
-
const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}:${typeKey(outElem)}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
|
|
474
|
+
function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRet, site = "", fastT = null, present = false, unread = false, withThis = false) {
|
|
475
|
+
const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}:${typeKey(outElem)}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
|
|
444
476
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
445
477
|
if (existing)
|
|
446
478
|
return existing;
|
|
@@ -456,7 +488,7 @@ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRe
|
|
|
456
488
|
split: !!fastT,
|
|
457
489
|
unread,
|
|
458
490
|
});
|
|
459
|
-
const fn = buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT, present, unread);
|
|
491
|
+
const fn = buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT, present, unread, withThis);
|
|
460
492
|
lowerer.liftedFns.push(fastT ? withFastCallback(fn, fastT, elem) : fn);
|
|
461
493
|
return name;
|
|
462
494
|
}
|
|
@@ -465,10 +497,17 @@ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRe
|
|
|
465
497
|
* original concrete array arm — never a copied `(T | U)[]` — and an
|
|
466
498
|
* arm-specific function adapter wraps the element and receiver arguments
|
|
467
499
|
* into the union-wide callback ABI. That preserves sparse-array reads,
|
|
468
|
-
* callback mutation, and the callback's third-argument identity.
|
|
500
|
+
* callback mutation, and the callback's third-argument identity.
|
|
501
|
+
*
|
|
502
|
+
* `filter` joins them: the kept elements are the checker's result element
|
|
503
|
+
* (`(b): b is TextContent` over `(TextContent | ImageContent)[] |
|
|
504
|
+
* (ThinkingContent | TextContent)[]` answers `TextContent[]`), so each arm
|
|
505
|
+
* filters its own array and converts its survivors through the checked
|
|
506
|
+
* narrowing — a predicate that kept an element it does not describe throws
|
|
507
|
+
* the TypeError. An arm with no such conversion leaves the fence in place. */
|
|
469
508
|
export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
|
|
470
509
|
const method = access.name.text;
|
|
471
|
-
if (method !== "map" && method !== "forEach")
|
|
510
|
+
if (method !== "map" && method !== "forEach" && method !== "filter")
|
|
472
511
|
return null;
|
|
473
512
|
if (!lowerer.isStdlibMember(access))
|
|
474
513
|
return null;
|
|
@@ -504,7 +543,7 @@ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
|
|
|
504
543
|
? valueArms[0]
|
|
505
544
|
: { kind: "union", unionId: lowerer.unions.intern(valueArms) };
|
|
506
545
|
const argNode = call.arguments.nodes[0];
|
|
507
|
-
const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [valueT], receiverT);
|
|
546
|
+
const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [valueT], receiverT, false, method === "map" ? (unitOnlyArrayElement(lowerer, call) ?? undefined) : undefined);
|
|
508
547
|
const fnRet = fnArg.type.ret;
|
|
509
548
|
if (method === "map" && fnRet.kind === "void") {
|
|
510
549
|
// `void[]` has no element (see the plain-receiver map path).
|
|
@@ -512,14 +551,50 @@ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
|
|
|
512
551
|
}
|
|
513
552
|
if (method === "map")
|
|
514
553
|
requireProducedArrayElement(lowerer, call, "'.map()'", fnRet);
|
|
515
|
-
|
|
516
|
-
|
|
554
|
+
if (method === "filter" && !filterPredicateOk(lowerer, fnRet)) {
|
|
555
|
+
if (fnRet.kind === "void") {
|
|
556
|
+
lowerer.unsupported("SC1090", call, "'.filter()' with a void-returning predicate (the callback return value is erased before its truthiness can be tested)");
|
|
557
|
+
}
|
|
558
|
+
lowerer.badType(call, lowerer.typeOf(call));
|
|
559
|
+
}
|
|
560
|
+
// `map` stores the callback's answer; `filter` keeps the elements its
|
|
561
|
+
// predicate named. The kept element is the CHECKER's result element, which
|
|
562
|
+
// for a written type predicate is narrower than every arm's own:
|
|
563
|
+
// `(b): b is TextContent` over `(TextContent | ImageContent)[] |
|
|
564
|
+
// (ThinkingContent | TextContent)[]` answers `TextContent[]`. Each arm
|
|
565
|
+
// filters its own concrete array and converts its survivors to that
|
|
566
|
+
// element through the checked narrowing — a predicate that kept an element
|
|
567
|
+
// it does not describe throws instead of misreading it. No conversion the
|
|
568
|
+
// arms cannot make honestly means the fence stays.
|
|
569
|
+
let outElem = VOID;
|
|
570
|
+
const narrowing = [];
|
|
571
|
+
if (method === "map") {
|
|
572
|
+
outElem = callbackArrayElement(lowerer, call, fnRet);
|
|
573
|
+
}
|
|
574
|
+
else if (method === "filter") {
|
|
575
|
+
const result = lowerer.mapTypeOf(lowerer.typeOf(call));
|
|
576
|
+
if (!result || result.kind !== "array")
|
|
577
|
+
return null;
|
|
578
|
+
outElem = result.elem;
|
|
579
|
+
const typeText = filterTypeText(lowerer, call);
|
|
580
|
+
for (const array of arrays) {
|
|
581
|
+
if (typeEquals(array.elem, outElem)) {
|
|
582
|
+
narrowing.push(null);
|
|
583
|
+
continue;
|
|
584
|
+
}
|
|
585
|
+
const helper = checkedFilterNarrowing(lowerer, array.elem, outElem, typeText, locOf(call));
|
|
586
|
+
if (helper === null)
|
|
587
|
+
return null;
|
|
588
|
+
narrowing.push(helper);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
const resultT = method === "forEach" ? VOID : arrayOf(outElem);
|
|
517
592
|
for (const array of arrays) {
|
|
518
593
|
const armFnT = funcOf([arrayValueType(lowerer, array.elem), F64, array].slice(0, arity), fnRet);
|
|
519
594
|
if (!lowerer.cleanFuncAdaptable(fnArg.type, armFnT))
|
|
520
595
|
return null;
|
|
521
596
|
}
|
|
522
|
-
const helper = arrayUnionHofHelper(lowerer, method, receiverT, arrays, fnArg.type, arity, fnRet, outElem, locOf(call));
|
|
597
|
+
const helper = arrayUnionHofHelper(lowerer, method, receiverT, arrays, fnArg.type, arity, fnRet, outElem, narrowing, locOf(call));
|
|
523
598
|
return {
|
|
524
599
|
kind: "call",
|
|
525
600
|
callee: helper,
|
|
@@ -531,9 +606,14 @@ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
|
|
|
531
606
|
loc: locOf(call),
|
|
532
607
|
};
|
|
533
608
|
}
|
|
534
|
-
function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arity, fnRet, outElem, loc) {
|
|
535
|
-
const resultT = method === "
|
|
536
|
-
|
|
609
|
+
function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arity, fnRet, outElem, narrowing, loc) {
|
|
610
|
+
const resultT = method === "forEach" ? VOID : arrayOf(outElem);
|
|
611
|
+
// A filter's per-arm conversions are part of what the helper does, so two
|
|
612
|
+
// sites that share receiver, callback and result but convert differently
|
|
613
|
+
// keep their own helper. `map`/`forEach` never narrow, and leaving their
|
|
614
|
+
// key untouched keeps the helpers a program already emitted byte-identical.
|
|
615
|
+
const narrowingKey = method === "filter" ? `:${narrowing.map((helper) => helper ?? "").join(",")}` : "";
|
|
616
|
+
const key = `union:${method}:${receiverT.unionId}:${typeKey(callbackT)}:${typeKey(resultT)}${narrowingKey}`;
|
|
537
617
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
538
618
|
if (existing)
|
|
539
619
|
return existing;
|
|
@@ -541,7 +621,7 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
|
|
|
541
621
|
lowerer.arrHofHelpers.set(key, name);
|
|
542
622
|
const receiver = varRef("a.0", receiverT, loc);
|
|
543
623
|
const callback = varRef("f.0", callbackT, loc);
|
|
544
|
-
const branch = (array) => {
|
|
624
|
+
const branch = (array, index) => {
|
|
545
625
|
const tag = lowerer.armTag(receiverT.unionId, array);
|
|
546
626
|
const concrete = {
|
|
547
627
|
kind: "unionNarrow",
|
|
@@ -556,16 +636,29 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
|
|
|
556
636
|
if (!typeEquals(adapted.type, armFnT)) {
|
|
557
637
|
throw new InternalCompilerError("lowerer bug: union-array callback stopped adapting");
|
|
558
638
|
}
|
|
559
|
-
const callee = arrayHofHelper(lowerer, method, array.elem, fnRet, arity, loc, outElem);
|
|
560
|
-
const invoke = {
|
|
639
|
+
const callee = arrayHofHelper(lowerer, method, array.elem, fnRet, arity, loc, method === "filter" ? array.elem : outElem);
|
|
640
|
+
const invoke = {
|
|
641
|
+
kind: "call",
|
|
642
|
+
callee,
|
|
643
|
+
args: [concrete, adapted],
|
|
644
|
+
type: method === "filter" ? arrayOf(array.elem) : resultT,
|
|
645
|
+
loc,
|
|
646
|
+
};
|
|
647
|
+
// Survivors of this arm's own array, converted to the checker's result
|
|
648
|
+
// element. The helper throws for a kept element the predicate does not
|
|
649
|
+
// describe, so a lying predicate never reinterprets a value.
|
|
650
|
+
const armNarrow = narrowing[index] ?? null;
|
|
651
|
+
const answer = armNarrow === null
|
|
652
|
+
? invoke
|
|
653
|
+
: { kind: "call", callee: armNarrow, args: [invoke], type: resultT, loc };
|
|
561
654
|
return resultT.kind === "void"
|
|
562
655
|
? [
|
|
563
656
|
{ kind: "exprStmt", expr: invoke, loc },
|
|
564
657
|
{ kind: "return", value: null, loc },
|
|
565
658
|
]
|
|
566
|
-
: [{ kind: "return", value:
|
|
659
|
+
: [{ kind: "return", value: answer, loc }];
|
|
567
660
|
};
|
|
568
|
-
let body = branch(arrays[arrays.length - 1]);
|
|
661
|
+
let body = branch(arrays[arrays.length - 1], arrays.length - 1);
|
|
569
662
|
for (let i = arrays.length - 2; i >= 0; i--) {
|
|
570
663
|
const array = arrays[i];
|
|
571
664
|
body = [
|
|
@@ -580,7 +673,7 @@ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arit
|
|
|
580
673
|
type: BOOL,
|
|
581
674
|
loc,
|
|
582
675
|
},
|
|
583
|
-
then: branch(array),
|
|
676
|
+
then: branch(array, i),
|
|
584
677
|
else_: body,
|
|
585
678
|
loc,
|
|
586
679
|
},
|
|
@@ -632,13 +725,13 @@ function filterRetainedValue(lowerer, v, elem, outElem, loc) {
|
|
|
632
725
|
* `arity` is the callback's declared parameter count (1–3): the loop
|
|
633
726
|
* passes the index and the receiver itself after the element when the
|
|
634
727
|
* callback names them, exactly the arguments JS supplies. */
|
|
635
|
-
function buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT = null, present = false, unread = false) {
|
|
728
|
+
function buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem, fastT = null, present = false, unread = false, withThis = false) {
|
|
636
729
|
const arrT = arrayOf(elem);
|
|
637
730
|
const valueT = callbackValueType(lowerer, elem, present);
|
|
638
731
|
const fnT = funcOf([valueT, F64, arrT].slice(0, arity), fnRet);
|
|
639
|
-
const locals = arrayCallbackLocals(arrT, fnT);
|
|
640
|
-
const params = arrayCallbackParams(arrT, fnT);
|
|
641
|
-
const callF = (arg) => callArrayCallback(arrT, fnT, fnRet, arity, arg, loc);
|
|
732
|
+
const locals = arrayCallbackLocals(arrT, fnT, withThis);
|
|
733
|
+
const params = arrayCallbackParams(arrT, fnT, withThis);
|
|
734
|
+
const callF = (arg) => callArrayCallback(arrT, fnT, fnRet, arity, arg, loc, withThis);
|
|
642
735
|
const getElem = callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc);
|
|
643
736
|
// What the callback takes: the element, or a placeholder for one it
|
|
644
737
|
// ignores (callbackValueRead's `unread`).
|
|
@@ -907,6 +1000,7 @@ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bind
|
|
|
907
1000
|
const argNode = call.arguments.nodes[0];
|
|
908
1001
|
if (!argNode)
|
|
909
1002
|
lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
|
|
1003
|
+
const thisArg = hofThisArg(lowerer, call);
|
|
910
1004
|
// find's result must be reachable from the element itself; a predicate
|
|
911
1005
|
// that narrows to another layout keeps the optional element visit.
|
|
912
1006
|
const present = presentElements(lowerer, call, elem) &&
|
|
@@ -930,17 +1024,17 @@ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bind
|
|
|
930
1024
|
method === "every" ||
|
|
931
1025
|
method === "findIndex" ||
|
|
932
1026
|
method === "findLastIndex") {
|
|
933
|
-
const fast = present || unread
|
|
1027
|
+
const fast = present || unread || thisArg !== null
|
|
934
1028
|
? null
|
|
935
1029
|
: lowerFastCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], 0, elem, arrT, { fnArg, arity }, bindUntyped);
|
|
936
1030
|
const fastT = fast?.type ?? null;
|
|
937
1031
|
const helper = method === "findIndex" || method === "findLastIndex"
|
|
938
|
-
? findIndexHelper(lowerer, elem, fnRet, arity, last, loc, callbackSite(fast ?? fnArg), fastT, present, unread)
|
|
939
|
-
: someEveryHelper(lowerer, method, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fastT, present, unread);
|
|
1032
|
+
? findIndexHelper(lowerer, elem, fnRet, arity, last, loc, callbackSite(fast ?? fnArg), fastT, present, unread, thisArg !== null)
|
|
1033
|
+
: someEveryHelper(lowerer, method, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fastT, present, unread, thisArg !== null);
|
|
940
1034
|
return {
|
|
941
1035
|
kind: "call",
|
|
942
1036
|
callee: helper,
|
|
943
|
-
args: [receiver, fnArg, ...(fast ? [fast] : [])],
|
|
1037
|
+
args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
|
|
944
1038
|
type: method === "findIndex" || method === "findLastIndex" ? F64 : BOOL,
|
|
945
1039
|
loc,
|
|
946
1040
|
};
|
|
@@ -962,8 +1056,14 @@ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bind
|
|
|
962
1056
|
if (undefTag < 0)
|
|
963
1057
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
964
1058
|
const retag = findResultRetag(lowerer, call, argNode, method, valueT, resultT, unchangedElement);
|
|
965
|
-
const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, callbackSite(fnArg), present, unread);
|
|
966
|
-
return {
|
|
1059
|
+
const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, callbackSite(fnArg), present, unread, thisArg !== null);
|
|
1060
|
+
return {
|
|
1061
|
+
kind: "call",
|
|
1062
|
+
callee: helper,
|
|
1063
|
+
args: [receiver, fnArg, ...(thisArg ? [thisArg] : [])],
|
|
1064
|
+
type: resultT,
|
|
1065
|
+
loc,
|
|
1066
|
+
};
|
|
967
1067
|
}
|
|
968
1068
|
/** The retag helper that converts a found element into find's result union,
|
|
969
1069
|
* or null when the element converts directly. Only an inline callback with
|
|
@@ -1017,9 +1117,9 @@ export function predicateToBoolean(e) {
|
|
|
1017
1117
|
* for (i = 0; i < n; i++) { v = a[i]; if (f(v)) return <v as result arm>; }
|
|
1018
1118
|
* return <undefined arm>;
|
|
1019
1119
|
*/
|
|
1020
|
-
function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, site = "", present = false, unread = false) {
|
|
1120
|
+
function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag, site = "", present = false, unread = false, withThis = false) {
|
|
1021
1121
|
const method = last ? "findLast" : "find";
|
|
1022
|
-
const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}${site}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
|
|
1122
|
+
const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}${site}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
|
|
1023
1123
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
1024
1124
|
if (existing)
|
|
1025
1125
|
return existing;
|
|
@@ -1056,7 +1156,7 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, r
|
|
|
1056
1156
|
...arraySlotSnapshot(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, FILTER_SNAPSHOT, loc),
|
|
1057
1157
|
{
|
|
1058
1158
|
kind: "if",
|
|
1059
|
-
cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, placeholder ?? v, loc)),
|
|
1159
|
+
cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, placeholder ?? v, loc, withThis)),
|
|
1060
1160
|
then: [
|
|
1061
1161
|
{
|
|
1062
1162
|
kind: "return",
|
|
@@ -1072,7 +1172,7 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, r
|
|
|
1072
1172
|
read,
|
|
1073
1173
|
{
|
|
1074
1174
|
kind: "if",
|
|
1075
|
-
cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, v, loc)),
|
|
1175
|
+
cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, v, loc, withThis)),
|
|
1076
1176
|
then: [{ kind: "return", value: found, loc }],
|
|
1077
1177
|
else_: null,
|
|
1078
1178
|
loc,
|
|
@@ -1089,10 +1189,10 @@ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, r
|
|
|
1089
1189
|
];
|
|
1090
1190
|
lowerer.liftedFns.push({
|
|
1091
1191
|
name,
|
|
1092
|
-
params: arrayCallbackParams(arrT, fnT),
|
|
1192
|
+
params: arrayCallbackParams(arrT, fnT, withThis),
|
|
1093
1193
|
returnType: resultT,
|
|
1094
1194
|
locals: [
|
|
1095
|
-
...arrayCallbackLocals(arrT, fnT),
|
|
1195
|
+
...arrayCallbackLocals(arrT, fnT, withThis),
|
|
1096
1196
|
{ id: "v.0", name: "v", type: valueT, mutable: false },
|
|
1097
1197
|
...(ignored
|
|
1098
1198
|
? slotSnapshotLocals(lowerer, elem, FILTER_SNAPSHOT).filter((l) => l.id !== "v.0")
|
|
@@ -1120,9 +1220,9 @@ function findFoundValue(lowerer, v, resultT, retag, loc) {
|
|
|
1120
1220
|
*
|
|
1121
1221
|
* n = a.length; for (...) if (f(a[i], i, a)) return i; return -1;
|
|
1122
1222
|
*/
|
|
1123
|
-
function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fastT = null, present = false, unread = false) {
|
|
1223
|
+
function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fastT = null, present = false, unread = false, withThis = false) {
|
|
1124
1224
|
const method = last ? "findLastIndex" : "findIndex";
|
|
1125
|
-
const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
|
|
1225
|
+
const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
|
|
1126
1226
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
1127
1227
|
if (existing)
|
|
1128
1228
|
return existing;
|
|
@@ -1144,7 +1244,7 @@ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fast
|
|
|
1144
1244
|
const visit = [
|
|
1145
1245
|
{
|
|
1146
1246
|
kind: "if",
|
|
1147
|
-
cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc)),
|
|
1247
|
+
cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc, withThis)),
|
|
1148
1248
|
then: [{ kind: "return", value: varRef("i.0", F64, loc), loc }],
|
|
1149
1249
|
else_: null,
|
|
1150
1250
|
loc,
|
|
@@ -1160,9 +1260,9 @@ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fast
|
|
|
1160
1260
|
];
|
|
1161
1261
|
lowerer.liftedFns.push(withFastCallback({
|
|
1162
1262
|
name,
|
|
1163
|
-
params: arrayCallbackParams(arrT, fnT),
|
|
1263
|
+
params: arrayCallbackParams(arrT, fnT, withThis),
|
|
1164
1264
|
returnType: F64,
|
|
1165
|
-
locals: [...arrayCallbackLocals(arrT, fnT)],
|
|
1265
|
+
locals: [...arrayCallbackLocals(arrT, fnT, withThis)],
|
|
1166
1266
|
body,
|
|
1167
1267
|
loc,
|
|
1168
1268
|
}, fastT, elem));
|
|
@@ -1173,8 +1273,8 @@ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc, site = "", fast
|
|
|
1173
1273
|
* some: n = a.length; for (...) if (f(a[i])) return true; return false;
|
|
1174
1274
|
* every: n = a.length; for (...) if (!f(a[i])) return false; return true;
|
|
1175
1275
|
*/
|
|
1176
|
-
function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false) {
|
|
1177
|
-
const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
|
|
1276
|
+
function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false, withThis = false) {
|
|
1277
|
+
const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
|
|
1178
1278
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
1179
1279
|
if (existing)
|
|
1180
1280
|
return existing;
|
|
@@ -1192,7 +1292,7 @@ function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fa
|
|
|
1192
1292
|
});
|
|
1193
1293
|
const arrT = arrayOf(elem);
|
|
1194
1294
|
const fnT = funcOf([callbackValueType(lowerer, elem, present), F64, arrT].slice(0, arity), fnRet);
|
|
1195
|
-
const callF = predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc));
|
|
1295
|
+
const callF = predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc, withThis));
|
|
1196
1296
|
const body = [
|
|
1197
1297
|
arrayLengthDeclaration(arrT, loc),
|
|
1198
1298
|
countedFor(loc, varRef("n.0", F64, loc), () => [
|
|
@@ -1218,9 +1318,9 @@ function someEveryHelper(lowerer, method, elem, fnRet, arity, loc, site = "", fa
|
|
|
1218
1318
|
];
|
|
1219
1319
|
lowerer.liftedFns.push(withFastCallback({
|
|
1220
1320
|
name,
|
|
1221
|
-
params: arrayCallbackParams(arrT, fnT),
|
|
1321
|
+
params: arrayCallbackParams(arrT, fnT, withThis),
|
|
1222
1322
|
returnType: BOOL,
|
|
1223
|
-
locals: [...arrayCallbackLocals(arrT, fnT)],
|
|
1323
|
+
locals: [...arrayCallbackLocals(arrT, fnT, withThis)],
|
|
1224
1324
|
body,
|
|
1225
1325
|
loc,
|
|
1226
1326
|
}, fastT, elem));
|
|
@@ -1239,6 +1339,7 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
|
|
|
1239
1339
|
const argNode = call.arguments.nodes[0];
|
|
1240
1340
|
if (!argNode)
|
|
1241
1341
|
lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
|
|
1342
|
+
const thisArg = hofThisArg(lowerer, call);
|
|
1242
1343
|
const present = presentElements(lowerer, call, elem);
|
|
1243
1344
|
const lowered = lowerArrayCallback(lowerer, argNode, [callbackValueType(lowerer, elem, present)], arrT);
|
|
1244
1345
|
const { fnArg, arity } = lowered;
|
|
@@ -1253,7 +1354,7 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
|
|
|
1253
1354
|
recv: { kind: "dynFrom", value: receiver, liveRef: true, type: DYN, loc },
|
|
1254
1355
|
method: "flatMap",
|
|
1255
1356
|
calleeName: ts.getTextOfNode(access),
|
|
1256
|
-
args: [{ kind: "dynFrom", value: fnArg, type: DYN, loc }],
|
|
1357
|
+
args: [{ kind: "dynFrom", value: fnArg, type: DYN, loc }, ...(thisArg ? [thisArg] : [])],
|
|
1257
1358
|
type: DYN,
|
|
1258
1359
|
loc,
|
|
1259
1360
|
};
|
|
@@ -1264,11 +1365,11 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
|
|
|
1264
1365
|
? flatMapUnionPlan(lowerer, call, argNode, fnRet)
|
|
1265
1366
|
: null;
|
|
1266
1367
|
if (plan) {
|
|
1267
|
-
const helper = flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present);
|
|
1368
|
+
const helper = flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present, thisArg !== null);
|
|
1268
1369
|
return {
|
|
1269
1370
|
kind: "call",
|
|
1270
1371
|
callee: helper,
|
|
1271
|
-
args: [receiver, fnArg],
|
|
1372
|
+
args: [receiver, fnArg, ...(thisArg ? [thisArg] : [])],
|
|
1272
1373
|
type: arrayOf(plan.outElem),
|
|
1273
1374
|
loc,
|
|
1274
1375
|
};
|
|
@@ -1284,32 +1385,32 @@ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
|
|
|
1284
1385
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
1285
1386
|
requireProducedArrayElement(lowerer, call, "'.flatMap()'", fnRet);
|
|
1286
1387
|
const outElem = callbackArrayElement(lowerer, call, fnRet);
|
|
1287
|
-
const fast = present || unread
|
|
1388
|
+
const fast = present || unread || thisArg !== null
|
|
1288
1389
|
? null
|
|
1289
1390
|
: lowerFastCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], 0, elem, arrT, {
|
|
1290
1391
|
fnArg,
|
|
1291
1392
|
arity,
|
|
1292
1393
|
});
|
|
1293
|
-
const helper = arrayHofHelper(lowerer, "flatMap", elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread);
|
|
1394
|
+
const helper = arrayHofHelper(lowerer, "flatMap", elem, fnRet, arity, loc, outElem, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread, thisArg !== null);
|
|
1294
1395
|
return {
|
|
1295
1396
|
kind: "call",
|
|
1296
1397
|
callee: helper,
|
|
1297
|
-
args: [receiver, fnArg, ...(fast ? [fast] : [])],
|
|
1398
|
+
args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
|
|
1298
1399
|
type: arrayOf(outElem),
|
|
1299
1400
|
loc,
|
|
1300
1401
|
};
|
|
1301
1402
|
}
|
|
1302
|
-
const fast = present || unread
|
|
1403
|
+
const fast = present || unread || thisArg !== null
|
|
1303
1404
|
? null
|
|
1304
1405
|
: lowerFastCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], 0, elem, arrT, {
|
|
1305
1406
|
fnArg,
|
|
1306
1407
|
arity,
|
|
1307
1408
|
});
|
|
1308
|
-
const helper = flatMapHelper(lowerer, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread);
|
|
1409
|
+
const helper = flatMapHelper(lowerer, elem, fnRet, arity, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, present, unread, thisArg !== null);
|
|
1309
1410
|
return {
|
|
1310
1411
|
kind: "call",
|
|
1311
1412
|
callee: helper,
|
|
1312
|
-
args: [receiver, fnArg, ...(fast ? [fast] : [])],
|
|
1413
|
+
args: [receiver, fnArg, ...(fast ? [fast] : []), ...(thisArg ? [thisArg] : [])],
|
|
1313
1414
|
type: fnRet,
|
|
1314
1415
|
loc,
|
|
1315
1416
|
};
|
|
@@ -1326,16 +1427,19 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
|
|
|
1326
1427
|
const arms = lowerer.unions.get(fnRet.unionId)?.arms;
|
|
1327
1428
|
if (!arms)
|
|
1328
1429
|
return null;
|
|
1329
|
-
// The
|
|
1430
|
+
// The constituents of the callback's checked result that can hold no
|
|
1431
|
+
// element: a `never[]` arm, and the empty tuple a bare `[]` arm infers
|
|
1432
|
+
// when the enclosing call has a contextual array type (`return x ? [a]
|
|
1433
|
+
// : []` in a `f(): T[]`).
|
|
1330
1434
|
const emptyArms = [];
|
|
1331
1435
|
const signature = lowerer.checker.getCallSignatures(lowerer.typeOf(argNode))[0];
|
|
1332
1436
|
if (signature) {
|
|
1333
1437
|
const ret = lowerer.checker.getReturnTypeOfSignature(signature);
|
|
1334
1438
|
for (const part of ret.isUnionType() ? ts.constituentTypes(ret) : [ret]) {
|
|
1335
|
-
if (!lowerer.checker.isArrayType(part))
|
|
1439
|
+
if (!lowerer.checker.isArrayType(part) && !lowerer.checker.isTupleType(part))
|
|
1336
1440
|
continue;
|
|
1337
|
-
const
|
|
1338
|
-
if (element
|
|
1441
|
+
const element = lowerer.checker.getTypeArguments(part)[0];
|
|
1442
|
+
if (element !== undefined && (element.flags & ts.TypeFlags.Never) === 0)
|
|
1339
1443
|
continue;
|
|
1340
1444
|
const mapped = lowerer.mapTypeOf(part);
|
|
1341
1445
|
if (mapped)
|
|
@@ -1352,6 +1456,7 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
|
|
|
1352
1456
|
return false;
|
|
1353
1457
|
return lowerer.armTag(outElem.unionId, t) >= 0;
|
|
1354
1458
|
};
|
|
1459
|
+
const tupleConverts = (arm) => (lowerer.shapes.get(arm.shapeId)?.fields ?? []).every((f) => converts(f.type));
|
|
1355
1460
|
const plan = [];
|
|
1356
1461
|
for (const arm of arms) {
|
|
1357
1462
|
if (arm.kind === "array" && emptyArms.some((e) => typeEquals(e, arm)))
|
|
@@ -1360,6 +1465,11 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
|
|
|
1360
1465
|
// undefined included, so its element type is the result's.
|
|
1361
1466
|
else if (arm.kind === "array" && typeEquals(arm.elem, outElem))
|
|
1362
1467
|
plan.push("spread");
|
|
1468
|
+
// A contextual array type makes a multi-statement body's `[pair]`
|
|
1469
|
+
// infer as a one-element TUPLE (`return x ? [pair] : []`), whose
|
|
1470
|
+
// fields contribute in order.
|
|
1471
|
+
else if (arm.kind === "record" && lowerer.shapes.get(arm.shapeId)?.tuple && tupleConverts(arm))
|
|
1472
|
+
plan.push("tuple");
|
|
1363
1473
|
else if (arm.kind !== "array" && converts(arm))
|
|
1364
1474
|
plan.push("value");
|
|
1365
1475
|
else
|
|
@@ -1370,10 +1480,10 @@ function flatMapUnionPlan(lowerer, call, argNode, fnRet) {
|
|
|
1370
1480
|
/** The flatMap loop over a union-returning callback: each result tests
|
|
1371
1481
|
* its arm and appends its elements, nothing, or itself (Node's
|
|
1372
1482
|
* IsArray decision per value). */
|
|
1373
|
-
function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
|
|
1483
|
+
function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present, withThis = false) {
|
|
1374
1484
|
// The plan is part of the key: one union result type can carry an empty
|
|
1375
1485
|
// `never[]` arm in one callback and a populated array arm in another.
|
|
1376
|
-
const key = `flatMapUnion:${typeKey(elem)}:${typeKey(fnRet)}:${typeKey(plan.outElem)}:${plan.arms.join(",")}:${arity}${present ? ":present" : ""}`;
|
|
1486
|
+
const key = `flatMapUnion:${typeKey(elem)}:${typeKey(fnRet)}:${typeKey(plan.outElem)}:${plan.arms.join(",")}:${arity}${present ? ":present" : ""}${withThis ? ":this" : ""}`;
|
|
1377
1487
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
1378
1488
|
if (existing)
|
|
1379
1489
|
return existing;
|
|
@@ -1394,7 +1504,7 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
|
|
|
1394
1504
|
loc,
|
|
1395
1505
|
});
|
|
1396
1506
|
const locals = [
|
|
1397
|
-
...arrayCallbackLocals(arrT, fnT),
|
|
1507
|
+
...arrayCallbackLocals(arrT, fnT, withThis),
|
|
1398
1508
|
{ id: "out.0", name: "out", type: outT, mutable: false },
|
|
1399
1509
|
{ id: "r.0", name: "r", type: fnRet, mutable: false },
|
|
1400
1510
|
];
|
|
@@ -1410,6 +1520,23 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
|
|
|
1410
1520
|
};
|
|
1411
1521
|
if (plan.arms[tag] === "empty")
|
|
1412
1522
|
return [];
|
|
1523
|
+
if (plan.arms[tag] === "tuple") {
|
|
1524
|
+
const tuple = arm;
|
|
1525
|
+
// The fields are stored by name ("0", "1", "10", "2", …): the
|
|
1526
|
+
// elements append in index order.
|
|
1527
|
+
const elements = [...(lowerer.shapes.get(tuple.shapeId)?.fields ?? [])].sort((a, b) => Number(a.name) - Number(b.name));
|
|
1528
|
+
return elements.map((field) => {
|
|
1529
|
+
const read = {
|
|
1530
|
+
kind: "recordGet",
|
|
1531
|
+
obj: narrowed,
|
|
1532
|
+
shapeId: tuple.shapeId,
|
|
1533
|
+
field: field.name,
|
|
1534
|
+
type: field.type,
|
|
1535
|
+
loc,
|
|
1536
|
+
};
|
|
1537
|
+
return arrayValueStore(lowerer, outRef(), outLength(), lowerer.coerceToExpected(read, plan.outElem), plan.outElem, loc);
|
|
1538
|
+
});
|
|
1539
|
+
}
|
|
1413
1540
|
if (plan.arms[tag] === "value") {
|
|
1414
1541
|
// A unit arm's value is the unit itself, which has no narrowed
|
|
1415
1542
|
// representation.
|
|
@@ -1522,7 +1649,7 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
|
|
|
1522
1649
|
{
|
|
1523
1650
|
kind: "varDecl",
|
|
1524
1651
|
localId: "r.0",
|
|
1525
|
-
init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc), loc),
|
|
1652
|
+
init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc), loc, withThis),
|
|
1526
1653
|
loc,
|
|
1527
1654
|
},
|
|
1528
1655
|
...dispatch,
|
|
@@ -1535,7 +1662,7 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
|
|
|
1535
1662
|
];
|
|
1536
1663
|
lowerer.liftedFns.push({
|
|
1537
1664
|
name,
|
|
1538
|
-
params: arrayCallbackParams(arrT, fnT),
|
|
1665
|
+
params: arrayCallbackParams(arrT, fnT, withThis),
|
|
1539
1666
|
returnType: outT,
|
|
1540
1667
|
locals,
|
|
1541
1668
|
body,
|
|
@@ -1552,8 +1679,8 @@ function flatMapUnionHelper(lowerer, elem, fnRet, arity, plan, loc, present) {
|
|
|
1552
1679
|
* }
|
|
1553
1680
|
* return out;
|
|
1554
1681
|
*/
|
|
1555
|
-
function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false) {
|
|
1556
|
-
const key = `flatMap:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}`;
|
|
1682
|
+
function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null, present = false, unread = false, withThis = false) {
|
|
1683
|
+
const key = `flatMap:${typeKey(elem)}:${typeKey(fnRet)}:${arity}${site}${fastT ? ":split" : ""}${present ? ":present" : ""}${unread ? ":unread" : ""}${withThis ? ":this" : ""}`;
|
|
1557
1684
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
1558
1685
|
if (existing)
|
|
1559
1686
|
return existing;
|
|
@@ -1638,7 +1765,7 @@ function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null
|
|
|
1638
1765
|
{
|
|
1639
1766
|
kind: "varDecl",
|
|
1640
1767
|
localId: "r.0",
|
|
1641
|
-
init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc),
|
|
1768
|
+
init: callArrayCallback(arrT, fnT, fnRet, arity, callbackValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, present, loc, unread), loc, withThis),
|
|
1642
1769
|
loc,
|
|
1643
1770
|
},
|
|
1644
1771
|
{
|
|
@@ -1664,10 +1791,10 @@ function flatMapHelper(lowerer, elem, fnRet, arity, loc, site = "", fastT = null
|
|
|
1664
1791
|
];
|
|
1665
1792
|
lowerer.liftedFns.push(withFastCallback({
|
|
1666
1793
|
name,
|
|
1667
|
-
params: arrayCallbackParams(arrT, fnT),
|
|
1794
|
+
params: arrayCallbackParams(arrT, fnT, withThis),
|
|
1668
1795
|
returnType: fnRet,
|
|
1669
1796
|
locals: [
|
|
1670
|
-
...arrayCallbackLocals(arrT, fnT),
|
|
1797
|
+
...arrayCallbackLocals(arrT, fnT, withThis),
|
|
1671
1798
|
{ id: "out.0", name: "out", type: fnRet, mutable: false },
|
|
1672
1799
|
{ id: "r.0", name: "r", type: fnRet, mutable: false },
|
|
1673
1800
|
{ id: "m.0", name: "m", type: F64, mutable: false },
|
|
@@ -1692,19 +1819,46 @@ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
|
|
|
1692
1819
|
if (!argNode)
|
|
1693
1820
|
lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
|
|
1694
1821
|
const hasInit = call.arguments.nodes.length === 2;
|
|
1695
|
-
const
|
|
1696
|
-
|
|
1697
|
-
if (
|
|
1822
|
+
const overrideT = lowerer.runtimeOptionalReduceTypes.get(call) ?? null;
|
|
1823
|
+
const staticAccT = overrideT ?? (hasInit ? lowerer.irTypeOf(call) : arrayValueType(lowerer, elem));
|
|
1824
|
+
if (staticAccT.kind === "void" || staticAccT.kind === "func")
|
|
1698
1825
|
lowerer.badType(call, lowerer.typeOf(call));
|
|
1699
|
-
const lowered = lowerArrayCallback(lowerer, argNode, [
|
|
1826
|
+
const lowered = lowerArrayCallback(lowerer, argNode, [staticAccT, arrayValueType(lowerer, elem)], arrT, false, staticAccT);
|
|
1700
1827
|
const { fnArg, arity } = lowered;
|
|
1828
|
+
// A JavaScript function with NO declared parameters whose body reads
|
|
1829
|
+
// `arguments` has that hidden slot as its whole ABI, which the synthetic
|
|
1830
|
+
// loop cannot fill: `callValue` passes exactly the declared parameters
|
|
1831
|
+
// (none), so the callback would see an empty `arguments` where JavaScript
|
|
1832
|
+
// passes (accumulator, element, index, array). Name the parameters
|
|
1833
|
+
// instead; that is the same value with a checkable type. Read the
|
|
1834
|
+
// callback's OWN type: the slot adaptation above (a dyn function boundary)
|
|
1835
|
+
// erases the hidden slot from `fnArg.type`. A callback that names its
|
|
1836
|
+
// parameters keeps working — `arguments` is built from the call's
|
|
1837
|
+
// arguments there, not from a hidden slot.
|
|
1838
|
+
if (lowered.rawType.kind === "func" &&
|
|
1839
|
+
lowered.rawType.params.length === 0 &&
|
|
1840
|
+
lowered.rawType.rest === true &&
|
|
1841
|
+
lowered.rawType.restAbi === undefined)
|
|
1842
|
+
lowerer.unsupported("SC1090", argNode, "a reduce callback that reads 'arguments' (name the parameters the callback uses)");
|
|
1843
|
+
// The callback's own answer is what the accumulator receives. An inline
|
|
1844
|
+
// lambda is contextually typed by the call (its returns coerce inside its
|
|
1845
|
+
// own lowering), but a function DECLARATION keeps its declared return. When
|
|
1846
|
+
// the checker's accumulator type cannot hold that value — `xs.reduce(function
|
|
1847
|
+
// () { count++ }, 1)` answers undefined, a program the checker already
|
|
1848
|
+
// diagnosed — the accumulator is the checked-dynamic value JavaScript
|
|
1849
|
+
// produces instead of a miscast (the untyped-reduce shape; see
|
|
1850
|
+
// accumulatorAdmitsAnswer).
|
|
1851
|
+
const accT = overrideT !== null || accumulatorAdmitsAnswer(lowerer, staticAccT, fnArg.type.ret)
|
|
1852
|
+
? staticAccT
|
|
1853
|
+
: DYN;
|
|
1701
1854
|
// Only an array that can hold elements outside its element type needs to
|
|
1702
|
-
// leave an element its callback ignores unread.
|
|
1855
|
+
// leave an element its callback ignores unread. A dynamic accumulator is
|
|
1856
|
+
// the untyped shape; it keeps the single visit and the callback's own ABI.
|
|
1703
1857
|
const unread = lowered.unread && elementMayBeForeign(lowerer, elem);
|
|
1704
|
-
const fast = unread
|
|
1858
|
+
const fast = unread || accT.kind === "dyn"
|
|
1705
1859
|
? null
|
|
1706
1860
|
: lowerFastCallback(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], 1, elem, arrT, { fnArg, arity }, false, accT);
|
|
1707
|
-
const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type
|
|
1861
|
+
const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type, hasInit, loc, callbackSite(fast ?? fnArg), fast?.type ?? null, unread);
|
|
1708
1862
|
const args = [receiver, fnArg];
|
|
1709
1863
|
if (hasInit)
|
|
1710
1864
|
args.push(lowerer.lowerExprExpecting(call.arguments.nodes[1], accT));
|
|
@@ -1714,6 +1868,33 @@ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
|
|
|
1714
1868
|
args.push(fast);
|
|
1715
1869
|
return { kind: "call", callee: helper, args, type: accT, loc };
|
|
1716
1870
|
}
|
|
1871
|
+
/** The accumulator's value as the callback's first parameter declares it.
|
|
1872
|
+
* Equal types pass the local straight through; a dynamic accumulator handed
|
|
1873
|
+
* to a typed parameter converts at the call (the callback is lowered first,
|
|
1874
|
+
* so its ABI is a fact and a value of another kind throws — "types don't
|
|
1875
|
+
* lie"). */
|
|
1876
|
+
function accumulatorArgument(lowerer, param, accT, loc) {
|
|
1877
|
+
const value = varRef("acc.0", accT, loc);
|
|
1878
|
+
return param === undefined || typeEquals(param, accT)
|
|
1879
|
+
? value
|
|
1880
|
+
: lowerer.coerceToExpected(value, param);
|
|
1881
|
+
}
|
|
1882
|
+
/** Whether the checker's accumulator type stores the callback's answer
|
|
1883
|
+
* itself. A scalar accumulator holds only its own scalar, and a void answer
|
|
1884
|
+
* (a callback with no return statement) is `undefined`; both leave the
|
|
1885
|
+
* checker's type unable to carry the value (a program the checker already
|
|
1886
|
+
* diagnosed), which the reduction accumulates dynamically instead of
|
|
1887
|
+
* miscasting. Every other pair keeps `coerceToExpected`'s static plan. */
|
|
1888
|
+
function accumulatorAdmitsAnswer(lowerer, accT, fnRet) {
|
|
1889
|
+
if (lowerer.coercibleValue(fnRet, accT))
|
|
1890
|
+
return true;
|
|
1891
|
+
if (fnRet.kind === "void" || isUnitType(fnRet))
|
|
1892
|
+
return false;
|
|
1893
|
+
return !(scalarKind(accT) && scalarKind(fnRet));
|
|
1894
|
+
}
|
|
1895
|
+
function scalarKind(t) {
|
|
1896
|
+
return t.kind === "f64" || t.kind === "string" || t.kind === "bool";
|
|
1897
|
+
}
|
|
1717
1898
|
/** The reduce/reduceRight loops, from existing IR nodes:
|
|
1718
1899
|
*
|
|
1719
1900
|
* with init: acc = z; n = a.length; for (...) acc = f(acc, a[i]); return acc;
|
|
@@ -1724,14 +1905,23 @@ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
|
|
|
1724
1905
|
* reduce walks 0→n-1, reduceRight n-1→0; the seed without an initial
|
|
1725
1906
|
* value is a[0] / a[n-1] and the loop starts one past it. The empty-array
|
|
1726
1907
|
* TypeError message is Node's exact message. */
|
|
1727
|
-
function reduceHelper(lowerer, method, elem, accT,
|
|
1908
|
+
function reduceHelper(lowerer, method, elem, accT, fnArg, hasInit, loc, site = "", fastT = null, unread = false) {
|
|
1909
|
+
// The callback's own ABI decides the helper's `f` slot: a dynamic
|
|
1910
|
+
// accumulator (accT) is coerced at the call and the store, so the closure
|
|
1911
|
+
// keeps the parameter types its lowering produced.
|
|
1912
|
+
const fnT = fnArg;
|
|
1913
|
+
const fnRet = fnT.ret;
|
|
1914
|
+
const arity = fnT.params.length;
|
|
1728
1915
|
const key = `${method}:${typeKey(elem)}:${typeKey(accT)}:${typeKey(fnRet)}:${arity}:${hasInit ? "init" : "seed"}${site}${fastT ? ":split" : ""}${unread ? ":unread" : ""}`;
|
|
1729
1916
|
const existing = lowerer.arrHofHelpers.get(key);
|
|
1730
1917
|
if (existing)
|
|
1731
1918
|
return existing;
|
|
1732
1919
|
const name = keyedHelperName(lowerer, `%arr.${method}`, key);
|
|
1733
1920
|
lowerer.arrHofHelpers.set(key, name);
|
|
1734
|
-
|
|
1921
|
+
// A dynamic accumulator stays out of the pipeline registry: the fused
|
|
1922
|
+
// loops type their accumulator from the checker's view (arrHofInfo), which
|
|
1923
|
+
// this shape contradicts.
|
|
1924
|
+
if (method === "reduce" && accT.kind !== "dyn")
|
|
1735
1925
|
lowerer.arrHofInfo.set(name, {
|
|
1736
1926
|
method,
|
|
1737
1927
|
elem,
|
|
@@ -1744,7 +1934,6 @@ function reduceHelper(lowerer, method, elem, accT, fnRet, arity, hasInit, loc, s
|
|
|
1744
1934
|
unread,
|
|
1745
1935
|
});
|
|
1746
1936
|
const arrT = arrayOf(elem);
|
|
1747
|
-
const fnT = funcOf([accT, arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
|
|
1748
1937
|
const n = varRef("n.0", F64, loc);
|
|
1749
1938
|
const i = varRef("i.0", F64, loc);
|
|
1750
1939
|
const right = method === "reduceRight";
|
|
@@ -1861,7 +2050,12 @@ function reduceHelper(lowerer, method, elem, accT, fnRet, arity, hasInit, loc, s
|
|
|
1861
2050
|
value: lowerer.coerceToExpected({
|
|
1862
2051
|
kind: "callValue",
|
|
1863
2052
|
callee: varRef("f.0", fnT, loc),
|
|
1864
|
-
args: [
|
|
2053
|
+
args: [
|
|
2054
|
+
accumulatorArgument(lowerer, fnT.params[0], accT, loc),
|
|
2055
|
+
visited(),
|
|
2056
|
+
i,
|
|
2057
|
+
varRef("a.0", arrT, loc),
|
|
2058
|
+
].slice(0, arity),
|
|
1865
2059
|
type: fnRet,
|
|
1866
2060
|
loc,
|
|
1867
2061
|
}, accT),
|
|
@@ -1985,16 +2179,20 @@ export function lowerArraySortCall(lowerer, call, access, elem, arrT) {
|
|
|
1985
2179
|
}
|
|
1986
2180
|
let fnArg = undefinedArg ?? lowerOptionalElementComparator(lowerer, argNode, unwrappedArg, elem, arrT);
|
|
1987
2181
|
// Reusable JS comparators often accept checked values. Adapt the array's
|
|
1988
|
-
// element ABI just as other array callbacks do before sorting.
|
|
2182
|
+
// element ABI just as other array callbacks do before sorting. A
|
|
2183
|
+
// comparator declaring MORE parameters than sort passes (`(a, b, loose?)`,
|
|
2184
|
+
// the imported semver shape) receives the surplus ones as undefined — the
|
|
2185
|
+
// completion an ordinary two-argument call performs — so it adapts to the
|
|
2186
|
+
// (a, b) slot like any other wider signature.
|
|
1989
2187
|
if (fnArg.type.kind === "func" &&
|
|
1990
|
-
fnArg.type.params.
|
|
1991
|
-
fnArg.type.params.every((param) => lowerer.coercibleValue(elem, param))) {
|
|
2188
|
+
fnArg.type.params.slice(2).every((param) => omittableTrailingParam(lowerer, param)) &&
|
|
2189
|
+
fnArg.type.params.slice(0, 2).every((param) => lowerer.coercibleValue(elem, param))) {
|
|
1992
2190
|
// Arithmetic on inferred JS values retains a checked result because
|
|
1993
2191
|
// it can produce BigInt. The sort callback still requires a number.
|
|
1994
2192
|
const result = fnArg.type.ret.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(argNode))
|
|
1995
2193
|
? F64
|
|
1996
2194
|
: fnArg.type.ret;
|
|
1997
|
-
const expected = funcOf(fnArg.type.params.map(() => elem), result);
|
|
2195
|
+
const expected = funcOf(fnArg.type.params.slice(0, 2).map(() => elem), result);
|
|
1998
2196
|
if (!typeEquals(fnArg.type, expected))
|
|
1999
2197
|
fnArg = lowerer.coerceToExpected(fnArg, expected);
|
|
2000
2198
|
}
|