Index: src/ast/scopes.cc |
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc |
index f003f8c37a148a9d56b74507a925a9ea7b610a70..361c3554bf7c9bd53a292e9e77ded7d0e8c0a742 100644 |
--- a/src/ast/scopes.cc |
+++ b/src/ast/scopes.cc |
@@ -320,16 +320,19 @@ void Scope::Initialize() { |
// Declare 'arguments' variable which exists in all non arrow functions. |
// Note that it might never be accessed, in which case it won't be |
// allocated during variable allocation. |
- variables_.Declare(this, ast_value_factory_->arguments_string(), VAR, |
- Variable::ARGUMENTS, kCreatedInitialized); |
+ arguments_ = |
+ variables_.Declare(this, ast_value_factory_->arguments_string(), VAR, |
+ Variable::ARGUMENTS, kCreatedInitialized); |
- variables_.Declare(this, ast_value_factory_->new_target_string(), CONST, |
- Variable::NORMAL, kCreatedInitialized); |
+ new_target_ = |
+ variables_.Declare(this, ast_value_factory_->new_target_string(), CONST, |
+ Variable::NORMAL, kCreatedInitialized); |
if (IsConciseMethod(function_kind_) || IsClassConstructor(function_kind_) || |
IsAccessorFunction(function_kind_)) { |
- variables_.Declare(this, ast_value_factory_->this_function_string(), |
- CONST, Variable::NORMAL, kCreatedInitialized); |
+ this_function_ = |
+ variables_.Declare(this, ast_value_factory_->this_function_string(), |
+ CONST, Variable::NORMAL, kCreatedInitialized); |
} |
} |
} |
@@ -1332,14 +1335,11 @@ void Scope::AllocateHeapSlot(Variable* var) { |
void Scope::AllocateParameterLocals(Isolate* isolate) { |
DCHECK(is_function_scope()); |
- Variable* arguments = LookupLocal(ast_value_factory_->arguments_string()); |
- // Functions have 'arguments' declared implicitly in all non arrow functions. |
- DCHECK(arguments != nullptr || is_arrow_scope()); |
bool uses_sloppy_arguments = false; |
- if (arguments != nullptr && MustAllocate(arguments) && |
- !HasArgumentsParameter(isolate)) { |
+ // Functions have 'arguments' declared implicitly in all non arrow functions. |
+ if (arguments_ != nullptr) { |
// 'arguments' is used. Unless there is also a parameter called |
// 'arguments', we must be conservative and allocate all parameters to |
// the context assuming they will be captured by the arguments object. |
@@ -1348,21 +1348,25 @@ void Scope::AllocateParameterLocals(Isolate* isolate) { |
// that specific parameter value and cannot be used to access the |
// parameters, which is why we don't need to allocate an arguments |
// object in that case. |
+ if (MustAllocate(arguments_) && !HasArgumentsParameter(isolate)) { |
+ // In strict mode 'arguments' does not alias formal parameters. |
+ // Therefore in strict mode we allocate parameters as if 'arguments' |
+ // were not used. |
+ // If the parameter list is not simple, arguments isn't sloppy either. |
+ uses_sloppy_arguments = |
+ is_sloppy(language_mode()) && has_simple_parameters(); |
+ } else { |
+ // 'arguments' is unused. Tell the code generator that it does not need to |
+ // allocate the arguments object by nulling out arguments_. |
+ arguments_ = nullptr; |
+ } |
- // We are using 'arguments'. Tell the code generator that is needs to |
- // allocate the arguments object by setting 'arguments_'. |
- arguments_ = arguments; |
- |
- // In strict mode 'arguments' does not alias formal parameters. |
- // Therefore in strict mode we allocate parameters as if 'arguments' |
- // were not used. |
- // If the parameter list is not simple, arguments isn't sloppy either. |
- uses_sloppy_arguments = |
- is_sloppy(language_mode()) && has_simple_parameters(); |
+ } else { |
+ DCHECK(is_arrow_scope()); |
} |
if (rest_parameter_ && !MustAllocate(rest_parameter_)) { |
- rest_parameter_ = NULL; |
+ rest_parameter_ = nullptr; |
} |
// The same parameter may occur multiple times in the parameters_ list. |
@@ -1484,16 +1488,12 @@ void Scope::AllocateNonParameterLocalsAndDeclaredGlobals(Isolate* isolate) { |
AllocateNonParameterLocal(isolate, rest_parameter_); |
} |
- Variable* new_target_var = |
- LookupLocal(ast_value_factory_->new_target_string()); |
- if (new_target_var != nullptr && MustAllocate(new_target_var)) { |
- new_target_ = new_target_var; |
+ if (new_target_ != nullptr && !MustAllocate(new_target_)) { |
+ new_target_ = nullptr; |
} |
- Variable* this_function_var = |
- LookupLocal(ast_value_factory_->this_function_string()); |
- if (this_function_var != nullptr && MustAllocate(this_function_var)) { |
- this_function_ = this_function_var; |
+ if (this_function_ != nullptr && !MustAllocate(this_function_)) { |
+ this_function_ = nullptr; |
} |
} |