Skip to content

Commit d4e9384

Browse files
mabaasitjuanarbol
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 0484122 commit d4e9384

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
@@ -394,6 +394,13 @@ function weakListeners() {
394394
return { registry: weakListenersState, map: objectToWeakListenerMap };
395395
}
396396

397+
const kFlagOnce = 1 << 0;
398+
const kFlagCapture = 1 << 1;
399+
const kFlagPassive = 1 << 2;
400+
const kFlagNodeStyle = 1 << 3;
401+
const kFlagWeak = 1 << 4;
402+
const kFlagRemoved = 1 << 5;
403+
397404
// The listeners for an EventTarget are maintained as a linked list.
398405
// Unfortunately, the way EventTarget is defined, listeners are accounted
399406
// using the tuple [handler,capture], and even if we don't actually make
@@ -409,13 +416,21 @@ class Listener {
409416
previous.next = this;
410417
this.previous = previous;
411418
this.listener = listener;
412-
// TODO(benjamingr) these 4 can be 'flags' to save 3 slots
413-
this.once = once;
414-
this.capture = capture;
415-
this.passive = passive;
416-
this.isNodeStyleListener = isNodeStyleListener;
419+
420+
let flags = 0b0;
421+
if (once)
422+
flags |= kFlagOnce;
423+
if (capture)
424+
flags |= kFlagCapture;
425+
if (passive)
426+
flags |= kFlagPassive;
427+
if (isNodeStyleListener)
428+
flags |= kFlagNodeStyle;
429+
if (weak)
430+
flags |= kFlagWeak;
431+
this.flags = flags;
432+
417433
this.removed = false;
418-
this.weak = Boolean(weak); // Don't retain the object
419434

420435
if (this.weak) {
421436
this.callback = new SafeWeakRef(listener);
@@ -435,6 +450,31 @@ class Listener {
435450
}
436451
}
437452

453+
get once() {
454+
return Boolean(this.flags & kFlagOnce);
455+
}
456+
get capture() {
457+
return Boolean(this.flags & kFlagCapture);
458+
}
459+
get passive() {
460+
return Boolean(this.flags & kFlagPassive);
461+
}
462+
get isNodeStyleListener() {
463+
return Boolean(this.flags & kFlagNodeStyle);
464+
}
465+
get weak() {
466+
return Boolean(this.flags & kFlagWeak);
467+
}
468+
get removed() {
469+
return Boolean(this.flags & kFlagRemoved);
470+
}
471+
set removed(value) {
472+
if (value)
473+
this.flags |= kFlagRemoved;
474+
else
475+
this.flags &= ~kFlagRemoved;
476+
}
477+
438478
same(listener, capture) {
439479
const myListener = this.weak ? this.listener.deref() : this.listener;
440480
return myListener === listener && this.capture === capture;

0 commit comments

Comments
 (0)