@@ -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,10 +690,18 @@ EventEmitter.prototype.removeListener =
686
690
return this ;
687
691
688
692
if ( list === listener || list . listener === listener ) {
689
- if ( -- this . _eventsCount === 0 )
690
- this . _events = { __proto__ : null } ;
691
- else {
692
- delete events [ type ] ;
693
+ if ( -- this . _eventsCount === 0 ) {
694
+ if ( this [ kShapeMode ] ) {
695
+ events [ type ] = undefined ;
696
+ } else {
697
+ this . _events = { __proto__ : null } ;
698
+ }
699
+ } else {
700
+ if ( this [ kShapeMode ] ) {
701
+ events [ type ] = undefined ;
702
+ } else {
703
+ delete events [ type ] ;
704
+ }
693
705
if ( events . removeListener )
694
706
this . emit ( 'removeListener' , type , list . listener || listener ) ;
695
707
}
@@ -741,7 +753,12 @@ EventEmitter.prototype.removeAllListeners =
741
753
742
754
// Not listening for removeListener, no need to emit
743
755
if ( events . removeListener === undefined ) {
744
- if ( arguments . length === 0 ) {
756
+ if ( this [ kShapeMode ] ) {
757
+ for ( const key of Object . keys ( this . _events ) ) {
758
+ this . _events [ key ] = undefined ;
759
+ }
760
+ this . _eventsCount = 0 ;
761
+ } else if ( arguments . length === 0 ) {
745
762
this . _events = { __proto__ : null } ;
746
763
this . _eventsCount = 0 ;
747
764
} else if ( events [ type ] !== undefined ) {
@@ -760,8 +777,15 @@ EventEmitter.prototype.removeAllListeners =
760
777
this . removeAllListeners ( key ) ;
761
778
}
762
779
this . removeAllListeners ( 'removeListener' ) ;
763
- this . _events = { __proto__ : null } ;
764
- this . _eventsCount = 0 ;
780
+ if ( this [ kShapeMode ] ) {
781
+ for ( const key of Object . keys ( this . _events ) ) {
782
+ this . _events [ key ] = undefined ;
783
+ }
784
+ this . _eventsCount = 0 ;
785
+ } else {
786
+ this . _events = { __proto__ : null } ;
787
+ this . _eventsCount = 0 ;
788
+ }
765
789
return this ;
766
790
}
767
791
0 commit comments