summaryrefslogtreecommitdiff
path: root/ext/web/02_event.js
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2021-09-21 17:51:44 +0200
committerGitHub <noreply@github.com>2021-09-21 17:51:44 +0200
commit0aa6fefce72bfb86dce00b61e72201d363e0bcff (patch)
treec0ee6d7ec15538b005cada306bc8716a4b09b731 /ext/web/02_event.js
parentf827b93df42385a0a5e37b6fbd41f2808aa9aa94 (diff)
perf(ext/web): optimize EventTarget (#12166)
and all its subclasses including `AbortSignal` ... Instead of storing associated data in a global `WeakMap` we store them as private attributes (via a Symbol) on the object instances
Diffstat (limited to 'ext/web/02_event.js')
-rw-r--r--ext/web/02_event.js33
1 files changed, 12 insertions, 21 deletions
diff --git a/ext/web/02_event.js b/ext/web/02_event.js
index 4cca20e00..c61f0955d 100644
--- a/ext/web/02_event.js
+++ b/ext/web/02_event.js
@@ -34,9 +34,6 @@
SymbolFor,
SymbolToStringTag,
TypeError,
- WeakMap,
- WeakMapPrototypeGet,
- WeakMapPrototypeSet,
} = window.__bootstrap.primordials;
// accessors for non runtime visible data
@@ -842,32 +839,30 @@
// Accessors for non-public data
- const eventTargetData = new WeakMap();
+ const eventTargetData = Symbol();
- function setEventTargetData(value) {
- WeakMapPrototypeSet(eventTargetData, value, getDefaultTargetData());
+ function setEventTargetData(target) {
+ target[eventTargetData] = getDefaultTargetData();
}
function getAssignedSlot(target) {
- return Boolean(WeakMapPrototypeGet(eventTargetData, target)?.assignedSlot);
+ return Boolean(target?.[eventTargetData]?.assignedSlot);
}
function getHasActivationBehavior(target) {
- return Boolean(
- WeakMapPrototypeGet(eventTargetData, target)?.hasActivationBehavior,
- );
+ return Boolean(target?.[eventTargetData]?.hasActivationBehavior);
}
function getHost(target) {
- return WeakMapPrototypeGet(eventTargetData, target)?.host ?? null;
+ return target?.[eventTargetData]?.host ?? null;
}
function getListeners(target) {
- return WeakMapPrototypeGet(eventTargetData, target)?.listeners ?? {};
+ return target?.[eventTargetData]?.listeners ?? {};
}
function getMode(target) {
- return WeakMapPrototypeGet(eventTargetData, target)?.mode ?? null;
+ return target?.[eventTargetData]?.mode ?? null;
}
function getDefaultTargetData() {
@@ -882,7 +877,7 @@
class EventTarget {
constructor() {
- WeakMapPrototypeSet(eventTargetData, this, getDefaultTargetData());
+ this[eventTargetData] = getDefaultTargetData();
}
addEventListener(
@@ -898,10 +893,7 @@
}
options = normalizeAddEventHandlerOptions(options);
- const { listeners } = WeakMapPrototypeGet(
- eventTargetData,
- this ?? globalThis,
- );
+ const { listeners } = (this ?? globalThis)[eventTargetData];
if (!(type in listeners)) {
listeners[type] = [];
@@ -946,8 +938,7 @@
prefix: "Failed to execute 'removeEventListener' on 'EventTarget'",
});
- const listeners =
- WeakMapPrototypeGet(eventTargetData, this ?? globalThis).listeners;
+ const { listeners } = (this ?? globalThis)[eventTargetData];
if (callback !== null && type in listeners) {
listeners[type] = ArrayPrototypeFilter(
listeners[type],
@@ -980,7 +971,7 @@
});
const self = this ?? globalThis;
- const listeners = WeakMapPrototypeGet(eventTargetData, self).listeners;
+ const { listeners } = self[eventTargetData];
if (!(event.type in listeners)) {
setTarget(event, this);
return true;