Chromium Code Reviews| Index: src/preparser.cc |
| diff --git a/src/preparser.cc b/src/preparser.cc |
| index 1685724fe4482780d2ae64e820ce3773f894dcb9..9e889967e651bd230e02b22532429528e040a8f8 100644 |
| --- a/src/preparser.cc |
| +++ b/src/preparser.cc |
| @@ -235,6 +235,11 @@ PreParser::Statement PreParser::ParseStatement(bool* ok) { |
| // Statement :: |
| // EmptyStatement |
| // ... |
| + |
| + if (peek() == Token::SEMICOLON) { |
|
rossberg
2015/04/14 20:19:49
Did you add a test covering this?
conradw
2015/04/15 11:40:03
Done, was indirectly covered before but now direct
|
| + Next(); |
| + return Statement::Default(); |
| + } |
| return ParseSubStatement(ok); |
| } |
| @@ -395,15 +400,16 @@ PreParser::Statement PreParser::ParseBlock(bool* ok) { |
| // (ECMA-262, 3rd, 12.2) |
| // |
| Expect(Token::LBRACE, CHECK_OK); |
| + Statement final = Statement::Default(); |
| while (peek() != Token::RBRACE) { |
| if (is_strict(language_mode())) { |
| - ParseStatementListItem(CHECK_OK); |
| + final = ParseStatementListItem(CHECK_OK); |
| } else { |
| - ParseStatement(CHECK_OK); |
| + final = ParseStatement(CHECK_OK); |
| } |
| } |
| Expect(Token::RBRACE, ok); |
| - return Statement::Default(); |
| + return final; |
| } |
| @@ -545,7 +551,11 @@ PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { |
| DCHECK(is_sloppy(language_mode()) || |
| !IsFutureStrictReserved(expr.AsIdentifier())); |
| Consume(Token::COLON); |
| - return ParseStatement(ok); |
| + Statement statement = ParseStatement(ok); |
| + if (statement.IsStrongSwitchTerminatingStatement()) { |
| + return Statement::Default(); |
| + } |
| + return statement; |
| // Preparsing is disabled for extensions (because the extension details |
| // aren't passed to lazily compiled functions), so we don't |
| // accept "native function" in the preparser. |
| @@ -594,7 +604,7 @@ PreParser::Statement PreParser::ParseContinueStatement(bool* ok) { |
| ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| } |
| ExpectSemicolon(CHECK_OK); |
| - return Statement::Default(); |
| + return Statement::Terminating(); |
| } |
| @@ -612,7 +622,7 @@ PreParser::Statement PreParser::ParseBreakStatement(bool* ok) { |
| ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| } |
| ExpectSemicolon(CHECK_OK); |
| - return Statement::Default(); |
| + return Statement::Terminating(); |
| } |
| @@ -647,7 +657,7 @@ PreParser::Statement PreParser::ParseReturnStatement(bool* ok) { |
| ParseExpression(true, CHECK_OK); |
| } |
| ExpectSemicolon(CHECK_OK); |
| - return Statement::Default(); |
| + return Statement::Terminating(); |
| } |
| @@ -691,12 +701,19 @@ PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) { |
| } |
| Expect(Token::COLON, CHECK_OK); |
| token = peek(); |
| + Statement statement = Statement::Terminating(); |
| while (token != Token::CASE && |
| token != Token::DEFAULT && |
| token != Token::RBRACE) { |
| - ParseStatementListItem(CHECK_OK); |
| + statement = ParseStatementListItem(CHECK_OK); |
| token = peek(); |
| } |
| + if (is_strong(language_mode()) && |
| + !statement.IsStrongSwitchTerminatingStatement()) { |
| + ReportMessageAt(scanner()->location(), "strong_unterminated_switch"); |
| + *ok = false; |
| + return Statement::Default(); |
| + } |
| } |
| Expect(Token::RBRACE, ok); |
| return Statement::Default(); |
| @@ -827,7 +844,7 @@ PreParser::Statement PreParser::ParseThrowStatement(bool* ok) { |
| } |
| ParseExpression(true, CHECK_OK); |
| ExpectSemicolon(ok); |
| - return Statement::Default(); |
| + return Statement::Terminating(); |
| } |