| Index: src/parsing/preparser.cc
|
| diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc
|
| index 9dffa836e90edd906151368c43ea2447aa4b9bea..37beecf5a40aedfc577c3b2432a7085081e26f58 100644
|
| --- a/src/parsing/preparser.cc
|
| +++ b/src/parsing/preparser.cc
|
| @@ -164,140 +164,6 @@ PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
|
| return ParseHoistableDeclaration(pos, flags, nullptr, false, ok);
|
| }
|
|
|
| -PreParser::Statement PreParser::ParseForStatement(
|
| - ZoneList<const AstRawString*>* labels, bool* ok) {
|
| - // ForStatement ::
|
| - // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
|
| -
|
| - // Create an in-between scope for let-bound iteration variables.
|
| - bool has_lexical = false;
|
| -
|
| - BlockState block_state(&scope_state_);
|
| - Expect(Token::FOR, CHECK_OK);
|
| - Expect(Token::LPAREN, CHECK_OK);
|
| - if (peek() != Token::SEMICOLON) {
|
| - ForEachStatement::VisitMode mode;
|
| - if (peek() == Token::VAR || peek() == Token::CONST ||
|
| - (peek() == Token::LET && IsNextLetKeyword())) {
|
| - DeclarationParsingResult parsing_result;
|
| -
|
| - ParseVariableDeclarations(kForStatement, &parsing_result, nullptr,
|
| - CHECK_OK);
|
| - if (parsing_result.descriptor.mode == CONST ||
|
| - parsing_result.descriptor.mode == LET) {
|
| - has_lexical = true;
|
| - }
|
| - if (CheckInOrOf(&mode)) {
|
| - if (!*ok) return Statement::Default();
|
| - if (parsing_result.declarations.length() != 1) {
|
| - ReportMessageAt(parsing_result.bindings_loc,
|
| - MessageTemplate::kForInOfLoopMultiBindings,
|
| - ForEachStatement::VisitModeString(mode));
|
| - *ok = false;
|
| - return Statement::Default();
|
| - }
|
| - bool is_binding_pattern =
|
| - parsing_result.declarations[0].pattern.IsObjectLiteral() ||
|
| - parsing_result.declarations[0].pattern.IsArrayLiteral();
|
| - if (parsing_result.first_initializer_loc.IsValid() &&
|
| - (is_strict(language_mode()) || mode == ForEachStatement::ITERATE ||
|
| - has_lexical || is_binding_pattern || allow_harmony_for_in())) {
|
| - // Only increment the use count if we would have let this through
|
| - // without the flag.
|
| - if (use_counts_ != nullptr && allow_harmony_for_in()) {
|
| - ++use_counts_[v8::Isolate::kForInInitializer];
|
| - }
|
| - ReportMessageAt(parsing_result.first_initializer_loc,
|
| - MessageTemplate::kForInOfLoopInitializer,
|
| - ForEachStatement::VisitModeString(mode));
|
| - *ok = false;
|
| - return Statement::Default();
|
| - }
|
| -
|
| - if (mode == ForEachStatement::ITERATE) {
|
| - ExpressionClassifier classifier(this);
|
| - ParseAssignmentExpression(true, CHECK_OK);
|
| - RewriteNonPattern(CHECK_OK);
|
| - } else {
|
| - ParseExpression(true, CHECK_OK);
|
| - }
|
| -
|
| - Expect(Token::RPAREN, CHECK_OK);
|
| - {
|
| - ReturnExprScope no_tail_calls(function_state_,
|
| - ReturnExprContext::kInsideForInOfBody);
|
| - ParseScopedStatement(nullptr, true, CHECK_OK);
|
| - }
|
| - return Statement::Default();
|
| - }
|
| - } else {
|
| - int lhs_beg_pos = peek_position();
|
| - ExpressionClassifier classifier(this);
|
| - Expression lhs = ParseExpressionCoverGrammar(false, CHECK_OK);
|
| - int lhs_end_pos = scanner()->location().end_pos;
|
| - bool is_for_each = CheckInOrOf(&mode);
|
| - bool is_destructuring = is_for_each &&
|
| - (lhs->IsArrayLiteral() || lhs->IsObjectLiteral());
|
| -
|
| - if (is_destructuring) {
|
| - ValidateAssignmentPattern(CHECK_OK);
|
| - } else {
|
| - ValidateExpression(CHECK_OK);
|
| - }
|
| -
|
| - if (is_for_each) {
|
| - if (!is_destructuring) {
|
| - lhs = CheckAndRewriteReferenceExpression(
|
| - lhs, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor,
|
| - kSyntaxError, CHECK_OK);
|
| - }
|
| -
|
| - if (mode == ForEachStatement::ITERATE) {
|
| - ExpressionClassifier classifier(this);
|
| - ParseAssignmentExpression(true, CHECK_OK);
|
| - RewriteNonPattern(CHECK_OK);
|
| - } else {
|
| - ParseExpression(true, CHECK_OK);
|
| - }
|
| -
|
| - Expect(Token::RPAREN, CHECK_OK);
|
| - {
|
| - BlockState block_state(&scope_state_);
|
| - ParseScopedStatement(nullptr, true, CHECK_OK);
|
| - }
|
| - return Statement::Default();
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Parsed initializer at this point.
|
| - Expect(Token::SEMICOLON, CHECK_OK);
|
| -
|
| - // If there are let bindings, then condition and the next statement of the
|
| - // for loop must be parsed in a new scope.
|
| - Scope* inner_scope = scope();
|
| - // TODO(verwaest): Allocate this through a ScopeState as well.
|
| - if (has_lexical) inner_scope = NewScopeWithParent(inner_scope, BLOCK_SCOPE);
|
| -
|
| - {
|
| - BlockState block_state(&scope_state_, inner_scope);
|
| -
|
| - if (peek() != Token::SEMICOLON) {
|
| - ParseExpression(true, CHECK_OK);
|
| - }
|
| - Expect(Token::SEMICOLON, CHECK_OK);
|
| -
|
| - if (peek() != Token::RPAREN) {
|
| - ParseExpression(true, CHECK_OK);
|
| - }
|
| - Expect(Token::RPAREN, CHECK_OK);
|
| -
|
| - ParseScopedStatement(nullptr, true, ok);
|
| - }
|
| - return Statement::Default();
|
| -}
|
| -
|
| -
|
| // Redefinition of CHECK_OK for parsing expressions.
|
| #undef CHECK_OK
|
| #define CHECK_OK CHECK_OK_VALUE(Expression::Default())
|
|
|