@@ -37,6 +37,7 @@ const {
3737 ObjectDefineProperty,
3838 ObjectDefineProperties,
3939 ObjectGetPrototypeOf,
40+ ObjectKeys,
4041 ObjectSetPrototypeOf,
4142 Promise,
4243 PromiseReject,
@@ -87,6 +88,7 @@ const {
8788
8889const kCapture = Symbol ( 'kCapture' ) ;
8990const kErrorMonitor = Symbol ( 'events.errorMonitor' ) ;
91+ const kShapeMode = Symbol ( 'shapeMode' ) ;
9092const kMaxEventTargetListeners = Symbol ( 'events.maxEventTargetListeners' ) ;
9193const kMaxEventTargetListenersWarned =
9294 Symbol ( 'events.maxEventTargetListenersWarned' ) ;
@@ -344,6 +346,9 @@ EventEmitter.init = function(opts) {
344346 this . _events === ObjectGetPrototypeOf ( this ) . _events ) {
345347 this . _events = { __proto__ : null } ;
346348 this . _eventsCount = 0 ;
349+ this [ kShapeMode ] = false ;
350+ } else {
351+ this [ kShapeMode ] = true ;
347352 }
348353
349354 this . _maxListeners = this . _maxListeners || undefined ;
@@ -686,10 +691,18 @@ EventEmitter.prototype.removeListener =
686691 return this ;
687692
688693 if ( list === listener || list . listener === listener ) {
689- if ( -- this . _eventsCount === 0 )
690- this . _events = { __proto__ : null } ;
691- else {
692- delete events [ type ] ;
694+ if ( -- this . _eventsCount === 0 ) {
695+ if ( this [ kShapeMode ] ) {
696+ events [ type ] = undefined ;
697+ } else {
698+ this . _events = { __proto__ : null } ;
699+ }
700+ } else {
701+ if ( this [ kShapeMode ] ) {
702+ events [ type ] = undefined ;
703+ } else {
704+ delete events [ type ] ;
705+ }
693706 if ( events . removeListener )
694707 this . emit ( 'removeListener' , type , list . listener || listener ) ;
695708 }
@@ -750,6 +763,7 @@ EventEmitter.prototype.removeAllListeners =
750763 else
751764 delete events [ type ] ;
752765 }
766+ this [ kShapeMode ] = false ;
753767 return this ;
754768 }
755769
@@ -762,6 +776,7 @@ EventEmitter.prototype.removeAllListeners =
762776 this . removeAllListeners ( 'removeListener' ) ;
763777 this . _events = { __proto__ : null } ;
764778 this . _eventsCount = 0 ;
779+ this [ kShapeMode ] = false ;
765780 return this ;
766781 }
767782
0 commit comments