Chromium Code Reviews| Index: src/preparser.cc |
| diff --git a/src/preparser.cc b/src/preparser.cc |
| index 1685724fe4482780d2ae64e820ce3773f894dcb9..e93223c60ec231ff9799b3c8ee9b54eaedf7477a 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) { |
| + 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.IsJumpStatement()) { |
|
rossberg
2015/04/15 19:56:34
Nit: Use return with ?:
conradw
2015/04/16 10:59:57
Done.
|
| + 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. |
| @@ -571,12 +581,15 @@ PreParser::Statement PreParser::ParseIfStatement(bool* ok) { |
| Expect(Token::LPAREN, CHECK_OK); |
| ParseExpression(true, CHECK_OK); |
| Expect(Token::RPAREN, CHECK_OK); |
| - ParseSubStatement(CHECK_OK); |
| + Statement stat = ParseSubStatement(CHECK_OK); |
| if (peek() == Token::ELSE) { |
| Next(); |
| - ParseSubStatement(CHECK_OK); |
| + Statement else_stat = ParseSubStatement(CHECK_OK); |
| + stat = (else_stat.IsJumpStatement()) ? stat : Statement::Default(); |
|
rossberg
2015/04/15 19:56:34
This doesn't seem quite right, since stat may be s
conradw
2015/04/16 10:59:57
Done.
|
| + } else { |
| + stat = Statement::Default(); |
| } |
| - return Statement::Default(); |
| + return stat; |
| } |
| @@ -594,7 +607,7 @@ PreParser::Statement PreParser::ParseContinueStatement(bool* ok) { |
| ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| } |
| ExpectSemicolon(CHECK_OK); |
| - return Statement::Default(); |
| + return Statement::Jump(); |
| } |
| @@ -612,7 +625,7 @@ PreParser::Statement PreParser::ParseBreakStatement(bool* ok) { |
| ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
| } |
| ExpectSemicolon(CHECK_OK); |
| - return Statement::Default(); |
| + return Statement::Jump(); |
| } |
| @@ -647,7 +660,7 @@ PreParser::Statement PreParser::ParseReturnStatement(bool* ok) { |
| ParseExpression(true, CHECK_OK); |
| } |
| ExpectSemicolon(CHECK_OK); |
| - return Statement::Default(); |
| + return Statement::Jump(); |
| } |
| @@ -691,12 +704,19 @@ PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) { |
| } |
| Expect(Token::COLON, CHECK_OK); |
| token = peek(); |
| + Statement statement = Statement::Jump(); |
| 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.IsJumpStatement()) { |
|
rossberg
2015/04/15 19:56:34
Nit: stray line break
But more importantly, don't
conradw
2015/04/16 10:59:57
Done, and I made the same mistake in parser
|
| + ReportMessageAt(scanner()->location(), "strong_switch_fallthrough"); |
| + *ok = false; |
| + return Statement::Default(); |
| + } |
| } |
| Expect(Token::RBRACE, ok); |
| return Statement::Default(); |
| @@ -827,7 +847,7 @@ PreParser::Statement PreParser::ParseThrowStatement(bool* ok) { |
| } |
| ParseExpression(true, CHECK_OK); |
| ExpectSemicolon(ok); |
| - return Statement::Default(); |
| + return Statement::Jump(); |
| } |