@scriptc/compiler 0.4.6 → 0.4.7
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/events.d.ts +6 -1
- package/ambient/node-fallback/fs-promises.d.ts +1 -1
- package/ambient/node-fallback/fs.d.ts +54 -10
- package/ambient/node-fallback/http.d.ts +3 -1
- package/ambient/node-fallback/net.d.ts +19 -0
- package/ambient/node-fallback/querystring.d.ts +3 -3
- package/ambient/scriptc-node-fallback.d.ts +58 -13
- package/dist/backend/executable-features.js +13 -0
- 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.js +2 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.d.ts +11 -0
- package/dist/backend/linker.js +31 -3
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +7 -2
- package/dist/backend/lld.js +5 -3
- package/dist/backend/lld.js.map +1 -1
- package/dist/backend/lld.test.js +10 -4
- package/dist/backend/lld.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.js +6 -5
- package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +53 -1
- package/dist/backend/llvm/dyn.js +221 -9
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +1 -1
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-module.js +148 -50
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.js +39 -19
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +29 -2
- package/dist/backend/llvm/emitter.js +86 -7
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +4 -1
- package/dist/backend/llvm/expr-calls.js +20 -4
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +209 -16
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +94 -11
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
- package/dist/backend/llvm/expr-stream-bridges.js +42 -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-ic.d.ts +38 -0
- package/dist/backend/llvm/js-ic.js +295 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +20 -0
- 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-process.js +136 -24
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +70 -0
- 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/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 +20 -2
- package/dist/backend/llvm/loop-state.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 +52 -11
- package/dist/backend/llvm/map-number-lookup.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/record-views.d.ts +22 -2
- package/dist/backend/llvm/record-views.js +139 -10
- 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-writes.js +1 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +3 -0
- package/dist/backend/llvm/shapes.js +18 -3
- 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/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.js +1 -1
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +54 -0
- package/dist/backend/native/executable.js +87 -5
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.js +5 -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.js +3 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +43 -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 +31 -7
- package/dist/backend/runtime-pack-core.js +21 -1
- 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 +3 -11
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/vendor-archives.d.ts +4 -1
- package/dist/backend/vendor-archives.js +264 -3
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +36 -0
- package/dist/backend/vendor-inputs.js +42 -0
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/vendor-inputs.test.js +28 -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 +23 -10
- 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/surface-manifest.js +1 -1
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/codes.d.ts +6 -0
- package/dist/diagnostics/codes.js +6 -0
- package/dist/diagnostics/codes.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +50 -0
- package/dist/diagnostics/diagnostic.js +142 -3
- 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/executable/executable-cache.d.ts +29 -0
- package/dist/executable/executable-cache.js +18 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +5 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +13 -3
- package/dist/executable/prepare.js +271 -18
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/early-errors.d.ts +14 -0
- package/dist/frontend/early-errors.js +305 -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 +42 -0
- package/dist/frontend/early-errors.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +23 -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/lowering/binding-analysis.d.ts +2 -1
- package/dist/frontend/lowering/binding-analysis.js +65 -1
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +9 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +1 -1
- package/dist/frontend/lowering/builtin-namespaces.js +19 -2
- package/dist/frontend/lowering/builtin-namespaces.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 +50 -10
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +5 -1
- package/dist/frontend/lowering/builtins/child-process.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.js +47 -16
- 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/module-calls.js +39 -2
- 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/operating-system.d.ts +3 -2
- package/dist/frontend/lowering/builtins/operating-system.js +5 -4
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +17 -1
- package/dist/frontend/lowering/builtins/process.js +285 -19
- package/dist/frontend/lowering/builtins/process.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.js +21 -3
- 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 +20 -1
- 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/call-signatures.js +77 -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-dynamic-dispatch.d.ts +5 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.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-runtime-statics.js +15 -0
- package/dist/frontend/lowering/class-runtime-statics.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 +54 -10
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +7 -0
- package/dist/frontend/lowering/coercions/state.js +7 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +60 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +29 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +132 -28
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +16 -5
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +16 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +4 -0
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +11 -0
- package/dist/frontend/lowering/containers/callback-arguments.js +53 -0
- package/dist/frontend/lowering/containers/callback-arguments.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/expressions/array-literals.d.ts +14 -0
- package/dist/frontend/lowering/expressions/array-literals.js +26 -10
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +104 -12
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +121 -4
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +143 -3
- 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.js +25 -1
- 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 +778 -229
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +66 -20
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +31 -0
- package/dist/frontend/lowering/expressions/property-access.js +796 -12
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +29 -1
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +17 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +132 -17
- 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 +5 -3
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +49 -0
- package/dist/frontend/lowering/generic-functions.js +365 -7
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/global-values.d.ts +9 -0
- package/dist/frontend/lowering/global-values.js +44 -0
- 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/key-order-witness.d.ts +54 -0
- package/dist/frontend/lowering/key-order-witness.js +546 -5
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +14 -0
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +110 -1
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
- package/dist/frontend/lowering/lower-builtin-values.js +332 -58
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +22 -1
- package/dist/frontend/lowering/lower-calls.js +427 -48
- 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 +78 -0
- package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
- package/dist/frontend/lowering/lower-classes.d.ts +16 -5
- package/dist/frontend/lowering/lower-classes.js +168 -51
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -0
- package/dist/frontend/lowering/lower-event-emitter.js +383 -41
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +14 -0
- package/dist/frontend/lowering/lower-exprs.js +25 -0
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +2 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +80 -33
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +87 -25
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
- package/dist/frontend/lowering/lower-node-island.js +456 -61
- package/dist/frontend/lowering/lower-node-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +160 -9
- 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 +32 -18
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +21 -4
- package/dist/frontend/lowering/lower-stmts.js +580 -103
- 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 +133 -21
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +139 -3
- package/dist/frontend/lowering/lowerer.js +579 -43
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +1 -1
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- 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/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/partial-assertions.d.ts +39 -0
- package/dist/frontend/lowering/partial-assertions.js +195 -0
- package/dist/frontend/lowering/partial-assertions.js.map +1 -0
- package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
- package/dist/frontend/lowering/primitive-wrappers.js +220 -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-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/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/surfaces.d.ts +27 -0
- package/dist/frontend/lowering/surfaces.js +135 -62
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.d.ts +128 -17
- package/dist/frontend/lowering/unit-journal.js +310 -53
- package/dist/frontend/lowering/unit-journal.js.map +1 -1
- package/dist/frontend/lowering/unit-journal.test.js +91 -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/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 +17 -2
- package/dist/frontend/npm-static.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 +4 -0
- package/dist/frontend/pipeline.js +68 -7
- package/dist/frontend/pipeline.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 +9 -0
- package/dist/frontend/program.js +159 -7
- package/dist/frontend/program.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.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 +116 -2
- 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/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.js +70 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +7 -2
- package/dist/frontend/type-mapper.js +148 -1
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +152 -8
- package/dist/index.js.map +1 -1
- 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 +53 -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 +211 -10
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/codec.d.ts +82 -0
- package/dist/ir/codec.generated.d.ts +13 -0
- package/dist/ir/codec.generated.js +5274 -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/fields.generated.d.ts +20 -10
- package/dist/ir/fields.generated.js +1031 -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/function-references.d.ts +5 -4
- package/dist/ir/function-references.js +8 -4
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +7 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/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 +944 -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/integer-ranges.js +16 -6
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +75 -44
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/js-ic.d.ts +10 -9
- package/dist/ir/js-ic.js +28 -20
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +10 -2
- 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/parameter-versions.d.ts +2 -1
- package/dist/ir/parameter-versions.js +3 -1
- package/dist/ir/parameter-versions.js.map +1 -1
- package/dist/ir/receiver-readers.js +58 -2
- package/dist/ir/receiver-readers.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +60 -1
- package/dist/ir/runtime-features.js +277 -2
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +165 -1
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/saturating-loop-jams.d.ts +8 -1
- package/dist/ir/saturating-loop-jams.js +46 -7
- 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/self-captures.js +8 -1
- 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 +3 -2
- package/dist/ir/serialize.js +6 -2
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.js +82 -4
- 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/ir-policy.js +3 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.js +2 -0
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +2 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -2
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.js +32 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.js +53 -3
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +88 -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 +25 -1
- package/dist/node-islands/boundary.js +28 -2
- package/dist/node-islands/boundary.js.map +1 -1
- package/dist/node-islands/detect.d.ts +18 -1
- package/dist/node-islands/detect.js +365 -40
- package/dist/node-islands/detect.js.map +1 -1
- package/dist/node-islands/detect.test.js +151 -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/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.test.js +2 -0
- package/dist/node-islands/report.test.js.map +1 -1
- package/dist/node-islands/rules.js +4 -0
- package/dist/node-islands/rules.js.map +1 -1
- package/dist/node-islands/scan.d.ts +7 -1
- package/dist/node-islands/scan.js +51 -2
- 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/package.json +20 -20
- package/surface-manifest.json +43 -11
|
@@ -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,13 @@
|
|
|
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 { functionUsesThis } from "./cjs-exports-object.js";
|
|
56
|
+
import { isThisParameter } from "./call-signatures.js";
|
|
50
57
|
import { arrayOf, BOOL, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, isDynTypedRefType, DYN, F64, isUnitType, STRING, typeEquals, typeKey, VOID, } from "../../ir/ir.js";
|
|
51
58
|
import { STREAM_FORCED_EVENT_NAMES, streamForcedTuple, streamSidesOf } from "./lower-stream.js";
|
|
52
59
|
import { boolLit, dynUndefinedExpr, strLit, varRef } from "../../ir/build.js";
|
|
@@ -70,6 +77,47 @@ const REGISTER_MEMBERS = new Set([
|
|
|
70
77
|
"prependOnceListener",
|
|
71
78
|
]);
|
|
72
79
|
const META_EVENTS = new Set(["newListener", "removeListener"]);
|
|
80
|
+
/** Whether `t` is an instance type of the Error hierarchy. */
|
|
81
|
+
function rootsAtError(lowerer, t) {
|
|
82
|
+
if (t?.kind !== "object")
|
|
83
|
+
return false;
|
|
84
|
+
for (let c = lowerer.classes.get(t.className) ?? null; c; c = c.base) {
|
|
85
|
+
if (c.def.name === "%Error")
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
/** Whether the scan recorded a dyn-flavored 'newListener' or 'removeListener'
|
|
91
|
+
* listener. Then every listener registers through the adapter, typed meta
|
|
92
|
+
* listeners included, so each entry has a function value to pass. */
|
|
93
|
+
function hasDynMetaListener(table) {
|
|
94
|
+
return [...META_EVENTS].some((meta) => table.get(meta)?.dynListener === true);
|
|
95
|
+
}
|
|
96
|
+
/** Whether a typed listener of `name` registers through the dyn adapter, so
|
|
97
|
+
* its entry holds a checked-dynamic function value: a dyn-flavored
|
|
98
|
+
* 'newListener' or 'removeListener' listener receives every added or
|
|
99
|
+
* removed listener as one, and a read listener array beside dyn-flavored
|
|
100
|
+
* listeners holds them. Listeners of 'error' and errorMonitor do when an
|
|
101
|
+
* emit passes a payload that is not an Error: the adapter's checked
|
|
102
|
+
* conversion admits it or throws a TypeError. */
|
|
103
|
+
function registersAsDyn(lowerer, name, streamForced) {
|
|
104
|
+
const table = emitterEvents(lowerer);
|
|
105
|
+
if (hasDynMetaListener(table))
|
|
106
|
+
return true;
|
|
107
|
+
if ((name === "error" || name === ERROR_MONITOR_EVENT) && table.get("error")?.valueEmit === true)
|
|
108
|
+
return true;
|
|
109
|
+
const sig = streamForced ? undefined : table.get(name);
|
|
110
|
+
return sig?.dynListener === true && sig.listenersRead === true;
|
|
111
|
+
}
|
|
112
|
+
/** Whether the event's listener array is read as checked-dynamic values:
|
|
113
|
+
* its registrations all hold a checked-dynamic function value (flexible
|
|
114
|
+
* and computed-name events, or a dyn-flavored listener beside a read of
|
|
115
|
+
* the array). */
|
|
116
|
+
function listenerArrayIsDyn(lowerer, name, sig) {
|
|
117
|
+
return ((sig?.dynListener === true && sig.listenersRead === true) ||
|
|
118
|
+
flexibleJsEvent(name, sig) ||
|
|
119
|
+
computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, name)));
|
|
120
|
+
}
|
|
73
121
|
function flexibleJsEvent(name, sig) {
|
|
74
122
|
// A stream may be upcast to EventEmitter. Its runtime-emitted payloads
|
|
75
123
|
// keep their fixed ABI even when the static receiver looks ordinary.
|
|
@@ -115,6 +163,7 @@ function emitterEvents(lowerer) {
|
|
|
115
163
|
return lowerer.emitterEventTable;
|
|
116
164
|
const table = new Map();
|
|
117
165
|
const computedPatterns = [];
|
|
166
|
+
let anyNameListener = false;
|
|
118
167
|
const sigOf = (name) => {
|
|
119
168
|
let sig = table.get(name);
|
|
120
169
|
if (!sig)
|
|
@@ -223,14 +272,51 @@ function emitterEvents(lowerer) {
|
|
|
223
272
|
}
|
|
224
273
|
}
|
|
225
274
|
};
|
|
275
|
+
// Events whose listener array is read; applied to the table after the
|
|
276
|
+
// walk, so a read alone adds no entry.
|
|
277
|
+
const listenersRead = new Set();
|
|
226
278
|
for (const sf of lowerer.program.getImplementationSourceFiles()) {
|
|
227
279
|
if (sf.isDeclarationFile)
|
|
228
280
|
continue;
|
|
229
281
|
const walk = (node) => {
|
|
230
282
|
ts.forEachChild(node, walk);
|
|
231
|
-
if (!ts.isCallExpression(node)
|
|
283
|
+
if (!ts.isCallExpression(node))
|
|
232
284
|
return;
|
|
233
|
-
const
|
|
285
|
+
const callee = node.expression;
|
|
286
|
+
if ((ts.isIdentifier(callee) || ts.isPropertyAccessExpression(callee)) &&
|
|
287
|
+
(ts.isIdentifier(callee) ? callee : callee.name).text === "getEventListeners" &&
|
|
288
|
+
node.arguments.nodes.length === 2) {
|
|
289
|
+
const nameT = (() => {
|
|
290
|
+
try {
|
|
291
|
+
return lowerer.typeOf(node.arguments.nodes[1]);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
})();
|
|
297
|
+
if (nameT?.isStringLiteralType())
|
|
298
|
+
listenersRead.add(literalEventKey(nameT.value));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if (!ts.isPropertyAccessExpression(callee))
|
|
302
|
+
return;
|
|
303
|
+
const member = callee.name.text;
|
|
304
|
+
if (member === "listeners" || member === "rawListeners") {
|
|
305
|
+
const arg = node.arguments.nodes[0];
|
|
306
|
+
let nameT = null;
|
|
307
|
+
try {
|
|
308
|
+
if (!arg ||
|
|
309
|
+
!scannedEmitterInfo(lowerer, lowerer.mapTypeOf(lowerer.typeOf(callee.expression))))
|
|
310
|
+
return;
|
|
311
|
+
nameT = lowerer.typeOf(arg);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (nameT.isStringLiteralType())
|
|
317
|
+
listenersRead.add(literalEventKey(nameT.value));
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
234
320
|
const isEmit = member === "emit";
|
|
235
321
|
if (!isEmit && !REGISTER_MEMBERS.has(member))
|
|
236
322
|
return;
|
|
@@ -240,7 +326,7 @@ function emitterEvents(lowerer) {
|
|
|
240
326
|
let recvT = null;
|
|
241
327
|
let nameT = null;
|
|
242
328
|
try {
|
|
243
|
-
recvT = lowerer.mapTypeOf(lowerer.typeOf(
|
|
329
|
+
recvT = lowerer.mapTypeOf(lowerer.typeOf(callee.expression));
|
|
244
330
|
nameT = lowerer.typeOf(arg0);
|
|
245
331
|
}
|
|
246
332
|
catch {
|
|
@@ -261,9 +347,54 @@ function emitterEvents(lowerer) {
|
|
|
261
347
|
!computedPatternOverlapsReserved(pattern)) {
|
|
262
348
|
computedPatterns.push({ ...pattern, listener: !isEmit });
|
|
263
349
|
}
|
|
350
|
+
// A listener under an unrestricted name may receive any event
|
|
351
|
+
// (lowerFlexListenerCall's any-name path).
|
|
352
|
+
if (!pattern && !isEmit && streamSidesOf(lowerer, info) === null)
|
|
353
|
+
anyNameListener = true;
|
|
264
354
|
return;
|
|
265
355
|
}
|
|
266
356
|
const name = literal;
|
|
357
|
+
if (META_EVENTS.has(name) && !isEmit && node.arguments.nodes[1]) {
|
|
358
|
+
// A dyn-flavored meta listener receives each added or removed
|
|
359
|
+
// listener as a checked-dynamic function value. The scan cannot
|
|
360
|
+
// lower the listener as dynListenerFlavor does, so it counts every
|
|
361
|
+
// listener that is not statically a typed function: a factory's
|
|
362
|
+
// result (a wrapper whose runtime value is checked-dynamic), a
|
|
363
|
+
// JavaScript function without parameters, and the dyn-flavored
|
|
364
|
+
// forms. Counting one too many only routes more registrations
|
|
365
|
+
// through the adapter.
|
|
366
|
+
const cbNode = node.arguments.nodes[1];
|
|
367
|
+
let typed = false;
|
|
368
|
+
try {
|
|
369
|
+
const cbCt = lowerer.typeOf(cbNode);
|
|
370
|
+
const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer, cbNode, cbCt);
|
|
371
|
+
typed =
|
|
372
|
+
cbT?.kind === "func" &&
|
|
373
|
+
!ts.isCallExpression(stripTypeCasts(cbNode)) &&
|
|
374
|
+
!(cbT.params.length === 0 && isJsSourceFile(sf)) &&
|
|
375
|
+
!cbT.params.some((p) => p.kind === "dyn") &&
|
|
376
|
+
!readsArgumentsPack(lowerer, cbNode);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
typed = false;
|
|
380
|
+
}
|
|
381
|
+
if (!typed)
|
|
382
|
+
table.get(name).dynListener = true;
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if (isEmit && name === "error") {
|
|
386
|
+
try {
|
|
387
|
+
const payload = node.arguments.nodes.slice(1);
|
|
388
|
+
if (payload.length !== 1 ||
|
|
389
|
+
!rootsAtError(lowerer, lowerer.mapTypeOf(lowerer.typeOf(payload[0])))) {
|
|
390
|
+
table.get("error").valueEmit = true;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
table.get("error").valueEmit = true;
|
|
395
|
+
}
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
267
398
|
if (META_EVENTS.has(name) || name === "error" || name === ERROR_MONITOR_EVENT)
|
|
268
399
|
return; // forced tuples
|
|
269
400
|
// Stream receivers' runtime-emitted events carry PER-BASE forced
|
|
@@ -279,11 +410,13 @@ function emitterEvents(lowerer) {
|
|
|
279
410
|
else if (node.arguments.nodes[1]) {
|
|
280
411
|
const cbCt = lowerer.typeOf(node.arguments.nodes[1]);
|
|
281
412
|
const cbT = lowerer.mapTypeOf(cbCt) ?? dynFallbackType(lowerer, node.arguments.nodes[1], cbCt);
|
|
413
|
+
const pack = readsArgumentsPack(lowerer, node.arguments.nodes[1]);
|
|
282
414
|
// A TypeScript listener with no parameters is typed too: it
|
|
283
415
|
// registers without the adapter, so an untyped emit reaches it
|
|
284
416
|
// only through the event's fixed ABI. A JavaScript function
|
|
285
417
|
// without parameters can still read `arguments`.
|
|
286
|
-
if (
|
|
418
|
+
if (!pack &&
|
|
419
|
+
cbT?.kind !== "dyn" &&
|
|
287
420
|
(cbT?.kind !== "func" ||
|
|
288
421
|
(cbT.params.length === 0 && !isJsSourceFile(sf)) ||
|
|
289
422
|
cbT.params.some((p) => p.kind !== "dyn"))) {
|
|
@@ -295,7 +428,8 @@ function emitterEvents(lowerer) {
|
|
|
295
428
|
// tuple position, and positions past the tuple read the boxed
|
|
296
429
|
// undefined (exactly JS's extra-parameter semantics).
|
|
297
430
|
if (cbT?.kind === "dyn" ||
|
|
298
|
-
(cbT?.kind === "func" && cbT.params.some((p) => p.kind === "dyn"))
|
|
431
|
+
(cbT?.kind === "func" && cbT.params.some((p) => p.kind === "dyn")) ||
|
|
432
|
+
pack) {
|
|
299
433
|
const sig = sigOf(name);
|
|
300
434
|
sig.hasListener = true;
|
|
301
435
|
sig.dynListener = true;
|
|
@@ -311,8 +445,14 @@ function emitterEvents(lowerer) {
|
|
|
311
445
|
};
|
|
312
446
|
walk(sf);
|
|
313
447
|
}
|
|
448
|
+
for (const name of listenersRead) {
|
|
449
|
+
const sig = table.get(name);
|
|
450
|
+
if (sig)
|
|
451
|
+
sig.listenersRead = true;
|
|
452
|
+
}
|
|
314
453
|
lowerer.emitterEventTable = table;
|
|
315
454
|
lowerer.emitterComputedPatterns = computedPatterns;
|
|
455
|
+
lowerer.emitterAnyNameListener = anyNameListener;
|
|
316
456
|
return table;
|
|
317
457
|
}
|
|
318
458
|
function computedPatterns(lowerer) {
|
|
@@ -467,6 +607,16 @@ function patternMatchesName(pattern, key) {
|
|
|
467
607
|
const name = eventKeyName(key);
|
|
468
608
|
return name.startsWith(pattern.prefix) && name.endsWith(pattern.suffix);
|
|
469
609
|
}
|
|
610
|
+
/** Whether a listener registered under a computed name may sit in the
|
|
611
|
+
* bucket of the event keyed `key`: a pattern registration that matches it,
|
|
612
|
+
* or any registration under an unrestricted name (a string, so never the
|
|
613
|
+
* errorMonitor key). Such a listener crossed
|
|
614
|
+
* the checked-dynamic boundary, so the bucket has no one static signature. */
|
|
615
|
+
function computedListenerMayHold(lowerer, key) {
|
|
616
|
+
emitterEvents(lowerer);
|
|
617
|
+
return ((lowerer.emitterAnyNameListener && key !== ERROR_MONITOR_EVENT) ||
|
|
618
|
+
computedPatterns(lowerer).some((pattern) => pattern.listener && patternMatchesName(pattern, key)));
|
|
619
|
+
}
|
|
470
620
|
/** A computed event can use the variable-arity dyn path only when its
|
|
471
621
|
* syntax proves a nonempty prefix or suffix excluding internal events. */
|
|
472
622
|
function computedEventPattern(lowerer, info, member, arg) {
|
|
@@ -483,7 +633,7 @@ function computedEventPattern(lowerer, info, member, arg) {
|
|
|
483
633
|
* checked-dynamic function boundary, which validates typed parameters.
|
|
484
634
|
* The runtime retains the original closure and its checked-dynamic thunk,
|
|
485
635
|
* supplying the exact emit argc without a fixed-tuple or varargs ABI. */
|
|
486
|
-
function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, registering, once, prepend, loc) {
|
|
636
|
+
function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, registering, once, prepend, loc, onFn = "emitter.onFlex", bridge = false) {
|
|
487
637
|
if (receiver.type.kind !== "object") {
|
|
488
638
|
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
639
|
}
|
|
@@ -507,10 +657,20 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
|
|
|
507
657
|
lowerer.noLowering(`${member} with a non-function computed-name listener`, cbNode);
|
|
508
658
|
}
|
|
509
659
|
const recvT = receiver.type;
|
|
510
|
-
|
|
660
|
+
// An UNRESTRICTED name (`bridge`) may be any event, including 'error',
|
|
661
|
+
// the meta events, and the literal events typed code fixes a tuple for:
|
|
662
|
+
// register through the checked-dynamic receiver's bridge (typed adapters
|
|
663
|
+
// for those events, the thunk alone otherwise), which keeps Node's
|
|
664
|
+
// contract for each.
|
|
665
|
+
if (bridge && registering) {
|
|
666
|
+
const bridged = lowerDynamicEmitterOn(lowerer, receiver, name, boxed, once, prepend, loc);
|
|
667
|
+
if (bridged)
|
|
668
|
+
return bridged;
|
|
669
|
+
}
|
|
670
|
+
const key = `${registering ? onFn : "emitter.offDyn"}:${typeKey(recvT)}`;
|
|
511
671
|
let helper = lowerer.arrHofHelpers.get(key);
|
|
512
672
|
if (!helper) {
|
|
513
|
-
helper = keyedHelperName(lowerer,
|
|
673
|
+
helper = keyedHelperName(lowerer, `%${registering ? onFn : "emitter.offFlex"}`, key);
|
|
514
674
|
lowerer.arrHofHelpers.set(key, helper);
|
|
515
675
|
const params = [
|
|
516
676
|
{ localId: "r.0", name: "r", type: recvT },
|
|
@@ -545,7 +705,7 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
|
|
|
545
705
|
kind: "return",
|
|
546
706
|
value: {
|
|
547
707
|
kind: "libCall",
|
|
548
|
-
fn: registering ?
|
|
708
|
+
fn: registering ? onFn : "emitter.offDyn",
|
|
549
709
|
args: [
|
|
550
710
|
varRef("r.0", recvT, loc),
|
|
551
711
|
varRef("n.0", STRING, loc),
|
|
@@ -573,6 +733,44 @@ function lowerFlexListenerCall(lowerer, member, name, receiver, cbNode, register
|
|
|
573
733
|
loc,
|
|
574
734
|
};
|
|
575
735
|
}
|
|
736
|
+
/** A lowered value as a checked-dynamic payload: boxed as any untyped
|
|
737
|
+
* value is (records and arrays keep their identity), otherwise a refusal
|
|
738
|
+
* at the argument. */
|
|
739
|
+
function boxedPayload(lowerer, value, node) {
|
|
740
|
+
if (value.type.kind === "dyn")
|
|
741
|
+
return value;
|
|
742
|
+
if (value.kind === "unitLit" ||
|
|
743
|
+
canConvertToDyn(value.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
|
|
744
|
+
return lowerer.coerceToExpected(value, DYN);
|
|
745
|
+
}
|
|
746
|
+
lowerer.noLowering(`emit('error') with a '${lowerer.fmt(value.type)}' payload`, node, "the payload cannot box into a dynamic value");
|
|
747
|
+
}
|
|
748
|
+
/** The listener array of an event whose registrations all hold a checked-
|
|
749
|
+
* dynamic function value (listenerArrayIsDyn), each comparing equal to the
|
|
750
|
+
* function that was registered. JavaScript sources read the untyped array,
|
|
751
|
+
* whose functions take every argument a call passes. TypeScript sources
|
|
752
|
+
* read the element type the typed path declares, the event's tuple: a
|
|
753
|
+
* listener of exactly that signature unwraps to the original closure. An
|
|
754
|
+
* event no literal emit or listener gives a tuple (one registered only under
|
|
755
|
+
* computed names) reads the untyped array in both. */
|
|
756
|
+
function dynListenerArray(lowerer, table, receiver, name, call, loc) {
|
|
757
|
+
const array = {
|
|
758
|
+
kind: "libCall",
|
|
759
|
+
fn: "emitter.listenersDyn",
|
|
760
|
+
args: [receiver, eventNameExpr(name, loc)],
|
|
761
|
+
type: DYN,
|
|
762
|
+
loc,
|
|
763
|
+
};
|
|
764
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(call)) || !table.has(name))
|
|
765
|
+
return array;
|
|
766
|
+
const tuple = tupleOf(lowerer, table, name, call);
|
|
767
|
+
return {
|
|
768
|
+
kind: "dynCheck",
|
|
769
|
+
value: array,
|
|
770
|
+
type: arrayOf({ kind: "func", params: tuple, ret: { kind: "void" } }),
|
|
771
|
+
loc,
|
|
772
|
+
};
|
|
773
|
+
}
|
|
576
774
|
/** The event's unified tuple, with conflicts reported at this site. */
|
|
577
775
|
function tupleOf(lowerer, table, name, blame) {
|
|
578
776
|
const sig = table.get(name);
|
|
@@ -583,6 +781,24 @@ function tupleOf(lowerer, table, name, blame) {
|
|
|
583
781
|
}
|
|
584
782
|
return sig.tuple;
|
|
585
783
|
}
|
|
784
|
+
/** True when the listener is a function whose body reads `arguments`: it
|
|
785
|
+
* lowers with an arguments-pack ABI and takes every emitted argument,
|
|
786
|
+
* which the typed path's call with a prefix of the event's tuple would not
|
|
787
|
+
* pass, so it registers as a checked-dynamic listener. */
|
|
788
|
+
function readsArgumentsPack(lowerer, node) {
|
|
789
|
+
let declaration;
|
|
790
|
+
try {
|
|
791
|
+
declaration = lowerer.checker.getCallSignatures(lowerer.typeOf(node))[0]?.declaration;
|
|
792
|
+
}
|
|
793
|
+
catch {
|
|
794
|
+
return false;
|
|
795
|
+
}
|
|
796
|
+
return (declaration !== undefined &&
|
|
797
|
+
ts.isFunctionLike(declaration) &&
|
|
798
|
+
!ts.isArrowFunction(declaration) &&
|
|
799
|
+
isJsSourceFile(ts.getSourceFileOfNode(declaration)) &&
|
|
800
|
+
bodyReadsArguments(declaration));
|
|
801
|
+
}
|
|
586
802
|
/** How a listener argument is dyn-flavored: "dyn" for a checked-dynamic
|
|
587
803
|
* VALUE (a mustCall wrapper, a listener that rode an untyped binding),
|
|
588
804
|
* "func" for a function whose parameters include dyn (the JS lane's
|
|
@@ -606,6 +822,8 @@ function dynListenerFlavor(lowerer, node) {
|
|
|
606
822
|
if (t?.kind === "func") {
|
|
607
823
|
if (t.params.some((p) => p.kind === "dyn"))
|
|
608
824
|
return "func";
|
|
825
|
+
if (readsArgumentsPack(lowerer, node))
|
|
826
|
+
return "func";
|
|
609
827
|
// The inferred signature of a wrapper can omit its runtime arguments
|
|
610
828
|
// pack. Register the checked callable produced by the factory itself.
|
|
611
829
|
return tryLowerExpression(lowerer, node)?.type.kind === "dyn" ? "dyn" : null;
|
|
@@ -648,7 +866,16 @@ function lowerDynListenerCall(lowerer, member, name, tuple, receiver, cbNode, fl
|
|
|
648
866
|
* tuple is [DYN] — the adapter passes the boxed chunk through. */
|
|
649
867
|
streamData) {
|
|
650
868
|
if (META_EVENTS.has(name)) {
|
|
651
|
-
|
|
869
|
+
// The registration installs the registry's dynamic half: the listener
|
|
870
|
+
// receives the event name and the added or removed listener's
|
|
871
|
+
// checked-dynamic function value, as in Node. Every other listener
|
|
872
|
+
// then registers through the adapter (registersAsDyn), which the event
|
|
873
|
+
// table's scan arranges when it records a dyn-flavored listener of
|
|
874
|
+
// either meta event; a typed listener of the other one arrives here too.
|
|
875
|
+
if (registering && !hasDynMetaListener(emitterEvents(lowerer))) {
|
|
876
|
+
lowerer.noLowering(`'${member}' of '${name}' with a checked-dynamic listener the event table did not record`, cbNode, "register the listener directly at this call");
|
|
877
|
+
}
|
|
878
|
+
return lowerFlexListenerCall(lowerer, member, eventNameExpr(name, loc), receiver, cbNode, registering, once, prepend, loc, "emitter.onAny");
|
|
652
879
|
}
|
|
653
880
|
const getRecord = (id) => lowerer.shapes.get(id);
|
|
654
881
|
const getUnion = (id) => lowerer.unions.get(id);
|
|
@@ -1087,7 +1314,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1087
1314
|
}
|
|
1088
1315
|
return receiver;
|
|
1089
1316
|
};
|
|
1090
|
-
const lowerFlexEmit = (name, kind = "computed-name") => {
|
|
1317
|
+
const lowerFlexEmit = (name, kind = "computed-name", anyName = false) => {
|
|
1091
1318
|
const below = [];
|
|
1092
1319
|
collectEmitOverridesBelow(info, below);
|
|
1093
1320
|
if (emitOverrideAtOrAbove(info) || below.length > 0) {
|
|
@@ -1098,6 +1325,18 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1098
1325
|
lowerer.noLowering(`${kind} emit on a nullable or non-emitter receiver`, access.expression, "narrow the receiver to an EventEmitter instance before emitting");
|
|
1099
1326
|
}
|
|
1100
1327
|
const payload = args.slice(1).map((arg) => lowerer.lowerExprExpecting(arg, DYN));
|
|
1328
|
+
if (anyName) {
|
|
1329
|
+
// Any event name: the checked-dynamic receiver's emit, which keeps
|
|
1330
|
+
// 'error' and the meta events' contracts and converts the arguments
|
|
1331
|
+
// for listeners registered with a typed tuple.
|
|
1332
|
+
return (lowerDynamicEmitterEmit(lowerer, receiver, name, payload, loc) ?? {
|
|
1333
|
+
kind: "libCall",
|
|
1334
|
+
fn: "emitter.emitAny",
|
|
1335
|
+
args: [receiver, name, ...payload],
|
|
1336
|
+
type: BOOL,
|
|
1337
|
+
loc,
|
|
1338
|
+
});
|
|
1339
|
+
}
|
|
1101
1340
|
return {
|
|
1102
1341
|
kind: "libCall",
|
|
1103
1342
|
fn: "emitter.emitFlex",
|
|
@@ -1182,10 +1421,14 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1182
1421
|
}
|
|
1183
1422
|
const registering = REGISTER_MEMBERS.has(member);
|
|
1184
1423
|
if (literalEventName(lowerer, args[0]) === null) {
|
|
1185
|
-
|
|
1424
|
+
// An unrestricted name on a plain emitter takes the any-name path;
|
|
1425
|
+
// streams keep the fence (their runtime events carry fixed ABIs).
|
|
1426
|
+
const anyName = computedEventPatternOf(lowerer, args[0]) === null && streamSidesOf(lowerer, info) === null;
|
|
1427
|
+
if (!anyName)
|
|
1428
|
+
computedEventPattern(lowerer, info, member, args[0]);
|
|
1186
1429
|
const receiver = lowerReceiver();
|
|
1187
1430
|
const name = lowerer.lowerExprExpecting(args[0], STRING);
|
|
1188
|
-
return lowerFlexListenerCall(lowerer, member, name, receiver, args[1], registering, member === "once" || member === "prependOnceListener", member === "prependListener" || member === "prependOnceListener", loc);
|
|
1431
|
+
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
1432
|
}
|
|
1190
1433
|
const name = eventNameOf(lowerer, member, args[0]);
|
|
1191
1434
|
if (!META_EVENTS.has(name) &&
|
|
@@ -1216,7 +1459,8 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1216
1459
|
// to the declared type, or take the value (dyn).
|
|
1217
1460
|
const sides = streamSidesOf(lowerer, info);
|
|
1218
1461
|
if (name === "data" && (sides === "r" || sides === "rw")) {
|
|
1219
|
-
const dynFlavor = dynListenerFlavor(lowerer, args[1])
|
|
1462
|
+
const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
|
|
1463
|
+
(registersAsDyn(lowerer, name, true) ? "func" : null);
|
|
1220
1464
|
if (dynFlavor !== null) {
|
|
1221
1465
|
return lowerDynListenerCall(lowerer, member, name, [DYN], receiver, args[1], dynFlavor, registering, once, prepend, loc, true);
|
|
1222
1466
|
}
|
|
@@ -1259,6 +1503,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1259
1503
|
args: [receiver, eventNameExpr(name, loc), cb, boolLit(once, loc), boolLit(prepend, loc)],
|
|
1260
1504
|
type: receiver.type,
|
|
1261
1505
|
loc,
|
|
1506
|
+
...(listenerReadsThis(lowerer, args[1]) ? { bindsThis: true } : {}),
|
|
1262
1507
|
};
|
|
1263
1508
|
}
|
|
1264
1509
|
// Stream-rooted receivers consult the per-base FORCED tuples first
|
|
@@ -1273,7 +1518,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1273
1518
|
if (probe)
|
|
1274
1519
|
checkKeypressListener(lowerer, args[1], probe);
|
|
1275
1520
|
}
|
|
1276
|
-
const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
|
|
1521
|
+
const dynFlavor = dynListenerFlavor(lowerer, args[1]) ??
|
|
1522
|
+
(keypress || registersAsDyn(lowerer, name, streamForcedTuple(lowerer, info, name) !== null)
|
|
1523
|
+
? "func"
|
|
1524
|
+
: null);
|
|
1277
1525
|
if (dynFlavor !== null) {
|
|
1278
1526
|
return lowerDynListenerCall(lowerer, member, name, tuple, receiver, args[1], dynFlavor, registering, once, prepend, loc, false);
|
|
1279
1527
|
}
|
|
@@ -1286,6 +1534,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1286
1534
|
: [receiver, eventNameExpr(name, loc), cb],
|
|
1287
1535
|
type: receiver.type,
|
|
1288
1536
|
loc,
|
|
1537
|
+
...(registering && listenerReadsThis(lowerer, args[1]) ? { bindsThis: true } : {}),
|
|
1289
1538
|
};
|
|
1290
1539
|
}
|
|
1291
1540
|
if (member === "emit") {
|
|
@@ -1295,6 +1544,7 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1295
1544
|
if (literalEventName(lowerer, args[0]) === null) {
|
|
1296
1545
|
const pattern = computedEventPatternOf(lowerer, args[0]);
|
|
1297
1546
|
const mayBeObserved = pattern === null ||
|
|
1547
|
+
lowerer.emitterAnyNameListener ||
|
|
1298
1548
|
computedPatternOverlapsReserved(pattern) ||
|
|
1299
1549
|
[...table].some(([candidate, sig]) => (candidate === "error" || sig.hasListener) && patternMatchesName(pattern, candidate)) ||
|
|
1300
1550
|
computedPatterns(lowerer).some((registered) => registered.listener && computedPatternsOverlap(pattern, registered));
|
|
@@ -1314,6 +1564,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1314
1564
|
loc,
|
|
1315
1565
|
};
|
|
1316
1566
|
}
|
|
1567
|
+
if (pattern === null && streamSidesOf(lowerer, info) === null) {
|
|
1568
|
+
const name = lowerer.lowerExprExpecting(args[0], STRING);
|
|
1569
|
+
return lowerFlexEmit(name, "computed-name", true);
|
|
1570
|
+
}
|
|
1317
1571
|
computedEventPattern(lowerer, info, member, args[0]);
|
|
1318
1572
|
const name = lowerer.lowerExprExpecting(args[0], STRING);
|
|
1319
1573
|
return lowerFlexEmit(name);
|
|
@@ -1327,23 +1581,30 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1327
1581
|
return lowerFlexEmit(eventNameExpr(name, loc), flexibleJsEvent(name, table.get(name)) ? "variable-arity" : "computed-name");
|
|
1328
1582
|
const receiver = lowerReceiver();
|
|
1329
1583
|
if (name === "error") {
|
|
1330
|
-
// The special event:
|
|
1331
|
-
//
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
return true;
|
|
1584
|
+
// The special event: one %Error-rooted payload; no listener means the
|
|
1585
|
+
// runtime THROWS it (emitter.emitError, may-throw).
|
|
1586
|
+
const err = args.length === 2 ? lowerer.lowerExpr(args[1]) : null;
|
|
1587
|
+
if (err === null || !rootsAtError(lowerer, err.type)) {
|
|
1588
|
+
// Any other payload, or another argument count: the arguments box
|
|
1589
|
+
// to dyn. With no 'error' listener the runtime throws Node's
|
|
1590
|
+
// ERR_UNHANDLED_ERROR (the payload's util.inspect in the message,
|
|
1591
|
+
// the payload as `context`); listeners receive the arguments as
|
|
1592
|
+
// given.
|
|
1593
|
+
if (emitOverrideAtOrAbove(info) || superRecv !== undefined) {
|
|
1594
|
+
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
1595
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1596
|
+
const payload = args
|
|
1597
|
+
.slice(1)
|
|
1598
|
+
.map((arg, i) => i === 0 && err !== null
|
|
1599
|
+
? boxedPayload(lowerer, err, arg)
|
|
1600
|
+
: lowerer.lowerExprExpecting(arg, DYN));
|
|
1601
|
+
return {
|
|
1602
|
+
kind: "libCall",
|
|
1603
|
+
fn: "emitter.emitErrorValue",
|
|
1604
|
+
args: [receiver, ...payload],
|
|
1605
|
+
type: BOOL,
|
|
1606
|
+
loc,
|
|
1607
|
+
};
|
|
1347
1608
|
}
|
|
1348
1609
|
return emitDispatchExpr(lowerer, info, name, [{ kind: "object", className: "%Error" }], receiver, [lowerer.upcastTo(err, "%Error")], superRecv?.cls, loc);
|
|
1349
1610
|
}
|
|
@@ -1452,9 +1713,10 @@ export function lowerEmitterMethodCall(lowerer, call, access, info, superRecv) {
|
|
|
1452
1713
|
}
|
|
1453
1714
|
const name = eventNameOf(lowerer, member, args[0]);
|
|
1454
1715
|
const sig = table.get(name);
|
|
1455
|
-
if (sig
|
|
1456
|
-
|
|
1457
|
-
|
|
1716
|
+
if (listenerArrayIsDyn(lowerer, name, sig)) {
|
|
1717
|
+
return dynListenerArray(lowerer, table, lowerReceiver(), name, call, loc);
|
|
1718
|
+
}
|
|
1719
|
+
if (sig?.dynListener || computedListenerMayHold(lowerer, name)) {
|
|
1458
1720
|
// A dyn-adapted registration means the runtime bucket can hold
|
|
1459
1721
|
// originals of MIXED signatures — no one honest element type.
|
|
1460
1722
|
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");
|
|
@@ -2070,6 +2332,44 @@ export function lowerEventsOnce(lowerer, call, loc) {
|
|
|
2070
2332
|
const arrayT = arrayOf(DYN);
|
|
2071
2333
|
const resultT = { kind: "promise", inner: arrayT };
|
|
2072
2334
|
let receiver = lowerer.lowerExpr(args[0]);
|
|
2335
|
+
// events.once(process.stdout, "drain"): the next 'drain' of a stream
|
|
2336
|
+
// whose writes are synchronous never comes (Node emits it only after a
|
|
2337
|
+
// write returned false), so the promise stays pending. A pending promise
|
|
2338
|
+
// holds nothing: the process exits when the loop is empty, as in Node.
|
|
2339
|
+
{
|
|
2340
|
+
let target = args[0];
|
|
2341
|
+
while (ts.isParenthesizedExpression(target))
|
|
2342
|
+
target = target.expression;
|
|
2343
|
+
const stream = ts.isPropertyAccessExpression(target)
|
|
2344
|
+
? lowerer.stdlibGlobalMember(target, "process")
|
|
2345
|
+
: null;
|
|
2346
|
+
const nameT = lowerer.typeOf(args[1]);
|
|
2347
|
+
if ((stream === "stdout" || stream === "stderr") &&
|
|
2348
|
+
nameT.isStringLiteralType() &&
|
|
2349
|
+
nameT.value === "drain" &&
|
|
2350
|
+
args.length === 2) {
|
|
2351
|
+
const pending = {
|
|
2352
|
+
kind: "libCall",
|
|
2353
|
+
fn: "events.pendingForever",
|
|
2354
|
+
args: [],
|
|
2355
|
+
type: resultT,
|
|
2356
|
+
loc,
|
|
2357
|
+
};
|
|
2358
|
+
let name = args[1];
|
|
2359
|
+
while (ts.isParenthesizedExpression(name))
|
|
2360
|
+
name = name.expression;
|
|
2361
|
+
if (ts.isStringLiteralLike(name))
|
|
2362
|
+
return pending;
|
|
2363
|
+
// A name expression typed "drain" still runs (`pick()`, `(log(), "drain")`).
|
|
2364
|
+
return {
|
|
2365
|
+
kind: "seqExpr",
|
|
2366
|
+
stmts: [{ kind: "exprStmt", expr: lowerer.lowerExpr(args[1]), loc }],
|
|
2367
|
+
result: pending,
|
|
2368
|
+
type: resultT,
|
|
2369
|
+
loc,
|
|
2370
|
+
};
|
|
2371
|
+
}
|
|
2372
|
+
}
|
|
2073
2373
|
// A checked-dynamic NodeJS stream slot (dyn-streams.ts): a native stream
|
|
2074
2374
|
// unboxes by identity; any other value throws the not-supported Error.
|
|
2075
2375
|
if (receiver.type.kind === "dyn" &&
|
|
@@ -2241,9 +2541,10 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2241
2541
|
const name = eventNameOf(lowerer, "events.getEventListeners", args[1]);
|
|
2242
2542
|
const table = emitterEvents(lowerer);
|
|
2243
2543
|
const sig = table.get(name);
|
|
2244
|
-
if (sig
|
|
2245
|
-
|
|
2246
|
-
|
|
2544
|
+
if (listenerArrayIsDyn(lowerer, name, sig)) {
|
|
2545
|
+
return dynListenerArray(lowerer, table, receiver, name, call, loc);
|
|
2546
|
+
}
|
|
2547
|
+
if (sig?.dynListener || computedListenerMayHold(lowerer, name)) {
|
|
2247
2548
|
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
2549
|
}
|
|
2249
2550
|
const tuple = tupleOf(lowerer, table, name, call);
|
|
@@ -2257,4 +2558,45 @@ export function lowerEventsEmitterHelper(lowerer, call, member, loc) {
|
|
|
2257
2558
|
}
|
|
2258
2559
|
return null;
|
|
2259
2560
|
}
|
|
2561
|
+
/** Whether a typed listener can read the `this` its calls bind (Node calls
|
|
2562
|
+
* listeners with the emitter as `this`): a function expression, or a
|
|
2563
|
+
* function declaration or `const` function binding, whose own body reads
|
|
2564
|
+
* `this`; any other listener value except an arrow in a JavaScript source;
|
|
2565
|
+
* and in a TypeScript source, where a function reads `this` only through a
|
|
2566
|
+
* declared `this` parameter, a value whose call signature declares one.
|
|
2567
|
+
* Arrows read the enclosing `this`. */
|
|
2568
|
+
function listenerReadsThis(lowerer, node) {
|
|
2569
|
+
let listener = node;
|
|
2570
|
+
while (ts.isParenthesizedExpression(listener))
|
|
2571
|
+
listener = listener.expression;
|
|
2572
|
+
if (ts.isArrowFunction(listener))
|
|
2573
|
+
return false;
|
|
2574
|
+
if (ts.isFunctionExpression(listener))
|
|
2575
|
+
return functionUsesThis(listener);
|
|
2576
|
+
if (ts.isIdentifier(listener)) {
|
|
2577
|
+
const decls = lowerer.checker.getSymbolAtLocation(listener)?.declarations ?? [];
|
|
2578
|
+
// An overloaded function's implementation is the declaration with a
|
|
2579
|
+
// body; its overload signatures have none.
|
|
2580
|
+
const fn = decls.find((d) => ts.isFunctionDeclaration(d) && d.body !== undefined);
|
|
2581
|
+
if (fn !== undefined)
|
|
2582
|
+
return functionUsesThis(fn);
|
|
2583
|
+
const binding = decls.find(ts.isVariableDeclaration);
|
|
2584
|
+
let init = binding?.initializer;
|
|
2585
|
+
while (init !== undefined && ts.isParenthesizedExpression(init))
|
|
2586
|
+
init = init.expression;
|
|
2587
|
+
if (binding !== undefined &&
|
|
2588
|
+
init !== undefined &&
|
|
2589
|
+
(ts.getCombinedNodeFlags(binding) & ts.NodeFlags.Const) !== 0) {
|
|
2590
|
+
if (ts.isArrowFunction(init))
|
|
2591
|
+
return false;
|
|
2592
|
+
if (ts.isFunctionExpression(init))
|
|
2593
|
+
return functionUsesThis(init);
|
|
2594
|
+
}
|
|
2595
|
+
}
|
|
2596
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)))
|
|
2597
|
+
return true;
|
|
2598
|
+
return lowerer.checker
|
|
2599
|
+
.getCallSignatures(lowerer.typeOf(listener))
|
|
2600
|
+
.some((signature) => (signature.declaration?.parameters?.nodes ?? []).some(isThisParameter));
|
|
2601
|
+
}
|
|
2260
2602
|
//# sourceMappingURL=lower-event-emitter.js.map
|