| Index: test/cctest/test-regexp.cc
|
| diff --git a/test/cctest/test-regexp.cc b/test/cctest/test-regexp.cc
|
| index 2e236c20f3188fcde73cc1b0a7d71cabf8cc8c18..21d5ad1fba477fb5ad142d0185d9bbb685ab0d0d 100644
|
| --- a/test/cctest/test-regexp.cc
|
| +++ b/test/cctest/test-regexp.cc
|
| @@ -159,7 +159,10 @@ static MinMaxPair CheckMinMaxMatch(const char* input) {
|
| CHECK_EQ(max, min_max.max_match); \
|
| }
|
|
|
| -TEST(Parser) {
|
| +
|
| +void TestRegExpParser(bool lookbehind) {
|
| + FLAG_harmony_regexp_lookbehind = lookbehind;
|
| +
|
| CHECK_PARSE_ERROR("?");
|
|
|
| CheckParseEq("abc", "'abc'");
|
| @@ -191,6 +194,13 @@ TEST(Parser) {
|
| CheckParseEq("foo|(bar|baz)|quux", "(| 'foo' (^ (| 'bar' 'baz')) 'quux')");
|
| CheckParseEq("foo(?=bar)baz", "(: 'foo' (-> + 'bar') 'baz')");
|
| CheckParseEq("foo(?!bar)baz", "(: 'foo' (-> - 'bar') 'baz')");
|
| + if (lookbehind) {
|
| + CheckParseEq("foo(?<=bar)baz", "(: 'foo' (<- + 'bar') 'baz')");
|
| + CheckParseEq("foo(?<!bar)baz", "(: 'foo' (<- - 'bar') 'baz')");
|
| + } else {
|
| + CHECK_PARSE_ERROR("foo(?<=bar)baz");
|
| + CHECK_PARSE_ERROR("foo(?<!bar)baz");
|
| + }
|
| CheckParseEq("()", "(^ %)");
|
| CheckParseEq("(?=)", "(-> + %)");
|
| CheckParseEq("[]", "^[\\x00-\\uffff]"); // Doesn't compile on windows
|
| @@ -267,9 +277,16 @@ TEST(Parser) {
|
| CheckParseEq("(?=a){1,10}a", "(: (-> + 'a') 'a')");
|
| CheckParseEq("(?=a){9,10}a", "(: (-> + 'a') 'a')");
|
| CheckParseEq("(?!a)?a", "'a'");
|
| - CheckParseEq("\\1(a)", "(^ 'a')");
|
| + CheckParseEq("\\1(a)", "(: (<- 1) (^ 'a'))");
|
| CheckParseEq("(?!(a))\\1", "(: (-> - (^ 'a')) (<- 1))");
|
| - CheckParseEq("(?!\\1(a\\1)\\1)\\1", "(: (-> - (: (^ 'a') (<- 1))) (<- 1))");
|
| + CheckParseEq("(?!\\1(a\\1)\\1)\\1",
|
| + "(: (-> - (: (<- 1) (^ 'a') (<- 1))) (<- 1))");
|
| + CheckParseEq("\\1\\2(a(?:\\1(b\\1\\2))\\2)\\1",
|
| + "(: (<- 1) (<- 2) (^ (: 'a' (^ 'b') (<- 2))) (<- 1))");
|
| + if (lookbehind) {
|
| + CheckParseEq("\\1\\2(a(?<=\\1(b\\1\\2))\\2)\\1",
|
| + "(: (<- 1) (<- 2) (^ (: 'a' (<- + (^ 'b')) (<- 2))) (<- 1))");
|
| + }
|
| CheckParseEq("[\\0]", "[\\x00]");
|
| CheckParseEq("[\\11]", "[\\x09]");
|
| CheckParseEq("[\\11a]", "[\\x09 a]");
|
| @@ -400,6 +417,16 @@ TEST(Parser) {
|
| }
|
|
|
|
|
| +TEST(ParserWithLookbehind) {
|
| + TestRegExpParser(true); // Lookbehind enabled.
|
| +}
|
| +
|
| +
|
| +TEST(ParserWithoutLookbehind) {
|
| + TestRegExpParser(true); // Lookbehind enabled.
|
| +}
|
| +
|
| +
|
| TEST(ParserRegression) {
|
| CheckParseEq("[A-Z$-][x]", "(! [A-Z $ -] [x])");
|
| CheckParseEq("a{3,4*}", "(: 'a{3,' (# 0 - g '4') '}')");
|
| @@ -790,7 +817,7 @@ TEST(MacroAssemblerNativeSimple) {
|
|
|
| Label fail, backtrack;
|
| m.PushBacktrack(&fail);
|
| - m.CheckNotAtStart(NULL);
|
| + m.CheckNotAtStart(0, NULL);
|
| m.LoadCurrentCharacter(2, NULL);
|
| m.CheckNotCharacter('o', NULL);
|
| m.LoadCurrentCharacter(1, NULL, false);
|
| @@ -857,7 +884,7 @@ TEST(MacroAssemblerNativeSimpleUC16) {
|
|
|
| Label fail, backtrack;
|
| m.PushBacktrack(&fail);
|
| - m.CheckNotAtStart(NULL);
|
| + m.CheckNotAtStart(0, NULL);
|
| m.LoadCurrentCharacter(2, NULL);
|
| m.CheckNotCharacter('o', NULL);
|
| m.LoadCurrentCharacter(1, NULL, false);
|
| @@ -973,12 +1000,12 @@ TEST(MacroAssemblerNativeBackReferenceLATIN1) {
|
| m.AdvanceCurrentPosition(2);
|
| m.WriteCurrentPositionToRegister(1, 0);
|
| Label nomatch;
|
| - m.CheckNotBackReference(0, &nomatch);
|
| + m.CheckNotBackReference(0, false, &nomatch);
|
| m.Fail();
|
| m.Bind(&nomatch);
|
| m.AdvanceCurrentPosition(2);
|
| Label missing_match;
|
| - m.CheckNotBackReference(0, &missing_match);
|
| + m.CheckNotBackReference(0, false, &missing_match);
|
| m.WriteCurrentPositionToRegister(2, 0);
|
| m.Succeed();
|
| m.Bind(&missing_match);
|
| @@ -1023,12 +1050,12 @@ TEST(MacroAssemblerNativeBackReferenceUC16) {
|
| m.AdvanceCurrentPosition(2);
|
| m.WriteCurrentPositionToRegister(1, 0);
|
| Label nomatch;
|
| - m.CheckNotBackReference(0, &nomatch);
|
| + m.CheckNotBackReference(0, false, &nomatch);
|
| m.Fail();
|
| m.Bind(&nomatch);
|
| m.AdvanceCurrentPosition(2);
|
| Label missing_match;
|
| - m.CheckNotBackReference(0, &missing_match);
|
| + m.CheckNotBackReference(0, false, &missing_match);
|
| m.WriteCurrentPositionToRegister(2, 0);
|
| m.Succeed();
|
| m.Bind(&missing_match);
|
| @@ -1073,7 +1100,7 @@ TEST(MacroAssemblernativeAtStart) {
|
| 0);
|
|
|
| Label not_at_start, newline, fail;
|
| - m.CheckNotAtStart(¬_at_start);
|
| + m.CheckNotAtStart(0, ¬_at_start);
|
| // Check that prevchar = '\n' and current = 'f'.
|
| m.CheckCharacter('\n', &newline);
|
| m.Bind(&fail);
|
| @@ -1138,16 +1165,16 @@ TEST(MacroAssemblerNativeBackRefNoCase) {
|
| m.WriteCurrentPositionToRegister(2, 0);
|
| m.AdvanceCurrentPosition(3);
|
| m.WriteCurrentPositionToRegister(3, 0);
|
| - m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC".
|
| - m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC".
|
| + m.CheckNotBackReferenceIgnoreCase(2, false, &fail); // Match "AbC".
|
| + m.CheckNotBackReferenceIgnoreCase(2, false, &fail); // Match "ABC".
|
| Label expected_fail;
|
| - m.CheckNotBackReferenceIgnoreCase(2, &expected_fail);
|
| + m.CheckNotBackReferenceIgnoreCase(2, false, &expected_fail);
|
| m.Bind(&fail);
|
| m.Fail();
|
|
|
| m.Bind(&expected_fail);
|
| m.AdvanceCurrentPosition(3); // Skip "xYz"
|
| - m.CheckNotBackReferenceIgnoreCase(2, &succ);
|
| + m.CheckNotBackReferenceIgnoreCase(2, false, &succ);
|
| m.Fail();
|
|
|
| m.Bind(&succ);
|
| @@ -1339,7 +1366,7 @@ TEST(MacroAssemblerNativeLotsOfRegisters) {
|
| m.WriteCurrentPositionToRegister(0, 0);
|
| m.WriteCurrentPositionToRegister(1, 1);
|
| Label done;
|
| - m.CheckNotBackReference(0, &done); // Performs a system-stack push.
|
| + m.CheckNotBackReference(0, false, &done); // Performs a system-stack push.
|
| m.Bind(&done);
|
| m.PushRegister(large_number, RegExpMacroAssembler::kNoStackLimitCheck);
|
| m.PopRegister(1);
|
| @@ -1388,7 +1415,7 @@ TEST(MacroAssembler) {
|
| m.Fail();
|
| m.Bind(&start);
|
| m.PushBacktrack(&fail);
|
| - m.CheckNotAtStart(NULL);
|
| + m.CheckNotAtStart(0, NULL);
|
| m.LoadCurrentCharacter(0, NULL);
|
| m.CheckNotCharacter('f', NULL);
|
| m.LoadCurrentCharacter(1, NULL);
|
|
|