From ffdc0821c8443b9f71129420f58099363b9a8eab Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 14 Jan 2017 19:43:33 -0800 Subject: [PATCH] vm: improve performance of vm.runIn*() Optimize for common cases in vm.runInContext() and vm.runInThisContext(). --- lib/vm.js | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/lib/vm.js b/lib/vm.js index 4869d368807665..295e874c6ab530 100644 --- a/lib/vm.js +++ b/lib/vm.js @@ -18,10 +18,7 @@ const realRunInContext = Script.prototype.runInContext; Script.prototype.runInThisContext = function(options) { if (options && options.breakOnSigint) { - const realRunInThisContextScript = () => { - return realRunInThisContext.call(this, options); - }; - return sigintHandlersWrap(realRunInThisContextScript); + return sigintHandlersWrap(realRunInThisContext, this, [options]); } else { return realRunInThisContext.call(this, options); } @@ -29,10 +26,8 @@ Script.prototype.runInThisContext = function(options) { Script.prototype.runInContext = function(contextifiedSandbox, options) { if (options && options.breakOnSigint) { - const realRunInContextScript = () => { - return realRunInContext.call(this, contextifiedSandbox, options); - }; - return sigintHandlersWrap(realRunInContextScript); + return sigintHandlersWrap(realRunInContext, this, + [contextifiedSandbox, options]); } else { return realRunInContext.call(this, contextifiedSandbox, options); } @@ -83,19 +78,22 @@ exports.isContext = binding.isContext; // Remove all SIGINT listeners and re-attach them after the wrapped function // has executed, so that caught SIGINT are handled by the listeners again. -function sigintHandlersWrap(fn) { +function sigintHandlersWrap(fn, thisArg, argsArray) { // Using the internal list here to make sure `.once()` wrappers are used, // not the original ones. let sigintListeners = process._events.SIGINT; - if (!Array.isArray(sigintListeners)) - sigintListeners = sigintListeners ? [sigintListeners] : []; - else + if (!sigintListeners) + return fn.apply(thisArg, argsArray); + + if (Array.isArray(sigintListeners)) sigintListeners = sigintListeners.slice(); + else + sigintListeners = [sigintListeners]; process.removeAllListeners('SIGINT'); try { - return fn(); + return fn.apply(thisArg, argsArray); } finally { // Add using the public methods so that the `newListener` handler of // process can re-attach the listeners.