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 committed by Anna Henningsen
parent 1b63fa1096
commit 241de510a8
No known key found for this signature in database
GPG Key ID: D8B9F5AEAE84E4CF

View File

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