vm: pass parsing_context to ScriptCompiler::CompileFunctionInContext

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: https://github.com/nodejs/node/issues/23194

doc: clarify parsingContext option for vm.compileScript

test: usage of parsingContext in vm.compileFunction

PR-URL: https://github.com/nodejs/node/pull/23206
Fixes: https://github.com/nodejs/node/issues/23194
Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
This commit is contained in:
Dara Hayes 2018-10-01 19:56:07 +01:00 committed by Daniel Bevenius
parent 700fe5bbc4
commit 8da674df49
3 changed files with 43 additions and 3 deletions

View File

@ -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:** `[]`.

View File

@ -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;

View File

@ -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;
}