Skip to content

Commit d57178c

Browse files
mabaasitruyadorno
authored andcommitted
events: use bitset to save memory
PR-URL: #43700 Reviewed-By: Gerhard Stöbich <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent b2a15b6 commit d57178c

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

lib/internal/event_target.js

+46-6
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)