Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/test/cctest/test-regexp.cc b/test/cctest/test-regexp.cc
index 0a153b7..071ab18 100644
--- a/test/cctest/test-regexp.cc
+++ b/test/cctest/test-regexp.cc
@@ -171,7 +171,6 @@
void TestRegExpParser(bool lookbehind) {
FLAG_harmony_regexp_lookbehind = lookbehind;
- FLAG_harmony_unicode_regexps = true;
CHECK_PARSE_ERROR("?");
@@ -438,6 +437,23 @@
CHECK_MIN_MAX("a(?=b)c", 2, 2);
CHECK_MIN_MAX("a(?=bbb|bb)c", 2, 2);
CHECK_MIN_MAX("a(?!bbb|bb)c", 2, 2);
+
+ FLAG_harmony_regexp_named_captures = true;
+ CheckParseEq("(?<a>x)(?<b>x)(?<c>x)\\k<a>",
+ "(: (^ 'x') (^ 'x') (^ 'x') (<- 1))", true);
+ CheckParseEq("(?<a>x)(?<b>x)(?<c>x)\\k<b>",
+ "(: (^ 'x') (^ 'x') (^ 'x') (<- 2))", true);
+ CheckParseEq("(?<a>x)(?<b>x)(?<c>x)\\k<c>",
+ "(: (^ 'x') (^ 'x') (^ 'x') (<- 3))", true);
+ CheckParseEq("(?<a>a)\\k<a>", "(: (^ 'a') (<- 1))", true);
+ CheckParseEq("(?<a>a\\k<a>)", "(^ 'a')", true);
+ CheckParseEq("(?<a>\\k<a>a)", "(^ 'a')", true);
+ CheckParseEq("(?<a>\\k<b>)(?<b>\\k<a>)", "(: (^ (<- 2)) (^ (<- 1)))", true);
+ CheckParseEq("\\k<a>(?<a>a)", "(: (<- 1) (^ 'a'))", true);
+
+ CheckParseEq("(?<\\u{03C0}>a)", "(^ 'a')", true);
+ CheckParseEq("(?<\\u03C0>a)", "(^ 'a')", true);
+ FLAG_harmony_regexp_named_captures = false;
}
@@ -450,7 +466,6 @@
TestRegExpParser(true); // Lookbehind enabled.
}
-
TEST(ParserRegression) {
CheckParseEq("[A-Z$-][x]", "(! [A-Z $ -] [x])");
CheckParseEq("a{3,4*}", "(: 'a{3,' (# 0 - g '4') '}')");
@@ -458,14 +473,16 @@
CheckParseEq("a|", "(| 'a' %)");
}
-static void ExpectError(const char* input,
- const char* expected) {
+static void ExpectError(const char* input, const char* expected,
+ bool unicode = false) {
v8::HandleScope scope(CcTest::isolate());
Zone zone(CcTest::i_isolate()->allocator());
FlatStringReader reader(CcTest::i_isolate(), CStrVector(input));
RegExpCompileData result;
- CHECK(!v8::internal::RegExpParser::ParseRegExp(
- CcTest::i_isolate(), &zone, &reader, JSRegExp::kNone, &result));
+ JSRegExp::Flags flags = JSRegExp::kNone;
+ if (unicode) flags |= JSRegExp::kUnicode;
+ CHECK(!v8::internal::RegExpParser::ParseRegExp(CcTest::i_isolate(), &zone,
+ &reader, flags, &result));
CHECK(result.tree == NULL);
CHECK(!result.error.is_null());
v8::base::SmartArrayPointer<char> str = result.error->ToCString(ALLOW_NULLS);
@@ -499,6 +516,23 @@
os << "()";
}
ExpectError(os.str().c_str(), kTooManyCaptures);
+
+ FLAG_harmony_regexp_named_captures = true;
+ const char* kInvalidCaptureName = "Invalid capture group name";
+ ExpectError("(?<>.)", kInvalidCaptureName, true);
+ ExpectError("(?<1>.)", kInvalidCaptureName, true);
+ ExpectError("(?<_%>.)", kInvalidCaptureName, true);
+ ExpectError("\\k<a", kInvalidCaptureName, true);
+ const char* kDuplicateCaptureName = "Duplicate capture group name";
+ ExpectError("(?<a>.)(?<a>.)", kDuplicateCaptureName, true);
+ const char* kInvalidUnicodeEscape = "Invalid Unicode escape sequence";
+ ExpectError("(?<\\u{FISK}", kInvalidUnicodeEscape, true);
+ const char* kInvalidCaptureReferenced = "Invalid named capture referenced";
+ ExpectError("\\k<a>", kInvalidCaptureReferenced, true);
+ ExpectError("(?<b>)\\k<a>", kInvalidCaptureReferenced, true);
+ const char* kInvalidNamedReference = "Invalid named reference";
+ ExpectError("\\ka", kInvalidNamedReference, true);
+ FLAG_harmony_regexp_named_captures = false;
}