@@ -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,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
0 commit comments