From 0836402f7ca9ee2578a7fc14ba1678d2871d5f94 Mon Sep 17 00:00:00 2001 From: AnnaMag Date: Sun, 26 Mar 2017 18:53:26 +0100 Subject: [PATCH] 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. --- src/node_contextify.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/node_contextify.cc b/src/node_contextify.cc index a6e3d93aa820e3..bc6c468aaf4218 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -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);