Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 77c98b77e4c0cd6aadb003ec1965f82d879c30c8..c450bfb73d496dbe4d7bbda2f8439a130af439fb 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -1819,13 +1819,40 @@ Statement* Parser::ParseSubStatement(ZoneList<const AstRawString*>* labels, |
return ParseForStatement(labels, ok); |
case Token::CONTINUE: |
- return ParseContinueStatement(ok); |
+ if (labels == NULL) { |
rossberg
2015/04/14 20:19:49
To avoid the code duplication, how about introduci
conradw
2015/04/15 11:40:03
Done, with the caveat that the ordering is kind of
|
+ return ParseContinueStatement(ok); |
+ } else { |
+ Block* result = |
+ factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); |
+ Target target(&this->target_stack_, result); |
+ Statement* statement = ParseContinueStatement(CHECK_OK); |
+ if (result) result->AddStatement(statement, zone()); |
+ return result; |
+ } |
case Token::BREAK: |
- return ParseBreakStatement(labels, ok); |
+ if (labels == NULL) { |
+ return ParseBreakStatement(labels, ok); |
+ } else { |
+ Block* result = |
+ factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); |
+ Target target(&this->target_stack_, result); |
+ Statement* statement = ParseBreakStatement(labels, CHECK_OK); |
+ if (result) result->AddStatement(statement, zone()); |
+ return result; |
+ } |
case Token::RETURN: |
- return ParseReturnStatement(ok); |
+ if (labels == NULL) { |
+ return ParseReturnStatement(ok); |
+ } else { |
+ Block* result = |
+ factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); |
+ Target target(&this->target_stack_, result); |
+ Statement* statement = ParseReturnStatement(CHECK_OK); |
+ if (result) result->AddStatement(statement, zone()); |
+ return result; |
+ } |
case Token::WITH: |
return ParseWithStatement(labels, ok); |
@@ -1834,7 +1861,16 @@ Statement* Parser::ParseSubStatement(ZoneList<const AstRawString*>* labels, |
return ParseSwitchStatement(labels, ok); |
case Token::THROW: |
- return ParseThrowStatement(ok); |
+ if (labels == NULL) { |
+ return ParseThrowStatement(ok); |
+ } else { |
+ Block* result = |
+ factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); |
+ Target target(&this->target_stack_, result); |
+ Statement* statement = ParseThrowStatement(CHECK_OK); |
+ if (result) result->AddStatement(statement, zone()); |
+ return result; |
+ } |
case Token::TRY: { |
// NOTE: It is somewhat complicated to have labels on |
@@ -2845,13 +2881,19 @@ CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) { |
int pos = position(); |
ZoneList<Statement*>* statements = |
new(zone()) ZoneList<Statement*>(5, zone()); |
+ Statement* stat = NULL; |
while (peek() != Token::CASE && |
peek() != Token::DEFAULT && |
peek() != Token::RBRACE) { |
- Statement* stat = ParseStatementListItem(CHECK_OK); |
+ stat = ParseStatementListItem(CHECK_OK); |
statements->Add(stat, zone()); |
} |
- |
+ if (is_strong(language_mode()) && stat != NULL && |
+ !stat->IsStrongSwitchTerminatingStatement()) { |
+ ReportMessageAt(scanner()->location(), "strong_unterminated_switch"); |
+ *ok = false; |
+ return NULL; |
+ } |
return factory()->NewCaseClause(label, statements, pos); |
} |