| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index 83f24273a7efd2c4a5449608efa2fb0a221cfb07..15792805e452175a1efe9e27950f69bf1aa114a8 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -3083,11 +3083,10 @@ Expression* Parser::BuildIteratorNextResult(Expression* iterator,
|
|
|
| void Parser::InitializeForEachStatement(ForEachStatement* stmt,
|
| Expression* each, Expression* subject,
|
| - Statement* body) {
|
| + Statement* body, int each_keyword_pos) {
|
| ForOfStatement* for_of = stmt->AsForOfStatement();
|
| if (for_of != NULL) {
|
| - InitializeForOfStatement(for_of, each, subject, body,
|
| - RelocInfo::kNoPosition);
|
| + InitializeForOfStatement(for_of, each, subject, body, each_keyword_pos);
|
| } else {
|
| if (each->IsArrayLiteral() || each->IsObjectLiteral()) {
|
| Variable* temp =
|
| @@ -3112,7 +3111,7 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt,
|
|
|
| void Parser::InitializeForOfStatement(ForOfStatement* for_of, Expression* each,
|
| Expression* iterable, Statement* body,
|
| - int iterable_pos) {
|
| + int next_result_pos) {
|
| Variable* iterator =
|
| scope_->NewTemporary(ast_value_factory()->dot_iterator_string());
|
| Variable* result =
|
| @@ -3123,14 +3122,7 @@ void Parser::InitializeForOfStatement(ForOfStatement* for_of, Expression* each,
|
| Expression* result_done;
|
| Expression* assign_each;
|
|
|
| - // Hackily disambiguate o from o.next and o [Symbol.iterator]().
|
| - // TODO(verwaest): Come up with a better solution.
|
| - int get_iterator_pos = iterable_pos != RelocInfo::kNoPosition
|
| - ? iterable_pos
|
| - : iterable->position() - 2;
|
| - int next_result_pos = iterable_pos != RelocInfo::kNoPosition
|
| - ? iterable_pos
|
| - : iterable->position() - 1;
|
| + int get_iterator_pos = iterable->position();
|
|
|
| // iterator = iterable[Symbol.iterator]()
|
| assign_iterator = factory()->NewAssignment(
|
| @@ -3550,6 +3542,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| factory()->NewForEachStatement(mode, labels, stmt_pos);
|
| Target target(&this->target_stack_, loop);
|
|
|
| + int each_keyword_position = scanner()->location().beg_pos;
|
| +
|
| Expression* enumerable;
|
| if (mode == ForEachStatement::ITERATE) {
|
| ExpressionClassifier classifier(this);
|
| @@ -3591,7 +3585,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| body_block->statements()->Add(body, zone());
|
| VariableProxy* temp_proxy =
|
| factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos);
|
| - InitializeForEachStatement(loop, temp_proxy, enumerable, body_block);
|
| + InitializeForEachStatement(loop, temp_proxy, enumerable, body_block,
|
| + each_keyword_position);
|
| }
|
| body_scope->set_end_position(scanner()->location().end_pos);
|
| body_scope = body_scope->FinalizeBlockScope();
|
| @@ -3670,6 +3665,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| factory()->NewForEachStatement(mode, labels, stmt_pos);
|
| Target target(&this->target_stack_, loop);
|
|
|
| + int each_keyword_position = scanner()->location().beg_pos;
|
| +
|
| Expression* enumerable;
|
| if (mode == ForEachStatement::ITERATE) {
|
| ExpressionClassifier classifier(this);
|
| @@ -3684,7 +3681,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
|
| // For legacy compat reasons, give for loops similar treatment to
|
| // if statements in allowing a function declaration for a body
|
| Statement* body = ParseScopedStatement(NULL, true, CHECK_OK);
|
| - InitializeForEachStatement(loop, expression, enumerable, body);
|
| + InitializeForEachStatement(loop, expression, enumerable, body,
|
| + each_keyword_position);
|
|
|
| Statement* final_loop = loop->IsForOfStatement()
|
| ? FinalizeForOfStatement(
|
| @@ -5520,7 +5518,7 @@ Expression* Parser::RewriteSpreads(ArrayLiteral* lit) {
|
| ForEachStatement::ITERATE, nullptr, RelocInfo::kNoPosition);
|
| InitializeForOfStatement(loop->AsForOfStatement(),
|
| factory()->NewVariableProxy(each), subject,
|
| - append_body, spread->expression_position());
|
| + append_body);
|
| do_block->statements()->Add(loop, zone());
|
| }
|
| }
|
|
|