Browse Source

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>
v6
AnnaMag 8 years ago
committed by Anna Henningsen
parent
commit
241de510a8
No known key found for this signature in database GPG Key ID: D8B9F5AEAE84E4CF
  1. 12
      src/node_contextify.cc

12
src/node_contextify.cc

@ -432,7 +432,17 @@ class ContextifyContext {
// false for vmResult.x = 5 where vmResult = vm.runInContext(); // false for vmResult.x = 5 where vmResult = vm.runInContext();
bool is_contextual_store = ctx->global_proxy() != args.This(); 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; return;
ctx->sandbox()->Set(property, value); ctx->sandbox()->Set(property, value);

Loading…
Cancel
Save