Commit d5fd5816 authored by wingo's avatar wingo Committed by Commit bot

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}
parent a1528ec0
......@@ -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 +
......
......@@ -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.
......
// 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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment