| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index 79d06da50750fca179203bb8abd768b07043d76d..e6c1c79a4159f9fa065912662d1822350f6fe221 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -4309,8 +4309,11 @@ void Parser::RewriteDestructuringAssignments() {
|
| pair.assignment->AsRewritableExpression();
|
| DCHECK_NOT_NULL(to_rewrite);
|
| if (!to_rewrite->is_rewritten()) {
|
| - PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite,
|
| - pair.scope);
|
| + // Since this function is called at the end of parsing the program,
|
| + // pair.scope may already have been removed by FinalizeBlockScope in the
|
| + // meantime.
|
| + Scope* scope = pair.scope->GetUnremovedScope();
|
| + PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, scope);
|
| }
|
| }
|
| }
|
| @@ -4745,7 +4748,7 @@ Expression* Parser::RewriteYieldStar(Expression* generator,
|
|
|
| Block* then = factory()->NewBlock(nullptr, 4 + 1, false, nopos);
|
| BuildIteratorCloseForCompletion(
|
| - then->statements(), var_iterator,
|
| + scope(), then->statements(), var_iterator,
|
| factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos));
|
| then->statements()->Add(throw_call, zone());
|
| check_throw = factory()->NewIfStatement(
|
| @@ -5113,9 +5116,9 @@ void Parser::BuildIteratorClose(ZoneList<Statement*>* statements,
|
| statements->Add(validate_output, zone());
|
| }
|
|
|
| -void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition,
|
| - Variable* iter, Block* iterator_use,
|
| - Block* target) {
|
| +void Parser::FinalizeIteratorUse(Scope* use_scope, Variable* completion,
|
| + Expression* condition, Variable* iter,
|
| + Block* iterator_use, Block* target) {
|
| //
|
| // This function adds two statements to [target], corresponding to the
|
| // following code:
|
| @@ -5171,7 +5174,8 @@ void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition,
|
| {
|
| Block* block = factory()->NewBlock(nullptr, 2, true, nopos);
|
| Expression* proxy = factory()->NewVariableProxy(completion);
|
| - BuildIteratorCloseForCompletion(block->statements(), iter, proxy);
|
| + BuildIteratorCloseForCompletion(use_scope, block->statements(), iter,
|
| + proxy);
|
| DCHECK(block->statements()->length() == 2);
|
|
|
| maybe_close = factory()->NewBlock(nullptr, 1, true, nopos);
|
| @@ -5188,7 +5192,7 @@ void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition,
|
| // }
|
| Statement* try_catch;
|
| {
|
| - Scope* catch_scope = NewScopeWithParent(scope(), CATCH_SCOPE);
|
| + Scope* catch_scope = NewScopeWithParent(use_scope, CATCH_SCOPE);
|
| Variable* catch_variable =
|
| catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
|
| kCreatedInitialized, NORMAL_VARIABLE);
|
| @@ -5228,7 +5232,8 @@ void Parser::FinalizeIteratorUse(Variable* completion, Expression* condition,
|
| target->statements()->Add(try_finally, zone());
|
| }
|
|
|
| -void Parser::BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements,
|
| +void Parser::BuildIteratorCloseForCompletion(Scope* scope,
|
| + ZoneList<Statement*>* statements,
|
| Variable* iterator,
|
| Expression* completion) {
|
| //
|
| @@ -5294,7 +5299,7 @@ void Parser::BuildIteratorCloseForCompletion(ZoneList<Statement*>* statements,
|
|
|
| Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos);
|
|
|
| - Scope* catch_scope = NewScope(CATCH_SCOPE);
|
| + Scope* catch_scope = NewScopeWithParent(scope, CATCH_SCOPE);
|
| Variable* catch_variable =
|
| catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR,
|
| kCreatedInitialized, NORMAL_VARIABLE);
|
| @@ -5431,8 +5436,13 @@ Statement* Parser::FinalizeForOfStatement(ForOfStatement* loop,
|
| Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
|
| try_block->statements()->Add(loop, zone());
|
|
|
| - FinalizeIteratorUse(var_completion, closing_condition, loop->iterator(),
|
| - try_block, final_loop);
|
| + // The scope in which the parser creates this loop.
|
| + Scope* loop_scope = scope()->outer_scope();
|
| + DCHECK_EQ(loop_scope->scope_type(), BLOCK_SCOPE);
|
| + DCHECK_EQ(scope()->scope_type(), BLOCK_SCOPE);
|
| +
|
| + FinalizeIteratorUse(loop_scope, var_completion, closing_condition,
|
| + loop->iterator(), try_block, final_loop);
|
| }
|
|
|
| return final_loop;
|
|
|