@@ -37,6 +37,7 @@ const {
37
37
ObjectDefineProperty,
38
38
ObjectDefineProperties,
39
39
ObjectGetPrototypeOf,
40
+ ObjectKeys,
40
41
ObjectSetPrototypeOf,
41
42
Promise,
42
43
PromiseReject,
@@ -87,6 +88,7 @@ const {
87
88
88
89
const kCapture = Symbol ( 'kCapture' ) ;
89
90
const kErrorMonitor = Symbol ( 'events.errorMonitor' ) ;
91
+ const kShapeMode = Symbol ( 'shapeMode' ) ;
90
92
const kMaxEventTargetListeners = Symbol ( 'events.maxEventTargetListeners' ) ;
91
93
const kMaxEventTargetListenersWarned =
92
94
Symbol ( 'events.maxEventTargetListenersWarned' ) ;
@@ -344,6 +346,9 @@ EventEmitter.init = function(opts) {
344
346
this . _events === ObjectGetPrototypeOf ( this ) . _events ) {
345
347
this . _events = { __proto__ : null } ;
346
348
this . _eventsCount = 0 ;
349
+ this [ kShapeMode ] = false ;
350
+ } else {
351
+ this [ kShapeMode ] = true ;
347
352
}
348
353
349
354
this . _maxListeners = this . _maxListeners || undefined ;
@@ -686,10 +691,18 @@ EventEmitter.prototype.removeListener =
686
691
return this ;
687
692
688
693
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
+ }
693
706
if ( events . removeListener )
694
707
this . emit ( 'removeListener' , type , list . listener || listener ) ;
695
708
}
@@ -750,6 +763,7 @@ EventEmitter.prototype.removeAllListeners =
750
763
else
751
764
delete events [ type ] ;
752
765
}
766
+ this [ kShapeMode ] = false ;
753
767
return this ;
754
768
}
755
769
@@ -762,6 +776,7 @@ EventEmitter.prototype.removeAllListeners =
762
776
this . removeAllListeners ( 'removeListener' ) ;
763
777
this . _events = { __proto__ : null } ;
764
778
this . _eventsCount = 0 ;
779
+ this [ kShapeMode ] = false ;
765
780
return this ;
766
781
}
767
782
0 commit comments