| OLD | NEW |
| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 #include "test/cctest/cctest.h" | 82 #include "test/cctest/cctest.h" |
| 83 | 83 |
| 84 using namespace v8::internal; | 84 using namespace v8::internal; |
| 85 | 85 |
| 86 | 86 |
| 87 static bool CheckParse(const char* input) { | 87 static bool CheckParse(const char* input) { |
| 88 v8::HandleScope scope(CcTest::isolate()); | 88 v8::HandleScope scope(CcTest::isolate()); |
| 89 Zone zone(CcTest::i_isolate()); | 89 Zone zone(CcTest::i_isolate()); |
| 90 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); | 90 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); |
| 91 RegExpCompileData result; | 91 RegExpCompileData result; |
| 92 return v8::internal::RegExpParser::ParseRegExp( | 92 return v8::internal::RegExpParser::ParseRegExp(&reader, false, false, &result, |
| 93 &reader, false, &result, &zone); | 93 &zone); |
| 94 } | 94 } |
| 95 | 95 |
| 96 | 96 |
| 97 static void CheckParseEq(const char* input, const char* expected) { | 97 static void CheckParseEq(const char* input, const char* expected) { |
| 98 v8::HandleScope scope(CcTest::isolate()); | 98 v8::HandleScope scope(CcTest::isolate()); |
| 99 Zone zone(CcTest::i_isolate()); | 99 Zone zone(CcTest::i_isolate()); |
| 100 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); | 100 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); |
| 101 RegExpCompileData result; | 101 RegExpCompileData result; |
| 102 CHECK(v8::internal::RegExpParser::ParseRegExp( | 102 CHECK(v8::internal::RegExpParser::ParseRegExp(&reader, false, false, &result, |
| 103 &reader, false, &result, &zone)); | 103 &zone)); |
| 104 CHECK(result.tree != NULL); | 104 CHECK(result.tree != NULL); |
| 105 CHECK(result.error.is_null()); | 105 CHECK(result.error.is_null()); |
| 106 std::ostringstream os; | 106 std::ostringstream os; |
| 107 result.tree->Print(os, &zone); | 107 result.tree->Print(os, &zone); |
| 108 CHECK_EQ(expected, os.str().c_str()); | 108 CHECK_EQ(expected, os.str().c_str()); |
| 109 } | 109 } |
| 110 | 110 |
| 111 | 111 |
| 112 static bool CheckSimple(const char* input) { | 112 static bool CheckSimple(const char* input) { |
| 113 v8::HandleScope scope(CcTest::isolate()); | 113 v8::HandleScope scope(CcTest::isolate()); |
| 114 Zone zone(CcTest::i_isolate()); | 114 Zone zone(CcTest::i_isolate()); |
| 115 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); | 115 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); |
| 116 RegExpCompileData result; | 116 RegExpCompileData result; |
| 117 CHECK(v8::internal::RegExpParser::ParseRegExp( | 117 CHECK(v8::internal::RegExpParser::ParseRegExp(&reader, false, false, &result, |
| 118 &reader, false, &result, &zone)); | 118 &zone)); |
| 119 CHECK(result.tree != NULL); | 119 CHECK(result.tree != NULL); |
| 120 CHECK(result.error.is_null()); | 120 CHECK(result.error.is_null()); |
| 121 return result.simple; | 121 return result.simple; |
| 122 } | 122 } |
| 123 | 123 |
| 124 struct MinMaxPair { | 124 struct MinMaxPair { |
| 125 int min_match; | 125 int min_match; |
| 126 int max_match; | 126 int max_match; |
| 127 }; | 127 }; |
| 128 | 128 |
| 129 | 129 |
| 130 static MinMaxPair CheckMinMaxMatch(const char* input) { | 130 static MinMaxPair CheckMinMaxMatch(const char* input) { |
| 131 v8::HandleScope scope(CcTest::isolate()); | 131 v8::HandleScope scope(CcTest::isolate()); |
| 132 Zone zone(CcTest::i_isolate()); | 132 Zone zone(CcTest::i_isolate()); |
| 133 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); | 133 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); |
| 134 RegExpCompileData result; | 134 RegExpCompileData result; |
| 135 CHECK(v8::internal::RegExpParser::ParseRegExp( | 135 CHECK(v8::internal::RegExpParser::ParseRegExp(&reader, false, false, &result, |
| 136 &reader, false, &result, &zone)); | 136 &zone)); |
| 137 CHECK(result.tree != NULL); | 137 CHECK(result.tree != NULL); |
| 138 CHECK(result.error.is_null()); | 138 CHECK(result.error.is_null()); |
| 139 int min_match = result.tree->min_match(); | 139 int min_match = result.tree->min_match(); |
| 140 int max_match = result.tree->max_match(); | 140 int max_match = result.tree->max_match(); |
| 141 MinMaxPair pair = { min_match, max_match }; | 141 MinMaxPair pair = { min_match, max_match }; |
| 142 return pair; | 142 return pair; |
| 143 } | 143 } |
| 144 | 144 |
| 145 | 145 |
| 146 #define CHECK_PARSE_ERROR(input) CHECK(!CheckParse(input)) | 146 #define CHECK_PARSE_ERROR(input) CHECK(!CheckParse(input)) |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 CheckParseEq("{", "'{'"); | 398 CheckParseEq("{", "'{'"); |
| 399 CheckParseEq("a|", "(| 'a' %)"); | 399 CheckParseEq("a|", "(| 'a' %)"); |
| 400 } | 400 } |
| 401 | 401 |
| 402 static void ExpectError(const char* input, | 402 static void ExpectError(const char* input, |
| 403 const char* expected) { | 403 const char* expected) { |
| 404 v8::HandleScope scope(CcTest::isolate()); | 404 v8::HandleScope scope(CcTest::isolate()); |
| 405 Zone zone(CcTest::i_isolate()); | 405 Zone zone(CcTest::i_isolate()); |
| 406 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); | 406 FlatStringReader reader(CcTest::i_isolate(), CStrVector(input)); |
| 407 RegExpCompileData result; | 407 RegExpCompileData result; |
| 408 CHECK(!v8::internal::RegExpParser::ParseRegExp( | 408 CHECK(!v8::internal::RegExpParser::ParseRegExp(&reader, false, false, &result, |
| 409 &reader, false, &result, &zone)); | 409 &zone)); |
| 410 CHECK(result.tree == NULL); | 410 CHECK(result.tree == NULL); |
| 411 CHECK(!result.error.is_null()); | 411 CHECK(!result.error.is_null()); |
| 412 SmartArrayPointer<char> str = result.error->ToCString(ALLOW_NULLS); | 412 SmartArrayPointer<char> str = result.error->ToCString(ALLOW_NULLS); |
| 413 CHECK_EQ(expected, str.get()); | 413 CHECK_EQ(expected, str.get()); |
| 414 } | 414 } |
| 415 | 415 |
| 416 | 416 |
| 417 TEST(Errors) { | 417 TEST(Errors) { |
| 418 const char* kEndBackslash = "\\ at end of pattern"; | 418 const char* kEndBackslash = "\\ at end of pattern"; |
| 419 ExpectError("\\", kEndBackslash); | 419 ExpectError("\\", kEndBackslash); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 TestCharacterClassEscapes('.', IsRegExpNewline); | 490 TestCharacterClassEscapes('.', IsRegExpNewline); |
| 491 TestCharacterClassEscapes('d', IsDigit); | 491 TestCharacterClassEscapes('d', IsDigit); |
| 492 TestCharacterClassEscapes('D', NotDigit); | 492 TestCharacterClassEscapes('D', NotDigit); |
| 493 TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator); | 493 TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator); |
| 494 TestCharacterClassEscapes('S', NotWhiteSpaceNorLineTermiantor); | 494 TestCharacterClassEscapes('S', NotWhiteSpaceNorLineTermiantor); |
| 495 TestCharacterClassEscapes('w', IsRegExpWord); | 495 TestCharacterClassEscapes('w', IsRegExpWord); |
| 496 TestCharacterClassEscapes('W', NotWord); | 496 TestCharacterClassEscapes('W', NotWord); |
| 497 } | 497 } |
| 498 | 498 |
| 499 | 499 |
| 500 static RegExpNode* Compile(const char* input, bool multiline, bool is_one_byte, | 500 static RegExpNode* Compile(const char* input, bool multiline, bool unicode, |
| 501 Zone* zone) { | 501 bool is_one_byte, Zone* zone) { |
| 502 Isolate* isolate = CcTest::i_isolate(); | 502 Isolate* isolate = CcTest::i_isolate(); |
| 503 FlatStringReader reader(isolate, CStrVector(input)); | 503 FlatStringReader reader(isolate, CStrVector(input)); |
| 504 RegExpCompileData compile_data; | 504 RegExpCompileData compile_data; |
| 505 if (!v8::internal::RegExpParser::ParseRegExp(&reader, multiline, | 505 if (!v8::internal::RegExpParser::ParseRegExp(&reader, multiline, unicode, |
| 506 &compile_data, zone)) | 506 &compile_data, zone)) |
| 507 return NULL; | 507 return NULL; |
| 508 Handle<String> pattern = isolate->factory()-> | 508 Handle<String> pattern = isolate->factory() |
| 509 NewStringFromUtf8(CStrVector(input)).ToHandleChecked(); | 509 ->NewStringFromUtf8(CStrVector(input)) |
| 510 .ToHandleChecked(); |
| 510 Handle<String> sample_subject = | 511 Handle<String> sample_subject = |
| 511 isolate->factory()->NewStringFromUtf8(CStrVector("")).ToHandleChecked(); | 512 isolate->factory()->NewStringFromUtf8(CStrVector("")).ToHandleChecked(); |
| 512 RegExpEngine::Compile(&compile_data, false, false, multiline, false, pattern, | 513 RegExpEngine::Compile(&compile_data, false, false, multiline, false, pattern, |
| 513 sample_subject, is_one_byte, zone); | 514 sample_subject, is_one_byte, zone); |
| 514 return compile_data.node; | 515 return compile_data.node; |
| 515 } | 516 } |
| 516 | 517 |
| 517 | 518 |
| 518 static void Execute(const char* input, bool multiline, bool is_one_byte, | 519 static void Execute(const char* input, bool multiline, bool unicode, |
| 519 bool dot_output = false) { | 520 bool is_one_byte, bool dot_output = false) { |
| 520 v8::HandleScope scope(CcTest::isolate()); | 521 v8::HandleScope scope(CcTest::isolate()); |
| 521 Zone zone(CcTest::i_isolate()); | 522 Zone zone(CcTest::i_isolate()); |
| 522 RegExpNode* node = Compile(input, multiline, is_one_byte, &zone); | 523 RegExpNode* node = Compile(input, multiline, unicode, is_one_byte, &zone); |
| 523 USE(node); | 524 USE(node); |
| 524 #ifdef DEBUG | 525 #ifdef DEBUG |
| 525 if (dot_output) { | 526 if (dot_output) { |
| 526 RegExpEngine::DotPrint(input, node, false); | 527 RegExpEngine::DotPrint(input, node, false); |
| 527 } | 528 } |
| 528 #endif // DEBUG | 529 #endif // DEBUG |
| 529 } | 530 } |
| 530 | 531 |
| 531 | 532 |
| 532 class TestConfig { | 533 class TestConfig { |
| (...skipping 1253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1786 | 1787 |
| 1787 ZoneList<CharacterRange> first_only(4, &zone); | 1788 ZoneList<CharacterRange> first_only(4, &zone); |
| 1788 ZoneList<CharacterRange> second_only(4, &zone); | 1789 ZoneList<CharacterRange> second_only(4, &zone); |
| 1789 ZoneList<CharacterRange> both(4, &zone); | 1790 ZoneList<CharacterRange> both(4, &zone); |
| 1790 } | 1791 } |
| 1791 | 1792 |
| 1792 | 1793 |
| 1793 TEST(Graph) { | 1794 TEST(Graph) { |
| 1794 Execute("\\b\\w+\\b", false, true, true); | 1795 Execute("\\b\\w+\\b", false, true, true); |
| 1795 } | 1796 } |
| OLD | NEW |