Skip to content

Commit

Permalink
vm: refactor vm module
Browse files Browse the repository at this point in the history
Switch to the more efficient module.exports = {} pattern.

PR-URL: #11392
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
jasnell committed Mar 7, 2017
1 parent f5d9202 commit f3546b7
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 54 deletions.
63 changes: 34 additions & 29 deletions lib/vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,11 @@ Script.prototype.runInContext = function(contextifiedSandbox, options) {
};

Script.prototype.runInNewContext = function(sandbox, options) {
var context = exports.createContext(sandbox);
var context = createContext(sandbox);
return this.runInContext(context, options);
};

exports.Script = Script;

exports.createScript = function(code, options) {
return new Script(code, options);
};

exports.createContext = function(sandbox) {
function createContext(sandbox) {
if (sandbox === undefined) {
sandbox = {};
} else if (binding.isContext(sandbox)) {
Expand All @@ -56,28 +50,11 @@ exports.createContext = function(sandbox) {

binding.makeContext(sandbox);
return sandbox;
};

exports.runInDebugContext = function(code) {
return binding.runInDebugContext(code);
};

exports.runInContext = function(code, contextifiedSandbox, options) {
var script = new Script(code, options);
return script.runInContext(contextifiedSandbox, options);
};

exports.runInNewContext = function(code, sandbox, options) {
var script = new Script(code, options);
return script.runInNewContext(sandbox, options);
};

exports.runInThisContext = function(code, options) {
var script = new Script(code, options);
return script.runInThisContext(options);
};
}

exports.isContext = binding.isContext;
function createScript(code, options) {
return new Script(code, options);
}

// Remove all SIGINT listeners and re-attach them after the wrapped function
// has executed, so that caught SIGINT are handled by the listeners again.
Expand All @@ -102,3 +79,31 @@ function sigintHandlersWrap(fn) {
}
}
}

function runInDebugContext(code) {
return binding.runInDebugContext(code);
}

function runInContext(code, contextifiedSandbox, options) {
return createScript(code, options)
.runInContext(contextifiedSandbox, options);
}

function runInNewContext(code, sandbox, options) {
return createScript(code, options).runInNewContext(sandbox, options);
}

function runInThisContext(code, options) {
return createScript(code, options).runInThisContext(options);
}

