Skip to content

Commit

Permalink
vm: pass parsing_context to ScriptCompiler::CompileFunctionInContext
Browse files Browse the repository at this point in the history
ContextifyContext::CompileFunction in src/node_contextify.cc
was incorrectly passing the context variable to
ScriptCompiler::CompileFunctionInContext

This meant that the parsingContext option in vm.compileFunction
was not being applied properly to the compiled function.

fixes: #23194

doc: clarify parsingContext option for vm.compileScript

test: usage of parsingContext in vm.compileFunction

PR-URL: #23206
Fixes: #23194
Reviewed-By: Ujjwal Sharma <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Sakthipriyan Vairamani <[email protected]>
  • Loading branch information
Dara Hayes authored and danbev committed Oct 11, 2018
1 parent 700fe5b commit 8da674d
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 3 deletions.
4 changes: 2 additions & 2 deletions doc/api/vm.md
Original file line number Diff line number Diff line change
Expand Up @@ -673,8 +673,8 @@ added: v10.10.0
data for the supplied source.
* `produceCachedData` {boolean} Specifies whether to produce new cache data.
**Default:** `false`.
* `parsingContext` {Object} The sandbox/context in which the said function
should be compiled in.
* `parsingContext` {Object} The [contextified][] sandbox in which the said
function should be compiled in.
* `contextExtensions` {Object[]} An array containing a collection of context
extensions (objects wrapping the current scope) to be applied while
compiling. **Default:** `[]`.
Expand Down
2 changes: 1 addition & 1 deletion src/node_contextify.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,7 @@ void ContextifyContext::CompileFunction(
}

MaybeLocal<Function> maybe_fun = ScriptCompiler::CompileFunctionInContext(
context, &source, params.size(), params.data(),
parsing_context, &source, params.size(), params.data(),
context_extensions.size(), context_extensions.data(), options);

Local<Function> fun;
Expand Down
40 changes: 40 additions & 0 deletions test/parallel/test-vm-basic.js
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,46 @@ const vm = require('vm');
stack: 'Error: Sample Error\n at <anonymous>:1:10'
});

assert.strictEqual(
vm.compileFunction(
'return varInContext',
[],
{
parsingContext: vm.createContext({ varInContext: 'abc' })
}
)(),
'abc'
);

common.expectsError(() => {
vm.compileFunction(
'return varInContext',
[]
)();
}, {
message: 'varInContext is not defined',
stack: 'ReferenceError: varInContext is not defined\n at <anonymous>:1:1'
});

assert.notDeepStrictEqual(
vm.compileFunction(
'return global',
[],
{
parsingContext: vm.createContext({ global: {} })
}
)(),
global
);

assert.deepStrictEqual(
vm.compileFunction(
'return global',
[]
)(),
global
);

// Resetting value
Error.stackTraceLimit = oldLimit;
}

0 comments on commit 8da674d

Please sign in to comment.