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:
AnnaMag 2017-03-26 18:53:26 +01:00 коммит произвёл Anna Henningsen
Родитель 1b63fa1096
Коммит 241de510a8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: D8B9F5AEAE84E4CF
1 изменённых файлов: 11 добавлений и 1 удалений

Просмотреть файл

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