vm: use SetterCallback to set func declarations
Currently, when in strict mode, function declarations are copied on the sandbox by CopyProperties(), which is not necessary and will break when CP is removed. This change maintains current behavior, letting GlobalPropertySetterCallback copy functions on the sandbox instead of using CP to do the task. PR-URL: https://github.com/nodejs/node/pull/12051 Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
1b63fa1096
commit
241de510a8
@ -432,7 +432,17 @@ class ContextifyContext {
|
||||
// false for vmResult.x = 5 where vmResult = vm.runInContext();
|
||||
bool is_contextual_store = ctx->global_proxy() != args.This();
|
||||
|
||||
if (!is_declared && args.ShouldThrowOnError() && is_contextual_store)
|
||||
// Indicator to not return before setting (undeclared) function declarations
|
||||
// on the sandbox in strict mode, i.e. args.ShouldThrowOnError() = true.
|
||||
// True for 'function f() {}', 'this.f = function() {}',
|
||||
// 'var f = function()'.
|
||||
// In effect only for 'function f() {}' because
|
||||
// var f = function(), is_declared = true
|
||||
// this.f = function() {}, is_contextual_store = false.
|
||||
bool is_function = value->IsFunction();
|
||||
|
||||
if (!is_declared && args.ShouldThrowOnError() && is_contextual_store &&
|
||||
!is_function)
|
||||
return;
|
||||
|
||||
ctx->sandbox()->Set(property, value);
|
||||
|
Loading…
x
Reference in New Issue
Block a user