Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index 8155dcc42889c1973ae76d7466f66ba3ebcf6c1d..06616981e6a03e0e48774f2608b3d618de045fb5 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -3331,9 +3331,8 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
} |
} |
- |
Statement* Parser::DesugarLexicalBindingsInForStatement( |
- Scope* inner_scope, bool is_const, ZoneList<const AstRawString*>* names, |
+ Scope* inner_scope, VariableMode mode, ZoneList<const AstRawString*>* names, |
ForStatement* loop, Statement* init, Expression* cond, Statement* next, |
Statement* body, bool* ok) { |
// ES6 13.7.4.8 specifies that on each loop iteration the let variables are |
@@ -3438,7 +3437,6 @@ Statement* Parser::DesugarLexicalBindingsInForStatement( |
ZoneList<Variable*> inner_vars(names->length(), zone()); |
// For each let variable x: |
// make statement: let/const x = temp_x. |
- VariableMode mode = is_const ? CONST : LET; |
for (int i = 0; i < names->length(); i++) { |
VariableProxy* proxy = NewUnresolved(names->at(i), mode); |
Declaration* declaration = factory()->NewVariableDeclaration( |
@@ -3588,7 +3586,6 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
// 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
int stmt_pos = peek_position(); |
- bool is_const = false; |
Statement* init = NULL; |
ZoneList<const AstRawString*> lexical_bindings(1, zone()); |
@@ -3605,22 +3602,18 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
if (peek() == Token::VAR || (peek() == Token::CONST && allow_const()) || |
(peek() == Token::LET && IsNextLetKeyword())) { |
ParseVariableDeclarations(kForStatement, &parsing_result, CHECK_OK); |
- is_const = parsing_result.descriptor.mode == CONST; |
- int num_decl = parsing_result.declarations.length(); |
- bool accept_IN = num_decl >= 1; |
ForEachStatement::VisitMode mode; |
int each_beg_pos = scanner()->location().beg_pos; |
int each_end_pos = scanner()->location().end_pos; |
- if (accept_IN && CheckInOrOf(&mode, ok)) { |
+ if (CheckInOrOf(&mode, ok)) { |
if (!*ok) return nullptr; |
- if (num_decl != 1) { |
- const char* loop_type = |
- mode == ForEachStatement::ITERATE ? "for-of" : "for-in"; |
+ if (parsing_result.declarations.length() != 1) { |
ParserTraits::ReportMessageAt( |
parsing_result.bindings_loc, |
- MessageTemplate::kForInOfLoopMultiBindings, loop_type); |
+ MessageTemplate::kForInOfLoopMultiBindings, |
+ ForEachStatement::VisitModeString(mode)); |
*ok = false; |
return nullptr; |
} |
@@ -3630,14 +3623,10 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
(is_strict(language_mode()) || mode == ForEachStatement::ITERATE || |
IsLexicalVariableMode(parsing_result.descriptor.mode) || |
!decl.pattern->IsVariableProxy())) { |
- if (mode == ForEachStatement::ITERATE) { |
- ReportMessageAt(parsing_result.first_initializer_loc, |
- MessageTemplate::kForOfLoopInitializer); |
- } else { |
- // TODO(caitp): This should be an error in sloppy mode too. |
- ReportMessageAt(parsing_result.first_initializer_loc, |
- MessageTemplate::kForInLoopInitializer); |
- } |
+ ParserTraits::ReportMessageAt( |
+ parsing_result.first_initializer_loc, |
+ MessageTemplate::kForInOfLoopInitializer, |
+ ForEachStatement::VisitModeString(mode)); |
*ok = false; |
return nullptr; |
} |
@@ -3895,8 +3884,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
if (lexical_bindings.length() > 0) { |
BlockState block_state(&scope_, for_scope); |
result = DesugarLexicalBindingsInForStatement( |
- inner_scope, is_const, &lexical_bindings, loop, init, cond, |
- next, body, CHECK_OK); |
+ inner_scope, parsing_result.descriptor.mode, &lexical_bindings, loop, |
+ init, cond, next, body, CHECK_OK); |
for_scope->set_end_position(scanner()->location().end_pos); |
} else { |
for_scope->set_end_position(scanner()->location().end_pos); |