@@ -87,6 +87,7 @@ const {
8787
8888const kCapture = Symbol ( 'kCapture' ) ;
8989const kErrorMonitor = Symbol ( 'events.errorMonitor' ) ;
90+ const kShapeMode = Symbol ( 'shapeMode' ) ;
9091const kMaxEventTargetListeners = Symbol ( 'events.maxEventTargetListeners' ) ;
9192const 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,10 +690,18 @@ EventEmitter.prototype.removeListener =
686690 return this ;
687691
688692 if ( list === listener || list . listener === listener ) {
689- if ( -- this . _eventsCount === 0 )
690- this . _events = { __proto__ : null } ;
691- else {
692- delete events [ type ] ;
693+ if ( -- this . _eventsCount === 0 ) {
694+ if ( this [ kShapeMode ] ) {
695+ events [ type ] = undefined ;
696+ } else {
697+ this . _events = { __proto__ : null } ;
698+ }
699+ } else {
700+ if ( this [ kShapeMode ] ) {
701+ events [ type ] = undefined ;
702+ } else {
703+ delete events [ type ] ;
704+ }
693705 if ( events . removeListener )
694706 this . emit ( 'removeListener' , type , list . listener || listener ) ;
695707 }
@@ -741,7 +753,12 @@ EventEmitter.prototype.removeAllListeners =
741753
742754 // Not listening for removeListener, no need to emit
743755 if ( events . removeListener === undefined ) {
744- if ( arguments . length === 0 ) {
756+ if ( this [ kShapeMode ] ) {
757+ for ( const key of Object . keys ( this . _events ) ) {
758+ this . _events [ key ] = undefined ;
759+ }
760+ this . _eventsCount = 0 ;
761+ } else if ( arguments . length === 0 ) {
745762 this . _events = { __proto__ : null } ;
746763 this . _eventsCount = 0 ;
747764 } else if ( events [ type ] !== undefined ) {
@@ -760,8 +777,15 @@ EventEmitter.prototype.removeAllListeners =
760777 this . removeAllListeners ( key ) ;
761778 }
762779 this . removeAllListeners ( 'removeListener' ) ;
763- this . _events = { __proto__ : null } ;
764- this . _eventsCount = 0 ;
780+ if ( this [ kShapeMode ] ) {
781+ for ( const key of Object . keys ( this . _events ) ) {
782+ this . _events [ key ] = undefined ;
783+ }
784+ this . _eventsCount = 0 ;
785+ } else {
786+ this . _events = { __proto__ : null } ;
787+ this . _eventsCount = 0 ;
788+ }
765789 return this ;
766790 }
767791
0 commit comments