@ -374,37 +374,40 @@
scheduleMicrotasks ( ) ;
scheduleMicrotasks ( ) ;
}
}
// Run callbacks that have no domain.
function _ combinedTickCallback ( args , callback ) {
// Using domains will cause this to be overridden.
function _ tickCallback ( ) {
var callback , args , tock ;
do {
while ( tickInfo [ kIndex ] < tickInfo [ kLength ] ) {
tock = nextTickQueue [ tickInfo [ kIndex ] ++ ] ;
callback = tock . callback ;
args = tock . args ;
// Using separate callback execution functions helps to limit the
// scope of DEOPTs caused by using try blocks and allows direct
// callback invocation with small numbers of arguments to avoid the
// performance hit associated with using `fn.apply()`
if ( args === undefined ) {
if ( args === undefined ) {
nextTi ckC allbackWith0Args ( callback ) ;
callback ( ) ;
} else {
} else {
switch ( args . length ) {
switch ( args . length ) {
case 1 :
case 1 :
nextTi ckC allbackWith1Arg ( callback , args [ 0 ] ) ;
callback ( args [ 0 ] ) ;
break ;
break ;
case 2 :
case 2 :
nextTi ckC allbackWith2Args ( callback , args [ 0 ] , args [ 1 ] ) ;
callback ( args [ 0 ] , args [ 1 ] ) ;
break ;
break ;
case 3 :
case 3 :
nextTi ckC allbackWith3Args ( callback , args [ 0 ] , args [ 1 ] , args [ 2 ] ) ;
callback ( args [ 0 ] , args [ 1 ] , args [ 2 ] ) ;
break ;
break ;
default :
default :
nextTickCallbackWithManyArgs ( callback , args ) ;
callback . apply ( null , args ) ;
}
}
}
}
}
// Run callbacks that have no domain.
// Using domains will cause this to be overridden.
function _ tickCallback ( ) {
var callback , args , tock ;
do {
while ( tickInfo [ kIndex ] < tickInfo [ kLength ] ) {
tock = nextTickQueue [ tickInfo [ kIndex ] ++ ] ;
callback = tock . callback ;
args = tock . args ;
// Using separate callback execution functions allows direct
// callback invocation with small numbers of arguments to avoid the
// performance hit associated with using `fn.apply()`
_ combinedTickCallback ( args , callback ) ;
if ( 1e4 < tickInfo [ kIndex ] )
if ( 1e4 < tickInfo [ kIndex ] )
tickDone ( ) ;
tickDone ( ) ;
}
}
@ -425,27 +428,10 @@
args = tock . args ;
args = tock . args ;
if ( domain )
if ( domain )
domain . enter ( ) ;
domain . enter ( ) ;
// Using separate callback execution functions helps to limit the
// Using separate callback execution functions allows direct
// scope of DEOPTs caused by using try blocks and allows direct
// callback invocation with small numbers of arguments to avoid the
// callback invocation with small numbers of arguments to avoid the
// performance hit associated with using `fn.apply()`
// performance hit associated with using `fn.apply()`
if ( args === undefined ) {
_ combinedTickCallback ( args , callback ) ;
nextTickCallbackWith0Args ( callback ) ;
} else {
switch ( args . length ) {
case 1 :
nextTickCallbackWith1Arg ( callback , args [ 0 ] ) ;
break ;
case 2 :
nextTickCallbackWith2Args ( callback , args [ 0 ] , args [ 1 ] ) ;
break ;
case 3 :
nextTickCallbackWith3Args ( callback , args [ 0 ] , args [ 1 ] , args [ 2 ] ) ;
break ;
default :
nextTickCallbackWithManyArgs ( callback , args ) ;
}
}
if ( 1e4 < tickInfo [ kIndex ] )
if ( 1e4 < tickInfo [ kIndex ] )
tickDone ( ) ;
tickDone ( ) ;
if ( domain )
if ( domain )
@ -457,61 +443,6 @@
} while ( tickInfo [ kLength ] !== 0 ) ;
} while ( tickInfo [ kLength ] !== 0 ) ;
}
}
function nextTickCallbackWith0Args ( callback ) {
var threw = true ;
try {
callback ( ) ;
threw = false ;
} finally {
if ( threw )
tickDone ( ) ;
}
}
function nextTickCallbackWith1Arg ( callback , arg1 ) {
var threw = true ;
try {
callback ( arg1 ) ;
threw = false ;
} finally {
if ( threw )
tickDone ( ) ;
}
}
function nextTickCallbackWith2Args ( callback , arg1 , arg2 ) {
var threw = true ;
try {
callback ( arg1 , arg2 ) ;
threw = false ;
} finally {
if ( threw )
tickDone ( ) ;
}
}
function nextTickCallbackWith3Args ( callback , arg1 , arg2 , arg3 ) {
var threw = true ;
try {
callback ( arg1 , arg2 , arg3 ) ;
threw = false ;
} finally {
if ( threw )
tickDone ( ) ;
}
}
function nextTickCallbackWithManyArgs ( callback , args ) {
var threw = true ;
try {
callback . apply ( null , args ) ;
threw = false ;
} finally {
if ( threw )
tickDone ( ) ;
}
}
function TickObject ( c , args ) {
function TickObject ( c , args ) {
this . callback = c ;
this . callback = c ;
this . domain = process . domain || null ;
this . domain = process . domain || null ;
@ -527,9 +458,9 @@
var args ;
var args ;
if ( arguments . length > 1 ) {
if ( arguments . length > 1 ) {
args = [ ] ;
args = new Array ( arguments . length - 1 ) ;
for ( var i = 1 ; i < arguments . length ; i ++ )
for ( var i = 1 ; i < arguments . length ; i ++ )
args . push ( arguments [ i ] ) ;
args [ i - 1 ] = arguments [ i ] ;
}
}
nextTickQueue . push ( new TickObject ( callback , args ) ) ;
nextTickQueue . push ( new TickObject ( callback , args ) ) ;