@@ -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