@@ -164,25 +164,69 @@ EventEmitter.prototype.removeListener = function(type, listener) {
164
164
delete this . _events [ type ] ;
165
165
}
166
166
167
+ if ( this . _events . removeListener )
168
+ this . emit ( 'removeListener' , type , listener ) ;
167
169
return this ;
168
170
} ;
169
171
170
172
EventEmitter . prototype . removeAllListeners = function ( type ) {
173
+ var key , listeners ;
174
+
175
+ if ( ! this . _events )
176
+ return this ;
177
+
178
+ // not listening for removeListener, no need to emit
179
+ if ( ! this . _events . removeListener ) {
180
+ if ( arguments . length === 0 )
181
+ this . _events = { } ;
182
+ else if ( this . _events [ type ] )
183
+ this . _events [ type ] = undefined ;
184
+ return this ;
185
+ }
186
+
187
+ // emit removeListener for all listeners on all events
171
188
if ( arguments . length === 0 ) {
189
+ for ( key in this . _events ) {
190
+ if ( key === 'removeListener' ) continue ;
191
+ this . removeAllListeners ( key ) ;
192
+ }
193
+ this . removeAllListeners ( 'removeListener' ) ;
172
194
this . _events = { } ;
173
195
return this ;
174
196
}
175
197
176
- // does not use listeners(), so no side effect of creating _events[type]
177
- if ( type && this . _events && this . _events [ type ] ) this . _events [ type ] = null ;
198
+ listeners = this . _events [ type ] ;
199
+
200
+ if ( typeof listeners === 'function' ) {
201
+ this . removeListener ( type , listeners ) ;
202
+ } else {
203
+ // LIFO order
204
+ while ( listeners . length )
205
+ this . removeListener ( type , listeners [ listeners . length - 1 ] ) ;
206
+ }
207
+ this . _events [ type ] = undefined ;
208
+
178
209
return this ;
179
210
} ;
180
211
181
212
EventEmitter . prototype . listeners = function ( type ) {
182
- if ( ! this . _events ) this . _events = { } ;
183
- if ( ! this . _events [ type ] ) this . _events [ type ] = [ ] ;
184
- if ( ! isArray ( this . _events [ type ] ) ) {
185
- this . _events [ type ] = [ this . _events [ type ] ] ;
186
- }
187
- return this . _events [ type ] ;
213
+ var ret ;
214
+ if ( ! this . _events || ! this . _events [ type ] )
215
+ ret = [ ] ;
216
+ else if ( typeof this . _events [ type ] === 'function' )
217
+ ret = [ this . _events [ type ] ] ;
218
+ else
219
+ ret = this . _events [ type ] . slice ( ) ;
220
+ return ret ;
188
221
} ;
222
+
223
+ EventEmitter . listenerCount = function ( emitter , type ) {
224
+ var ret ;
225
+ if ( ! emitter . _events || ! emitter . _events [ type ] )
226
+ ret = 0 ;
227
+ else if ( typeof emitter . _events [ type ] === 'function' )
228
+ ret = 1 ;
229
+ else
230
+ ret = emitter . _events [ type ] . length ;
231
+ return ret ;
232
+ } ;
0 commit comments