Chromium Code Reviews| Index: src/scopes.cc |
| diff --git a/src/scopes.cc b/src/scopes.cc |
| index de364a5b489050408dd04a32c308054566ae9fec..fe4bb011088ab9ed91f3422f41bcf70ac3f5d0ce 100644 |
| --- a/src/scopes.cc |
| +++ b/src/scopes.cc |
| @@ -160,12 +160,16 @@ void Scope::SetDefaults(ScopeType scope_type, |
| scope_inside_with_ = false; |
| scope_contains_with_ = false; |
| scope_calls_eval_ = false; |
| + scope_uses_this_ = false; |
| + scope_uses_arguments_ = false; |
| asm_module_ = false; |
| asm_function_ = outer_scope != NULL && outer_scope->asm_module_; |
| // Inherit the strict mode from the parent scope. |
| strict_mode_ = outer_scope != NULL ? outer_scope->strict_mode_ : SLOPPY; |
| outer_scope_calls_sloppy_eval_ = false; |
| inner_scope_calls_eval_ = false; |
| + inner_scope_uses_this_ = false; |
| + inner_scope_uses_arguments_ = false; |
| force_eager_compilation_ = false; |
| force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) |
| ? outer_scope->has_forced_context_allocation() : false; |
| @@ -779,6 +783,8 @@ static const char* Header(ScopeType scope_type) { |
| case CATCH_SCOPE: return "catch"; |
| case BLOCK_SCOPE: return "block"; |
| case WITH_SCOPE: return "with"; |
| + case ARROW_SCOPE: |
|
rossberg
2014/10/15 12:56:32
Nit: no newline
aperez
2014/10/15 17:09:51
Acknowledged.
|
| + return "arrow"; |
| } |
| UNREACHABLE(); |
| return NULL; |
| @@ -885,6 +891,12 @@ void Scope::Print(int n) { |
| if (scope_inside_with_) Indent(n1, "// scope inside 'with'\n"); |
| if (scope_contains_with_) Indent(n1, "// scope contains 'with'\n"); |
| if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n"); |
| + if (scope_uses_this_) Indent(n1, "// scope uses 'this'\n"); |
| + if (scope_uses_arguments_) Indent(n1, "// scope uses 'arguments'\n"); |
| + if (inner_scope_uses_this_) Indent(n1, "// inner scope uses 'this'\n"); |
| + if (inner_scope_uses_arguments_) { |
| + Indent(n1, "// inner scope uses 'arguments'\n"); |
| + } |
| if (outer_scope_calls_sloppy_eval_) { |
| Indent(n1, "// outer scope calls 'eval' in sloppy context\n"); |
| } |
| @@ -1166,6 +1178,17 @@ void Scope::PropagateScopeInfo(bool outer_scope_calls_sloppy_eval ) { |
| if (inner->scope_calls_eval_ || inner->inner_scope_calls_eval_) { |
| inner_scope_calls_eval_ = true; |
| } |
| + // If the inner scope is an arrow function, propagate the flags tracking |
| + // usage of this/arguments, but do not propagate them out from normal |
| + // functions. |
| + if (inner->is_arrow_scope() || !inner->is_function_scope()) { |
|
rossberg
2014/10/15 12:56:32
Nit: switch around the two conditions (the more ge
aperez
2014/10/15 17:09:51
Acknowledged.
|
| + if (inner->scope_uses_this_ || inner->inner_scope_uses_this_) { |
| + inner_scope_uses_this_ = true; |
| + } |
| + if (inner->scope_uses_arguments_ || inner->inner_scope_uses_arguments_) { |
| + inner_scope_uses_arguments_ = true; |
| + } |
| + } |
| if (inner->force_eager_compilation_) { |
| force_eager_compilation_ = true; |
| } |