mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
events: use bitset to save memory
PR-URL: https://github.com/nodejs/node/pull/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>
This commit is contained in:
committed by
Anna Henningsen
parent
3028af95de
commit
9b8ba25360
@@ -389,6 +389,13 @@ function weakListeners() {
|
||||
return { registry: weakListenersState, map: objectToWeakListenerMap };
|
||||
}
|
||||
|
||||
const kFlagOnce = 1 << 0;
|
||||
const kFlagCapture = 1 << 1;
|
||||
const kFlagPassive = 1 << 2;
|
||||
const kFlagNodeStyle = 1 << 3;
|
||||
const kFlagWeak = 1 << 4;
|
||||
const kFlagRemoved = 1 << 5;
|
||||
|
||||
// The listeners for an EventTarget are maintained as a linked list.
|
||||
// Unfortunately, the way EventTarget is defined, listeners are accounted
|
||||
// using the tuple [handler,capture], and even if we don't actually make
|
||||
@@ -404,13 +411,21 @@ class Listener {
|
||||
previous.next = this;
|
||||
this.previous = previous;
|
||||
this.listener = listener;
|
||||
// TODO(benjamingr) these 4 can be 'flags' to save 3 slots
|
||||
this.once = once;
|
||||
this.capture = capture;
|
||||
this.passive = passive;
|
||||
this.isNodeStyleListener = isNodeStyleListener;
|
||||
|
||||
let flags = 0b0;
|
||||
if (once)
|
||||
flags |= kFlagOnce;
|
||||
if (capture)
|
||||
flags |= kFlagCapture;
|
||||
if (passive)
|
||||
flags |= kFlagPassive;
|
||||
if (isNodeStyleListener)
|
||||
flags |= kFlagNodeStyle;
|
||||
if (weak)
|
||||
flags |= kFlagWeak;
|
||||
this.flags = flags;
|
||||
|
||||
this.removed = false;
|
||||
this.weak = Boolean(weak); // Don't retain the object
|
||||
|
||||
if (this.weak) {
|
||||
this.callback = new SafeWeakRef(listener);
|
||||
@@ -430,6 +445,31 @@ class Listener {
|
||||
}
|
||||
}
|
||||
|
||||
get once() {
|
||||
return Boolean(this.flags & kFlagOnce);
|
||||
}
|
||||
get capture() {
|
||||
return Boolean(this.flags & kFlagCapture);
|
||||
}
|
||||
get passive() {
|
||||
return Boolean(this.flags & kFlagPassive);
|
||||
}
|
||||
get isNodeStyleListener() {
|
||||
return Boolean(this.flags & kFlagNodeStyle);
|
||||
}
|
||||
get weak() {
|
||||
return Boolean(this.flags & kFlagWeak);
|
||||
}
|
||||
get removed() {
|
||||
return Boolean(this.flags & kFlagRemoved);
|
||||
}
|
||||
set removed(value) {
|
||||
if (value)
|
||||
this.flags |= kFlagRemoved;
|
||||
else
|
||||
this.flags &= ~kFlagRemoved;
|
||||
}
|
||||
|
||||
same(listener, capture) {
|
||||
const myListener = this.weak ? this.listener.deref() : this.listener;
|
||||
return myListener === listener && this.capture === capture;
|
||||
|
||||
Reference in New Issue
Block a user