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:
Родитель
1b63fa1096
Коммит
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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче