'use strict'; function NextTickWrap() {} module.exports = function patch() { const hooks = this._hooks; const state = this._state; const oldNextTick = process.nextTick; process.nextTick = function () { if (!state.enabled) return oldNextTick.apply(process, arguments); const args = new Array(arguments.length); for (let i = 0; i < arguments.length; i++) { args[i] = arguments[i]; } const callback = args[0]; if (typeof callback !== 'function') { throw new TypeError('callback is not a function'); } const handle = new NextTickWrap(); const uid = --state.counter; // call the init hook hooks.init.call(handle, uid, 0, null, null); // overwrite callback args[0] = function () { // call the pre hook hooks.pre.call(handle, uid); let didThrow = true; try { callback.apply(this, arguments); didThrow = false; } finally { // If `callback` threw and there is an uncaughtException handler // then call the `post` and `destroy` hook after the uncaughtException // user handlers have been invoked. if(didThrow && process.listenerCount('uncaughtException') > 0) { process.once('uncaughtException', function () { hooks.post.call(handle, uid, true); hooks.destroy.call(null, uid); }); } } // callback done successfully hooks.post.call(handle, uid, false); hooks.destroy.call(null, uid); }; return oldNextTick.apply(process, args); }; }