Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Unified Diff: src/parser.cc

Issue 1152503002: [destructuring] Implement pattern matching in lexcal for-of/for-in. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove commented-out code Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | test/mjsunit/harmony/destructuring.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index c2e7c6dbf8bf77aedfac4ebed582e143edc339c8..b9d2c2f9e7df66c6e5e0feebf727001aac2915be 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -3484,8 +3484,6 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
is_const = peek() == Token::CONST;
ParseVariableDeclarations(kForStatement, &parsing_result, CHECK_OK);
DCHECK(parsing_result.descriptor.pos != RelocInfo::kNoPosition);
- Block* variable_statement =
- parsing_result.BuildInitializationBlock(&lexical_bindings, CHECK_OK);
int num_decl = parsing_result.declarations.length();
bool accept_IN = num_decl >= 1;
@@ -3546,19 +3544,23 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
scope_ = for_scope;
Expect(Token::RPAREN, CHECK_OK);
- VariableProxy* each =
- scope_->NewUnresolved(factory(), parsing_result.SingleName(),
- Variable::NORMAL, each_end_pos);
Statement* body = ParseSubStatement(NULL, CHECK_OK);
Block* body_block =
factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition);
- Token::Value init_op = is_const ? Token::INIT_CONST : Token::ASSIGN;
- Assignment* assignment = factory()->NewAssignment(
- init_op, each, temp_proxy, RelocInfo::kNoPosition);
- Statement* assignment_statement = factory()->NewExpressionStatement(
- assignment, RelocInfo::kNoPosition);
- body_block->AddStatement(variable_statement, zone());
- body_block->AddStatement(assignment_statement, zone());
+
+ auto each_initialization_block = factory()->NewBlock(
+ nullptr, 1, true, parsing_result.descriptor.pos);
+ {
+ DCHECK(parsing_result.declarations.length() == 1);
+ DeclarationParsingResult::Declaration decl =
+ parsing_result.declarations[0];
+ decl.initializer = temp_proxy;
+ PatternRewriter::DeclareAndInitializeVariables(
+ each_initialization_block, &parsing_result.descriptor, &decl,
+ &lexical_bindings, CHECK_OK);
+ }
+
+ body_block->AddStatement(each_initialization_block, zone());
body_block->AddStatement(body, zone());
InitializeForEachStatement(loop, temp_proxy, enumerable, body_block);
scope_ = saved_scope;
@@ -3567,9 +3569,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
body_block->set_scope(for_scope);
// Parsed for-in loop w/ let declaration.
return loop;
-
} else {
- init = variable_statement;
+ init = parsing_result.BuildInitializationBlock(&lexical_bindings,
+ CHECK_OK);
}
} else {
Scanner::Location lhs_location = scanner()->peek_location();
« no previous file with comments | « no previous file | test/mjsunit/harmony/destructuring.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698