@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
|
@@ -24,13 +24,16 @@
|
|
|
24
24
|
* same vector handles varying or inference-unknown JavaScript emit tuples
|
|
25
25
|
* when every known listener accepts checked-dynamic parameters or no
|
|
26
26
|
* parameters. Typed listener constraints keep the fixed-tuple refusal.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
* Unrestricted names on plain emitters take the checked-dynamic receiver's
|
|
28
|
+
* bridge. The remaining cases are fenced:
|
|
29
|
+
* unrestricted names on streams, symbol names, conflicting literal tuples,
|
|
30
|
+
* the meta-events' listener-function argument (meta listeners take at most
|
|
30
31
|
* the event name; dyn meta listeners fence — Node
|
|
31
32
|
* passes the listener function second, which has no dyn conversion), and
|
|
32
33
|
* listeners()/rawListeners() of an event with any dynamic
|
|
33
|
-
* registration
|
|
34
|
+
* registration, or, once the program registers a listener under an
|
|
35
|
+
* unrestricted name, of an event that literal names register with typed
|
|
36
|
+
* listeners (the bucket has no one honest element type).
|
|
34
37
|
*
|
|
35
38
|
* Two special names: 'error' is forced to the one-%Error tuple (emit
|
|
36
39
|
* routes through emitter.emitError — no listener means the payload
|
|
@@ -44,9 +47,15 @@
|
|
|
44
47
|
* super.emit as the prototype chain). */
|
|
45
48
|
import { keyedHelperName } from "./stable-names.js";
|
|
46
49
|
import { checkKeypressListener } from "./builtins/readline.js";
|
|
50
|
+
import { stripTypeCasts } from "./builtins/arguments.js";
|
|
47
51
|
import * as ts from "../ts7/adapter.js";
|
|
48
52
|
import { dynFallbackType, newFnCtx } from "./lowerer.js";
|
|
49
53
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
54
|
+
import { bodyReadsArguments } from "../arguments-usage.js";
|
|
55
|
+
import { nullishExprUnitOf, stripValueWrappers } from "./binding-analysis.js";
|
|
56
|
+
import { isPureReference } from "./effect-free.js";
|
|
57
|
+
import { functionUsesThis } from "./cjs-exports-object.js";
|
|
58
|
+
import { isThisParameter } from "./call-signatures.js";
|
|
50
59
|
import { arrayOf, BOOL, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, isDynTypedRefType, DYN, F64, isUnitType, STRING, typeEquals, typeKey, VOID, } from "../../ir/ir.js";
|
|
51
60
|
import { STREAM_FORCED_EVENT_NAMES, streamForcedTuple, streamSidesOf } from "./lower-stream.js";
|
|
52
61
|
import { boolLit, dynUndefinedExpr, strLit, varRef } from "../../ir/build.js";
|
|
@@ -70,6 +79,47 @@ const REGISTER_MEMBERS = new Set([
|
|
|
70
79
|
"prependOnceListener",
|
|
71
80
|
]);
|
|
72
81
|
const META_EVENTS = new Set(["newListener", "removeListener"]);
|
|
82
|
+
/** Whether `t` is an instance type of the Error hierarchy. */
|
|
83
|
+
function rootsAtError(lowerer, t) {
|
|
84
|
+
if (t?.kind !== "object")
|
|
85
|
+
return false;
|
|
86
|
+
for (let c = lowerer.classes.get(t.className) ?? null; c; c = c.base) {
|
|
87
|
+
if (c.def.name === "%Error")
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
/** Whether the scan recorded a dyn-flavored 'newListener' or 'removeListener'
|
|
93
|
+
* listener. Then every listener registers through the adapter, typed meta
|
|
94
|
+
* listeners included, so each entry has a function value to pass. */
|
|
95
|
+
function hasDynMetaListener(table) {
|
|
96
|
+
return [...META_EVENTS].some((meta) => table.get(meta)?.dynListener === true);
|
|
97
|
+
}
|
|
98
|
+
/** Whether a typed listener of `name` registers through the dyn adapter, so
|
|
99
|
+
* its entry holds a checked-dynamic function value: a dyn-flavored
|
|
100
|
+
* 'newListener' or 'removeListener' listener receives every added or
|
|
101
|
+
* removed listener as one, and a read listener array beside dyn-flavored
|
|
102
|
+
* listeners holds them. Listeners of 'error' and errorMonitor do when an
|
|
103
|
+
* emit passes a payload that is not an Error: the adapter's checked
|
|
104
|
+
* conversion admits it or throws a TypeError. */
|
|
105
|
+
function registersAsDyn(lowerer, name, streamForced) {
|
|
106
|
+
const table = emitterEvents(lowerer);
|
|
107
|
+
if (hasDynMetaListener(table))
|
|
108
|
+
return true;
|
|
109
|
+
if ((name === "error" || name === ERROR_MONITOR_EVENT) && table.get("error")?.valueEmit === true)
|
|
110
|
+
return true;
|
|
111
|
+
const sig = streamForced ? undefined : table.get(name);
|
|
112
|
+
return sig?.dynListener === true && sig.listenersRead === true;
|
|
113
|
+
}
|
|
114
|
+
/** Whether the event's listener array is read as checked-dynamic values:
|
|
115
|
+
* its registrations all hold a checked-dynamic function value (flexible
|
|
116
|
+
* and computed-name events, or a dyn-flavored listener beside a read of
|
|
117
|
+
* the array). */
|
|
118
|
+
function listenerArrayIsDyn(lowerer, name, sig) {
|
|
119
|
+
return ((sig?.dynListener === true && sig.listenersRead === true) ||
|
|
120
|
+
flexibleJsEvent(name, sig) ||
|
|
121
|
+
computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, name)));
|
|
122
|
+
}
|
|
73
123
|
function flexibleJsEvent(name, sig) {
|
|
74
124
|
// A stream may be upcast to EventEmitter. Its runtime-emitted payloads
|
|
75
125
|
// keep their fixed ABI even when the static receiver looks ordinary.
|
|
@@ -115,6 +165,7 @@ function emitterEvents(lowerer) {
|
|
|
115
165
|
return lowerer.emitterEventTable;
|
|
116
166
|
const table = new Map();
|
|
117
167
|
const computedPatterns = [];
|
|
168
|
+
let anyNameListener = false;
|
|
118
169
|
const sigOf = (name) => {
|
|
119
170
|
let sig = table.get(name);
|
|
120
171
|
if (!sig)
|
|
@@ -223,25 +274,62 @@ function emitterEvents(lowerer) {
|
|
|
223
274
|
}
|
|
224
275
|
}
|
|
225
276
|
};
|
|
277
|
+
// Events whose listener array is read; applied to the table after the
|
|
278
|
+
// walk, so a read alone adds no entry.
|
|
279
|
+
const listenersRead = new Set();
|
|
226
280
|
for (const sf of lowerer.program.getImplementationSourceFiles()) {
|
|
227
281
|
if (sf.isDeclarationFile)
|
|
228
282
|
continue;
|
|
229
283
|
const walk = (node) => {
|
|
230
284
|
ts.forEachChild(node, walk);
|
|
231
|
-
if (!ts.isCallExpression(node)
|
|
285
|
+
if (!ts.isCallExpression(node))
|
|
286
|
+
return;
|
|
287
|
+
const callee = node.expression;
|
|
288
|
+
if ((ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) &&
|
|
289
|
+
(ts.isIdentifier(callee) ? callee : callee.name).text === "getEventListeners" &&
|
|
290
|
+
node.arguments.nodes.length === 2) {
|
|
291
|
+
const key = scannedEventKey(lowerer, node.arguments.nodes[1]);
|
|
292
|
+
if (key !== null && key !== ERROR_MONITOR_EVENT)
|
|
293
|
+
listenersRead.add(key);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (!ts.isPropertyAccessExpression(callee))
|
|
297
|
+
return;
|
|
298
|
+
let member = callee.name.text;
|
|
299
|
+
let recvNode = callee.expression;
|
|
300
|
+
let callArgs = node.arguments.nodes;
|
|
301
|
+
// `R.<method>.call(thisArg, ...args)` runs the method on thisArg
|
|
302
|
+
// (lowerEmitterMethodValueCall in lower-calls.ts).
|
|
303
|
+
if (member === "call" &&
|
|
304
|
+
ts.isPropertyAccessExpression(callee.expression) &&
|
|
305
|
+
callArgs.length > 0) {
|
|
306
|
+
member = callee.expression.name.text;
|
|
307
|
+
recvNode = callArgs[0];
|
|
308
|
+
callArgs = callArgs.slice(1);
|
|
309
|
+
}
|
|
310
|
+
if (member === "listeners" || member === "rawListeners") {
|
|
311
|
+
const arg = callArgs[0];
|
|
312
|
+
try {
|
|
313
|
+
if (!arg || !scannedEmitterInfo(lowerer, lowerer.mapTypeOf(lowerer.typeOf(recvNode))))
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const key = scannedEventKey(lowerer, arg);
|
|
320
|
+
if (key !== null && key !== ERROR_MONITOR_EVENT)
|
|
321
|
+
listenersRead.add(key);
|
|
232
322
|
return;
|
|
233
|
-
|
|
323
|
+
}
|
|
234
324
|
const isEmit = member === "emit";
|
|
235
325
|
if (!isEmit && !REGISTER_MEMBERS.has(member))
|
|
236
326
|
return;
|
|
237
|
-
const arg0 =
|
|
327
|
+
const arg0 = callArgs[0];
|
|
238
328
|
if (!arg0)
|
|
239
329
|
return;
|
|
240
330
|
let recvT = null;
|
|
241
|
-
let nameT = null;
|
|
242
331
|
try {
|
|
243
|
-
recvT = lowerer.mapTypeOf(lowerer.typeOf(
|
|
244
|
-
nameT = lowerer.typeOf(arg0);
|
|
332
|
+
recvT = lowerer.mapTypeOf(lowerer.typeOf(recvNode));
|
|
245
333
|
}
|
|
246
334
|
catch {
|
|
247
335
|
return; // checker trouble is the lowering's business, not the scan's
|
|
@@ -249,11 +337,7 @@ function emitterEvents(lowerer) {
|
|
|
249
337
|
const info = scannedEmitterInfo(lowerer, recvT);
|
|
250
338
|
if (!info)
|
|
251
339
|
return;
|
|
252
|
-
const literal =
|
|
253
|
-
? ERROR_MONITOR_EVENT
|
|
254
|
-
: nameT.isStringLiteralType()
|
|
255
|
-
? literalEventKey(nameT.value)
|
|
256
|
-
: null;
|
|
340
|
+
const literal = scannedEventKey(lowerer, arg0);
|
|
257
341
|
if (literal === null) {
|
|
258
342
|
const pattern = computedEventPatternOf(lowerer, arg0);
|
|
259
343
|
if (pattern &&
|
|
@@ -261,9 +345,54 @@ function emitterEvents(lowerer) {
|
|
|
261
345
|
!computedPatternOverlapsReserved(pattern)) {
|
|
262
346
|
computedPatterns.push({ ...pattern, listener: !isEmit });
|
|
263
347
|
}
|
|
348
|
+
// A listener under an unrestricted name may receive any event
|
|
349
|
+
// (lowerFlexListenerCall's any-name path).
|
|
350
|
+
if (!pattern && !isEmit && streamSidesOf(lowerer, info) === null)
|
|
351
|
+
anyNameListener = true;
|
|
264
352
|
return;
|
|
265
353
|
}
|
|
266
354
|
const name = literal;
|
|
355
|
+
if (META_EVENTS.has(name) && !isEmit && callArgs[1]) {
|
|
356
|
+
// A dyn-flavored meta listener receives each added or removed
|
|
357
|
+
// listener as a checked-dynamic function value. The scan cannot
|
|
358
|
+
// lower the listener as dynListenerFlavor does, so it counts every
|
|
359
|
+
// listener that is not statically a typed function: a factory's
|
|
360
|
+
// result (a wrapper whose runtime value is checked-dynamic), a
|
|
361
|
+
// JavaScript function without parameters, and the dyn-flavored
|
|
362
|
+
// forms. Counting one too many only routes more registrations
|
|
363
|
+
// through the adapter.
|
|
364
|
+
const cbNode = callArgs[1];
|
|
365
|
+
let typed = false;
|
|
366
|
+
try {
|
|
367
|
+
const cbCt = lowerer.typeOf(cbNode);
|
|
368
|
+
const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer, cbNode, cbCt);
|
|
369
|
+
typed =
|
|
370
|
+
cbT?.kind === "func" &&
|
|
371
|
+
!ts.isCallExpression(stripTypeCasts(cbNode)) &&
|
|
372
|
+
!(cbT.params.length === 0 && isJsSourceFile(sf)) &&
|
|
373
|
+
!cbT.params.some((p) => p.kind === "dyn") &&
|
|
374
|
+
!readsArgumentsPack(lowerer, cbNode);
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
typed = false;
|
|
378
|
+
}
|
|
379
|
+
if (!typed)
|
|
380
|
+
table.get(name).dynListener = true;
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (isEmit && name === "error") {
|
|
384
|
+
try {
|
|
385
|
+
const payload = callArgs.slice(1);
|
|
386
|
+
if (payload.length !== 1 ||
|
|
387
|
+
!rootsAtError(lowerer, lowerer.mapTypeOf(lowerer.typeOf(payload[0])))) {
|
|
388
|
+
table.get("error").valueEmit = true;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
table.get("error").valueEmit = true;
|
|
393
|
+
}
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
267
396
|
if (META_EVENTS.has(name) || name === "error" || name === ERROR_MONITOR_EVENT)
|
|
268
397
|
return; // forced tuples
|
|
269
398
|
// Stream receivers' runtime-emitted events carry PER-BASE forced
|
|
@@ -274,16 +403,18 @@ function emitterEvents(lowerer) {
|
|
|
274
403
|
return;
|
|
275
404
|
try {
|
|
276
405
|
if (isEmit) {
|
|
277
|
-
mergeEmit(name,
|
|
406
|
+
mergeEmit(name, callArgs.slice(1).map((a) => lowerer.mapTypeOf(lowerer.typeOf(a))), isJsSourceFile(sf));
|
|
278
407
|
}
|
|
279
|
-
else if (
|
|
280
|
-
const cbCt = lowerer.typeOf(
|
|
281
|
-
const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer,
|
|
408
|
+
else if (callArgs[1]) {
|
|
409
|
+
const cbCt = lowerer.typeOf(callArgs[1]);
|
|
410
|
+
const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer, callArgs[1], cbCt);
|
|
411
|
+
const pack = readsArgumentsPack(lowerer, callArgs[1]);
|
|
282
412
|
// A TypeScript listener with no parameters is typed too: it
|
|
283
413
|
// registers without the adapter, so an untyped emit reaches it
|
|
284
414
|
// only through the event's fixed ABI. A JavaScript function
|
|
285
415
|
// without parameters can still read `arguments`.
|
|
286
|
-
if (
|
|
416
|
+
if (!pack &&
|
|
417
|
+
cbT?.kind !== "dyn" &&
|
|
287
418
|
(cbT?.kind !== "func" ||
|
|
288
419
|
(cbT.params.length === 0 && !isJsSourceFile(sf)) ||
|
|
289
420
|
cbT.params.some((p) => p.kind !== "dyn"))) {
|
|
@@ -295,7 +426,8 @@ function emitterEvents(lowerer) {
|
|
|
295
426
|
// tuple position, and positions past the tuple read the boxed
|
|
296
427
|
// undefined (exactly JS's extra-parameter semantics).
|
|
297
428
|
if (cbT?.kind === "dyn" ||
|
|
298
|
-
(cbT?.kind === "func" && cbT.params.some((p) => p.kind === "dyn"))
|
|
429
|
+
(cbT?.kind === "func" && cbT.params.some((p) => p.kind === "dyn")) ||
|
|
430
|
+
pack) {
|
|
299
431
|
const sig = sigOf(name);
|
|
300
432
|
sig.hasListener = true;
|
|
301
433
|
sig.dynListener = true;
|
|
@@ -311,8 +443,14 @@ function emitterEvents(lowerer) {
|
|
|
311
443
|
};
|
|
312
444
|
walk(sf);
|
|
313
445
|
}
|
|
446
|
+
for (const name of listenersRead) {
|
|
447
|
+
const sig = table.get(name);
|
|
448
|
+
if (sig)
|
|
449
|
+
sig.listenersRead = true;
|
|
450
|
+
}
|
|
314
451
|
lowerer.emitterEventTable = table;
|
|
315
452
|
lowerer.emitterComputedPatterns = computedPatterns;
|
|
453
|
+
lowerer.emitterAnyNameListener = anyNameListener;
|
|
316
454
|
return table;
|
|
317
455
|
}
|
|
318
456
|
function computedPatterns(lowerer) {
|
|
@@ -383,14 +521,108 @@ function isErrorMonitorRef(lowerer, arg) {
|
|
|
383
521
|
const property = lowerer.checker.getPropertyOfType(lowerer.typeOf(variable.initializer), key.text);
|
|
384
522
|
return property !== undefined && isMonitorType(lowerer.checker.getTypeOfSymbol(property));
|
|
385
523
|
}
|
|
524
|
+
/** A name expression whose evaluation has no effects: a string or number
|
|
525
|
+
* literal, a `null`, `true` or `false` keyword, a binding read, or a stored
|
|
526
|
+
* field or record entry read. A call or an accessor lowers as a run-time
|
|
527
|
+
* name so its effects still run. */
|
|
528
|
+
function staticNameExpr(lowerer, arg) {
|
|
529
|
+
const expression = stripValueWrappers(arg);
|
|
530
|
+
if (ts.isStringLiteral(expression) ||
|
|
531
|
+
ts.isNoSubstitutionTemplateLiteral(expression) ||
|
|
532
|
+
ts.isNumericLiteral(expression) ||
|
|
533
|
+
expression.kind === ts.SyntaxKind.NullKeyword ||
|
|
534
|
+
expression.kind === ts.SyntaxKind.TrueKeyword ||
|
|
535
|
+
expression.kind === ts.SyntaxKind.FalseKeyword) {
|
|
536
|
+
return true;
|
|
537
|
+
}
|
|
538
|
+
return isPureReference(lowerer, expression) || staticStdlibRead(lowerer, expression);
|
|
539
|
+
}
|
|
540
|
+
/** A read of a standard library field (`events.errorMonitor`,
|
|
541
|
+
* `EventEmitter.errorMonitor`): a plain member of the standard library's
|
|
542
|
+
* declaration, so it runs no program code. */
|
|
543
|
+
function staticStdlibRead(lowerer, node) {
|
|
544
|
+
if (!ts.isPropertyAccessExpression(node) || node.questionDotToken)
|
|
545
|
+
return false;
|
|
546
|
+
if (!isPureReference(lowerer, node.expression))
|
|
547
|
+
return false;
|
|
548
|
+
const symbol = lowerer.checker.getSymbolAtLocation(node.name);
|
|
549
|
+
return (symbol !== undefined &&
|
|
550
|
+
lowerer.isStdlibSymbol(symbol) &&
|
|
551
|
+
(symbol.flags &
|
|
552
|
+
(ts.SymbolFlags.GetAccessor | ts.SymbolFlags.SetAccessor | ts.SymbolFlags.Method)) ===
|
|
553
|
+
0);
|
|
554
|
+
}
|
|
386
555
|
/** A compile-time event key (literalEventKey): a string-literal TYPE
|
|
387
556
|
* (const bindings and literal unions of one member count — the
|
|
388
|
-
* staticHeaderKeyOf stance) or the errorMonitor symbol
|
|
557
|
+
* staticHeaderKeyOf stance) or the errorMonitor symbol, read without
|
|
558
|
+
* effects. A number-literal type read without effects and a `null`,
|
|
559
|
+
* `undefined`, `true` or `false` literal name the string Node's listener
|
|
560
|
+
* table keys them by, the property key `String(name)`: `on(123, fn)`
|
|
561
|
+
* registers under '123'. */
|
|
389
562
|
function literalEventName(lowerer, arg) {
|
|
390
|
-
|
|
563
|
+
const staticName = staticNameExpr(lowerer, arg);
|
|
564
|
+
if (staticName && isErrorMonitorRef(lowerer, arg))
|
|
391
565
|
return ERROR_MONITOR_EVENT;
|
|
392
|
-
|
|
393
|
-
|
|
566
|
+
if (staticName) {
|
|
567
|
+
const t = lowerer.typeOf(arg);
|
|
568
|
+
if (t.isStringLiteralType())
|
|
569
|
+
return literalEventKey(t.value);
|
|
570
|
+
if (t.isNumberLiteralType())
|
|
571
|
+
return literalEventKey(String(t.value));
|
|
572
|
+
}
|
|
573
|
+
const unit = nullishExprUnitOf(lowerer, arg);
|
|
574
|
+
if (unit !== null)
|
|
575
|
+
return unit;
|
|
576
|
+
let expression = arg;
|
|
577
|
+
while (ts.isParenthesizedExpression(expression))
|
|
578
|
+
expression = expression.expression;
|
|
579
|
+
if (expression.kind === ts.SyntaxKind.TrueKeyword)
|
|
580
|
+
return "true";
|
|
581
|
+
if (expression.kind === ts.SyntaxKind.FalseKeyword)
|
|
582
|
+
return "false";
|
|
583
|
+
return null;
|
|
584
|
+
}
|
|
585
|
+
/** An event-name argument as the string Node's listener table keys it by:
|
|
586
|
+
* a compile-time key, or a string, number or boolean value (or a union of
|
|
587
|
+
* those with null and undefined) converted as a property key
|
|
588
|
+
* (`String(name)`). An untyped value converts with the dynamic ToString,
|
|
589
|
+
* as the untyped emitter entries do. Other names are refused at the
|
|
590
|
+
* argument. */
|
|
591
|
+
function eventNameArg(lowerer, member, arg) {
|
|
592
|
+
const key = literalEventName(lowerer, arg);
|
|
593
|
+
if (key !== null)
|
|
594
|
+
return eventNameExpr(key, locOf(arg));
|
|
595
|
+
const value = lowerer.lowerExpr(arg);
|
|
596
|
+
if (value.type.kind === "string")
|
|
597
|
+
return value;
|
|
598
|
+
const converts = (t) => t.kind === "string" || t.kind === "f64" || t.kind === "bool" || isUnitType(t);
|
|
599
|
+
const union = value.type.kind === "union" ? lowerer.unions.get(value.type.unionId) : undefined;
|
|
600
|
+
if (value.type.kind === "f64" ||
|
|
601
|
+
value.type.kind === "bool" ||
|
|
602
|
+
value.type.kind === "dyn" ||
|
|
603
|
+
(union !== undefined && union.arms.every(converts))) {
|
|
604
|
+
return { kind: "toString", operand: value, type: STRING, loc: value.loc };
|
|
605
|
+
}
|
|
606
|
+
lowerer.noLowering(`${member} with a '${lowerer.fmt(value.type)}' event name`, arg, "event names lower as strings, numbers and booleans (symbol names have no lowering)");
|
|
607
|
+
}
|
|
608
|
+
/** Whether a name that is neither a compile-time key nor a computed name
|
|
609
|
+
* with a constant prefix or suffix reaches the emitter through the bridge
|
|
610
|
+
* typed code uses for untyped receivers (lowerDynamicEmitterOn and
|
|
611
|
+
* lowerDynamicEmitterEmit): the runtime matches the name against the
|
|
612
|
+
* events typed code fixes, and keeps Node's 'error' and meta-event behavior
|
|
613
|
+
* for any other name. Streams keep their fixed internal events. */
|
|
614
|
+
function bridgesUnrestrictedName(lowerer, info, arg) {
|
|
615
|
+
return computedEventPatternOf(lowerer, arg) === null && streamSidesOf(lowerer, info) === null;
|
|
616
|
+
}
|
|
617
|
+
/** literalEventName for the event table's scan, which leaves checker
|
|
618
|
+
* trouble to the lowering: null when the name's type cannot be read. */
|
|
619
|
+
function scannedEventKey(lowerer, arg) {
|
|
620
|
+
try {
|
|
621
|
+
return literalEventName(lowerer, arg);
|
|
622
|
+
}
|
|
623
|
+
catch {
|
|
624
|
+
return null;
|
|
625
|
+
}
|
|
394
626
|
}
|
|
395
627
|
/** The compile-time key for a literal-only operation, or a pointed fence. */
|
|
396
628
|
function eventNameOf(lowerer, member, arg) {
|
|
@@ -467,6 +699,16 @@ function patternMatchesName(pattern, key) {
|
|
|
467
699
|
const name = eventKeyName(key);
|
|
468
700
|
return name.startsWith(pattern.prefix) && name.endsWith(pattern.suffix);
|
|
469
701
|
}
|
|
702
|
+
/** Whether a listener registered under a computed name may sit in the
|
|
703
|
+
* bucket of the event keyed `key`: a pattern registration that matches it,
|
|
704
|
+
* or any registration under an unrestricted name (a string, so never the
|
|
705
|
+
* errorMonitor key). Such a listener crossed
|
|
706
|
+
* the checked-dynamic boundary, so the bucket has no one static signature. */
|
|
707
|
+
function computedListenerMayHold(lowerer, key) {
|
|
708
|
+
emitterEvents(lowerer);
|
|
709
|
+
return ((lowerer.emitterAnyNameListener && key !== ERROR_MONITOR_EVENT) ||
|
|
710
|
+
computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, key)));
|
|
711
|
+
}
|
|
470
712
|
/** A computed event can use the variable-arity dyn path only when its
|
|
471
713
|
* syntax proves a nonempty prefix or suffix excluding internal events. */
|
|
472
714
|
function computedEventPattern(lowerer, info, member, arg) {
|
|
@@ -483,7 +725,7 @@ function computedEventPattern(lowerer, info, member, arg) {
|
|
|
483
725
|
* checked-dynamic function boundary, which validates typed parameters.
|
|
484
726
|
* The runtime retains the original closure and its checked-dynamic thunk,
|
|
485
727
|
* supplying the exact emit argc without a fixed-tuple or varargs ABI. */
|
|
486
|
-
function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, registering, once, prepend, loc) {
|
|
728
|
+
function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, registering, once, prepend, loc, onFn = "emitter.onFlex", bridge = false) {
|
|
487
729
|
if (receiver.type.kind !== "object") {
|
|
488
730
|
lowerer.noLowering(`${member} with a nullable or non-emitter receiver`, cbNode, "narrow the receiver to an EventEmitter instance before registering or removing a computed-name listener");
|
|
489
731
|
}
|
|
@@ -507,10 +749,20 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
|
|
|
507
749
|
lowerer.noLowering(`${member} with a non-function computed-name listener`, cbNode);
|
|
508
750
|
}
|
|
509
751
|
const recvT = receiver.type;
|
|
510
|
-
|
|
752
|
+
// An UNRESTRICTED name (`bridge`) may be any event, including 'error',
|
|
753
|
+
// the meta events, and the literal events typed code fixes a tuple for:
|
|
754
|
+
// register through the checked-dynamic receiver's bridge (typed adapters
|
|
755
|
+
// for those events, the thunk alone otherwise), which keeps Node's
|
|
756
|
+
// contract for each.
|
|
757
|
+
if (bridge && registering) {
|
|
758
|
+
const bridged = lowerDynamicEmitterOn(lowerer, receiver, name, boxed, once, prepend, loc);
|
|
759
|
+
if (bridged)
|
|
760
|
+
return bridged;
|
|
761
|
+
}
|
|
762
|
+
const key = `${registering ? onFn : "emitter.offDyn"}:${typeKey(recvT)}`;
|
|
511
763
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
512
764
|
if (!helper) {
|
|
513
|
-
helper = keyedHelperName(lowerer,
|
|
765
|
+
helper = keyedHelperName(lowerer, `%${registering ? onFn : "emitter.offFlex"}`, key);
|
|
514
766
|
lowerer.arrHofHelpers.set(key, helper);
|
|
515
767
|
const params = [
|
|
516
768
|
{ localId: "r.0", name: "r", type: recvT },
|
|
@@ -545,7 +797,7 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
|
|
|
545
797
|
kind: "return",
|
|
546
798
|
value: {
|
|
547
799
|
kind: "libCall",
|
|
548
|
-
fn: registering ?
|
|
800
|
+
fn: registering ? onFn : "emitter.offDyn",
|
|
549
801
|
args: [
|
|
550
802
|
varRef("r.0", recvT, loc),
|
|
551
803
|
varRef("n.0", STRING, loc),
|
|
@@ -573,6 +825,44 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
|
|
|
573
825
|
loc,
|
|
574
826
|
};
|
|
575
827
|
}
|
|
828
|
+
/** A lowered value as a checked-dynamic payload: boxed as any untyped
|
|
829
|
+
* value is (records and arrays keep their identity), otherwise a refusal
|
|
830
|
+
* at the argument. */
|
|
831
|
+
function boxedPayload(lowerer, value, node) {
|
|
832
|
+
if (value.type.kind === "dyn")
|
|
833
|
+
return value;
|
|
834
|
+
if (value.kind === "unitLit" ||
|
|
835
|
+
canConvertToDyn(value.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
|
|
836
|
+
return lowerer.coerceToExpected(value, DYN);
|
|
837
|
+
}
|
|
838
|
+
lowerer.noLowering(`emit('error') with a '${lowerer.fmt(value.type)}' payload`, node, "the payload cannot box into a dynamic value");
|
|
839
|
+
}
|
|
840
|
+
/** The listener array of an event whose registrations all hold a checked-
|
|
841
|
+
* dynamic function value (listenerArrayIsDyn), each comparing equal to the
|
|
842
|
+
* function that was registered. JavaScript sources read the untyped array,
|
|
843
|
+
* whose functions take every argument a call passes. TypeScript sources
|
|
844
|
+
* read the element type the typed path declares, the event's tuple: a
|
|
845
|
+
* listener of exactly that signature unwraps to the original closure. An
|
|
846
|
+
* event no literal emit or listener gives a tuple (one registered only under
|
|
847
|
+
* computed names) reads the untyped array in both. */
|
|
848
|
+
function dynListenerArray(lowerer, table, receiver, name, call, loc) {
|
|
849
|
+
const array = {
|
|
850
|
+
kind: "libCall",
|
|
851
|
+
fn: "emitter.listenersDyn",
|
|
852
|
+
args: [receiver, eventNameExpr(name, loc)],
|
|
853
|
+
type: DYN,
|
|
854
|
+
loc,
|
|
855
|
+
};
|
|
856
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(call)) || !table.has(name))
|
|
857
|
+
return array;
|
|
858
|
+
const tuple = tupleOf(lowerer, table, name, call);
|
|
859
|
+
return {
|
|
860
|
+
kind: "dynCheck",
|
|
861
|
+
value: array,
|
|
862
|
+
type: arrayOf({ kind: "func", params: tuple, ret: { kind: "void" } }),
|
|
863
|
+
loc,
|
|
864
|
+
};
|
|
865
|
+
}
|
|
576
866
|
/** The event's unified tuple, with conflicts reported at this site. */
|
|
577
867
|
function tupleOf(lowerer, table, name, blame) {
|
|
578
868
|
const sig = table.get(name);
|
|
@@ -583,6 +873,24 @@ function tupleOf(lowerer, table, name, blame) {
|
|
|
583
873
|
}
|
|
584
874
|
return sig.tuple;
|
|
585
875
|
}
|
|
876
|
+
/** True when the listener is a function whose body reads `arguments`: it
|
|
877
|
+
* lowers with an arguments-pack ABI and takes every emitted argument,
|
|
878
|
+
* which the typed path's call with a prefix of the event's tuple would not
|
|
879
|
+
* pass, so it registers as a checked-dynamic listener. */
|
|
880
|
+
function readsArgumentsPack(lowerer, node) {
|
|
881
|
+
let declaration;
|
|
882
|
+
try {
|
|
883
|
+
declaration = lowerer.checker.getCallSignatures(lowerer.typeOf(node))[0]?.declaration;
|
|
884
|
+
}
|
|
885
|
+
catch {
|
|
886
|
+
return false;
|
|
887
|
+
}
|
|
888
|
+
return (declaration !== undefined &&
|
|
889
|
+
ts.isFunctionLike(declaration) &&
|
|
890
|
+
!ts.isArrowFunction(declaration) &&
|
|
891
|
+
isJsSourceFile(ts.getSourceFileOfNode(declaration)) &&
|
|
892
|
+
bodyReadsArguments(declaration));
|
|
893
|
+
}
|
|
586
894
|
/** How a listener argument is dyn-flavored: "dyn" for a checked-dynamic
|
|
587
895
|
* VALUE (a mustCall wrapper, a listener that rode an untyped binding),
|
|
588
896
|
* "func" for a function whose parameters include dyn (the JS lane's
|
|
@@ -606,6 +914,8 @@ function dynListenerFlavor(lowerer, node) {
|
|
|
606
914
|
if (t?.kind === "func") {
|
|
607
915
|
if (t.params.some((p) => p.kind === "dyn"))
|
|
608
916
|
return "func";
|
|
917
|
+
if (readsArgumentsPack(lowerer, node))
|
|
918
|
+
return "func";
|
|
609
919
|
// The inferred signature of a wrapper can omit its runtime arguments
|
|
610
920
|
// pack. Register the checked callable produced by the factory itself.
|
|
611
921
|
return tryLowerExpression(lowerer, node)?.type.kind === "dyn" ? "dyn" : null;
|
|
@@ -648,7 +958,16 @@ function lowerDynListenerCall(lowerer, member, name, tuple, receiver, cbNode, fl
|
|
|
648
958
|
* tuple is [DYN] — the adapter passes the boxed chunk through. */
|
|
649
959
|
streamData) {
|
|
650
960
|
if (META_EVENTS.has(name)) {
|
|
651
|
-
|
|
961
|
+
// The registration installs the registry's dynamic half: the listener
|
|
962
|
+
// receives the event name and the added or removed listener's
|
|
963
|
+
// checked-dynamic function value, as in Node. Every other listener
|
|
964
|
+
// then registers through the adapter (registersAsDyn), which the event
|
|
965
|
+
// table's scan arranges when it records a dyn-flavored listener of
|
|
966
|
+
// either meta event; a typed listener of the other one arrives here too.
|
|
967
|
+
if (registering && !hasDynMetaListener(emitterEvents(lowerer))) {
|
|
968
|
+
lowerer.noLowering(`'${member}' of '${name}' with a checked-dynamic listener the event table did not record`, cbNode, "register the listener directly at this call");
|
|
969
|
+
}
|
|
970
|
+
return lowerFlexListenerCall(lowerer, member, eventNameExpr(name, loc), receiver, cbNode, registering, once, prepend, loc, "emitter.onAny");
|
|
652
971
|
}
|
|
653
972
|
const getRecord = (id) => lowerer.shapes.get(id);
|
|
654
973
|
const getUnion = (id) => lowerer.unions.get(id);
|
|
@@ -1063,11 +1382,13 @@ function lowerListenerArg(lowerer, member, name, node, tuple) {
|
|
|
1063
1382
|
* routes here): the receiver is the current method's `this`, and emit
|
|
1064
1383
|
* NEVER dispatches through an override at-or-below the lexical class —
|
|
1065
1384
|
* JS's static super dispatch (the nearest override STRICTLY ABOVE the
|
|
1066
|
-
* lexical class still answers, exactly like a prototype-chain walk).
|
|
1067
|
-
|
|
1385
|
+
* lexical class still answers, exactly like a prototype-chain walk).
|
|
1386
|
+
* `argsOverride` replaces the call's arguments (`method.call(thisArg,
|
|
1387
|
+
* ...args)` passes the ones after thisArg). */
|
|
1388
|
+
export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv, argsOverride) {
|
|
1068
1389
|
const member = access.name.text;
|
|
1069
1390
|
const loc = locOf(call);
|
|
1070
|
-
const args = call.arguments.nodes;
|
|
1391
|
+
const args = argsOverride ?? call.arguments.nodes;
|
|
1071
1392
|
const lowerReceiver = () => {
|
|
1072
1393
|
if (superRecv)
|
|
1073
1394
|
return superRecv.thisRef;
|
|
@@ -1087,7 +1408,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1087
1408
|
}
|
|
1088
1409
|
return receiver;
|
|
1089
1410
|
};
|
|
1090
|
-
const lowerFlexEmit = (name, kind = "computed-name") => {
|
|
1411
|
+
const lowerFlexEmit = (name, kind = "computed-name", anyName = false) => {
|
|
1091
1412
|
const below = [];
|
|
1092
1413
|
collectEmitOverridesBelow(info, below);
|
|
1093
1414
|
if (emitOverrideAtOrAbove(info) || below.length > 0) {
|
|
@@ -1098,6 +1419,18 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1098
1419
|
lowerer.noLowering(`${kind} emit on a nullable or non-emitter receiver`, access.expression, "narrow the receiver to an EventEmitter instance before emitting");
|
|
1099
1420
|
}
|
|
1100
1421
|
const payload = args.slice(1).map((arg) => lowerer.lowerExprExpecting(arg, DYN));
|
|
1422
|
+
if (anyName) {
|
|
1423
|
+
// Any event name: the checked-dynamic receiver's emit, which keeps
|
|
1424
|
+
// 'error' and the meta events' contracts and converts the arguments
|
|
1425
|
+
// for listeners registered with a typed tuple.
|
|
1426
|
+
return (lowerDynamicEmitterEmit(lowerer, receiver, name, payload, loc) ?? {
|
|
1427
|
+
kind: "libCall",
|
|
1428
|
+
fn: "emitter.emitAny",
|
|
1429
|
+
args: [receiver, name, ...payload],
|
|
1430
|
+
type: BOOL,
|
|
1431
|
+
loc,
|
|
1432
|
+
});
|
|
1433
|
+
}
|
|
1101
1434
|
return {
|
|
1102
1435
|
kind: "libCall",
|
|
1103
1436
|
fn: "emitter.emitFlex",
|
|
@@ -1182,10 +1515,21 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1182
1515
|
}
|
|
1183
1516
|
const registering = REGISTER_MEMBERS.has(member);
|
|
1184
1517
|
if (literalEventName(lowerer, args[0]) === null) {
|
|
1185
|
-
|
|
1518
|
+
// An unrestricted name on a plain emitter takes the any-name path;
|
|
1519
|
+
// streams keep the fence (their runtime events carry fixed ABIs).
|
|
1520
|
+
const anyName = bridgesUnrestrictedName(lowerer, info, args[0]);
|
|
1521
|
+
if (!anyName)
|
|
1522
|
+
computedEventPattern(lowerer, info, member, args[0]);
|
|
1523
|
+
// The name may be a meta event, which the runtime fires internally.
|
|
1524
|
+
const ov = anyName && registering ? emitOverrideComparable(info) : null;
|
|
1525
|
+
if (ov) {
|
|
1526
|
+
lowerer.noLowering(`'${member}' with a runtime event name while '${ov.def.jsName || ov.def.name}' overrides emit`, call, "the runtime fires meta events internally, which cannot route through an emit override");
|
|
1527
|
+
}
|
|
1186
1528
|
const receiver = lowerReceiver();
|
|
1187
|
-
const name =
|
|
1188
|
-
|
|
1529
|
+
const name = anyName
|
|
1530
|
+
? eventNameArg(lowerer, member, args[0])
|
|
1531
|
+
: lowerer.lowerExprExpecting(args[0], STRING);
|
|
1532
|
+
return lowerFlexListenerCall(lowerer, member, name, receiver, args[1], registering, member === "once" || member === "prependOnceListener", member === "prependListener" || member === "prependOnceListener", loc, anyName ? "emitter.onAny" : "emitter.onFlex", anyName);
|
|
1189
1533
|
}
|
|
1190
1534
|
const name = eventNameOf(lowerer, member, args[0]);
|
|
1191
1535
|
if (!META_EVENTS.has(name) &&
|
|
@@ -1216,7 +1560,8 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1216
1560
|
// to the declared type, or take the value (dyn).
|
|
1217
1561
|
const sides = streamSidesOf(lowerer, info);
|
|
1218
1562
|
if (name === "data" && (sides === "r" || sides === "rw")) {
|
|
1219
|
-
const dynFlavor = dynListenerFlavor(lowerer, args[1])
|
|
1563
|
+
const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
|
|
1564
|
+
(registersAsDyn(lowerer, name, true) ? "func" : null);
|
|
1220
1565
|
if (dynFlavor !== null) {
|
|
1221
1566
|
return lowerDynListenerCall(lowerer, member, name, [DYN], receiver, args[1], dynFlavor, registering, once, prepend, loc, true);
|
|
1222
1567
|
}
|
|
@@ -1259,6 +1604,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1259
1604
|
args: [receiver, eventNameExpr(name, loc), cb, boolLit(once, loc), boolLit(prepend, loc)],
|
|
1260
1605
|
type: receiver.type,
|
|
1261
1606
|
loc,
|
|
1607
|
+
...(listenerReadsThis(lowerer, args[1]) ? { bindsThis: true } : {}),
|
|
1262
1608
|
};
|
|
1263
1609
|
}
|
|
1264
1610
|
// Stream-rooted receivers consult the per-base FORCED tuples first
|
|
@@ -1273,7 +1619,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1273
1619
|
if (probe)
|
|
1274
1620
|
checkKeypressListener(lowerer, args[1], probe);
|
|
1275
1621
|
}
|
|
1276
|
-
const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
|
|
1622
|
+
const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
|
|
1623
|
+
(keypress || registersAsDyn(lowerer, name, streamForcedTuple(lowerer, info, name) !== null)
|
|
1624
|
+
? "func"
|
|
1625
|
+
: null);
|
|
1277
1626
|
if (dynFlavor !== null) {
|
|
1278
1627
|
return lowerDynListenerCall(lowerer, member, name, tuple, receiver, args[1], dynFlavor, registering, once, prepend, loc, false);
|
|
1279
1628
|
}
|
|
@@ -1286,6 +1635,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1286
1635
|
: [receiver, eventNameExpr(name, loc), cb],
|
|
1287
1636
|
type: receiver.type,
|
|
1288
1637
|
loc,
|
|
1638
|
+
...(registering && listenerReadsThis(lowerer, args[1]) ? { bindsThis: true } : {}),
|
|
1289
1639
|
};
|
|
1290
1640
|
}
|
|
1291
1641
|
if (member === "emit") {
|
|
@@ -1295,6 +1645,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1295
1645
|
if (literalEventName(lowerer, args[0]) === null) {
|
|
1296
1646
|
const pattern = computedEventPatternOf(lowerer, args[0]);
|
|
1297
1647
|
const mayBeObserved = pattern === null ||
|
|
1648
|
+
lowerer.emitterAnyNameListener ||
|
|
1298
1649
|
computedPatternOverlapsReserved(pattern) ||
|
|
1299
1650
|
[...table].some(([candidate, sig]) => (candidate === "error" || sig.hasListener) && patternMatchesName(pattern, candidate)) ||
|
|
1300
1651
|
computedPatterns(lowerer).some((registered) => registered.listener && computedPatternsOverlap(pattern, registered));
|
|
@@ -1314,6 +1665,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1314
1665
|
loc,
|
|
1315
1666
|
};
|
|
1316
1667
|
}
|
|
1668
|
+
if (bridgesUnrestrictedName(lowerer, info, args[0])) {
|
|
1669
|
+
const name = eventNameArg(lowerer, member, args[0]);
|
|
1670
|
+
return lowerFlexEmit(name, "computed-name", true);
|
|
1671
|
+
}
|
|
1317
1672
|
computedEventPattern(lowerer, info, member, args[0]);
|
|
1318
1673
|
const name = lowerer.lowerExprExpecting(args[0], STRING);
|
|
1319
1674
|
return lowerFlexEmit(name);
|
|
@@ -1327,23 +1682,30 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1327
1682
|
return lowerFlexEmit(eventNameExpr(name, loc), flexibleJsEvent(name, table.get(name)) ? "variable-arity" : "computed-name");
|
|
1328
1683
|
const receiver = lowerReceiver();
|
|
1329
1684
|
if (name === "error") {
|
|
1330
|
-
// The special event:
|
|
1331
|
-
//
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
return true;
|
|
1685
|
+
// The special event: one %Error-rooted payload; no listener means the
|
|
1686
|
+
// runtime THROWS it (emitter.emitError, may-throw).
|
|
1687
|
+
const err = args.length === 2 ? lowerer.lowerExpr(args[1]) : null;
|
|
1688
|
+
if (err === null || !rootsAtError(lowerer, err.type)) {
|
|
1689
|
+
// Any other payload, or another argument count: the arguments box
|
|
1690
|
+
// to dyn. With no 'error' listener the runtime throws Node's
|
|
1691
|
+
// ERR_UNHANDLED_ERROR (the payload's util.inspect in the message,
|
|
1692
|
+
// the payload as `context`); listeners receive the arguments as
|
|
1693
|
+
// given.
|
|
1694
|
+
if (emitOverrideAtOrAbove(info) || superRecv !== undefined) {
|
|
1695
|
+
lowerer.noLowering(`emit('error') with a non-Error payload through an emit override`, call, "the override specialization takes the event's one Error payload");
|
|
1342
1696
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1697
|
+
const payload = args
|
|
1698
|
+
.slice(1)
|
|
1699
|
+
.map((arg, i) => i === 0 && err !== null
|
|
1700
|
+
? boxedPayload(lowerer, err, arg)
|
|
1701
|
+
: lowerer.lowerExprExpecting(arg, DYN));
|
|
1702
|
+
return {
|
|
1703
|
+
kind: "libCall",
|
|
1704
|
+
fn: "emitter.emitErrorValue",
|
|
1705
|
+
args: [receiver, ...payload],
|
|
1706
|
+
type: BOOL,
|
|
1707
|
+
loc,
|
|
1708
|
+
};
|
|
1347
1709
|
}
|
|
1348
1710
|
return emitDispatchExpr(lowerer, info, name, [{ kind: "object", className: "%Error" }], receiver, [lowerer.upcastTo(err, "%Error")], superRecv?.cls, loc);
|
|
1349
1711
|
}
|
|
@@ -1390,14 +1752,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1390
1752
|
}
|
|
1391
1753
|
const all = args.length === 0;
|
|
1392
1754
|
const receiver = lowerReceiver();
|
|
1393
|
-
const name = all
|
|
1394
|
-
? strLit("", loc)
|
|
1395
|
-
: isErrorMonitorRef(lowerer, args[0])
|
|
1396
|
-
? eventNameExpr(ERROR_MONITOR_EVENT, loc)
|
|
1397
|
-
: lowerer.lowerExprExpecting(args[0], STRING);
|
|
1398
|
-
if (name.type.kind !== "string") {
|
|
1399
|
-
lowerer.noLowering(`removeAllListeners with a '${lowerer.fmt(name.type)}' event name`, args[0] ?? call);
|
|
1400
|
-
}
|
|
1755
|
+
const name = all ? strLit("", loc) : eventNameArg(lowerer, member, args[0]);
|
|
1401
1756
|
return {
|
|
1402
1757
|
kind: "libCall",
|
|
1403
1758
|
fn: "emitter.removeAll",
|
|
@@ -1411,12 +1766,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1411
1766
|
lowerer.noLowering(`listenerCount with ${args.length} arguments`, call);
|
|
1412
1767
|
}
|
|
1413
1768
|
const receiver = lowerReceiver();
|
|
1414
|
-
const name =
|
|
1415
|
-
? eventNameExpr(ERROR_MONITOR_EVENT, loc)
|
|
1416
|
-
: lowerer.lowerExprExpecting(args[0], STRING);
|
|
1417
|
-
if (name.type.kind !== "string") {
|
|
1418
|
-
lowerer.noLowering(`listenerCount with a '${lowerer.fmt(name.type)}' event name`, args[0]);
|
|
1419
|
-
}
|
|
1769
|
+
const name = eventNameArg(lowerer, member, args[0]);
|
|
1420
1770
|
if (args.length === 2) {
|
|
1421
1771
|
// The fn filter matches by identity — the listener's own type is
|
|
1422
1772
|
// its word; no tuple check is needed to count.
|
|
@@ -1450,11 +1800,24 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1450
1800
|
if (args.length !== 1) {
|
|
1451
1801
|
lowerer.noLowering(`${member} with ${args.length} arguments`, call, "the supported form is (eventName)");
|
|
1452
1802
|
}
|
|
1803
|
+
if (literalEventName(lowerer, args[0]) === null &&
|
|
1804
|
+
bridgesUnrestrictedName(lowerer, info, args[0])) {
|
|
1805
|
+
// A runtime name: the untyped array, as through an untyped receiver.
|
|
1806
|
+
const receiver = lowerReceiver();
|
|
1807
|
+
return {
|
|
1808
|
+
kind: "libCall",
|
|
1809
|
+
fn: "emitter.listenersDyn",
|
|
1810
|
+
args: [receiver, eventNameArg(lowerer, member, args[0])],
|
|
1811
|
+
type: DYN,
|
|
1812
|
+
loc,
|
|
1813
|
+
};
|
|
1814
|
+
}
|
|
1453
1815
|
const name = eventNameOf(lowerer, member, args[0]);
|
|
1454
1816
|
const sig = table.get(name);
|
|
1455
|
-
if (sig
|
|
1456
|
-
|
|
1457
|
-
|
|
1817
|
+
if (listenerArrayIsDyn(lowerer, name, sig)) {
|
|
1818
|
+
return dynListenerArray(lowerer, table, lowerReceiver(), name, call, loc);
|
|
1819
|
+
}
|
|
1820
|
+
if (sig?.dynListener || computedListenerMayHold(lowerer, name)) {
|
|
1458
1821
|
// A dyn-adapted registration means the runtime bucket can hold
|
|
1459
1822
|
// originals of MIXED signatures — no one honest element type.
|
|
1460
1823
|
lowerer.noLowering(`${member} of the event '${name}'`, call, "a listener of this event uses checked-dynamic dispatch, so the listener array has no one static element type — listenerCount(name) counts");
|
|
@@ -1673,7 +2036,7 @@ function isWriteTarget(id) {
|
|
|
1673
2036
|
}
|
|
1674
2037
|
}
|
|
1675
2038
|
/** The nearest class at-or-above `info` declaring an emit override. */
|
|
1676
|
-
function emitOverrideAtOrAbove(info) {
|
|
2039
|
+
export function emitOverrideAtOrAbove(info) {
|
|
1677
2040
|
for (let c = info ?? null; c; c = c.base) {
|
|
1678
2041
|
if (c.emitOverride)
|
|
1679
2042
|
return c;
|
|
@@ -2070,6 +2433,44 @@ export function lowerEventsOnce(lowerer, call, loc) {
|
|
|
2070
2433
|
const arrayT = arrayOf(DYN);
|
|
2071
2434
|
const resultT = { kind: "promise", inner: arrayT };
|
|
2072
2435
|
let receiver = lowerer.lowerExpr(args[0]);
|
|
2436
|
+
// events.once(process.stdout, "drain"): the next 'drain' of a stream
|
|
2437
|
+
// whose writes are synchronous never comes (Node emits it only after a
|
|
2438
|
+
// write returned false), so the promise stays pending. A pending promise
|
|
2439
|
+
// holds nothing: the process exits when the loop is empty, as in Node.
|
|
2440
|
+
{
|
|
2441
|
+
let target = args[0];
|
|
2442
|
+
while (ts.isParenthesizedExpression(target))
|
|
2443
|
+
target = target.expression;
|
|
2444
|
+
const stream = ts.isPropertyAccessExpression(target)
|
|
2445
|
+
? lowerer.stdlibGlobalMember(target, "process")
|
|
2446
|
+
: null;
|
|
2447
|
+
const nameT = lowerer.typeOf(args[1]);
|
|
2448
|
+
if ((stream === "stdout" || stream === "stderr") &&
|
|
2449
|
+
nameT.isStringLiteralType() &&
|
|
2450
|
+
nameT.value === "drain" &&
|
|
2451
|
+
args.length === 2) {
|
|
2452
|
+
const pending = {
|
|
2453
|
+
kind: "libCall",
|
|
2454
|
+
fn: "events.pendingForever",
|
|
2455
|
+
args: [],
|
|
2456
|
+
type: resultT,
|
|
2457
|
+
loc,
|
|
2458
|
+
};
|
|
2459
|
+
let name = args[1];
|
|
2460
|
+
while (ts.isParenthesizedExpression(name))
|
|
2461
|
+
name = name.expression;
|
|
2462
|
+
if (ts.isStringLiteralLike(name))
|
|
2463
|
+
return pending;
|
|
2464
|
+
// A name expression typed "drain" still runs (`pick()`, `(log(), "drain")`).
|
|
2465
|
+
return {
|
|
2466
|
+
kind: "seqExpr",
|
|
2467
|
+
stmts: [{ kind: "exprStmt", expr: lowerer.lowerExpr(args[1]), loc }],
|
|
2468
|
+
result: pending,
|
|
2469
|
+
type: resultT,
|
|
2470
|
+
loc,
|
|
2471
|
+
};
|
|
2472
|
+
}
|
|
2473
|
+
}
|
|
2073
2474
|
// A checked-dynamic NodeJS stream slot (dyn-streams.ts): a native stream
|
|
2074
2475
|
// unboxes by identity; any other value throws the not-supported Error.
|
|
2075
2476
|
if (receiver.type.kind === "dyn" &&
|
|
@@ -2126,15 +2527,43 @@ export function lowerEventsOnce(lowerer, call, loc) {
|
|
|
2126
2527
|
loc,
|
|
2127
2528
|
};
|
|
2128
2529
|
}
|
|
2129
|
-
/** The
|
|
2130
|
-
*
|
|
2131
|
-
|
|
2530
|
+
/** The receiver of an events-module helper: an emitter, answered by its
|
|
2531
|
+
* own methods, or an EventTarget (a plain target, an AbortSignal, or a
|
|
2532
|
+
* compiled subclass), which crosses as a checked-dynamic value and is
|
|
2533
|
+
* answered from its listener state. */
|
|
2534
|
+
function helperReceiver(lowerer, member, node) {
|
|
2132
2535
|
const value = lowerer.lowerExpr(node);
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2536
|
+
// A target's lowered value is a checked-dynamic handle, so the class
|
|
2537
|
+
// comes from the static type the checker gives the expression.
|
|
2538
|
+
const staticType = value.type.kind === "object" ? null : lowerer.mapTypeOf(lowerer.typeOf(node));
|
|
2539
|
+
const type = value.type.kind === "object" ? value.type : staticType;
|
|
2540
|
+
const info = type?.kind === "object" ? lowerer.classes.get(type.className) : undefined;
|
|
2541
|
+
if (emitterRooted(lowerer, info)) {
|
|
2542
|
+
if (streamSidesOf(lowerer, info) === null)
|
|
2543
|
+
return { kind: "emitter", value };
|
|
2544
|
+
lowerer.noLowering(`events.${member} over a stream`, node, "a stream's own listenerCount/getMaxListeners/setMaxListeners/listeners answer its emitter; stream arguments are not supported yet");
|
|
2545
|
+
}
|
|
2546
|
+
// Everything else is resolved at runtime: an EventTarget (a plain target,
|
|
2547
|
+
// an AbortSignal, a compiled subclass, or a value whose static type is
|
|
2548
|
+
// checked-dynamic) answers from its own state, and any other value throws
|
|
2549
|
+
// Node's ERR_INVALID_ARG_TYPE.
|
|
2550
|
+
const dyn = lowerer.coerceToExpected(value, DYN);
|
|
2551
|
+
if (dyn.type.kind === "dyn")
|
|
2552
|
+
return { kind: "target", value: dyn };
|
|
2553
|
+
lowerer.noLowering(`events.${member} over this value`, node, "pass an EventEmitter instance, an EventTarget, or a value of a checked-dynamic type");
|
|
2554
|
+
}
|
|
2555
|
+
/** The event name of a helper over a target: the string itself, or a
|
|
2556
|
+
* checked-dynamic value (a value that is not a string matches no event
|
|
2557
|
+
* type, which the runtime answers as an empty result). */
|
|
2558
|
+
function helperTypeName(lowerer, node) {
|
|
2559
|
+
const value = lowerer.lowerExpr(node);
|
|
2560
|
+
if (value.type.kind === "string")
|
|
2561
|
+
return { expr: value, dyn: false };
|
|
2562
|
+
const converted = lowerer.coerceToExpected(value, DYN);
|
|
2563
|
+
if (converted.type.kind !== "dyn") {
|
|
2564
|
+
lowerer.noLowering(`an events helper with a '${lowerer.fmt(value.type)}' event name`, node, "pass a string, or a value whose type is checked-dynamic");
|
|
2136
2565
|
}
|
|
2137
|
-
return
|
|
2566
|
+
return { expr: converted, dyn: true };
|
|
2138
2567
|
}
|
|
2139
2568
|
/** setMaxListeners(n) with no targets: the process-wide default, through
|
|
2140
2569
|
* Node's validateNumber(n, 'setMaxListeners', 0) ladder. */
|
|
@@ -2174,7 +2603,18 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2174
2603
|
if (member === "listenerCount") {
|
|
2175
2604
|
if (args.length !== 2)
|
|
2176
2605
|
lowerer.noLowering(`events.listenerCount with ${args.length} arguments`, call);
|
|
2177
|
-
const
|
|
2606
|
+
const helper = helperReceiver(lowerer, member, args[0]);
|
|
2607
|
+
if (helper.kind === "target") {
|
|
2608
|
+
const type = helperTypeName(lowerer, args[1]);
|
|
2609
|
+
return {
|
|
2610
|
+
kind: "libCall",
|
|
2611
|
+
fn: type.dyn ? "event.targetListenerCountDyn" : "event.targetListenerCount",
|
|
2612
|
+
args: [helper.value, type.expr],
|
|
2613
|
+
type: F64,
|
|
2614
|
+
loc,
|
|
2615
|
+
};
|
|
2616
|
+
}
|
|
2617
|
+
const receiver = helper.value;
|
|
2178
2618
|
const name = isErrorMonitorRef(lowerer, args[1])
|
|
2179
2619
|
? eventNameExpr(ERROR_MONITOR_EVENT, loc)
|
|
2180
2620
|
: lowerer.lowerExprExpecting(args[1], STRING);
|
|
@@ -2186,8 +2626,14 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2186
2626
|
if (member === "getMaxListeners") {
|
|
2187
2627
|
if (args.length !== 1)
|
|
2188
2628
|
lowerer.noLowering(`events.getMaxListeners with ${args.length} arguments`, call);
|
|
2189
|
-
const
|
|
2190
|
-
return {
|
|
2629
|
+
const helper = helperReceiver(lowerer, member, args[0]);
|
|
2630
|
+
return {
|
|
2631
|
+
kind: "libCall",
|
|
2632
|
+
fn: helper.kind === "target" ? "event.targetGetMax" : "emitter.getMax",
|
|
2633
|
+
args: [helper.value],
|
|
2634
|
+
type: F64,
|
|
2635
|
+
loc,
|
|
2636
|
+
};
|
|
2191
2637
|
}
|
|
2192
2638
|
if (member === "setMaxListeners") {
|
|
2193
2639
|
// An omitted n is the current default, assigned again.
|
|
@@ -2210,21 +2656,29 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2210
2656
|
const limit = lowerer.declareHiddenLocal("%maxListeners", F64);
|
|
2211
2657
|
const stmts = [{ kind: "varDecl", localId: limit.id, init: n, loc }];
|
|
2212
2658
|
const targets = args.slice(1).map((node) => {
|
|
2213
|
-
const
|
|
2214
|
-
const slot = lowerer.declareHiddenLocal("%maxListenersTarget", value.type);
|
|
2215
|
-
stmts.push({ kind: "varDecl", localId: slot.id, init: value, loc });
|
|
2216
|
-
return varRef(slot.id, value.type, loc);
|
|
2659
|
+
const helper = helperReceiver(lowerer, member, node);
|
|
2660
|
+
const slot = lowerer.declareHiddenLocal("%maxListenersTarget", helper.value.type);
|
|
2661
|
+
stmts.push({ kind: "varDecl", localId: slot.id, init: helper.value, loc });
|
|
2662
|
+
return { kind: helper.kind, value: varRef(slot.id, helper.value.type, loc) };
|
|
2217
2663
|
});
|
|
2218
2664
|
for (const target of targets) {
|
|
2219
2665
|
stmts.push({
|
|
2220
2666
|
kind: "exprStmt",
|
|
2221
|
-
expr:
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2667
|
+
expr: target.kind === "target"
|
|
2668
|
+
? {
|
|
2669
|
+
kind: "libCall",
|
|
2670
|
+
fn: "event.targetSetMax",
|
|
2671
|
+
args: [target.value, varRef(limit.id, F64, loc)],
|
|
2672
|
+
type: VOID,
|
|
2673
|
+
loc,
|
|
2674
|
+
}
|
|
2675
|
+
: {
|
|
2676
|
+
kind: "libCall",
|
|
2677
|
+
fn: "emitter.setMax",
|
|
2678
|
+
args: [target.value, varRef(limit.id, F64, loc)],
|
|
2679
|
+
type: target.value.type,
|
|
2680
|
+
loc,
|
|
2681
|
+
},
|
|
2228
2682
|
loc,
|
|
2229
2683
|
});
|
|
2230
2684
|
}
|
|
@@ -2235,15 +2689,32 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2235
2689
|
if (member === "getEventListeners") {
|
|
2236
2690
|
if (args.length !== 2)
|
|
2237
2691
|
lowerer.noLowering(`events.getEventListeners with ${args.length} arguments`, call);
|
|
2692
|
+
const helper = helperReceiver(lowerer, member, args[0]);
|
|
2693
|
+
if (helper.kind === "target") {
|
|
2694
|
+
// The target's listeners of the type, in registration order.
|
|
2695
|
+
const type = helperTypeName(lowerer, args[1]);
|
|
2696
|
+
const listeners = {
|
|
2697
|
+
kind: "libCall",
|
|
2698
|
+
fn: type.dyn ? "event.targetListenersDyn" : "event.targetListeners",
|
|
2699
|
+
args: [helper.value, type.expr],
|
|
2700
|
+
type: DYN,
|
|
2701
|
+
loc,
|
|
2702
|
+
};
|
|
2703
|
+
// Node returns the listeners as registered, so a listener object with
|
|
2704
|
+
// handleEvent comes back as itself; typed reads of the array convert
|
|
2705
|
+
// each element where it is used.
|
|
2706
|
+
return { kind: "dynCheck", value: listeners, type: arrayOf(DYN), loc };
|
|
2707
|
+
}
|
|
2238
2708
|
// emitter.listeners(name): the event's listener array, typed by the
|
|
2239
2709
|
// event's unified tuple (the instance method's rules).
|
|
2240
|
-
const receiver =
|
|
2710
|
+
const receiver = helper.value;
|
|
2241
2711
|
const name = eventNameOf(lowerer, "events.getEventListeners", args[1]);
|
|
2242
2712
|
const table = emitterEvents(lowerer);
|
|
2243
2713
|
const sig = table.get(name);
|
|
2244
|
-
if (sig
|
|
2245
|
-
|
|
2246
|
-
|
|
2714
|
+
if (listenerArrayIsDyn(lowerer, name, sig)) {
|
|
2715
|
+
return dynListenerArray(lowerer, table, receiver, name, call, loc);
|
|
2716
|
+
}
|
|
2717
|
+
if (sig?.dynListener || computedListenerMayHold(lowerer, name)) {
|
|
2247
2718
|
lowerer.noLowering(`events.getEventListeners of the event '${name}'`, call, "a listener of this event uses checked-dynamic dispatch, so the listener array has no one static element type — listenerCount(emitter, name) counts");
|
|
2248
2719
|
}
|
|
2249
2720
|
const tuple = tupleOf(lowerer, table, name, call);
|
|
@@ -2257,4 +2728,45 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2257
2728
|
}
|
|
2258
2729
|
return null;
|
|
2259
2730
|
}
|
|
2731
|
+
/** Whether a typed listener can read the `this` its calls bind (Node calls
|
|
2732
|
+
* listeners with the emitter as `this`): a function expression, or a
|
|
2733
|
+
* function declaration or `const` function binding, whose own body reads
|
|
2734
|
+
* `this`; any other listener value except an arrow in a JavaScript source;
|
|
2735
|
+
* and in a TypeScript source, where a function reads `this` only through a
|
|
2736
|
+
* declared `this` parameter, a value whose call signature declares one.
|
|
2737
|
+
* Arrows read the enclosing `this`. */
|
|
2738
|
+
function listenerReadsThis(lowerer, node) {
|
|
2739
|
+
let listener = node;
|
|
2740
|
+
while (ts.isParenthesizedExpression(listener))
|
|
2741
|
+
listener = listener.expression;
|
|
2742
|
+
if (ts.isArrowFunction(listener))
|
|
2743
|
+
return false;
|
|
2744
|
+
if (ts.isFunctionExpression(listener))
|
|
2745
|
+
return functionUsesThis(listener);
|
|
2746
|
+
if (ts.isIdentifier(listener)) {
|
|
2747
|
+
const decls = lowerer.checker.getSymbolAtLocation(listener)?.declarations ?? [];
|
|
2748
|
+
// An overloaded function's implementation is the declaration with a
|
|
2749
|
+
// body; its overload signatures have none.
|
|
2750
|
+
const fn = decls.find((d) => ts.isFunctionDeclaration(d) && d.body !== undefined);
|
|
2751
|
+
if (fn !== undefined)
|
|
2752
|
+
return functionUsesThis(fn);
|
|
2753
|
+
const binding = decls.find(ts.isVariableDeclaration);
|
|
2754
|
+
let init = binding?.initializer;
|
|
2755
|
+
while (init !== undefined && ts.isParenthesizedExpression(init))
|
|
2756
|
+
init = init.expression;
|
|
2757
|
+
if (binding !== undefined &&
|
|
2758
|
+
init !== undefined &&
|
|
2759
|
+
(ts.getCombinedNodeFlags(binding) & ts.NodeFlags.Const) !== 0) {
|
|
2760
|
+
if (ts.isArrowFunction(init))
|
|
2761
|
+
return false;
|
|
2762
|
+
if (ts.isFunctionExpression(init))
|
|
2763
|
+
return functionUsesThis(init);
|
|
2764
|
+
}
|
|
2765
|
+
}
|
|
2766
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)))
|
|
2767
|
+
return true;
|
|
2768
|
+
return lowerer.checker
|
|
2769
|
+
.getCallSignatures(lowerer.typeOf(listener))
|
|
2770
|
+
.some((signature) => (signature.declaration?.parameters?.nodes ?? []).some(isThisParameter));
|
|
2771
|
+
}
|
|
2260
2772
|
//# sourceMappingURL=lower-event-emitter.js.map
|