|
364 | 364 | scheduleMicrotasks(); |
365 | 365 | } |
366 | 366 |
|
| 367 | + function _combinedTickCallback(args, callback) { |
| 368 | + if (args === undefined) { |
| 369 | + callback(); |
| 370 | + } else { |
| 371 | + switch (args.length) { |
| 372 | + case 1: |
| 373 | + callback(args[0]); |
| 374 | + break; |
| 375 | + case 2: |
| 376 | + callback(args[0], args[1]); |
| 377 | + break; |
| 378 | + case 3: |
| 379 | + callback(args[0], args[1], args[2]); |
| 380 | + break; |
| 381 | + default: |
| 382 | + callback.apply(null, args); |
| 383 | + } |
| 384 | + } |
| 385 | + } |
| 386 | + |
367 | 387 | // Run callbacks that have no domain. |
368 | 388 | // Using domains will cause this to be overridden. |
369 | 389 | function _tickCallback() { |
|
374 | 394 | tock = nextTickQueue[tickInfo[kIndex]++]; |
375 | 395 | callback = tock.callback; |
376 | 396 | args = tock.args; |
377 | | - // Using separate callback execution functions helps to limit the |
378 | | - // scope of DEOPTs caused by using try blocks and allows direct |
| 397 | + // Using separate callback execution functions allows direct |
379 | 398 | // callback invocation with small numbers of arguments to avoid the |
380 | 399 | // performance hit associated with using `fn.apply()` |
381 | | - if (args === undefined) { |
382 | | - nextTickCallbackWith0Args(callback); |
383 | | - } else { |
384 | | - switch (args.length) { |
385 | | - case 1: |
386 | | - nextTickCallbackWith1Arg(callback, args[0]); |
387 | | - break; |
388 | | - case 2: |
389 | | - nextTickCallbackWith2Args(callback, args[0], args[1]); |
390 | | - break; |
391 | | - case 3: |
392 | | - nextTickCallbackWith3Args(callback, args[0], args[1], args[2]); |
393 | | - break; |
394 | | - default: |
395 | | - nextTickCallbackWithManyArgs(callback, args); |
396 | | - } |
397 | | - } |
| 400 | + _combinedTickCallback(args, callback); |
398 | 401 | if (1e4 < tickInfo[kIndex]) |
399 | 402 | tickDone(); |
400 | 403 | } |
|
415 | 418 | args = tock.args; |
416 | 419 | if (domain) |
417 | 420 | domain.enter(); |
418 | | - // Using separate callback execution functions helps to limit the |
419 | | - // scope of DEOPTs caused by using try blocks and allows direct |
| 421 | + // Using separate callback execution functions allows direct |
420 | 422 | // callback invocation with small numbers of arguments to avoid the |
421 | 423 | // performance hit associated with using `fn.apply()` |
422 | | - if (args === undefined) { |
423 | | - nextTickCallbackWith0Args(callback); |
424 | | - } else { |
425 | | - switch (args.length) { |
426 | | - case 1: |
427 | | - nextTickCallbackWith1Arg(callback, args[0]); |
428 | | - break; |
429 | | - case 2: |
430 | | - nextTickCallbackWith2Args(callback, args[0], args[1]); |
431 | | - break; |
432 | | - case 3: |
433 | | - nextTickCallbackWith3Args(callback, args[0], args[1], args[2]); |
434 | | - break; |
435 | | - default: |
436 | | - nextTickCallbackWithManyArgs(callback, args); |
437 | | - } |
438 | | - } |
| 424 | + _combinedTickCallback(args, callback); |
439 | 425 | if (1e4 < tickInfo[kIndex]) |
440 | 426 | tickDone(); |
441 | 427 | if (domain) |
|
447 | 433 | } while (tickInfo[kLength] !== 0); |
448 | 434 | } |
449 | 435 |
|
450 | | - function nextTickCallbackWith0Args(callback) { |
451 | | - var threw = true; |
452 | | - try { |
453 | | - callback(); |
454 | | - threw = false; |
455 | | - } finally { |
456 | | - if (threw) |
457 | | - tickDone(); |
458 | | - } |
459 | | - } |
460 | | - |
461 | | - function nextTickCallbackWith1Arg(callback, arg1) { |
462 | | - var threw = true; |
463 | | - try { |
464 | | - callback(arg1); |
465 | | - threw = false; |
466 | | - } finally { |
467 | | - if (threw) |
468 | | - tickDone(); |
469 | | - } |
470 | | - } |
471 | | - |
472 | | - function nextTickCallbackWith2Args(callback, arg1, arg2) { |
473 | | - var threw = true; |
474 | | - try { |
475 | | - callback(arg1, arg2); |
476 | | - threw = false; |
477 | | - } finally { |
478 | | - if (threw) |
479 | | - tickDone(); |
480 | | - } |
481 | | - } |
482 | | - |
483 | | - function nextTickCallbackWith3Args(callback, arg1, arg2, arg3) { |
484 | | - var threw = true; |
485 | | - try { |
486 | | - callback(arg1, arg2, arg3); |
487 | | - threw = false; |
488 | | - } finally { |
489 | | - if (threw) |
490 | | - tickDone(); |
491 | | - } |
492 | | - } |
493 | | - |
494 | | - function nextTickCallbackWithManyArgs(callback, args) { |
495 | | - var threw = true; |
496 | | - try { |
497 | | - callback.apply(null, args); |
498 | | - threw = false; |
499 | | - } finally { |
500 | | - if (threw) |
501 | | - tickDone(); |
502 | | - } |
503 | | - } |
504 | | - |
505 | 436 | function TickObject(c, args) { |
506 | 437 | this.callback = c; |
507 | 438 | this.domain = process.domain || null; |
|
515 | 446 |
|
516 | 447 | var args; |
517 | 448 | if (arguments.length > 1) { |
518 | | - args = []; |
| 449 | + args = new Array(arguments.length - 1); |
519 | 450 | for (var i = 1; i < arguments.length; i++) |
520 | | - args.push(arguments[i]); |
| 451 | + args[i - 1] = arguments[i]; |
521 | 452 | } |
522 | 453 |
|
523 | 454 | nextTickQueue.push(new TickObject(callback, args)); |
|
0 commit comments