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(); |
} |