1
1
'use strict' ;
2
2
3
+ const EEEvents = require ( 'internal/symbols' ) . EEEvents ;
4
+
3
5
var domain ;
4
6
5
7
function EventEmitter ( ) {
@@ -13,7 +15,7 @@ EventEmitter.EventEmitter = EventEmitter;
13
15
EventEmitter . usingDomains = false ;
14
16
15
17
EventEmitter . prototype . domain = undefined ;
16
- EventEmitter . prototype . _events = undefined ;
18
+ EventEmitter . prototype [ EEEvents ] = undefined ;
17
19
EventEmitter . prototype . _maxListeners = undefined ;
18
20
19
21
// By default EventEmitters will print a warning if more than 10 listeners are
@@ -30,10 +32,9 @@ EventEmitter.init = function() {
30
32
}
31
33
}
32
34
33
- if ( ! this . _events || this . _events === Object . getPrototypeOf ( this ) . _events ) {
34
- this . _events = { } ;
35
- this . _eventsCount = 0 ;
36
- }
35
+ if ( ! this [ EEEvents ] ||
36
+ this [ EEEvents ] === Object . getPrototypeOf ( this ) [ EEEvents ] )
37
+ this [ EEEvents ] = new Map ( ) ;
37
38
38
39
this . _maxListeners = this . _maxListeners || undefined ;
39
40
} ;
@@ -119,9 +120,9 @@ EventEmitter.prototype.emit = function emit(type) {
119
120
var needDomainExit = false ;
120
121
var doError = ( type === 'error' ) ;
121
122
122
- events = this . _events ;
123
+ events = this [ EEEvents ] ;
123
124
if ( events )
124
- doError = ( doError && events . error == null ) ;
125
+ doError = ( doError && ! events . has ( ' error' ) ) ;
125
126
else if ( ! doError )
126
127
return false ;
127
128
@@ -148,7 +149,7 @@ EventEmitter.prototype.emit = function emit(type) {
148
149
return false ;
149
150
}
150
151
151
- handler = events [ type ] ;
152
+ handler = events . get ( type ) ;
152
153
153
154
if ( ! handler )
154
155
return false ;
@@ -196,32 +197,31 @@ EventEmitter.prototype.addListener = function addListener(type, listener) {
196
197
if ( typeof listener !== 'function' )
197
198
throw new TypeError ( 'listener must be a function' ) ;
198
199
199
- events = this . _events ;
200
+ events = this [ EEEvents ] ;
200
201
if ( ! events ) {
201
- events = this . _events = { } ;
202
- this . _eventsCount = 0 ;
202
+ events = this [ EEEvents ] = new Map ( ) ;
203
203
} else {
204
204
// To avoid recursion in the case that type === "newListener"! Before
205
205
// adding it to the listeners, first emit "newListener".
206
- if ( events . newListener ) {
206
+ if ( events . has ( ' newListener' ) ) {
207
207
this . emit ( 'newListener' , type ,
208
208
listener . listener ? listener . listener : listener ) ;
209
209
210
210
// Re-assign `events` because a newListener handler could have caused the
211
- // this._events to be assigned to a new object
212
- events = this . _events ;
211
+ // this[EEEvents] to be assigned to a new object
212
+ events = this [ EEEvents ] ;
213
213
}
214
- existing = events [ type ] ;
214
+ existing = events . get ( type ) ;
215
215
}
216
216
217
217
if ( ! existing ) {
218
218
// Optimize the case of one listener. Don't need the extra array object.
219
- existing = events [ type ] = listener ;
220
- ++ this . _eventsCount ;
219
+ events . set ( type , listener ) ;
221
220
} else {
222
221
if ( typeof existing === 'function' ) {
223
222
// Adding the second element, need to change to array.
224
- existing = events [ type ] = [ existing , listener ] ;
223
+ existing = [ existing , listener ] ;
224
+ events . set ( type , existing ) ;
225
225
} else {
226
226
// If we've already got an array, just append.
227
227
existing . push ( listener ) ;
@@ -267,30 +267,26 @@ EventEmitter.prototype.once = function once(type, listener) {
267
267
return this ;
268
268
} ;
269
269
270
- // emits a 'removeListener' event iff the listener was removed
270
+ // emits a 'removeListener' event if the listener was removed
271
271
EventEmitter . prototype . removeListener =
272
272
function removeListener ( type , listener ) {
273
273
var list , events , position , i ;
274
274
275
275
if ( typeof listener !== 'function' )
276
276
throw new TypeError ( 'listener must be a function' ) ;
277
277
278
- events = this . _events ;
278
+ events = this [ EEEvents ] ;
279
279
if ( ! events )
280
280
return this ;
281
281
282
- list = events [ type ] ;
282
+ list = events . get ( type ) ;
283
283
if ( ! list )
284
284
return this ;
285
285
286
286
if ( list === listener || ( list . listener && list . listener === listener ) ) {
287
- if ( -- this . _eventsCount === 0 )
288
- this . _events = { } ;
289
- else {
290
- delete events [ type ] ;
291
- if ( events . removeListener )
292
- this . emit ( 'removeListener' , type , listener ) ;
293
- }
287
+ events . delete ( type ) ;
288
+ if ( events . has ( 'removeListener' ) )
289
+ this . emit ( 'removeListener' , type , listener ) ;
294
290
} else if ( typeof list !== 'function' ) {
295
291
position = - 1 ;
296
292
@@ -307,17 +303,12 @@ EventEmitter.prototype.removeListener =
307
303
308
304
if ( list . length === 1 ) {
309
305
list [ 0 ] = undefined ;
310
- if ( -- this . _eventsCount === 0 ) {
311
- this . _events = { } ;
312
- return this ;
313
- } else {
314
- delete events [ type ] ;
315
- }
306
+ events . delete ( type ) ;
316
307
} else {
317
308
spliceOne ( list , position ) ;
318
309
}
319
310
320
- if ( events . removeListener )
311
+ if ( events . has ( ' removeListener' ) )
321
312
this . emit ( 'removeListener' , type , listener ) ;
322
313
}
323
314
@@ -328,39 +319,32 @@ EventEmitter.prototype.removeAllListeners =
328
319
function removeAllListeners ( type ) {
329
320
var listeners , events ;
330
321
331
- events = this . _events ;
322
+ events = this [ EEEvents ] ;
332
323
if ( ! events )
333
324
return this ;
334
325
335
326
// not listening for removeListener, no need to emit
336
- if ( ! events . removeListener ) {
327
+ if ( ! events . has ( ' removeListener' ) ) {
337
328
if ( arguments . length === 0 ) {
338
- this . _events = { } ;
339
- this . _eventsCount = 0 ;
340
- } else if ( events [ type ] ) {
341
- if ( -- this . _eventsCount === 0 )
342
- this . _events = { } ;
343
- else
344
- delete events [ type ] ;
329
+ events . clear ( ) ;
330
+ } else {
331
+ events . delete ( type ) ;
345
332
}
346
333
return this ;
347
334
}
348
335
349
336
// emit removeListener for all listeners on all events
350
337
if ( arguments . length === 0 ) {
351
- var keys = Object . keys ( events ) ;
352
- for ( var i = 0 , key ; i < keys . length ; ++ i ) {
353
- key = keys [ i ] ;
338
+ for ( var key of events . keys ( ) ) {
354
339
if ( key === 'removeListener' ) continue ;
355
340
this . removeAllListeners ( key ) ;
356
341
}
357
342
this . removeAllListeners ( 'removeListener' ) ;
358
- this . _events = { } ;
359
- this . _eventsCount = 0 ;
343
+ events . clear ( ) ;
360
344
return this ;
361
345
}
362
346
363
- listeners = events [ type ] ;
347
+ listeners = events . get ( type ) ;
364
348
365
349
if ( typeof listeners === 'function' ) {
366
350
this . removeListener ( type , listeners ) ;
@@ -377,12 +361,12 @@ EventEmitter.prototype.removeAllListeners =
377
361
EventEmitter . prototype . listeners = function listeners ( type ) {
378
362
var evlistener ;
379
363
var ret ;
380
- var events = this . _events ;
364
+ var events = this [ EEEvents ] ;
381
365
382
366
if ( ! events )
383
367
ret = [ ] ;
384
368
else {
385
- evlistener = events [ type ] ;
369
+ evlistener = events . get ( type ) ;
386
370
if ( ! evlistener )
387
371
ret = [ ] ;
388
372
else if ( typeof evlistener === 'function' )
@@ -399,10 +383,10 @@ EventEmitter.listenerCount = function(emitter, type) {
399
383
} ;
400
384
401
385
EventEmitter . prototype . listenerCount = function listenerCount ( type ) {
402
- const events = this . _events ;
386
+ const events = this [ EEEvents ] ;
403
387
404
388
if ( events ) {
405
- const evlistener = events [ type ] ;
389
+ const evlistener = events . get ( type ) ;
406
390
407
391
if ( typeof evlistener === 'function' ) {
408
392
return 1 ;
@@ -414,6 +398,20 @@ EventEmitter.prototype.listenerCount = function listenerCount(type) {
414
398
return 0 ;
415
399
} ;
416
400
401
+ Object . defineProperty ( EventEmitter . prototype , '_events' , {
402
+ get ( ) {
403
+ const thisEvents = this [ EEEvents ] ;
404
+ if ( ! thisEvents )
405
+ return ;
406
+
407
+ const events = { } ;
408
+ for ( var event of thisEvents ) {
409
+ events [ event [ 0 ] ] = event [ 1 ] ;
410
+ }
411
+ return events ;
412
+ }
413
+ } ) ;
414
+
417
415
// About 1.5x faster than the two-arg version of Array#splice().
418
416
function spliceOne ( list , index ) {
419
417
for ( var i = index , k = i + 1 , n = list . length ; k < n ; i += 1 , k += 1 )
0 commit comments