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

Reply via email to