vm: improve performance of vm.runIn*()

Optimize for common cases in vm.runInContext() and
vm.runInThisContext().

PR-URL: https://github.com/nodejs/node/pull/10816
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Brian White <mscdex@mscdex.net>
This commit is contained in:
Rich Trott 2017-01-14 19:43:33 -08:00 committed by James M Snell
parent 030dd14793
commit ef1e77d186

View File

@ -17,22 +17,17 @@ const realRunInThisContext = Script.prototype.runInThisContext;
const realRunInContext = Script.prototype.runInContext;
Script.prototype.runInThisContext = function(options) {
if (options && options.breakOnSigint) {
const realRunInThisContextScript = () => {
return realRunInThisContext.call(this, options);
};
return sigintHandlersWrap(realRunInThisContextScript);
if (options && options.breakOnSigint && process._events.SIGINT) {
return sigintHandlersWrap(realRunInThisContext, this, [options]);
} else {
return realRunInThisContext.call(this, options);
}
};
Script.prototype.runInContext = function(contextifiedSandbox, options) {
if (options && options.breakOnSigint) {
const realRunInContextScript = () => {
return realRunInContext.call(this, contextifiedSandbox, options);
};
return sigintHandlersWrap(realRunInContextScript);
if (options && options.breakOnSigint && process._events.SIGINT) {
return sigintHandlersWrap(realRunInContext, this,
[contextifiedSandbox, options]);
} else {
return realRunInContext.call(this, contextifiedSandbox, options);
}
@ -83,19 +78,20 @@ 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 (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.