mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
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:
parent
030dd14793
commit
ef1e77d186
26
lib/vm.js
26
lib/vm.js
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user