module.exports = {
Script,
createContext,
createScript,
runInDebugContext,
runInContext,
runInNewContext,
runInThisContext,
isContext: binding.isContext
};
14 changes: 10 additions & 4 deletions test/message/eval_messages.out
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
with(this){__filename}
^^^^
SyntaxError: Strict mode code may not include a with statement
at Object.exports.runInThisContext (vm.js:*)
at createScript (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([eval]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
Expand All @@ -15,10 +16,11 @@ SyntaxError: Strict mode code may not include a with statement
[eval]:1
throw new Error("hello")
^

Error: hello
at [eval]:1:7
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([eval]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
Expand All @@ -28,10 +30,11 @@ Error: hello
[eval]:1
throw new Error("hello")
^

Error: hello
at [eval]:1:7
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([eval]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
Expand All @@ -42,20 +45,23 @@ Error: hello
[eval]:1
var x = 100; y = x;
^

ReferenceError: y is not defined
at [eval]:1:16
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([eval]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
at runCallback (timers.js:*:*)
at tryOnImmediate (timers.js:*:*)
at processImmediate [as _immediateCallback] (timers.js:*:*)

[eval]:1
var ______________________________________________; throw 10
^
10

[eval]:1
var ______________________________________________; throw 10
^
Expand Down
18 changes: 9 additions & 9 deletions test/message/stdin_messages.out
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[stdin]

[stdin]:1
with(this){__filename}
^^^^
SyntaxError: Strict mode code may not include a with statement
at Object.exports.runInThisContext (vm.js:*)
at createScript (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
Expand All @@ -13,43 +13,43 @@ SyntaxError: Strict mode code may not include a with statement
at processImmediate [as _immediateCallback] (timers.js:*:*)
42
42

[stdin]:1
throw new Error("hello")
^

Error: hello
at [stdin]:1:*
at [stdin]:1:7
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
at runCallback (timers.js:*:*)
at tryOnImmediate (timers.js:*:*)
at processImmediate [as _immediateCallback] (timers.js:*:*)

[stdin]:1
throw new Error("hello")
^

Error: hello
at [stdin]:1:*
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
at runCallback (timers.js:*:*)
at tryOnImmediate (timers.js:*:*)
at processImmediate [as _immediateCallback] (timers.js:*:*)
100

[stdin]:1
var x = 100; y = x;
^

ReferenceError: y is not defined
at [stdin]:1:16
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> ([stdin]-wrapper:*:*)
at Module._compile (module.js:*:*)
at Immediate.<anonymous> (bootstrap_node.js:*:*)
Expand Down
4 changes: 2 additions & 2 deletions test/message/undefined_reference_in_new_context.out
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
before

evalmachine.<anonymous>:1
foo.bar = 5;
^

ReferenceError: foo is not defined
at evalmachine.<anonymous>:1:1
at ContextifyScript.Script.runInContext (vm.js:*)
at ContextifyScript.Script.runInNewContext (vm.js:*)
at Object.exports.runInNewContext (vm.js:*)
at Object.runInNewContext (vm.js:*)
at Object.<anonymous> (*test*message*undefined_reference_in_new_context.js:*)
at Module._compile (module.js:*)
at *..js (module.js:*)
Expand Down
4 changes: 2 additions & 2 deletions test/message/vm_display_runtime_error.out
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
beginning

test.vm:1
throw new Error("boo!")
^

Error: boo!
at test.vm:1:7
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> (*test*message*vm_display_runtime_error.js:*)
at Module._compile (module.js:*)
at Object.Module._extensions..js (module.js:*)
Expand Down
9 changes: 4 additions & 5 deletions test/message/vm_display_syntax_error.out
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
beginning

foo.vm:1
var 4;
^
SyntaxError: Unexpected number
at Object.exports.runInThisContext (vm.js:*)
at createScript (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> (*test*message*vm_display_syntax_error.js:*)
at Module._compile (module.js:*)
at Object.Module._extensions..js (module.js:*)
Expand All @@ -13,12 +13,12 @@ SyntaxError: Unexpected number
at Function.Module._load (module.js:*)
at Module.runMain (module.js:*)
at run (bootstrap_node.js:*)
at startup (bootstrap_node.js:*)
test.vm:1
var 5;
^
SyntaxError: Unexpected number
at Object.exports.runInThisContext (vm.js:*)
at createScript (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> (*test*message*vm_display_syntax_error.js:*)
at Module._compile (module.js:*)
at Object.Module._extensions..js (module.js:*)
Expand All @@ -27,4 +27,3 @@ SyntaxError: Unexpected number
at Function.Module._load (module.js:*)
at Module.runMain (module.js:*)
at run (bootstrap_node.js:*)
at startup (bootstrap_node.js:*)
3 changes: 2 additions & 1 deletion test/message/vm_dont_display_runtime_error.out
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ middle
test.vm:1
throw new Error("boo!")
^

Error: boo!
at test.vm:1:7
at ContextifyScript.Script.runInThisContext (vm.js:*)
at Object.exports.runInThisContext (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> (*test*message*vm_dont_display_runtime_error.js:*)
at Module._compile (module.js:*)
at Object.Module._extensions..js (module.js:*)
Expand Down
5 changes: 3 additions & 2 deletions test/message/vm_dont_display_syntax_error.out
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ middle
test.vm:1
var 5;
^

SyntaxError: Unexpected number
at Object.exports.runInThisContext (vm.js:*)
at createScript (vm.js:*)
at Object.runInThisContext (vm.js:*)
at Object.<anonymous> (*test*message*vm_dont_display_syntax_error.js:*)
at Module._compile (module.js:*)
at Object.Module._extensions..js (module.js:*)
Expand All @@ -13,4 +15,3 @@ SyntaxError: Unexpected number
at Function.Module._load (module.js:*)
at Module.runMain (module.js:*)
at run (bootstrap_node.js:*)
at startup (bootstrap_node.js:*)

0 comments on commit f3546b7

Please sign in to comment.