Skip to content

Commit 0116ae7

Browse files
ronagtargos
authored andcommitted
stream: pre-allocate _events
PR-URL: #50428 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Vinícius Lourenço Claro Cardoso <contact@viniciusl.com.br> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 2c0d88e commit 0116ae7

File tree

6 files changed

+58
-4
lines changed

6 files changed

+58
-4
lines changed

lib/events.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ const {
8787

8888
const kCapture = Symbol('kCapture');
8989
const kErrorMonitor = Symbol('events.errorMonitor');
90+
const kShapeMode = Symbol('shapeMode');
9091
const kMaxEventTargetListeners = Symbol('events.maxEventTargetListeners');
9192
const kMaxEventTargetListenersWarned =
9293
Symbol('events.maxEventTargetListenersWarned');
@@ -344,6 +345,9 @@ EventEmitter.init = function(opts) {
344345
this._events === ObjectGetPrototypeOf(this)._events) {
345346
this._events = { __proto__: null };
346347
this._eventsCount = 0;
348+
this[kShapeMode] = false;
349+
} else {
350+
this[kShapeMode] = true;
347351
}
348352

349353
this._maxListeners = this._maxListeners || undefined;
@@ -686,9 +690,13 @@ EventEmitter.prototype.removeListener =
686690
return this;
687691

688692
if (list === listener || list.listener === listener) {
689-
if (--this._eventsCount === 0)
693+
this._eventsCount -= 1;
694+
695+
if (this[kShapeMode]) {
696+
events[type] = undefined;
697+
} else if (this._eventsCount === 0) {
690698
this._events = { __proto__: null };
691-
else {
699+
} else {
692700
delete events[type];
693701
if (events.removeListener)
694702
this.emit('removeListener', type, list.listener || listener);
@@ -750,6 +758,7 @@ EventEmitter.prototype.removeAllListeners =
750758
else
751759
delete events[type];
752760
}
761+
this[kShapeMode] = false;
753762
return this;
754763
}
755764

@@ -762,6 +771,7 @@ EventEmitter.prototype.removeAllListeners =
762771
this.removeAllListeners('removeListener');
763772
this._events = { __proto__: null };
764773
this._eventsCount = 0;
774+
this[kShapeMode] = false;
765775
return this;
766776
}
767777

lib/internal/streams/duplex.js

+18
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,24 @@ function Duplex(options) {
6363
if (!(this instanceof Duplex))
6464
return new Duplex(options);
6565

66+
this._events ??= {
67+
close: undefined,
68+
error: undefined,
69+
prefinish: undefined,
70+
finish: undefined,
71+
drain: undefined,
72+
data: undefined,
73+
end: undefined,
74+
readable: undefined,
75+
// Skip uncommon events...
76+
// pause: undefined,
77+
// resume: undefined,
78+
// pipe: undefined,
79+
// unpipe: undefined,
80+
// [destroyImpl.kConstruct]: undefined,
81+
// [destroyImpl.kDestroy]: undefined,
82+
};
83+
6684
this._readableState = new Readable.ReadableState(options, this, true);
6785
this._writableState = new Writable.WritableState(options, this, true);
6886

lib/internal/streams/readable.js

+15
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,21 @@ function Readable(options) {
319319
if (!(this instanceof Readable))
320320
return new Readable(options);
321321

322+
this._events ??= {
323+
close: undefined,
324+
error: undefined,
325+
data: undefined,
326+
end: undefined,
327+
readable: undefined,
328+
// Skip uncommon events...
329+
// pause: undefined,
330+
// resume: undefined,
331+
// pipe: undefined,
332+
// unpipe: undefined,
333+
// [destroyImpl.kConstruct]: undefined,
334+
// [destroyImpl.kDestroy]: undefined,
335+
};
336+
322337
this._readableState = new ReadableState(options, this, false);
323338

324339
if (options) {

lib/internal/streams/writable.js

+11
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,17 @@ function Writable(options) {
385385
if (!(this instanceof Writable))
386386
return new Writable(options);
387387

388+
this._events ??= {
389+
close: undefined,
390+
error: undefined,
391+
prefinish: undefined,
392+
finish: undefined,
393+
drain: undefined,
394+
// Skip uncommon events...
395+
// [destroyImpl.kConstruct]: undefined,
396+
// [destroyImpl.kDestroy]: undefined,
397+
};
398+
388399
this._writableState = new WritableState(options, this, false);
389400

390401
if (options) {

test/parallel/test-readline-interface.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class FakeInput extends EventEmitter {
4444
function isWarned(emitter) {
4545
for (const name in emitter) {
4646
const listeners = emitter[name];
47-
if (listeners.warned) return true;
47+
if (listeners && listeners.warned) return true;
4848
}
4949
return false;
5050
}

test/parallel/test-readline-promises-interface.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class FakeInput extends EventEmitter {
2222
function isWarned(emitter) {
2323
for (const name in emitter) {
2424
const listeners = emitter[name];
25-
if (listeners.warned) return true;
25+
if (listeners && listeners.warned) return true;
2626
}
2727
return false;
2828
}

0 commit comments

Comments
 (0)