Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: test/cctest/test-regexp.cc

Issue 1618753002: Revert of [regexp] implement character classes for unicode regexps. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/regexp/regexp-parser.cc ('k') | test/mjsunit/harmony/unicode-character-ranges.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 89
90 using namespace v8::internal; 90 using namespace v8::internal;
91 91
92 92
93 static bool CheckParse(const char* input) { 93 static bool CheckParse(const char* input) {
94 v8::HandleScope scope(CcTest::isolate()); 94 v8::HandleScope scope(CcTest::isolate());
95 Zone zone; 95 Zone zone;
96 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); 96 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input));
97 RegExpCompileData result; 97 RegExpCompileData result;
98 return v8::internal::RegExpParser::ParseRegExp( 98 return v8::internal::RegExpParser::ParseRegExp(
99 CcTest::i_isolate(), &zone, &reader, JSRegExp::kNone, &result); 99 CcTest::i_isolate(), &zone, &reader, false, false, &result);
100 } 100 }
101 101
102 102
103 static void CheckParseEq(const char* input, const char* expected, 103 static void CheckParseEq(const char* input, const char* expected,
104 bool unicode = false) { 104 bool unicode = false) {
105 v8::HandleScope scope(CcTest::isolate()); 105 v8::HandleScope scope(CcTest::isolate());
106 Zone zone; 106 Zone zone;
107 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); 107 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input));
108 RegExpCompileData result; 108 RegExpCompileData result;
109 JSRegExp::Flags flags = JSRegExp::kNone; 109 CHECK(v8::internal::RegExpParser::ParseRegExp(
110 if (unicode) flags |= JSRegExp::kUnicode; 110 CcTest::i_isolate(), &zone, &reader, false, unicode, &result));
111 CHECK(v8::internal::RegExpParser::ParseRegExp(CcTest::i_isolate(), &zone,
112 &reader, flags, &result));
113 CHECK(result.tree != NULL); 111 CHECK(result.tree != NULL);
114 CHECK(result.error.is_null()); 112 CHECK(result.error.is_null());
115 std::ostringstream os; 113 std::ostringstream os;
116 result.tree->Print(os, &zone); 114 result.tree->Print(os, &zone);
117 if (strcmp(expected, os.str().c_str()) != 0) { 115 if (strcmp(expected, os.str().c_str()) != 0) {
118 printf("%s | %s\n", expected, os.str().c_str()); 116 printf("%s | %s\n", expected, os.str().c_str());
119 } 117 }
120 CHECK_EQ(0, strcmp(expected, os.str().c_str())); 118 CHECK_EQ(0, strcmp(expected, os.str().c_str()));
121 } 119 }
122 120
123 121
124 static bool CheckSimple(const char* input) { 122 static bool CheckSimple(const char* input) {
125 v8::HandleScope scope(CcTest::isolate()); 123 v8::HandleScope scope(CcTest::isolate());
126 Zone zone; 124 Zone zone;
127 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); 125 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input));
128 RegExpCompileData result; 126 RegExpCompileData result;
129 CHECK(v8::internal::RegExpParser::ParseRegExp( 127 CHECK(v8::internal::RegExpParser::ParseRegExp(
130 CcTest::i_isolate(), &zone, &reader, JSRegExp::kNone, &result)); 128 CcTest::i_isolate(), &zone, &reader, false, false, &result));
131 CHECK(result.tree != NULL); 129 CHECK(result.tree != NULL);
132 CHECK(result.error.is_null()); 130 CHECK(result.error.is_null());
133 return result.simple; 131 return result.simple;
134 } 132 }
135 133
136 struct MinMaxPair { 134 struct MinMaxPair {
137 int min_match; 135 int min_match;
138 int max_match; 136 int max_match;
139 }; 137 };
140 138
141 139
142 static MinMaxPair CheckMinMaxMatch(const char* input) { 140 static MinMaxPair CheckMinMaxMatch(const char* input) {
143 v8::HandleScope scope(CcTest::isolate()); 141 v8::HandleScope scope(CcTest::isolate());
144 Zone zone; 142 Zone zone;
145 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); 143 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input));
146 RegExpCompileData result; 144 RegExpCompileData result;
147 CHECK(v8::internal::RegExpParser::ParseRegExp( 145 CHECK(v8::internal::RegExpParser::ParseRegExp(
148 CcTest::i_isolate(), &zone, &reader, JSRegExp::kNone, &result)); 146 CcTest::i_isolate(), &zone, &reader, false, false, &result));
149 CHECK(result.tree != NULL); 147 CHECK(result.tree != NULL);
150 CHECK(result.error.is_null()); 148 CHECK(result.error.is_null());
151 int min_match = result.tree->min_match(); 149 int min_match = result.tree->min_match();
152 int max_match = result.tree->max_match(); 150 int max_match = result.tree->max_match();
153 MinMaxPair pair = { min_match, max_match }; 151 MinMaxPair pair = { min_match, max_match };
154 return pair; 152 return pair;
155 } 153 }
156 154
157 155
158 #define CHECK_PARSE_ERROR(input) CHECK(!CheckParse(input)) 156 #define CHECK_PARSE_ERROR(input) CHECK(!CheckParse(input))
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 CheckParseEq("foo(?!bar)baz", "(: 'foo' (-> - 'bar') 'baz')"); 199 CheckParseEq("foo(?!bar)baz", "(: 'foo' (-> - 'bar') 'baz')");
202 if (lookbehind) { 200 if (lookbehind) {
203 CheckParseEq("foo(?<=bar)baz", "(: 'foo' (<- + 'bar') 'baz')"); 201 CheckParseEq("foo(?<=bar)baz", "(: 'foo' (<- + 'bar') 'baz')");
204 CheckParseEq("foo(?<!bar)baz", "(: 'foo' (<- - 'bar') 'baz')"); 202 CheckParseEq("foo(?<!bar)baz", "(: 'foo' (<- - 'bar') 'baz')");
205 } else { 203 } else {
206 CHECK_PARSE_ERROR("foo(?<=bar)baz"); 204 CHECK_PARSE_ERROR("foo(?<=bar)baz");
207 CHECK_PARSE_ERROR("foo(?<!bar)baz"); 205 CHECK_PARSE_ERROR("foo(?<!bar)baz");
208 } 206 }
209 CheckParseEq("()", "(^ %)"); 207 CheckParseEq("()", "(^ %)");
210 CheckParseEq("(?=)", "(-> + %)"); 208 CheckParseEq("(?=)", "(-> + %)");
211 CheckParseEq("[]", "^[\\x00-\\u{10ffff}]"); // Doesn't compile on windows 209 CheckParseEq("[]", "^[\\x00-\\uffff]"); // Doesn't compile on windows
212 CheckParseEq("[^]", "[\\x00-\\u{10ffff}]"); // \uffff isn't in codepage 1252 210 CheckParseEq("[^]", "[\\x00-\\uffff]"); // \uffff isn't in codepage 1252
213 CheckParseEq("[x]", "[x]"); 211 CheckParseEq("[x]", "[x]");
214 CheckParseEq("[xyz]", "[x y z]"); 212 CheckParseEq("[xyz]", "[x y z]");
215 CheckParseEq("[a-zA-Z0-9]", "[a-z A-Z 0-9]"); 213 CheckParseEq("[a-zA-Z0-9]", "[a-z A-Z 0-9]");
216 CheckParseEq("[-123]", "[- 1 2 3]"); 214 CheckParseEq("[-123]", "[- 1 2 3]");
217 CheckParseEq("[^123]", "^[1 2 3]"); 215 CheckParseEq("[^123]", "^[1 2 3]");
218 CheckParseEq("]", "']'"); 216 CheckParseEq("]", "']'");
219 CheckParseEq("}", "'}'"); 217 CheckParseEq("}", "'}'");
220 CheckParseEq("[a-b-c]", "[a-b - c]"); 218 CheckParseEq("[a-b-c]", "[a-b - c]");
221 CheckParseEq("[\\d]", "[0-9]"); 219 CheckParseEq("[\\d]", "[0-9]");
222 CheckParseEq("[x\\dz]", "[x 0-9 z]"); 220 CheckParseEq("[x\\dz]", "[x 0-9 z]");
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 309
312 // Unicode regexps 310 // Unicode regexps
313 CheckParseEq("\\u{12345}", "'\\ud808\\udf45'", true); 311 CheckParseEq("\\u{12345}", "'\\ud808\\udf45'", true);
314 CheckParseEq("\\u{12345}\\u{23456}", "(! '\\ud808\\udf45' '\\ud84d\\udc56')", 312 CheckParseEq("\\u{12345}\\u{23456}", "(! '\\ud808\\udf45' '\\ud84d\\udc56')",
315 true); 313 true);
316 CheckParseEq("\\u{12345}|\\u{23456}", "(| '\\ud808\\udf45' '\\ud84d\\udc56')", 314 CheckParseEq("\\u{12345}|\\u{23456}", "(| '\\ud808\\udf45' '\\ud84d\\udc56')",
317 true); 315 true);
318 CheckParseEq("\\u{12345}{3}", "(# 3 3 g '\\ud808\\udf45')", true); 316 CheckParseEq("\\u{12345}{3}", "(# 3 3 g '\\ud808\\udf45')", true);
319 CheckParseEq("\\u{12345}*", "(# 0 - g '\\ud808\\udf45')", true); 317 CheckParseEq("\\u{12345}*", "(# 0 - g '\\ud808\\udf45')", true);
320 318
321 CheckParseEq("\\ud808\\udf45*", "(# 0 - g '\\ud808\\udf45')", true);
322 CheckParseEq("[\\ud808\\udf45-\\ud809\\udccc]", "[\\u{012345}-\\u{0124cc}]",
323 true);
324
325 CHECK_SIMPLE("", false); 319 CHECK_SIMPLE("", false);
326 CHECK_SIMPLE("a", true); 320 CHECK_SIMPLE("a", true);
327 CHECK_SIMPLE("a|b", false); 321 CHECK_SIMPLE("a|b", false);
328 CHECK_SIMPLE("a\\n", false); 322 CHECK_SIMPLE("a\\n", false);
329 CHECK_SIMPLE("^a", false); 323 CHECK_SIMPLE("^a", false);
330 CHECK_SIMPLE("a$", false); 324 CHECK_SIMPLE("a$", false);
331 CHECK_SIMPLE("a\\b!", false); 325 CHECK_SIMPLE("a\\b!", false);
332 CHECK_SIMPLE("a\\Bb", false); 326 CHECK_SIMPLE("a\\Bb", false);
333 CHECK_SIMPLE("a*", false); 327 CHECK_SIMPLE("a*", false);
334 CHECK_SIMPLE("a*?", false); 328 CHECK_SIMPLE("a*?", false);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 CheckParseEq("a|", "(| 'a' %)"); 447 CheckParseEq("a|", "(| 'a' %)");
454 } 448 }
455 449
456 static void ExpectError(const char* input, 450 static void ExpectError(const char* input,
457 const char* expected) { 451 const char* expected) {
458 v8::HandleScope scope(CcTest::isolate()); 452 v8::HandleScope scope(CcTest::isolate());
459 Zone zone; 453 Zone zone;
460 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); 454 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input));
461 RegExpCompileData result; 455 RegExpCompileData result;
462 CHECK(!v8::internal::RegExpParser::ParseRegExp( 456 CHECK(!v8::internal::RegExpParser::ParseRegExp(
463 CcTest::i_isolate(), &zone, &reader, JSRegExp::kNone, &result)); 457 CcTest::i_isolate(), &zone, &reader, false, false, &result));
464 CHECK(result.tree == NULL); 458 CHECK(result.tree == NULL);
465 CHECK(!result.error.is_null()); 459 CHECK(!result.error.is_null());
466 v8::base::SmartArrayPointer<char> str = result.error->ToCString(ALLOW_NULLS); 460 v8::base::SmartArrayPointer<char> str = result.error->ToCString(ALLOW_NULLS);
467 CHECK_EQ(0, strcmp(expected, str.get())); 461 CHECK_EQ(0, strcmp(expected, str.get()));
468 } 462 }
469 463
470 464
471 TEST(Errors) { 465 TEST(Errors) {
472 const char* kEndBackslash = "\\ at end of pattern"; 466 const char* kEndBackslash = "\\ at end of pattern";
473 ExpectError("\\", kEndBackslash); 467 ExpectError("\\", kEndBackslash);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 static bool NotWord(uc16 c) { 516 static bool NotWord(uc16 c) {
523 return !IsRegExpWord(c); 517 return !IsRegExpWord(c);
524 } 518 }
525 519
526 520
527 static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) { 521 static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) {
528 Zone zone; 522 Zone zone;
529 ZoneList<CharacterRange>* ranges = 523 ZoneList<CharacterRange>* ranges =
530 new(&zone) ZoneList<CharacterRange>(2, &zone); 524 new(&zone) ZoneList<CharacterRange>(2, &zone);
531 CharacterRange::AddClassEscape(c, ranges, &zone); 525 CharacterRange::AddClassEscape(c, ranges, &zone);
532 for (uc32 i = 0; i < (1 << 16); i++) { 526 for (unsigned i = 0; i < (1 << 16); i++) {
533 bool in_class = false; 527 bool in_class = false;
534 for (int j = 0; !in_class && j < ranges->length(); j++) { 528 for (int j = 0; !in_class && j < ranges->length(); j++) {
535 CharacterRange& range = ranges->at(j); 529 CharacterRange& range = ranges->at(j);
536 in_class = (range.from() <= i && i <= range.to()); 530 in_class = (range.from() <= i && i <= range.to());
537 } 531 }
538 CHECK_EQ(pred(i), in_class); 532 CHECK_EQ(pred(i), in_class);
539 } 533 }
540 } 534 }
541 535
542 536
543 TEST(CharacterClassEscapes) { 537 TEST(CharacterClassEscapes) {
544 TestCharacterClassEscapes('.', IsRegExpNewline); 538 TestCharacterClassEscapes('.', IsRegExpNewline);
545 TestCharacterClassEscapes('d', IsDigit); 539 TestCharacterClassEscapes('d', IsDigit);
546 TestCharacterClassEscapes('D', NotDigit); 540 TestCharacterClassEscapes('D', NotDigit);
547 TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator); 541 TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator);
548 TestCharacterClassEscapes('S', NotWhiteSpaceNorLineTermiantor); 542 TestCharacterClassEscapes('S', NotWhiteSpaceNorLineTermiantor);
549 TestCharacterClassEscapes('w', IsRegExpWord); 543 TestCharacterClassEscapes('w', IsRegExpWord);
550 TestCharacterClassEscapes('W', NotWord); 544 TestCharacterClassEscapes('W', NotWord);
551 } 545 }
552 546
553 547
554 static RegExpNode* Compile(const char* input, bool multiline, bool unicode, 548 static RegExpNode* Compile(const char* input, bool multiline, bool unicode,
555 bool is_one_byte, Zone* zone) { 549 bool is_one_byte, Zone* zone) {
556 Isolate* isolate = CcTest::i_isolate(); 550 Isolate* isolate = CcTest::i_isolate();
557 FlatStringReader reader(isolate, CStrVector(input)); 551 FlatStringReader reader(isolate, CStrVector(input));
558 RegExpCompileData compile_data; 552 RegExpCompileData compile_data;
559 JSRegExp::Flags flags = JSRegExp::kNone;
560 if (multiline) flags = JSRegExp::kMultiline;
561 if (unicode) flags = JSRegExp::kUnicode;
562 if (!v8::internal::RegExpParser::ParseRegExp(CcTest::i_isolate(), zone, 553 if (!v8::internal::RegExpParser::ParseRegExp(CcTest::i_isolate(), zone,
563 &reader, flags, &compile_data)) 554 &reader, multiline, unicode,
555 &compile_data))
564 return NULL; 556 return NULL;
565 Handle<String> pattern = isolate->factory() 557 Handle<String> pattern = isolate->factory()
566 ->NewStringFromUtf8(CStrVector(input)) 558 ->NewStringFromUtf8(CStrVector(input))
567 .ToHandleChecked(); 559 .ToHandleChecked();
568 Handle<String> sample_subject = 560 Handle<String> sample_subject =
569 isolate->factory()->NewStringFromUtf8(CStrVector("")).ToHandleChecked(); 561 isolate->factory()->NewStringFromUtf8(CStrVector("")).ToHandleChecked();
570 RegExpEngine::Compile(isolate, zone, &compile_data, flags, pattern, 562 RegExpEngine::Compile(isolate, zone, &compile_data, false, false, multiline,
571 sample_subject, is_one_byte); 563 false, pattern, sample_subject, is_one_byte);
572 return compile_data.node; 564 return compile_data.node;
573 } 565 }
574 566
575 567
576 static void Execute(const char* input, bool multiline, bool unicode, 568 static void Execute(const char* input, bool multiline, bool unicode,
577 bool is_one_byte, bool dot_output = false) { 569 bool is_one_byte, bool dot_output = false) {
578 v8::HandleScope scope(CcTest::isolate()); 570 v8::HandleScope scope(CcTest::isolate());
579 Zone zone; 571 Zone zone;
580 RegExpNode* node = Compile(input, multiline, unicode, is_one_byte, &zone); 572 RegExpNode* node = Compile(input, multiline, unicode, is_one_byte, &zone);
581 USE(node); 573 USE(node);
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 TestSimpleRangeCaseIndependence(isolate, CharacterRange('A' - 1, 'Z' + 1), 1662 TestSimpleRangeCaseIndependence(isolate, CharacterRange('A' - 1, 'Z' + 1),
1671 CharacterRange('a', 'z')); 1663 CharacterRange('a', 'z'));
1672 // Here we need to add [l-z] to complete the case independence of 1664 // Here we need to add [l-z] to complete the case independence of
1673 // [A-Za-z] but we expect [a-z] to be added since we always add a 1665 // [A-Za-z] but we expect [a-z] to be added since we always add a
1674 // whole block at a time. 1666 // whole block at a time.
1675 TestSimpleRangeCaseIndependence(isolate, CharacterRange('A', 'k'), 1667 TestSimpleRangeCaseIndependence(isolate, CharacterRange('A', 'k'),
1676 CharacterRange('a', 'z')); 1668 CharacterRange('a', 'z'));
1677 } 1669 }
1678 1670
1679 1671
1680 static bool InClass(uc32 c, ZoneList<CharacterRange>* ranges) { 1672 static bool InClass(uc16 c, ZoneList<CharacterRange>* ranges) {
1681 if (ranges == NULL) 1673 if (ranges == NULL)
1682 return false; 1674 return false;
1683 for (int i = 0; i < ranges->length(); i++) { 1675 for (int i = 0; i < ranges->length(); i++) {
1684 CharacterRange range = ranges->at(i); 1676 CharacterRange range = ranges->at(i);
1685 if (range.from() <= c && c <= range.to()) 1677 if (range.from() <= c && c <= range.to())
1686 return true; 1678 return true;
1687 } 1679 }
1688 return false; 1680 return false;
1689 } 1681 }
1690 1682
1691 1683
1692 TEST(UnicodeRangeSplitter) { 1684 TEST(CharClassDifference) {
1693 Zone zone; 1685 Zone zone;
1694 ZoneList<CharacterRange>* base = 1686 ZoneList<CharacterRange>* base =
1695 new(&zone) ZoneList<CharacterRange>(1, &zone); 1687 new(&zone) ZoneList<CharacterRange>(1, &zone);
1696 base->Add(CharacterRange::Everything(), &zone); 1688 base->Add(CharacterRange::Everything(), &zone);
1697 UnicodeRangeSplitter splitter(&zone, base); 1689 Vector<const int> overlay = CharacterRange::GetWordBounds();
1698 // BMP 1690 ZoneList<CharacterRange>* included = NULL;
1699 for (uc32 c = 0; c < 0xd800; c++) { 1691 ZoneList<CharacterRange>* excluded = NULL;
1700 CHECK(InClass(c, splitter.bmp())); 1692 CharacterRange::Split(base, overlay, &included, &excluded, &zone);
1701 CHECK(!InClass(c, splitter.lead_surrogates())); 1693 for (int i = 0; i < (1 << 16); i++) {
1702 CHECK(!InClass(c, splitter.trail_surrogates())); 1694 bool in_base = InClass(i, base);
1703 CHECK(!InClass(c, splitter.non_bmp())); 1695 if (in_base) {
1704 } 1696 bool in_overlay = false;
1705 // Lead surrogates 1697 for (int j = 0; !in_overlay && j < overlay.length(); j += 2) {
1706 for (uc32 c = 0xd800; c < 0xdbff; c++) { 1698 if (overlay[j] <= i && i < overlay[j+1])
1707 CHECK(!InClass(c, splitter.bmp())); 1699 in_overlay = true;
1708 CHECK(InClass(c, splitter.lead_surrogates())); 1700 }
1709 CHECK(!InClass(c, splitter.trail_surrogates())); 1701 CHECK_EQ(in_overlay, InClass(i, included));
1710 CHECK(!InClass(c, splitter.non_bmp())); 1702 CHECK_EQ(!in_overlay, InClass(i, excluded));
1711 } 1703 } else {
1712 // Trail surrogates 1704 CHECK(!InClass(i, included));
1713 for (uc32 c = 0xdc00; c < 0xdfff; c++) { 1705 CHECK(!InClass(i, excluded));
1714 CHECK(!InClass(c, splitter.bmp())); 1706 }
1715 CHECK(!InClass(c, splitter.lead_surrogates()));
1716 CHECK(InClass(c, splitter.trail_surrogates()));
1717 CHECK(!InClass(c, splitter.non_bmp()));
1718 }
1719 // BMP
1720 for (uc32 c = 0xe000; c < 0xffff; c++) {
1721 CHECK(InClass(c, splitter.bmp()));
1722 CHECK(!InClass(c, splitter.lead_surrogates()));
1723 CHECK(!InClass(c, splitter.trail_surrogates()));
1724 CHECK(!InClass(c, splitter.non_bmp()));
1725 }
1726 // Non-BMP
1727 for (uc32 c = 0x10000; c < 0x10ffff; c++) {
1728 CHECK(!InClass(c, splitter.bmp()));
1729 CHECK(!InClass(c, splitter.lead_surrogates()));
1730 CHECK(!InClass(c, splitter.trail_surrogates()));
1731 CHECK(InClass(c, splitter.non_bmp()));
1732 } 1707 }
1733 } 1708 }
1734 1709
1735 1710
1736 TEST(CanonicalizeCharacterSets) { 1711 TEST(CanonicalizeCharacterSets) {
1737 Zone zone; 1712 Zone zone;
1738 ZoneList<CharacterRange>* list = 1713 ZoneList<CharacterRange>* list =
1739 new(&zone) ZoneList<CharacterRange>(4, &zone); 1714 new(&zone) ZoneList<CharacterRange>(4, &zone);
1740 CharacterSet set(list); 1715 CharacterSet set(list);
1741 1716
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1956 // .toString() throws on non-RegExps that aren't RegExp.prototype 1931 // .toString() throws on non-RegExps that aren't RegExp.prototype
1957 v8::Local<v8::Value> resultToStringError = CompileRun( 1932 v8::Local<v8::Value> resultToStringError = CompileRun(
1958 "var exception;" 1933 "var exception;"
1959 "try { RegExp.prototype.toString.call(null) }" 1934 "try { RegExp.prototype.toString.call(null) }"
1960 "catch (e) { exception = e; }" 1935 "catch (e) { exception = e; }"
1961 "exception"); 1936 "exception");
1962 CHECK_EQ(1, use_counts[v8::Isolate::kRegExpPrototypeStickyGetter]); 1937 CHECK_EQ(1, use_counts[v8::Isolate::kRegExpPrototypeStickyGetter]);
1963 CHECK_EQ(1, use_counts[v8::Isolate::kRegExpPrototypeToString]); 1938 CHECK_EQ(1, use_counts[v8::Isolate::kRegExpPrototypeToString]);
1964 CHECK(resultToStringError->IsObject()); 1939 CHECK(resultToStringError->IsObject());
1965 } 1940 }
OLDNEW
« no previous file with comments | « src/regexp/regexp-parser.cc ('k') | test/mjsunit/harmony/unicode-character-ranges.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698