Skip to content

Commit eac875e

Browse files
mabaasitdanielleadams
authored andcommitted
events: use bitset to save memory
PR-URL: #43700 Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 7104210 commit eac875e

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

lib/internal/event_target.js

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,13 @@ function weakListeners() {
389389
return { registry: weakListenersState, map: objectToWeakListenerMap };
390390
}
391391

392+
const kFlagOnce = 1 << 0;
393+
const kFlagCapture = 1 << 1;
394+
const kFlagPassive = 1 << 2;
395+
const kFlagNodeStyle = 1 << 3;
396+
const kFlagWeak = 1 << 4;
397+
const kFlagRemoved = 1 << 5;
398+
392399
// The listeners for an EventTarget are maintained as a linked list.
393400
// Unfortunately, the way EventTarget is defined, listeners are accounted
394401
// using the tuple [handler,capture], and even if we don't actually make
@@ -404,13 +411,21 @@ class Listener {
404411
previous.next = this;
405412
this.previous = previous;
406413
this.listener = listener;
407-
// TODO(benjamingr) these 4 can be 'flags' to save 3 slots
408-
this.once = once;
409-
this.capture = capture;
410-
this.passive = passive;
411-
this.isNodeStyleListener = isNodeStyleListener;
414+
415+
let flags = 0b0;
416+
if (once)
417+
flags |= kFlagOnce;
418+
if (capture)
419+
flags |= kFlagCapture;
420+
if (passive)
421+
flags |= kFlagPassive;
422+
if (isNodeStyleListener)
423+
flags |= kFlagNodeStyle;
424+
if (weak)
425+
flags |= kFlagWeak;
426+
this.flags = flags;
427+
412428
this.removed = false;
413-
this.weak = Boolean(weak); // Don't retain the object
414429

415430
if (this.weak) {
416431
this.callback = new SafeWeakRef(listener);
@@ -430,6 +445,31 @@ class Listener {
430445
}
431446
}
432447

448+
get once() {
449+
return Boolean(this.flags & kFlagOnce);
450+
}
451+
get capture() {
452+
return Boolean(this.flags & kFlagCapture);
453+
}
454+
get passive() {
455+
return Boolean(this.flags & kFlagPassive);
456+
}
457+
get isNodeStyleListener() {
458+
return Boolean(this.flags & kFlagNodeStyle);
459+
}
460+
get weak() {
461+
return Boolean(this.flags & kFlagWeak);
462+
}
463+
get removed() {
464+
return Boolean(this.flags & kFlagRemoved);
465+
}
466+
set removed(value) {
467+
if (value)
468+
this.flags |= kFlagRemoved;
469+
else
470+
this.flags &= ~kFlagRemoved;
471+
}
472+
433473
same(listener, capture) {
434474
const myListener = this.weak ? this.listener.deref() : this.listener;
435475
return myListener === listener && this.capture === capture;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy