@@ -96,65 +96,8 @@ EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
9696 return $getMaxListeners ( this ) ;
9797} ;
9898
99- // These standalone emit* functions are used to optimize calling of event
100- // handlers for fast cases because emit() itself often has a variable number of
101- // arguments and can be deoptimized because of that. These functions always have
102- // the same number of arguments and thus do not get deoptimized, so the code
103- // inside them can execute faster.
104- function emitNone ( handler , isFn , self ) {
105- if ( isFn )
106- handler . call ( self ) ;
107- else {
108- var len = handler . length ;
109- var listeners = arrayClone ( handler , len ) ;
110- for ( var i = 0 ; i < len ; ++ i )
111- listeners [ i ] . call ( self ) ;
112- }
113- }
114- function emitOne ( handler , isFn , self , arg1 ) {
115- if ( isFn )
116- handler . call ( self , arg1 ) ;
117- else {
118- var len = handler . length ;
119- var listeners = arrayClone ( handler , len ) ;
120- for ( var i = 0 ; i < len ; ++ i )
121- listeners [ i ] . call ( self , arg1 ) ;
122- }
123- }
124- function emitTwo ( handler , isFn , self , arg1 , arg2 ) {
125- if ( isFn )
126- handler . call ( self , arg1 , arg2 ) ;
127- else {
128- var len = handler . length ;
129- var listeners = arrayClone ( handler , len ) ;
130- for ( var i = 0 ; i < len ; ++ i )
131- listeners [ i ] . call ( self , arg1 , arg2 ) ;
132- }
133- }
134- function emitThree ( handler , isFn , self , arg1 , arg2 , arg3 ) {
135- if ( isFn )
136- handler . call ( self , arg1 , arg2 , arg3 ) ;
137- else {
138- var len = handler . length ;
139- var listeners = arrayClone ( handler , len ) ;
140- for ( var i = 0 ; i < len ; ++ i )
141- listeners [ i ] . call ( self , arg1 , arg2 , arg3 ) ;
142- }
143- }
144-
145- function emitMany ( handler , isFn , self , args ) {
146- if ( isFn )
147- handler . apply ( self , args ) ;
148- else {
149- var len = handler . length ;
150- var listeners = arrayClone ( handler , len ) ;
151- for ( var i = 0 ; i < len ; ++ i )
152- listeners [ i ] . apply ( self , args ) ;
153- }
154- }
155-
15699EventEmitter . prototype . emit = function emit ( type ) {
157- var er , handler , len , args , i , events , domain ;
100+ var er , fn , i , events , domain ;
158101 var needDomainExit = false ;
159102 var doError = ( type === 'error' ) ;
160103
@@ -190,38 +133,103 @@ EventEmitter.prototype.emit = function emit(type) {
190133 return false ;
191134 }
192135
193- handler = events [ type ] ;
136+ fn = events [ type ] ;
194137
195- if ( ! handler )
138+ if ( ! fn )
196139 return false ;
197140
198141 if ( domain && this !== process ) {
199142 domain . enter ( ) ;
200143 needDomainExit = true ;
201144 }
202145
203- var isFn = typeof handler === 'function' ;
204- len = arguments . length ;
205- switch ( len ) {
206- // fast cases
207- case 1 :
208- emitNone ( handler , isFn , this ) ;
209- break ;
210- case 2 :
211- emitOne ( handler , isFn , this , arguments [ 1 ] ) ;
212- break ;
213- case 3 :
214- emitTwo ( handler , isFn , this , arguments [ 1 ] , arguments [ 2 ] ) ;
215- break ;
216- case 4 :
217- emitThree ( handler , isFn , this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
218- break ;
219- // slower
220- default :
221- args = new Array ( len - 1 ) ;
222- for ( i = 1 ; i < len ; i ++ )
223- args [ i - 1 ] = arguments [ i ] ;
224- emitMany ( handler , isFn , this , args ) ;
146+ var len = arguments . length ;
147+ var args ;
148+ if ( typeof fn === 'function' ) {
149+ switch ( len ) {
150+ case 1 : fn . call ( this ) ; break ;
151+ case 2 : fn . call ( this , arguments [ 1 ] ) ; break ;
152+ case 3 : fn . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ; break ;
153+ case 4 : fn . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
154+ break ;
155+ default :
156+ args = new Array ( len - 1 ) ;
157+ for ( i = 1 ; i < len ; i ++ )
158+ args [ i - 1 ] = arguments [ i ] ;
159+ fn . apply ( this , args ) ;
160+ }
161+ } else {
162+ var fnlen = fn . length ;
163+ fn = arrayClone ( fn , fnlen ) ;
164+ switch ( len ) {
165+ case 1 :
166+ fn [ 0 ] . call ( this ) ;
167+ fn [ 1 ] . call ( this ) ;
168+ if ( fnlen === 2 ) break ;
169+ fn [ 2 ] . call ( this ) ;
170+ if ( fnlen === 3 ) break ;
171+ fn [ 3 ] . call ( this ) ;
172+ if ( fnlen === 4 ) break ;
173+ fn [ 4 ] . call ( this ) ;
174+ if ( fnlen === 5 ) break ;
175+ for ( i = 5 ; i < fnlen ; ++ i )
176+ fn [ i ] . call ( this ) ;
177+ break ;
178+ case 2 :
179+ fn [ 0 ] . call ( this , arguments [ 1 ] ) ;
180+ fn [ 1 ] . call ( this , arguments [ 1 ] ) ;
181+ if ( fnlen === 2 ) break ;
182+ fn [ 2 ] . call ( this , arguments [ 1 ] ) ;
183+ if ( fnlen === 3 ) break ;
184+ fn [ 3 ] . call ( this , arguments [ 1 ] ) ;
185+ if ( fnlen === 4 ) break ;
186+ fn [ 4 ] . call ( this , arguments [ 1 ] ) ;
187+ if ( fnlen === 5 ) break ;
188+ for ( i = 5 ; i < fnlen ; ++ i )
189+ fn [ i ] . call ( this , arguments [ 1 ] ) ;
190+ break ;
191+ case 3 :
192+ fn [ 0 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ;
193+ fn [ 1 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ;
194+ if ( fnlen === 2 ) break ;
195+ fn [ 2 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ;
196+ if ( fnlen === 3 ) break ;
197+ fn [ 3 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ;
198+ if ( fnlen === 4 ) break ;
199+ fn [ 4 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ;
200+ if ( fnlen === 5 ) break ;
201+ for ( i = 5 ; i < fnlen ; ++ i )
202+ fn [ i ] . call ( this , arguments [ 1 ] , arguments [ 2 ] ) ;
203+ break ;
204+ case 4 :
205+ fn [ 0 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
206+ fn [ 1 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
207+ if ( fnlen === 2 ) break ;
208+ fn [ 2 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
209+ if ( fnlen === 3 ) break ;
210+ fn [ 3 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
211+ if ( fnlen === 4 ) break ;
212+ fn [ 4 ] . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
213+ if ( fnlen === 5 ) break ;
214+ for ( i = 5 ; i < fnlen ; ++ i )
215+ fn [ i ] . call ( this , arguments [ 1 ] , arguments [ 2 ] , arguments [ 3 ] ) ;
216+ break ;
217+ default :
218+ args = new Array ( len - 1 ) ;
219+ for ( i = 1 ; i < len ; i ++ )
220+ args [ i - 1 ] = arguments [ i ] ;
221+ fn [ 0 ] . apply ( this , args ) ;
222+ fn [ 1 ] . apply ( this , args ) ;
223+ if ( fnlen === 2 ) break ;
224+ fn [ 2 ] . apply ( this , args ) ;
225+ if ( fnlen === 3 ) break ;
226+ fn [ 3 ] . apply ( this , args ) ;
227+ if ( fnlen === 4 ) break ;
228+ fn [ 4 ] . apply ( this , args ) ;
229+ if ( fnlen === 5 ) break ;
230+ for ( i = 5 ; i < fnlen ; ++ i )
231+ fn [ i ] . apply ( this , args ) ;
232+ }
225233 }
226234
227235 if ( needDomainExit )
@@ -497,7 +505,13 @@ function spliceOne(list, index) {
497505}
498506
499507function arrayClone ( arr , n ) {
500- var copy = new Array ( n ) ;
508+ switch ( n ) {
509+ case 2 : return [ arr [ 0 ] , arr [ 1 ] ] ;
510+ case 3 : return [ arr [ 0 ] , arr [ 1 ] , arr [ 2 ] ] ;
511+ case 4 : return [ arr [ 0 ] , arr [ 1 ] , arr [ 2 ] , arr [ 3 ] ] ;
512+ case 5 : return [ arr [ 0 ] , arr [ 1 ] , arr [ 2 ] , arr [ 3 ] , arr [ 4 ] ] ;
513+ }
514+ const copy = new Array ( n ) ;
501515 for ( var i = 0 ; i < n ; ++ i )
502516 copy [ i ] = arr [ i ] ;
503517 return copy ;
0 commit comments