Reviewers: Jakob,
Description:
Sync preparser and parser wrt syntax error in switch..case.
[email protected]
BUG=v8:2210
TEST=test-parsing/ParserSync
Please review this at https://chromiumcodereview.appspot.com/10701116/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/preparser.cc
M test/cctest/test-parsing.cc
Index: src/preparser.cc
diff --git a/src/preparser.cc b/src/preparser.cc
index
0c17eecd6a432a6d24efe93247acabcdbb6d13ff..3f26423f3889437211c7a994c860c186ebe8702a
100644
--- a/src/preparser.cc
+++ b/src/preparser.cc
@@ -603,13 +603,17 @@ PreParser::Statement
PreParser::ParseSwitchStatement(bool* ok) {
Expect(i::Token::CASE, CHECK_OK);
ParseExpression(true, CHECK_OK);
Expect(i::Token::COLON, CHECK_OK);
- } else if (token == i::Token::DEFAULT) {
+ } else {
Expect(i::Token::DEFAULT, CHECK_OK);
Expect(i::Token::COLON, CHECK_OK);
- } else {
- ParseStatement(CHECK_OK);
}
token = peek();
+ while (token != i::Token::CASE &&
+ token != i::Token::DEFAULT &&
+ token != i::Token::RBRACE) {
+ ParseStatement(CHECK_OK);
+ token = peek();
+ }
}
Expect(i::Token::RBRACE, ok);
return Statement::Default();
Index: test/cctest/test-parsing.cc
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
index
288e8d1f3f98c422da5bb50bedff5c896a3aa4fd..e4215245d7fa972e613e78df1ce1509a08d3567b
100755
--- a/test/cctest/test-parsing.cc
+++ b/test/cctest/test-parsing.cc
@@ -1147,6 +1147,7 @@ TEST(ParserSync) {
{ "with ({})", "" },
{ "switch (12) { case 12: ", "}" },
{ "switch (12) { default: ", "}" },
+ { "switch (12) { ", "case 12: }" },
{ "label2: ", "" },
{ NULL, NULL }
};
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev