Function scopes only must have a context if they call sloppy eval
authorwingo <wingo@igalia.com>
Thu, 23 Apr 2015 13:20:11 +0000 (06:20 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 23 Apr 2015 13:19:54 +0000 (13:19 +0000)
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}

src/scopeinfo.cc
src/scopes.cc
test/mjsunit/harmony/regress/regress-4056.js [new file with mode: 0644]

index e7edbcd..0127449 100644 (file)
@@ -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 +
index b8f7eb8..b2efd3d 100644 (file)
@@ -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 (file)
index 0000000..d938df0
--- /dev/null
@@ -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)