Skip to content

Commit dd52068

Browse files
ronagUlisesGascon
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 829b82e commit dd52068

6 files changed

Lines changed: 58 additions & 4 deletions

File tree

‎lib/events.js‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ const {
8686

8787
constkCapture=Symbol('kCapture');
8888
constkErrorMonitor=Symbol('events.errorMonitor');
89+
constkShapeMode=Symbol('shapeMode');
8990
constkMaxEventTargetListeners=Symbol('events.maxEventTargetListeners');
9091
constkMaxEventTargetListenersWarned=
9192
Symbol('events.maxEventTargetListenersWarned');
@@ -343,6 +344,9 @@ EventEmitter.init = function(opts) {
343344
this._events===ObjectGetPrototypeOf(this)._events){
344345
this._events={__proto__: null};
345346
this._eventsCount=0;
347+
this[kShapeMode]=false;
348+
}else{
349+
this[kShapeMode]=true;
346350
}
347351

348352
this._maxListeners=this._maxListeners||undefined;
@@ -685,9 +689,13 @@ EventEmitter.prototype.removeListener =
685689
returnthis;
686690

687691
if(list===listener||list.listener===listener){
688-
if(--this._eventsCount===0)
692+
this._eventsCount-=1;
693+
694+
if(this[kShapeMode]){
695+
events[type]=undefined;
696+
}elseif(this._eventsCount===0){
689697
this._events={__proto__: null};
690-
else{
698+
}else{
691699
deleteevents[type];
692700
if(events.removeListener)
693701
this.emit('removeListener',type,list.listener||listener);
@@ -749,6 +757,7 @@ EventEmitter.prototype.removeAllListeners =
749757
else
750758
deleteevents[type];
751759
}
760+
this[kShapeMode]=false;
752761
returnthis;
753762
}
754763

@@ -761,6 +770,7 @@ EventEmitter.prototype.removeAllListeners =
761770
this.removeAllListeners('removeListener');
762771
this._events={__proto__: null};
763772
this._eventsCount=0;
773+
this[kShapeMode]=false;
764774
returnthis;
765775
}
766776

‎lib/internal/streams/duplex.js‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,24 @@ function Duplex(options) {
6363
if(!(thisinstanceofDuplex))
6464
returnnewDuplex(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=newReadable.ReadableState(options,this,true);
6785
this._writableState=newWritable.WritableState(options,this,true);
6886

‎lib/internal/streams/readable.js‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,21 @@ function Readable(options) {
319319
if(!(thisinstanceofReadable))
320320
returnnewReadable(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=newReadableState(options,this,false);
323338

324339
if(options){

‎lib/internal/streams/writable.js‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,17 @@ function Writable(options) {
385385
if(!(thisinstanceofWritable))
386386
returnnewWritable(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=newWritableState(options,this,false);
389400

390401
if(options){

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class FakeInput extends EventEmitter {
4444
functionisWarned(emitter){
4545
for(constnameinemitter){
4646
constlisteners=emitter[name];
47-
if(listeners.warned)returntrue;
47+
if(listeners&&listeners.warned)returntrue;
4848
}
4949
returnfalse;
5050
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class FakeInput extends EventEmitter {
2222
functionisWarned(emitter){
2323
for(constnameinemitter){
2424
constlisteners=emitter[name];
25-
if(listeners.warned)returntrue;
25+
if(listeners&&listeners.warned)returntrue;
2626
}
2727
returnfalse;
2828
}

0 commit comments

Comments
 (0)