| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 3229886 commit 1f72393
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,33 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const common = require('../common.js'); | ||
| 4 | + const assert = require('node:assert'); | ||
| 5 | + | ||
| 6 | + const bench = common.createBenchmark(main, { | ||
| 7 | + n: [1e6], | ||
| 8 | + kind: ['AbortController', 'AbortSignal.timeout'], | ||
| 9 | + }); | ||
| 10 | + | ||
| 11 | + function main({ n, kind }) { | ||
| 12 | + let result; | ||
| 13 | + | ||
| 14 | + switch (kind) { | ||
| 15 | + case 'AbortController': | ||
| 16 | + bench.start(); | ||
| 17 | + for (let i = 0; i < n; i++) | ||
| 18 | + result = new AbortController().signal; // AbortSignal is created lazily on first .signal access | ||
| 19 | + bench.end(n); | ||
| 20 | + break; | ||
| 21 | + case 'AbortSignal.timeout': | ||
| 22 | + bench.start(); | ||
| 23 | + for (let i = 0; i < n; i++) | ||
| 24 | + result = AbortSignal.timeout(1); | ||
| 25 | + bench.end(n); | ||
| 26 | + break; | ||
| 27 | + default: | ||
| 28 | + throw new Error('Invalid kind'); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + // Avoid V8 dead code elimination | ||
| 32 | + assert.ok(result); | ||
| 33 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -927,7 +927,7 @@ function getEventListeners(emitterOrTarget, type) { | |||
| 927 | 927 | // Require event target lazily to avoid always loading it | |
| 928 | 928 | const { isEventTarget, kEvents } = require('internal/event_target'); | |
| 929 | 929 | if (isEventTarget(emitterOrTarget)) { | |
| 930 | - const root = emitterOrTarget[kEvents].get(type); | ||
| 930 | + const root = emitterOrTarget[kEvents]?.get(type); | ||
| 931 | 931 | const listeners = []; | |
| 932 | 932 | let handler = root?.next; | |
| 933 | 933 | while (handler?.listener !== undefined) { | |
@@ -972,7 +972,7 @@ function listenerCount(emitterOrTarget, type) { | |||
| 972 | 972 | } | |
| 973 | 973 | const { isEventTarget, kEvents } = require('internal/event_target'); | |
| 974 | 974 | if (isEventTarget(emitterOrTarget)) { | |
| 975 | - return emitterOrTarget[kEvents].get(type)?.size ?? 0; | ||
| 975 | + return emitterOrTarget[kEvents]?.get(type)?.size ?? 0; | ||
| 976 | 976 | } | |
| 977 | 977 | throw new ERR_INVALID_ARG_TYPE('emitter', | |
| 978 | 978 | ['EventEmitter', 'EventTarget'], | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -551,10 +551,16 @@ class Listener { | |||
| 551 | 551 | } | |
| 552 | 552 | ||
| 553 | 553 | function initEventTarget(self) { | |
| 554 | - self[kEvents] = new SafeMap(); | ||
| 554 | + self[kEvents] = undefined; | ||
| 555 | 555 | self[kMaxEventTargetListeners] = EventEmitter.defaultMaxListeners; | |
| 556 | 556 | self[kMaxEventTargetListenersWarned] = false; | |
| 557 | - self[kHandlers] = new SafeMap(); | ||
| 557 | + self[kHandlers] = undefined; | ||
| 558 | + } | ||
| 559 | + | ||
| 560 | + function getEventsMap(self) { | ||
| 561 | + if (self[kEvents] === undefined) | ||
| 562 | + self[kEvents] = new SafeMap(); | ||
| 563 | + return self[kEvents]; | ||
| 558 | 564 | } | |
| 559 | 565 | ||
| 560 | 566 | class EventTarget { | |
@@ -660,7 +666,8 @@ class EventTarget { | |||
| 660 | 666 | ||
| 661 | 667 | type = webidl.converters.DOMString(type); | |
| 662 | 668 | ||
| 663 | - let root = this[kEvents].get(type); | ||
| 669 | + const eventsMap = getEventsMap(this); | ||
| 670 | + let root = eventsMap.get(type); | ||
| 664 | 671 | ||
| 665 | 672 | if (root === undefined) { | |
| 666 | 673 | root = { size: 1, next: undefined, resistStopPropagation: Boolean(resistStopPropagation) }; | |
@@ -675,7 +682,7 @@ class EventTarget { | |||
| 675 | 682 | capture, | |
| 676 | 683 | passive, | |
| 677 | 684 | weak); | |
| 678 | - this[kEvents].set(type, root); | ||
| 685 | + eventsMap.set(type, root); | ||
| 679 | 686 | return; | |
| 680 | 687 | } | |
| 681 | 688 | ||
@@ -717,6 +724,9 @@ class EventTarget { | |||
| 717 | 724 | type = webidl.converters.DOMString(type); | |
| 718 | 725 | const capture = options?.capture === true; | |
| 719 | 726 | ||
| 727 | + if (this[kEvents] === undefined) | ||
| 728 | + return; | ||
| 729 | + | ||
| 720 | 730 | const root = this[kEvents].get(type); | |
| 721 | 731 | if (root === undefined || root.next === undefined) | |
| 722 | 732 | return; | |
@@ -736,6 +746,9 @@ class EventTarget { | |||
| 736 | 746 | } | |
| 737 | 747 | ||
| 738 | 748 | [kRemoveWeakListenerHelper](type, listener) { | |
| 749 | + if (this[kEvents] === undefined) | ||
| 750 | + return; | ||
| 751 | + | ||
| 739 | 752 | const root = this[kEvents].get(type); | |
| 740 | 753 | if (root === undefined || root.next === undefined) | |
| 741 | 754 | return; | |
@@ -791,7 +804,7 @@ class EventTarget { | |||
| 791 | 804 | event[kIsBeingDispatched] = true; | |
| 792 | 805 | } | |
| 793 | 806 | ||
| 794 | - const root = this[kEvents].get(type); | ||
| 807 | + const root = this[kEvents]?.get(type); | ||
| 795 | 808 | if (root === undefined || root.next === undefined) { | |
| 796 | 809 | if (event !== undefined) | |
| 797 | 810 | event[kIsBeingDispatched] = false; | |
@@ -927,6 +940,8 @@ class NodeEventTarget extends EventTarget { | |||
| 927 | 940 | eventNames() { | |
| 928 | 941 | if (!isNodeEventTarget(this)) | |
| 929 | 942 | throw new ERR_INVALID_THIS('NodeEventTarget'); | |
| 943 | + if (this[kEvents] === undefined) | ||
| 944 | + return []; | ||
| 930 | 945 | return ArrayFrom(this[kEvents].keys()); | |
| 931 | 946 | } | |
| 932 | 947 | ||
@@ -937,6 +952,8 @@ class NodeEventTarget extends EventTarget { | |||
| 937 | 952 | listenerCount(type) { | |
| 938 | 953 | if (!isNodeEventTarget(this)) | |
| 939 | 954 | throw new ERR_INVALID_THIS('NodeEventTarget'); | |
| 955 | + if (this[kEvents] === undefined) | ||
| 956 | + return 0; | ||
| 940 | 957 | const root = this[kEvents].get(String(type)); | |
| 941 | 958 | return root !== undefined ? root.size : 0; | |
| 942 | 959 | } | |
@@ -1029,11 +1046,12 @@ class NodeEventTarget extends EventTarget { | |||
| 1029 | 1046 | removeAllListeners(type) { | |
| 1030 | 1047 | if (!isNodeEventTarget(this)) | |
| 1031 | 1048 | throw new ERR_INVALID_THIS('NodeEventTarget'); | |
| 1032 | - if (type !== undefined) { | ||
| 1049 | + if (this[kEvents] === undefined) | ||
| 1050 | + return this; | ||
| 1051 | + if (type !== undefined) | ||
| 1033 | 1052 | this[kEvents].delete(String(type)); | |
| 1034 | - } else { | ||
| 1053 | + else | ||
| 1035 | 1054 | this[kEvents].clear(); | |
| 1036 | - } | ||
| 1037 | 1055 | ||
| 1038 | 1056 | return this; | |
| 1039 | 1057 | } | |
@@ -1145,18 +1163,29 @@ function defineEventHandler(emitter, name, event = name) { | |||
| 1145 | 1163 | ||
| 1146 | 1164 | function set(value) { | |
| 1147 | 1165 | validateThisInternalField(this, kHandlers, 'EventTarget'); | |
| 1148 | - let wrappedHandler = this[kHandlers]?.get(event); | ||
| 1166 | + if (this[kHandlers] === undefined) | ||
| 1167 | + this[kHandlers] = new SafeMap(); | ||
| 1168 | + let wrappedHandler = this[kHandlers].get(event); | ||
| 1149 | 1169 | if (wrappedHandler) { | |
| 1170 | + const eventsMap = getEventsMap(this); | ||
| 1150 | 1171 | if (typeof wrappedHandler.handler === 'function') { | |
| 1151 | - this[kEvents].get(event).size--; | ||
| 1152 | - const size = this[kEvents].get(event).size; | ||
| 1153 | - this[kRemoveListener](size, event, wrappedHandler.handler, false); | ||
| 1172 | + const root = eventsMap.get(event); | ||
| 1173 | + if (root !== undefined) { | ||
| 1174 | + root.size--; | ||
| 1175 | + this[kRemoveListener](root.size, event, wrappedHandler.handler, false); | ||
| 1176 | + } | ||
| 1154 | 1177 | } | |
| 1155 | 1178 | wrappedHandler.handler = value; | |
| 1156 | 1179 | if (typeof wrappedHandler.handler === 'function') { | |
| 1157 | - this[kEvents].get(event).size++; | ||
| 1158 | - const size = this[kEvents].get(event).size; | ||
| 1159 | - this[kNewListener](size, event, value, false, false, false, false); | ||
| 1180 | + const root = eventsMap.get(event); | ||
| 1181 | + if (root !== undefined) { | ||
| 1182 | + root.size++; | ||
| 1183 | + this[kNewListener](root.size, event, value, false, false, false, false); | ||
| 1184 | + } else { | ||
| 1185 | + // The wrapper was externally removed from kEvents (e.g. via | ||
| 1186 | + // removeEventListener); re-register it so the handler fires. | ||
| 1187 | + this.addEventListener(event, wrappedHandler); | ||
| 1188 | + } | ||
| 1160 | 1189 | } | |
| 1161 | 1190 | } else { | |
| 1162 | 1191 | wrappedHandler = makeEventHandler(value); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments