@@ -86,6 +86,7 @@ const {
86
86
87
87
const kCapture = Symbol ( 'kCapture' ) ;
88
88
const kErrorMonitor = Symbol ( 'events.errorMonitor' ) ;
89
+ const kShapeMode = Symbol ( 'shapeMode' ) ;
89
90
const kMaxEventTargetListeners = Symbol ( 'events.maxEventTargetListeners' ) ;
90
91
const kMaxEventTargetListenersWarned =
91
92
Symbol ( 'events.maxEventTargetListenersWarned' ) ;
@@ -343,6 +344,9 @@ EventEmitter.init = function(opts) {
343
344
this . _events === ObjectGetPrototypeOf ( this ) . _events ) {
344
345
this . _events = { __proto__ : null } ;
345
346
this . _eventsCount = 0 ;
347
+ this [ kShapeMode ] = false ;
348
+ } else {
349
+ this [ kShapeMode ] = true ;
346
350
}
347
351
348
352
this . _maxListeners = this . _maxListeners || undefined ;
@@ -685,9 +689,13 @@ EventEmitter.prototype.removeListener =
685
689
return this ;
686
690
687
691
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
+ } else if ( this . _eventsCount === 0 ) {
689
697
this . _events = { __proto__ : null } ;
690
- else {
698
+ } else {
691
699
delete events [ type ] ;
692
700
if ( events . removeListener )
693
701
this . emit ( 'removeListener' , type , list . listener || listener ) ;
@@ -749,6 +757,7 @@ EventEmitter.prototype.removeAllListeners =
749
757
else
750
758
delete events [ type ] ;
751
759
}
760
+ this [ kShapeMode ] = false ;
752
761
return this ;
753
762
}
754
763
@@ -761,6 +770,7 @@ EventEmitter.prototype.removeAllListeners =
761
770
this . removeAllListeners ( 'removeListener' ) ;
762
771
this . _events = { __proto__ : null } ;
763
772
this . _eventsCount = 0 ;
773
+ this [ kShapeMode ] = false ;
764
774
return this ;
765
775
}
766
776
0 commit comments