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