|
374 | 374 | scheduleMicrotasks();
|
375 | 375 | }
|
376 | 376 |
|
| 377 | + function _combinedTickCallback(args, callback) { |
| 378 | + if (args === undefined) { |
| 379 | + callback(); |
| 380 | + } else { |
| 381 | + switch (args.length) { |
| 382 | + case 1: |
| 383 | + callback(args[0]); |
| 384 | + break; |
| 385 | + case 2: |
| 386 | + callback(args[0], args[1]); |
| 387 | + break; |
| 388 | + case 3: |
| 389 | + callback(args[0], args[1], args[2]); |
| 390 | + break; |
| 391 | + default: |
| 392 | + callback.apply(null, args); |
| 393 | + } |
| 394 | + } |
| 395 | + } |
| 396 | + |
377 | 397 | // Run callbacks that have no domain.
|
378 | 398 | // Using domains will cause this to be overridden.
|
379 | 399 | function _tickCallback() {
|
|
384 | 404 | tock = nextTickQueue[tickInfo[kIndex]++];
|
385 | 405 | callback = tock.callback;
|
386 | 406 | args = tock.args;
|
387 |
| - // Using separate callback execution functions helps to limit the |
388 |
| - // scope of DEOPTs caused by using try blocks and allows direct |
| 407 | + // Using separate callback execution functions allows direct |
389 | 408 | // callback invocation with small numbers of arguments to avoid the
|
390 | 409 | // performance hit associated with using `fn.apply()`
|
391 |
| - if (args === undefined) { |
392 |
| - nextTickCallbackWith0Args(callback); |
393 |
| - } else { |
394 |
| - switch (args.length) { |
395 |
| - case 1: |
396 |
| - nextTickCallbackWith1Arg(callback, args[0]); |
397 |
| - break; |
398 |
| - case 2: |
399 |
| - nextTickCallbackWith2Args(callback, args[0], args[1]); |
400 |
| - break; |
401 |
| - case 3: |
402 |
| - nextTickCallbackWith3Args(callback, args[0], args[1], args[2]); |
403 |
| - break; |
404 |
| - default: |
405 |
| - nextTickCallbackWithManyArgs(callback, args); |
406 |
| - } |
407 |
| - } |
| 410 | + _combinedTickCallback(args, callback); |
408 | 411 | if (1e4 < tickInfo[kIndex])
|
409 | 412 | tickDone();
|
410 | 413 | }
|
|
425 | 428 | args = tock.args;
|
426 | 429 | if (domain)
|
427 | 430 | domain.enter();
|
428 |
| - // Using separate callback execution functions helps to limit the |
429 |
| - // scope of DEOPTs caused by using try blocks and allows direct |
| 431 | + // Using separate callback execution functions allows direct |
430 | 432 | // callback invocation with small numbers of arguments to avoid the
|
431 | 433 | // performance hit associated with using `fn.apply()`
|
432 |
| - if (args === undefined) { |
433 |
| - nextTickCallbackWith0Args(callback); |
434 |
| - } else { |
435 |
| - switch (args.length) { |
436 |
| - case 1: |
437 |
| - nextTickCallbackWith1Arg(callback, args[0]); |
438 |
| - break; |
439 |
| - case 2: |
440 |
| - nextTickCallbackWith2Args(callback, args[0], args[1]); |
441 |
| - break; |
442 |
| - case 3: |
443 |
| - nextTickCallbackWith3Args(callback, args[0], args[1], args[2]); |
444 |
| - break; |
445 |
| - default: |
446 |
| - nextTickCallbackWithManyArgs(callback, args); |
447 |
| - } |
448 |
| - } |
| 434 | + _combinedTickCallback(args, callback); |
449 | 435 | if (1e4 < tickInfo[kIndex])
|
450 | 436 | tickDone();
|
451 | 437 | if (domain)
|
|
457 | 443 | } while (tickInfo[kLength] !== 0);
|
458 | 444 | }
|
459 | 445 |
|
460 |
| - function nextTickCallbackWith0Args(callback) { |
461 |
| - var threw = true; |
462 |
| - try { |
463 |
| - callback(); |
464 |
| - threw = false; |
465 |
| - } finally { |
466 |
| - if (threw) |
467 |
| - tickDone(); |
468 |
| - } |
469 |
| - } |
470 |
| - |
471 |
| - function nextTickCallbackWith1Arg(callback, arg1) { |
472 |
| - var threw = true; |
473 |
| - try { |
474 |
| - callback(arg1); |
475 |
| - threw = false; |
476 |
| - } finally { |
477 |
| - if (threw) |
478 |
| - tickDone(); |
479 |
| - } |
480 |
| - } |
481 |
| - |
482 |
| - function nextTickCallbackWith2Args(callback, arg1, arg2) { |
483 |
| - var threw = true; |
484 |
| - try { |
485 |
| - callback(arg1, arg2); |
486 |
| - threw = false; |
487 |
| - } finally { |
488 |
| - if (threw) |
489 |
| - tickDone(); |
490 |
| - } |
491 |
| - } |
492 |
| - |
493 |
| - function nextTickCallbackWith3Args(callback, arg1, arg2, arg3) { |
494 |
| - var threw = true; |
495 |
| - try { |
496 |
| - callback(arg1, arg2, arg3); |
497 |
| - threw = false; |
498 |
| - } finally { |
499 |
| - if (threw) |
500 |
| - tickDone(); |
501 |
| - } |
502 |
| - } |
503 |
| - |
504 |
| - function nextTickCallbackWithManyArgs(callback, args) { |
505 |
| - var threw = true; |
506 |
| - try { |
507 |
| - callback.apply(null, args); |
508 |
| - threw = false; |
509 |
| - } finally { |
510 |
| - if (threw) |
511 |
| - tickDone(); |
512 |
| - } |
513 |
| - } |
514 |
| - |
515 | 446 | function TickObject(c, args) {
|
516 | 447 | this.callback = c;
|
517 | 448 | this.domain = process.domain || null;
|
|
527 | 458 |
|
528 | 459 | var args;
|
529 | 460 | if (arguments.length > 1) {
|
530 |
| - args = []; |
| 461 | + args = new Array(arguments.length - 1); |
531 | 462 | for (var i = 1; i < arguments.length; i++)
|
532 |
| - args.push(arguments[i]); |
| 463 | + args[i - 1] = arguments[i]; |
533 | 464 | }
|
534 | 465 |
|
535 | 466 | nextTickQueue.push(new TickObject(callback, args));
|
|
0 commit comments