From: wingo Date: Thu, 23 Apr 2015 13:20:11 +0000 (-0700) Subject: Function scopes only must have a context if they call sloppy eval X-Git-Tag: upstream/4.7.83~3009 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d5fd58165c5348c45e3a63d60df9d75787b44e83;p=platform%2Fupstream%2Fv8.git Function scopes only must have a context if they call sloppy eval A strict arrow function with no parameters and no variable bindings won't need a context object because it will never have any locals. (This is unlike strict normal functions, which do have "arguments" and "this" locals.) R=rossberg@chromium.org BUG=v8:4056 LOG=N Review URL: https://codereview.chromium.org/1093183003 Cr-Commit-Position: refs/heads/master@{#28031} --- diff --git a/src/scopeinfo.cc b/src/scopeinfo.cc index e7edbcd..0127449 100644 --- a/src/scopeinfo.cc +++ b/src/scopeinfo.cc @@ -208,8 +208,8 @@ int ScopeInfo::ContextLength() { FunctionVariableField::decode(Flags()) == CONTEXT; bool has_context = context_locals > 0 || function_name_context_slot || scope_type() == WITH_SCOPE || - (scope_type() == ARROW_SCOPE && CallsEval()) || - (scope_type() == FUNCTION_SCOPE && CallsEval()) || + (scope_type() == ARROW_SCOPE && CallsSloppyEval()) || + (scope_type() == FUNCTION_SCOPE && CallsSloppyEval()) || scope_type() == MODULE_SCOPE; if (has_context) { return Context::MIN_CONTEXT_SLOTS + context_locals + diff --git a/src/scopes.cc b/src/scopes.cc index b8f7eb8..b2efd3d 100644 --- a/src/scopes.cc +++ b/src/scopes.cc @@ -1464,7 +1464,7 @@ void Scope::AllocateVariablesRecursively(Isolate* isolate) { // even if no local variables were statically allocated in the scope. // Likewise for modules. bool must_have_context = is_with_scope() || is_module_scope() || - (is_function_scope() && calls_eval()); + (is_function_scope() && calls_sloppy_eval()); // If we didn't allocate any locals in the local context, then we only // need the minimal number of slots if we must have a context. diff --git a/test/mjsunit/harmony/regress/regress-4056.js b/test/mjsunit/harmony/regress/regress-4056.js new file mode 100644 index 0000000..d938df0 --- /dev/null +++ b/test/mjsunit/harmony/regress/regress-4056.js @@ -0,0 +1,12 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --harmony-arrow-functions + +function strictFunctionArrowEval(s) { + "use strict"; + return (()=>eval(s))(); +}; + +assertEquals(strictFunctionArrowEval("42"), 42)