Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index 4c7733ffea167f498005c02b183c2eb0f9ba5712..f03fb9dce685399c150e357886f9fa67cdf7d49d 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -2741,11 +2741,9 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
!(FLAG_validate_asm && scope()->IsAsmModule()); |
bool is_lazy_inner_function = use_temp_zone && FLAG_lazy_inner_functions; |
- DeclarationScope* main_scope = nullptr; |
- if (use_temp_zone) { |
- // This Scope lives in the main Zone; we'll migrate data into it later. |
- main_scope = NewFunctionScope(kind); |
- } |
+ // This Scope lives in the main zone. We'll migrate data into that zone later. |
+ DeclarationScope* scope = NewFunctionScope(kind); |
+ SetLanguageMode(scope, language_mode); |
ZoneList<Statement*>* body = nullptr; |
int arity = -1; |
@@ -2765,18 +2763,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
// new temporary zone if the preconditions are satisfied, and ensures that |
// the previous zone is always restored after parsing the body. To be able |
// to do scope analysis correctly after full parsing, we migrate needed |
- // information from scope into main_scope when the function has been parsed. |
+ // information when the function is parsed. |
Zone temp_zone(zone()->allocator()); |
DiscardableZoneScope zone_scope(this, &temp_zone, use_temp_zone); |
- DeclarationScope* scope = NewFunctionScope(kind); |
- SetLanguageMode(scope, language_mode); |
- if (!use_temp_zone) { |
- main_scope = scope; |
- } else { |
- DCHECK(main_scope->zone() != scope->zone()); |
- } |
- |
FunctionState function_state(&function_state_, &scope_state_, scope); |
#ifdef DEBUG |
scope->SetScopeName(function_name); |
@@ -2841,24 +2831,23 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
// used once. |
eager_compile_hint = FunctionLiteral::kShouldEagerCompile; |
should_be_used_once_hint = true; |
- } else if (is_lazy_inner_function) { |
- DCHECK(main_scope != scope); |
- scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory); |
+ scope->ResetAfterPreparsing(); |
} |
} |
+ |
if (!is_lazy_top_level_function && !is_lazy_inner_function) { |
body = ParseEagerFunctionBody(function_name, pos, formals, kind, |
function_type, CHECK_OK); |
materialized_literal_count = function_state.materialized_literal_count(); |
expected_property_count = function_state.expected_property_count(); |
- if (use_temp_zone) { |
- // If the preconditions are correct the function body should never be |
- // accessed, but do this anyway for better behaviour if they're wrong. |
- body = nullptr; |
- DCHECK(main_scope != scope); |
- scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory); |
- } |
+ } |
+ |
+ if (use_temp_zone || is_lazy_top_level_function) { |
marja
2016/09/27 07:14:03
This sounds wrong... is_lazy_inner_function maybe?
marja
2016/09/27 11:17:34
.... and I was confused; use_temp_zone contains th
|
+ // If the preconditions are correct the function body should never be |
+ // accessed, but do this anyway for better behaviour if they're wrong. |
+ body = nullptr; |
+ scope->AnalyzePartially(&previous_zone_ast_node_factory); |
} |
// Parsing the body may change the language mode in our scope. |
@@ -2895,7 +2884,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
// Note that the FunctionLiteral needs to be created in the main Zone again. |
FunctionLiteral* function_literal = factory()->NewFunctionLiteral( |
- function_name, main_scope, body, materialized_literal_count, |
+ function_name, scope, body, materialized_literal_count, |
expected_property_count, arity, duplicate_parameters, function_type, |
eager_compile_hint, kind, pos); |
function_literal->set_function_token_position(function_token_pos); |
@@ -3480,9 +3469,6 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
function_scope, parsing_module_, logger, is_inner_function, may_abort, |
use_counts_); |
- // Detaching the scopes created by PreParser from the Scope chain must be done |
- // above (see ParseFunctionLiteral & AnalyzePartially). |
- if (!is_inner_function) function_scope->ResetAfterPreparsing(); |
if (pre_parse_timer_ != NULL) { |
pre_parse_timer_->Stop(); |
} |