|
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