Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index da5d771d7b2b6d75d4fa14d4a6f93e4307bc37a3..151cf50a5c4baa538448e211256455fbc7691167 100755 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -645,3 +645,58 @@ TEST(StreamScanner) { |
TestStreamScanner(&stream3, expectations3, 1, 1 + i); |
} |
} |
+ |
+ |
+void TestScanRegExp(const char* re_source, const char* expected) { |
+ i::Utf8ToUC16CharacterStream stream( |
+ reinterpret_cast<const i::byte*>(re_source), |
+ static_cast<unsigned>(strlen(re_source))); |
+ i::V8JavaScriptScanner scanner; |
+ scanner.Initialize(&stream); |
+ |
+ i::Token::Value start = scanner.peek(); |
+ CHECK(start == i::Token::DIV || start == i::Token::ASSIGN_DIV); |
+ CHECK(scanner.ScanRegExpPattern(start == i::Token::ASSIGN_DIV)); |
+ scanner.Next(); // Current token is now the regexp literal. |
+ CHECK(scanner.is_literal_ascii()); |
+ i::Vector<const char> actual = scanner.literal_ascii_string(); |
+ for (int i = 0; i < actual.length(); i++) { |
+ CHECK_NE('\0', expected[i]); |
+ CHECK_EQ(expected[i], actual[i]); |
+ } |
+} |
+ |
+ |
+TEST(RegExpScanning) { |
+ // RegExp token with added garbage at the end. The scanner should only |
+ // scan the RegExp until the terminating slash just before "flipperwald". |
+ TestScanRegExp("/b/flipperwald", "b"); |
+ // Incomplete escape sequences doesn't hide the terminating slash. |
+ TestScanRegExp("/\\x/flipperwald", "\\x"); |
+ TestScanRegExp("/\\u/flipperwald", "\\u"); |
+ TestScanRegExp("/\\u1/flipperwald", "\\u1"); |
+ TestScanRegExp("/\\u12/flipperwald", "\\u12"); |
+ TestScanRegExp("/\\u123/flipperwald", "\\u123"); |
+ TestScanRegExp("/\\c/flipperwald", "\\c"); |
+ TestScanRegExp("/\\c//flipperwald", "\\c"); |
+ // Slashes inside character classes are not terminating. |
+ TestScanRegExp("/[/]/flipperwald", "[/]"); |
+ TestScanRegExp("/[\\s-/]/flipperwald", "[\\s-/]"); |
+ // Incomplete escape sequences inside a character class doesn't hide |
+ // the end of the character class. |
+ TestScanRegExp("/[\\c/]/flipperwald", "[\\c/]"); |
+ TestScanRegExp("/[\\c]/flipperwald", "[\\c]"); |
+ TestScanRegExp("/[\\x]/flipperwald", "[\\x]"); |
+ TestScanRegExp("/[\\x1]/flipperwald", "[\\x1]"); |
+ TestScanRegExp("/[\\u]/flipperwald", "[\\u]"); |
+ TestScanRegExp("/[\\u1]/flipperwald", "[\\u1]"); |
+ TestScanRegExp("/[\\u12]/flipperwald", "[\\u12]"); |
+ TestScanRegExp("/[\\u123]/flipperwald", "[\\u123]"); |
+ // Escaped ']'s wont end the character class. |
+ TestScanRegExp("/[\\]/]/flipperwald", "[\\]/]"); |
+ // Escaped slashes are not terminating. |
+ TestScanRegExp("/\\//flipperwald", "\\/"); |
+ // Starting with '=' works too. |
+ TestScanRegExp("/=/", "="); |
+ TestScanRegExp("/=?/", "=?"); |
+} |