|
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