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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 | 81 |
82 static SmartArrayPointer<const char> Parse(const char* input) { | 82 static SmartArrayPointer<const char> Parse(const char* input) { |
83 V8::Initialize(NULL); | 83 V8::Initialize(NULL); |
84 v8::HandleScope scope; | 84 v8::HandleScope scope; |
85 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 85 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
86 FlatStringReader reader(Isolate::Current(), CStrVector(input)); | 86 FlatStringReader reader(Isolate::Current(), CStrVector(input)); |
87 RegExpCompileData result; | 87 RegExpCompileData result; |
88 CHECK(v8::internal::RegExpParser::ParseRegExp(&reader, false, &result)); | 88 CHECK(v8::internal::RegExpParser::ParseRegExp(&reader, false, &result)); |
89 CHECK(result.tree != NULL); | 89 CHECK(result.tree != NULL); |
90 CHECK(result.error.is_null()); | 90 CHECK(result.error.is_null()); |
91 SmartArrayPointer<const char> output = result.tree->ToString(); | 91 SmartArrayPointer<const char> output = |
| 92 result.tree->ToString(Isolate::Current()->zone()); |
92 return output; | 93 return output; |
93 } | 94 } |
94 | 95 |
95 static bool CheckSimple(const char* input) { | 96 static bool CheckSimple(const char* input) { |
96 V8::Initialize(NULL); | 97 V8::Initialize(NULL); |
97 v8::HandleScope scope; | 98 v8::HandleScope scope; |
98 unibrow::Utf8InputBuffer<> buffer(input, StrLength(input)); | 99 unibrow::Utf8InputBuffer<> buffer(input, StrLength(input)); |
99 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 100 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
100 FlatStringReader reader(Isolate::Current(), CStrVector(input)); | 101 FlatStringReader reader(Isolate::Current(), CStrVector(input)); |
101 RegExpCompileData result; | 102 RegExpCompileData result; |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 } | 463 } |
463 | 464 |
464 | 465 |
465 static bool NotWord(uc16 c) { | 466 static bool NotWord(uc16 c) { |
466 return !IsRegExpWord(c); | 467 return !IsRegExpWord(c); |
467 } | 468 } |
468 | 469 |
469 | 470 |
470 static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) { | 471 static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) { |
471 ZoneScope scope(Isolate::Current(), DELETE_ON_EXIT); | 472 ZoneScope scope(Isolate::Current(), DELETE_ON_EXIT); |
472 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); | 473 Zone* zone = Isolate::Current()->zone(); |
473 CharacterRange::AddClassEscape(c, ranges); | 474 ZoneList<CharacterRange>* ranges = |
| 475 new(zone) ZoneList<CharacterRange>(2, zone); |
| 476 CharacterRange::AddClassEscape(c, ranges, zone); |
474 for (unsigned i = 0; i < (1 << 16); i++) { | 477 for (unsigned i = 0; i < (1 << 16); i++) { |
475 bool in_class = false; | 478 bool in_class = false; |
476 for (int j = 0; !in_class && j < ranges->length(); j++) { | 479 for (int j = 0; !in_class && j < ranges->length(); j++) { |
477 CharacterRange& range = ranges->at(j); | 480 CharacterRange& range = ranges->at(j); |
478 in_class = (range.from() <= i && i <= range.to()); | 481 in_class = (range.from() <= i && i <= range.to()); |
479 } | 482 } |
480 CHECK_EQ(pred(i), in_class); | 483 CHECK_EQ(pred(i), in_class); |
481 } | 484 } |
482 } | 485 } |
483 | 486 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 | 560 |
558 static unsigned PseudoRandom(int i, int j) { | 561 static unsigned PseudoRandom(int i, int j) { |
559 return ~(~((i * 781) ^ (j * 329))); | 562 return ~(~((i * 781) ^ (j * 329))); |
560 } | 563 } |
561 | 564 |
562 | 565 |
563 TEST(SplayTreeSimple) { | 566 TEST(SplayTreeSimple) { |
564 v8::internal::V8::Initialize(NULL); | 567 v8::internal::V8::Initialize(NULL); |
565 static const unsigned kLimit = 1000; | 568 static const unsigned kLimit = 1000; |
566 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 569 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
567 ZoneSplayTree<TestConfig> tree; | 570 ZoneSplayTree<TestConfig> tree(Isolate::Current()->zone()); |
568 bool seen[kLimit]; | 571 bool seen[kLimit]; |
569 for (unsigned i = 0; i < kLimit; i++) seen[i] = false; | 572 for (unsigned i = 0; i < kLimit; i++) seen[i] = false; |
570 #define CHECK_MAPS_EQUAL() do { \ | 573 #define CHECK_MAPS_EQUAL() do { \ |
571 for (unsigned k = 0; k < kLimit; k++) \ | 574 for (unsigned k = 0; k < kLimit; k++) \ |
572 CHECK_EQ(seen[k], tree.Find(k, &loc)); \ | 575 CHECK_EQ(seen[k], tree.Find(k, &loc)); \ |
573 } while (false) | 576 } while (false) |
574 for (int i = 0; i < 50; i++) { | 577 for (int i = 0; i < 50; i++) { |
575 for (int j = 0; j < 50; j++) { | 578 for (int j = 0; j < 50; j++) { |
576 unsigned next = PseudoRandom(i, j) % kLimit; | 579 unsigned next = PseudoRandom(i, j) % kLimit; |
577 if (seen[next]) { | 580 if (seen[next]) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 for (int j = 0; j < 2 * kRangeSize; j++) { | 628 for (int j = 0; j < 2 * kRangeSize; j++) { |
626 range[j] = PseudoRandom(i + 25, j + 87) % kLimit; | 629 range[j] = PseudoRandom(i + 25, j + 87) % kLimit; |
627 } | 630 } |
628 range.Sort(); | 631 range.Sort(); |
629 for (int j = 1; j < 2 * kRangeSize; j++) { | 632 for (int j = 1; j < 2 * kRangeSize; j++) { |
630 CHECK(range[j-1] <= range[j]); | 633 CHECK(range[j-1] <= range[j]); |
631 } | 634 } |
632 } | 635 } |
633 // Enter test data into dispatch table. | 636 // Enter test data into dispatch table. |
634 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 637 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
635 DispatchTable table; | 638 DispatchTable table(Isolate::Current()->zone()); |
636 for (int i = 0; i < kRangeCount; i++) { | 639 for (int i = 0; i < kRangeCount; i++) { |
637 uc16* range = ranges[i]; | 640 uc16* range = ranges[i]; |
638 for (int j = 0; j < 2 * kRangeSize; j += 2) | 641 for (int j = 0; j < 2 * kRangeSize; j += 2) |
639 table.AddRange(CharacterRange(range[j], range[j + 1]), i); | 642 table.AddRange(CharacterRange(range[j], range[j + 1]), i, |
| 643 Isolate::Current()->zone()); |
640 } | 644 } |
641 // Check that the table looks as we would expect | 645 // Check that the table looks as we would expect |
642 for (int p = 0; p < kLimit; p++) { | 646 for (int p = 0; p < kLimit; p++) { |
643 OutSet* outs = table.Get(p); | 647 OutSet* outs = table.Get(p); |
644 for (int j = 0; j < kRangeCount; j++) { | 648 for (int j = 0; j < kRangeCount; j++) { |
645 uc16* range = ranges[j]; | 649 uc16* range = ranges[j]; |
646 bool is_on = false; | 650 bool is_on = false; |
647 for (int k = 0; !is_on && (k < 2 * kRangeSize); k += 2) | 651 for (int k = 0; !is_on && (k < 2 * kRangeSize); k += 2) |
648 is_on = (range[k] <= p && p <= range[k + 1]); | 652 is_on = (range[k] <= p && p <= range[k + 1]); |
649 CHECK_EQ(is_on, outs->Get(j)); | 653 CHECK_EQ(is_on, outs->Get(j)); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 0, | 733 0, |
730 Isolate::Current()); | 734 Isolate::Current()); |
731 } | 735 } |
732 | 736 |
733 | 737 |
734 TEST(MacroAssemblerNativeSuccess) { | 738 TEST(MacroAssemblerNativeSuccess) { |
735 v8::V8::Initialize(); | 739 v8::V8::Initialize(); |
736 ContextInitializer initializer; | 740 ContextInitializer initializer; |
737 Factory* factory = Isolate::Current()->factory(); | 741 Factory* factory = Isolate::Current()->factory(); |
738 | 742 |
739 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 743 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, |
| 744 Isolate::Current()->zone()); |
740 | 745 |
741 m.Succeed(); | 746 m.Succeed(); |
742 | 747 |
743 Handle<String> source = factory->NewStringFromAscii(CStrVector("")); | 748 Handle<String> source = factory->NewStringFromAscii(CStrVector("")); |
744 Handle<Object> code_object = m.GetCode(source); | 749 Handle<Object> code_object = m.GetCode(source); |
745 Handle<Code> code = Handle<Code>::cast(code_object); | 750 Handle<Code> code = Handle<Code>::cast(code_object); |
746 | 751 |
747 int captures[4] = {42, 37, 87, 117}; | 752 int captures[4] = {42, 37, 87, 117}; |
748 Handle<String> input = factory->NewStringFromAscii(CStrVector("foofoo")); | 753 Handle<String> input = factory->NewStringFromAscii(CStrVector("foofoo")); |
749 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 754 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
(...skipping 14 matching lines...) Expand all Loading... |
764 CHECK_EQ(-1, captures[2]); | 769 CHECK_EQ(-1, captures[2]); |
765 CHECK_EQ(-1, captures[3]); | 770 CHECK_EQ(-1, captures[3]); |
766 } | 771 } |
767 | 772 |
768 | 773 |
769 TEST(MacroAssemblerNativeSimple) { | 774 TEST(MacroAssemblerNativeSimple) { |
770 v8::V8::Initialize(); | 775 v8::V8::Initialize(); |
771 ContextInitializer initializer; | 776 ContextInitializer initializer; |
772 Factory* factory = Isolate::Current()->factory(); | 777 Factory* factory = Isolate::Current()->factory(); |
773 | 778 |
774 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 779 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, |
| 780 Isolate::Current()->zone()); |
775 | 781 |
776 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 782 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
777 Vector<const uc16> foo(foo_chars, 3); | 783 Vector<const uc16> foo(foo_chars, 3); |
778 | 784 |
779 Label fail; | 785 Label fail; |
780 m.CheckCharacters(foo, 0, &fail, true); | 786 m.CheckCharacters(foo, 0, &fail, true); |
781 m.WriteCurrentPositionToRegister(0, 0); | 787 m.WriteCurrentPositionToRegister(0, 0); |
782 m.AdvanceCurrentPosition(3); | 788 m.AdvanceCurrentPosition(3); |
783 m.WriteCurrentPositionToRegister(1, 0); | 789 m.WriteCurrentPositionToRegister(1, 0); |
784 m.Succeed(); | 790 m.Succeed(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 | 827 |
822 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); | 828 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); |
823 } | 829 } |
824 | 830 |
825 | 831 |
826 TEST(MacroAssemblerNativeSimpleUC16) { | 832 TEST(MacroAssemblerNativeSimpleUC16) { |
827 v8::V8::Initialize(); | 833 v8::V8::Initialize(); |
828 ContextInitializer initializer; | 834 ContextInitializer initializer; |
829 Factory* factory = Isolate::Current()->factory(); | 835 Factory* factory = Isolate::Current()->factory(); |
830 | 836 |
831 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); | 837 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4, |
| 838 Isolate::Current()->zone()); |
832 | 839 |
833 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 840 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
834 Vector<const uc16> foo(foo_chars, 3); | 841 Vector<const uc16> foo(foo_chars, 3); |
835 | 842 |
836 Label fail; | 843 Label fail; |
837 m.CheckCharacters(foo, 0, &fail, true); | 844 m.CheckCharacters(foo, 0, &fail, true); |
838 m.WriteCurrentPositionToRegister(0, 0); | 845 m.WriteCurrentPositionToRegister(0, 0); |
839 m.AdvanceCurrentPosition(3); | 846 m.AdvanceCurrentPosition(3); |
840 m.WriteCurrentPositionToRegister(1, 0); | 847 m.WriteCurrentPositionToRegister(1, 0); |
841 m.Succeed(); | 848 m.Succeed(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 | 890 |
884 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); | 891 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); |
885 } | 892 } |
886 | 893 |
887 | 894 |
888 TEST(MacroAssemblerNativeBacktrack) { | 895 TEST(MacroAssemblerNativeBacktrack) { |
889 v8::V8::Initialize(); | 896 v8::V8::Initialize(); |
890 ContextInitializer initializer; | 897 ContextInitializer initializer; |
891 Factory* factory = Isolate::Current()->factory(); | 898 Factory* factory = Isolate::Current()->factory(); |
892 | 899 |
893 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); | 900 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0, |
| 901 Isolate::Current()->zone()); |
894 | 902 |
895 Label fail; | 903 Label fail; |
896 Label backtrack; | 904 Label backtrack; |
897 m.LoadCurrentCharacter(10, &fail); | 905 m.LoadCurrentCharacter(10, &fail); |
898 m.Succeed(); | 906 m.Succeed(); |
899 m.Bind(&fail); | 907 m.Bind(&fail); |
900 m.PushBacktrack(&backtrack); | 908 m.PushBacktrack(&backtrack); |
901 m.LoadCurrentCharacter(10, NULL); | 909 m.LoadCurrentCharacter(10, NULL); |
902 m.Succeed(); | 910 m.Succeed(); |
903 m.Bind(&backtrack); | 911 m.Bind(&backtrack); |
(...skipping 17 matching lines...) Expand all Loading... |
921 | 929 |
922 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); | 930 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); |
923 } | 931 } |
924 | 932 |
925 | 933 |
926 TEST(MacroAssemblerNativeBackReferenceASCII) { | 934 TEST(MacroAssemblerNativeBackReferenceASCII) { |
927 v8::V8::Initialize(); | 935 v8::V8::Initialize(); |
928 ContextInitializer initializer; | 936 ContextInitializer initializer; |
929 Factory* factory = Isolate::Current()->factory(); | 937 Factory* factory = Isolate::Current()->factory(); |
930 | 938 |
931 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 939 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, |
| 940 Isolate::Current()->zone()); |
932 | 941 |
933 m.WriteCurrentPositionToRegister(0, 0); | 942 m.WriteCurrentPositionToRegister(0, 0); |
934 m.AdvanceCurrentPosition(2); | 943 m.AdvanceCurrentPosition(2); |
935 m.WriteCurrentPositionToRegister(1, 0); | 944 m.WriteCurrentPositionToRegister(1, 0); |
936 Label nomatch; | 945 Label nomatch; |
937 m.CheckNotBackReference(0, &nomatch); | 946 m.CheckNotBackReference(0, &nomatch); |
938 m.Fail(); | 947 m.Fail(); |
939 m.Bind(&nomatch); | 948 m.Bind(&nomatch); |
940 m.AdvanceCurrentPosition(2); | 949 m.AdvanceCurrentPosition(2); |
941 Label missing_match; | 950 Label missing_match; |
(...skipping 26 matching lines...) Expand all Loading... |
968 CHECK_EQ(6, output[2]); | 977 CHECK_EQ(6, output[2]); |
969 CHECK_EQ(-1, output[3]); | 978 CHECK_EQ(-1, output[3]); |
970 } | 979 } |
971 | 980 |
972 | 981 |
973 TEST(MacroAssemblerNativeBackReferenceUC16) { | 982 TEST(MacroAssemblerNativeBackReferenceUC16) { |
974 v8::V8::Initialize(); | 983 v8::V8::Initialize(); |
975 ContextInitializer initializer; | 984 ContextInitializer initializer; |
976 Factory* factory = Isolate::Current()->factory(); | 985 Factory* factory = Isolate::Current()->factory(); |
977 | 986 |
978 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); | 987 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4, |
| 988 Isolate::Current()->zone()); |
979 | 989 |
980 m.WriteCurrentPositionToRegister(0, 0); | 990 m.WriteCurrentPositionToRegister(0, 0); |
981 m.AdvanceCurrentPosition(2); | 991 m.AdvanceCurrentPosition(2); |
982 m.WriteCurrentPositionToRegister(1, 0); | 992 m.WriteCurrentPositionToRegister(1, 0); |
983 Label nomatch; | 993 Label nomatch; |
984 m.CheckNotBackReference(0, &nomatch); | 994 m.CheckNotBackReference(0, &nomatch); |
985 m.Fail(); | 995 m.Fail(); |
986 m.Bind(&nomatch); | 996 m.Bind(&nomatch); |
987 m.AdvanceCurrentPosition(2); | 997 m.AdvanceCurrentPosition(2); |
988 Label missing_match; | 998 Label missing_match; |
(...skipping 29 matching lines...) Expand all Loading... |
1018 CHECK_EQ(-1, output[3]); | 1028 CHECK_EQ(-1, output[3]); |
1019 } | 1029 } |
1020 | 1030 |
1021 | 1031 |
1022 | 1032 |
1023 TEST(MacroAssemblernativeAtStart) { | 1033 TEST(MacroAssemblernativeAtStart) { |
1024 v8::V8::Initialize(); | 1034 v8::V8::Initialize(); |
1025 ContextInitializer initializer; | 1035 ContextInitializer initializer; |
1026 Factory* factory = Isolate::Current()->factory(); | 1036 Factory* factory = Isolate::Current()->factory(); |
1027 | 1037 |
1028 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); | 1038 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0, |
| 1039 Isolate::Current()->zone()); |
1029 | 1040 |
1030 Label not_at_start, newline, fail; | 1041 Label not_at_start, newline, fail; |
1031 m.CheckNotAtStart(¬_at_start); | 1042 m.CheckNotAtStart(¬_at_start); |
1032 // Check that prevchar = '\n' and current = 'f'. | 1043 // Check that prevchar = '\n' and current = 'f'. |
1033 m.CheckCharacter('\n', &newline); | 1044 m.CheckCharacter('\n', &newline); |
1034 m.Bind(&fail); | 1045 m.Bind(&fail); |
1035 m.Fail(); | 1046 m.Fail(); |
1036 m.Bind(&newline); | 1047 m.Bind(&newline); |
1037 m.LoadCurrentCharacter(0, &fail); | 1048 m.LoadCurrentCharacter(0, &fail); |
1038 m.CheckNotCharacter('f', &fail); | 1049 m.CheckNotCharacter('f', &fail); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 | 1086 |
1076 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 1087 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
1077 } | 1088 } |
1078 | 1089 |
1079 | 1090 |
1080 TEST(MacroAssemblerNativeBackRefNoCase) { | 1091 TEST(MacroAssemblerNativeBackRefNoCase) { |
1081 v8::V8::Initialize(); | 1092 v8::V8::Initialize(); |
1082 ContextInitializer initializer; | 1093 ContextInitializer initializer; |
1083 Factory* factory = Isolate::Current()->factory(); | 1094 Factory* factory = Isolate::Current()->factory(); |
1084 | 1095 |
1085 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 1096 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, |
| 1097 Isolate::Current()->zone()); |
1086 | 1098 |
1087 Label fail, succ; | 1099 Label fail, succ; |
1088 | 1100 |
1089 m.WriteCurrentPositionToRegister(0, 0); | 1101 m.WriteCurrentPositionToRegister(0, 0); |
1090 m.WriteCurrentPositionToRegister(2, 0); | 1102 m.WriteCurrentPositionToRegister(2, 0); |
1091 m.AdvanceCurrentPosition(3); | 1103 m.AdvanceCurrentPosition(3); |
1092 m.WriteCurrentPositionToRegister(3, 0); | 1104 m.WriteCurrentPositionToRegister(3, 0); |
1093 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". | 1105 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". |
1094 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". | 1106 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". |
1095 Label expected_fail; | 1107 Label expected_fail; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 CHECK_EQ(3, output[3]); | 1144 CHECK_EQ(3, output[3]); |
1133 } | 1145 } |
1134 | 1146 |
1135 | 1147 |
1136 | 1148 |
1137 TEST(MacroAssemblerNativeRegisters) { | 1149 TEST(MacroAssemblerNativeRegisters) { |
1138 v8::V8::Initialize(); | 1150 v8::V8::Initialize(); |
1139 ContextInitializer initializer; | 1151 ContextInitializer initializer; |
1140 Factory* factory = Isolate::Current()->factory(); | 1152 Factory* factory = Isolate::Current()->factory(); |
1141 | 1153 |
1142 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6); | 1154 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6, |
| 1155 Isolate::Current()->zone()); |
1143 | 1156 |
1144 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 1157 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
1145 Vector<const uc16> foo(foo_chars, 3); | 1158 Vector<const uc16> foo(foo_chars, 3); |
1146 | 1159 |
1147 enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt }; | 1160 enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt }; |
1148 Label fail; | 1161 Label fail; |
1149 Label backtrack; | 1162 Label backtrack; |
1150 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] | 1163 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] |
1151 m.PushRegister(out1, RegExpMacroAssembler::kNoStackLimitCheck); | 1164 m.PushRegister(out1, RegExpMacroAssembler::kNoStackLimitCheck); |
1152 m.PushBacktrack(&backtrack); | 1165 m.PushBacktrack(&backtrack); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1234 CHECK_EQ(-1, output[5]); | 1247 CHECK_EQ(-1, output[5]); |
1235 } | 1248 } |
1236 | 1249 |
1237 | 1250 |
1238 TEST(MacroAssemblerStackOverflow) { | 1251 TEST(MacroAssemblerStackOverflow) { |
1239 v8::V8::Initialize(); | 1252 v8::V8::Initialize(); |
1240 ContextInitializer initializer; | 1253 ContextInitializer initializer; |
1241 Isolate* isolate = Isolate::Current(); | 1254 Isolate* isolate = Isolate::Current(); |
1242 Factory* factory = isolate->factory(); | 1255 Factory* factory = isolate->factory(); |
1243 | 1256 |
1244 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); | 1257 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0, |
| 1258 Isolate::Current()->zone()); |
1245 | 1259 |
1246 Label loop; | 1260 Label loop; |
1247 m.Bind(&loop); | 1261 m.Bind(&loop); |
1248 m.PushBacktrack(&loop); | 1262 m.PushBacktrack(&loop); |
1249 m.GoTo(&loop); | 1263 m.GoTo(&loop); |
1250 | 1264 |
1251 Handle<String> source = | 1265 Handle<String> source = |
1252 factory->NewStringFromAscii(CStrVector("<stack overflow test>")); | 1266 factory->NewStringFromAscii(CStrVector("<stack overflow test>")); |
1253 Handle<Object> code_object = m.GetCode(source); | 1267 Handle<Object> code_object = m.GetCode(source); |
1254 Handle<Code> code = Handle<Code>::cast(code_object); | 1268 Handle<Code> code = Handle<Code>::cast(code_object); |
(...skipping 17 matching lines...) Expand all Loading... |
1272 isolate->clear_pending_exception(); | 1286 isolate->clear_pending_exception(); |
1273 } | 1287 } |
1274 | 1288 |
1275 | 1289 |
1276 TEST(MacroAssemblerNativeLotsOfRegisters) { | 1290 TEST(MacroAssemblerNativeLotsOfRegisters) { |
1277 v8::V8::Initialize(); | 1291 v8::V8::Initialize(); |
1278 ContextInitializer initializer; | 1292 ContextInitializer initializer; |
1279 Isolate* isolate = Isolate::Current(); | 1293 Isolate* isolate = Isolate::Current(); |
1280 Factory* factory = isolate->factory(); | 1294 Factory* factory = isolate->factory(); |
1281 | 1295 |
1282 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 2); | 1296 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 2, |
| 1297 Isolate::Current()->zone()); |
1283 | 1298 |
1284 // At least 2048, to ensure the allocated space for registers | 1299 // At least 2048, to ensure the allocated space for registers |
1285 // span one full page. | 1300 // span one full page. |
1286 const int large_number = 8000; | 1301 const int large_number = 8000; |
1287 m.WriteCurrentPositionToRegister(large_number, 42); | 1302 m.WriteCurrentPositionToRegister(large_number, 42); |
1288 m.WriteCurrentPositionToRegister(0, 0); | 1303 m.WriteCurrentPositionToRegister(0, 0); |
1289 m.WriteCurrentPositionToRegister(1, 1); | 1304 m.WriteCurrentPositionToRegister(1, 1); |
1290 Label done; | 1305 Label done; |
1291 m.CheckNotBackReference(0, &done); // Performs a system-stack push. | 1306 m.CheckNotBackReference(0, &done); // Performs a system-stack push. |
1292 m.Bind(&done); | 1307 m.Bind(&done); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1390 | 1405 |
1391 #endif // V8_INTERPRETED_REGEXP | 1406 #endif // V8_INTERPRETED_REGEXP |
1392 | 1407 |
1393 | 1408 |
1394 TEST(AddInverseToTable) { | 1409 TEST(AddInverseToTable) { |
1395 v8::internal::V8::Initialize(NULL); | 1410 v8::internal::V8::Initialize(NULL); |
1396 static const int kLimit = 1000; | 1411 static const int kLimit = 1000; |
1397 static const int kRangeCount = 16; | 1412 static const int kRangeCount = 16; |
1398 for (int t = 0; t < 10; t++) { | 1413 for (int t = 0; t < 10; t++) { |
1399 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 1414 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
| 1415 Zone* zone = Isolate::Current()->zone(); |
1400 ZoneList<CharacterRange>* ranges = | 1416 ZoneList<CharacterRange>* ranges = |
1401 new ZoneList<CharacterRange>(kRangeCount); | 1417 new(zone) |
| 1418 ZoneList<CharacterRange>(kRangeCount, zone); |
1402 for (int i = 0; i < kRangeCount; i++) { | 1419 for (int i = 0; i < kRangeCount; i++) { |
1403 int from = PseudoRandom(t + 87, i + 25) % kLimit; | 1420 int from = PseudoRandom(t + 87, i + 25) % kLimit; |
1404 int to = from + (PseudoRandom(i + 87, t + 25) % (kLimit / 20)); | 1421 int to = from + (PseudoRandom(i + 87, t + 25) % (kLimit / 20)); |
1405 if (to > kLimit) to = kLimit; | 1422 if (to > kLimit) to = kLimit; |
1406 ranges->Add(CharacterRange(from, to)); | 1423 ranges->Add(CharacterRange(from, to), zone); |
1407 } | 1424 } |
1408 DispatchTable table; | 1425 DispatchTable table(zone); |
1409 DispatchTableConstructor cons(&table, false); | 1426 DispatchTableConstructor cons(&table, false, Isolate::Current()->zone()); |
1410 cons.set_choice_index(0); | 1427 cons.set_choice_index(0); |
1411 cons.AddInverse(ranges); | 1428 cons.AddInverse(ranges); |
1412 for (int i = 0; i < kLimit; i++) { | 1429 for (int i = 0; i < kLimit; i++) { |
1413 bool is_on = false; | 1430 bool is_on = false; |
1414 for (int j = 0; !is_on && j < kRangeCount; j++) | 1431 for (int j = 0; !is_on && j < kRangeCount; j++) |
1415 is_on = ranges->at(j).Contains(i); | 1432 is_on = ranges->at(j).Contains(i); |
1416 OutSet* set = table.Get(i); | 1433 OutSet* set = table.Get(i); |
1417 CHECK_EQ(is_on, set->Get(0) == false); | 1434 CHECK_EQ(is_on, set->Get(0) == false); |
1418 } | 1435 } |
1419 } | 1436 } |
1420 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 1437 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
| 1438 Zone* zone = Isolate::Current()->zone(); |
1421 ZoneList<CharacterRange>* ranges = | 1439 ZoneList<CharacterRange>* ranges = |
1422 new ZoneList<CharacterRange>(1); | 1440 new(zone) ZoneList<CharacterRange>(1, zone); |
1423 ranges->Add(CharacterRange(0xFFF0, 0xFFFE)); | 1441 ranges->Add(CharacterRange(0xFFF0, 0xFFFE), zone); |
1424 DispatchTable table; | 1442 DispatchTable table(zone); |
1425 DispatchTableConstructor cons(&table, false); | 1443 DispatchTableConstructor cons(&table, false, Isolate::Current()->zone()); |
1426 cons.set_choice_index(0); | 1444 cons.set_choice_index(0); |
1427 cons.AddInverse(ranges); | 1445 cons.AddInverse(ranges); |
1428 CHECK(!table.Get(0xFFFE)->Get(0)); | 1446 CHECK(!table.Get(0xFFFE)->Get(0)); |
1429 CHECK(table.Get(0xFFFF)->Get(0)); | 1447 CHECK(table.Get(0xFFFF)->Get(0)); |
1430 } | 1448 } |
1431 | 1449 |
1432 | 1450 |
1433 static uc32 canonicalize(uc32 c) { | 1451 static uc32 canonicalize(uc32 c) { |
1434 unibrow::uchar canon[unibrow::Ecma262Canonicalize::kMaxWidth]; | 1452 unibrow::uchar canon[unibrow::Ecma262Canonicalize::kMaxWidth]; |
1435 int count = unibrow::Ecma262Canonicalize::Convert(c, '\0', canon, NULL); | 1453 int count = unibrow::Ecma262Canonicalize::Convert(c, '\0', canon, NULL); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1524 for (int k = 0; k < length; k++) | 1542 for (int k = 0; k < length; k++) |
1525 CHECK_EQ(static_cast<int>(chars[k]), static_cast<int>(chars2[k])); | 1543 CHECK_EQ(static_cast<int>(chars[k]), static_cast<int>(chars2[k])); |
1526 } | 1544 } |
1527 } | 1545 } |
1528 } | 1546 } |
1529 | 1547 |
1530 | 1548 |
1531 static void TestRangeCaseIndependence(CharacterRange input, | 1549 static void TestRangeCaseIndependence(CharacterRange input, |
1532 Vector<CharacterRange> expected) { | 1550 Vector<CharacterRange> expected) { |
1533 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 1551 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
| 1552 Zone* zone = Isolate::Current()->zone(); |
1534 int count = expected.length(); | 1553 int count = expected.length(); |
1535 ZoneList<CharacterRange>* list = new ZoneList<CharacterRange>(count); | 1554 ZoneList<CharacterRange>* list = |
1536 input.AddCaseEquivalents(list, false); | 1555 new(zone) ZoneList<CharacterRange>(count, zone); |
| 1556 input.AddCaseEquivalents(list, false, zone); |
1537 CHECK_EQ(count, list->length()); | 1557 CHECK_EQ(count, list->length()); |
1538 for (int i = 0; i < list->length(); i++) { | 1558 for (int i = 0; i < list->length(); i++) { |
1539 CHECK_EQ(expected[i].from(), list->at(i).from()); | 1559 CHECK_EQ(expected[i].from(), list->at(i).from()); |
1540 CHECK_EQ(expected[i].to(), list->at(i).to()); | 1560 CHECK_EQ(expected[i].to(), list->at(i).to()); |
1541 } | 1561 } |
1542 } | 1562 } |
1543 | 1563 |
1544 | 1564 |
1545 static void TestSimpleRangeCaseIndependence(CharacterRange input, | 1565 static void TestSimpleRangeCaseIndependence(CharacterRange input, |
1546 CharacterRange expected) { | 1566 CharacterRange expected) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1588 if (range.from() <= c && c <= range.to()) | 1608 if (range.from() <= c && c <= range.to()) |
1589 return true; | 1609 return true; |
1590 } | 1610 } |
1591 return false; | 1611 return false; |
1592 } | 1612 } |
1593 | 1613 |
1594 | 1614 |
1595 TEST(CharClassDifference) { | 1615 TEST(CharClassDifference) { |
1596 v8::internal::V8::Initialize(NULL); | 1616 v8::internal::V8::Initialize(NULL); |
1597 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 1617 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
1598 ZoneList<CharacterRange>* base = new ZoneList<CharacterRange>(1); | 1618 Zone* zone = Isolate::Current()->zone(); |
1599 base->Add(CharacterRange::Everything()); | 1619 ZoneList<CharacterRange>* base = |
| 1620 new(zone) ZoneList<CharacterRange>(1, zone); |
| 1621 base->Add(CharacterRange::Everything(), zone); |
1600 Vector<const int> overlay = CharacterRange::GetWordBounds(); | 1622 Vector<const int> overlay = CharacterRange::GetWordBounds(); |
1601 ZoneList<CharacterRange>* included = NULL; | 1623 ZoneList<CharacterRange>* included = NULL; |
1602 ZoneList<CharacterRange>* excluded = NULL; | 1624 ZoneList<CharacterRange>* excluded = NULL; |
1603 CharacterRange::Split(base, overlay, &included, &excluded); | 1625 CharacterRange::Split(base, overlay, &included, &excluded, |
| 1626 Isolate::Current()->zone()); |
1604 for (int i = 0; i < (1 << 16); i++) { | 1627 for (int i = 0; i < (1 << 16); i++) { |
1605 bool in_base = InClass(i, base); | 1628 bool in_base = InClass(i, base); |
1606 if (in_base) { | 1629 if (in_base) { |
1607 bool in_overlay = false; | 1630 bool in_overlay = false; |
1608 for (int j = 0; !in_overlay && j < overlay.length(); j += 2) { | 1631 for (int j = 0; !in_overlay && j < overlay.length(); j += 2) { |
1609 if (overlay[j] <= i && i < overlay[j+1]) | 1632 if (overlay[j] <= i && i < overlay[j+1]) |
1610 in_overlay = true; | 1633 in_overlay = true; |
1611 } | 1634 } |
1612 CHECK_EQ(in_overlay, InClass(i, included)); | 1635 CHECK_EQ(in_overlay, InClass(i, included)); |
1613 CHECK_EQ(!in_overlay, InClass(i, excluded)); | 1636 CHECK_EQ(!in_overlay, InClass(i, excluded)); |
1614 } else { | 1637 } else { |
1615 CHECK(!InClass(i, included)); | 1638 CHECK(!InClass(i, included)); |
1616 CHECK(!InClass(i, excluded)); | 1639 CHECK(!InClass(i, excluded)); |
1617 } | 1640 } |
1618 } | 1641 } |
1619 } | 1642 } |
1620 | 1643 |
1621 | 1644 |
1622 TEST(CanonicalizeCharacterSets) { | 1645 TEST(CanonicalizeCharacterSets) { |
1623 v8::internal::V8::Initialize(NULL); | 1646 v8::internal::V8::Initialize(NULL); |
1624 ZoneScope scope(Isolate::Current(), DELETE_ON_EXIT); | 1647 ZoneScope scope(Isolate::Current(), DELETE_ON_EXIT); |
1625 ZoneList<CharacterRange>* list = new ZoneList<CharacterRange>(4); | 1648 Zone* zone = Isolate::Current()->zone(); |
| 1649 ZoneList<CharacterRange>* list = |
| 1650 new(zone) ZoneList<CharacterRange>(4, zone); |
1626 CharacterSet set(list); | 1651 CharacterSet set(list); |
1627 | 1652 |
1628 list->Add(CharacterRange(10, 20)); | 1653 list->Add(CharacterRange(10, 20), zone); |
1629 list->Add(CharacterRange(30, 40)); | 1654 list->Add(CharacterRange(30, 40), zone); |
1630 list->Add(CharacterRange(50, 60)); | 1655 list->Add(CharacterRange(50, 60), zone); |
1631 set.Canonicalize(); | 1656 set.Canonicalize(); |
1632 ASSERT_EQ(3, list->length()); | 1657 ASSERT_EQ(3, list->length()); |
1633 ASSERT_EQ(10, list->at(0).from()); | 1658 ASSERT_EQ(10, list->at(0).from()); |
1634 ASSERT_EQ(20, list->at(0).to()); | 1659 ASSERT_EQ(20, list->at(0).to()); |
1635 ASSERT_EQ(30, list->at(1).from()); | 1660 ASSERT_EQ(30, list->at(1).from()); |
1636 ASSERT_EQ(40, list->at(1).to()); | 1661 ASSERT_EQ(40, list->at(1).to()); |
1637 ASSERT_EQ(50, list->at(2).from()); | 1662 ASSERT_EQ(50, list->at(2).from()); |
1638 ASSERT_EQ(60, list->at(2).to()); | 1663 ASSERT_EQ(60, list->at(2).to()); |
1639 | 1664 |
1640 list->Rewind(0); | 1665 list->Rewind(0); |
1641 list->Add(CharacterRange(10, 20)); | 1666 list->Add(CharacterRange(10, 20), zone); |
1642 list->Add(CharacterRange(50, 60)); | 1667 list->Add(CharacterRange(50, 60), zone); |
1643 list->Add(CharacterRange(30, 40)); | 1668 list->Add(CharacterRange(30, 40), zone); |
1644 set.Canonicalize(); | 1669 set.Canonicalize(); |
1645 ASSERT_EQ(3, list->length()); | 1670 ASSERT_EQ(3, list->length()); |
1646 ASSERT_EQ(10, list->at(0).from()); | 1671 ASSERT_EQ(10, list->at(0).from()); |
1647 ASSERT_EQ(20, list->at(0).to()); | 1672 ASSERT_EQ(20, list->at(0).to()); |
1648 ASSERT_EQ(30, list->at(1).from()); | 1673 ASSERT_EQ(30, list->at(1).from()); |
1649 ASSERT_EQ(40, list->at(1).to()); | 1674 ASSERT_EQ(40, list->at(1).to()); |
1650 ASSERT_EQ(50, list->at(2).from()); | 1675 ASSERT_EQ(50, list->at(2).from()); |
1651 ASSERT_EQ(60, list->at(2).to()); | 1676 ASSERT_EQ(60, list->at(2).to()); |
1652 | 1677 |
1653 list->Rewind(0); | 1678 list->Rewind(0); |
1654 list->Add(CharacterRange(30, 40)); | 1679 list->Add(CharacterRange(30, 40), zone); |
1655 list->Add(CharacterRange(10, 20)); | 1680 list->Add(CharacterRange(10, 20), zone); |
1656 list->Add(CharacterRange(25, 25)); | 1681 list->Add(CharacterRange(25, 25), zone); |
1657 list->Add(CharacterRange(100, 100)); | 1682 list->Add(CharacterRange(100, 100), zone); |
1658 list->Add(CharacterRange(1, 1)); | 1683 list->Add(CharacterRange(1, 1), zone); |
1659 set.Canonicalize(); | 1684 set.Canonicalize(); |
1660 ASSERT_EQ(5, list->length()); | 1685 ASSERT_EQ(5, list->length()); |
1661 ASSERT_EQ(1, list->at(0).from()); | 1686 ASSERT_EQ(1, list->at(0).from()); |
1662 ASSERT_EQ(1, list->at(0).to()); | 1687 ASSERT_EQ(1, list->at(0).to()); |
1663 ASSERT_EQ(10, list->at(1).from()); | 1688 ASSERT_EQ(10, list->at(1).from()); |
1664 ASSERT_EQ(20, list->at(1).to()); | 1689 ASSERT_EQ(20, list->at(1).to()); |
1665 ASSERT_EQ(25, list->at(2).from()); | 1690 ASSERT_EQ(25, list->at(2).from()); |
1666 ASSERT_EQ(25, list->at(2).to()); | 1691 ASSERT_EQ(25, list->at(2).to()); |
1667 ASSERT_EQ(30, list->at(3).from()); | 1692 ASSERT_EQ(30, list->at(3).from()); |
1668 ASSERT_EQ(40, list->at(3).to()); | 1693 ASSERT_EQ(40, list->at(3).to()); |
1669 ASSERT_EQ(100, list->at(4).from()); | 1694 ASSERT_EQ(100, list->at(4).from()); |
1670 ASSERT_EQ(100, list->at(4).to()); | 1695 ASSERT_EQ(100, list->at(4).to()); |
1671 | 1696 |
1672 list->Rewind(0); | 1697 list->Rewind(0); |
1673 list->Add(CharacterRange(10, 19)); | 1698 list->Add(CharacterRange(10, 19), zone); |
1674 list->Add(CharacterRange(21, 30)); | 1699 list->Add(CharacterRange(21, 30), zone); |
1675 list->Add(CharacterRange(20, 20)); | 1700 list->Add(CharacterRange(20, 20), zone); |
1676 set.Canonicalize(); | 1701 set.Canonicalize(); |
1677 ASSERT_EQ(1, list->length()); | 1702 ASSERT_EQ(1, list->length()); |
1678 ASSERT_EQ(10, list->at(0).from()); | 1703 ASSERT_EQ(10, list->at(0).from()); |
1679 ASSERT_EQ(30, list->at(0).to()); | 1704 ASSERT_EQ(30, list->at(0).to()); |
1680 } | 1705 } |
1681 | 1706 |
1682 | 1707 |
1683 TEST(CharacterRangeMerge) { | 1708 TEST(CharacterRangeMerge) { |
1684 v8::internal::V8::Initialize(NULL); | 1709 v8::internal::V8::Initialize(NULL); |
1685 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 1710 ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); |
1686 ZoneList<CharacterRange> l1(4); | 1711 ZoneList<CharacterRange> l1(4, Isolate::Current()->zone()); |
1687 ZoneList<CharacterRange> l2(4); | 1712 ZoneList<CharacterRange> l2(4, Isolate::Current()->zone()); |
| 1713 Zone* zone = Isolate::Current()->zone(); |
1688 // Create all combinations of intersections of ranges, both singletons and | 1714 // Create all combinations of intersections of ranges, both singletons and |
1689 // longer. | 1715 // longer. |
1690 | 1716 |
1691 int offset = 0; | 1717 int offset = 0; |
1692 | 1718 |
1693 // The five kinds of singleton intersections: | 1719 // The five kinds of singleton intersections: |
1694 // X | 1720 // X |
1695 // Y - outside before | 1721 // Y - outside before |
1696 // Y - outside touching start | 1722 // Y - outside touching start |
1697 // Y - overlap | 1723 // Y - overlap |
1698 // Y - outside touching end | 1724 // Y - outside touching end |
1699 // Y - outside after | 1725 // Y - outside after |
1700 | 1726 |
1701 for (int i = 0; i < 5; i++) { | 1727 for (int i = 0; i < 5; i++) { |
1702 l1.Add(CharacterRange::Singleton(offset + 2)); | 1728 l1.Add(CharacterRange::Singleton(offset + 2), zone); |
1703 l2.Add(CharacterRange::Singleton(offset + i)); | 1729 l2.Add(CharacterRange::Singleton(offset + i), zone); |
1704 offset += 6; | 1730 offset += 6; |
1705 } | 1731 } |
1706 | 1732 |
1707 // The seven kinds of singleton/non-singleton intersections: | 1733 // The seven kinds of singleton/non-singleton intersections: |
1708 // XXX | 1734 // XXX |
1709 // Y - outside before | 1735 // Y - outside before |
1710 // Y - outside touching start | 1736 // Y - outside touching start |
1711 // Y - inside touching start | 1737 // Y - inside touching start |
1712 // Y - entirely inside | 1738 // Y - entirely inside |
1713 // Y - inside touching end | 1739 // Y - inside touching end |
1714 // Y - outside touching end | 1740 // Y - outside touching end |
1715 // Y - disjoint after | 1741 // Y - disjoint after |
1716 | 1742 |
1717 for (int i = 0; i < 7; i++) { | 1743 for (int i = 0; i < 7; i++) { |
1718 l1.Add(CharacterRange::Range(offset + 2, offset + 4)); | 1744 l1.Add(CharacterRange::Range(offset + 2, offset + 4), zone); |
1719 l2.Add(CharacterRange::Singleton(offset + i)); | 1745 l2.Add(CharacterRange::Singleton(offset + i), zone); |
1720 offset += 8; | 1746 offset += 8; |
1721 } | 1747 } |
1722 | 1748 |
1723 // The eleven kinds of non-singleton intersections: | 1749 // The eleven kinds of non-singleton intersections: |
1724 // | 1750 // |
1725 // XXXXXXXX | 1751 // XXXXXXXX |
1726 // YYYY - outside before. | 1752 // YYYY - outside before. |
1727 // YYYY - outside touching start. | 1753 // YYYY - outside touching start. |
1728 // YYYY - overlapping start | 1754 // YYYY - overlapping start |
1729 // YYYY - inside touching start | 1755 // YYYY - inside touching start |
1730 // YYYY - entirely inside | 1756 // YYYY - entirely inside |
1731 // YYYY - inside touching end | 1757 // YYYY - inside touching end |
1732 // YYYY - overlapping end | 1758 // YYYY - overlapping end |
1733 // YYYY - outside touching end | 1759 // YYYY - outside touching end |
1734 // YYYY - outside after | 1760 // YYYY - outside after |
1735 // YYYYYYYY - identical | 1761 // YYYYYYYY - identical |
1736 // YYYYYYYYYYYY - containing entirely. | 1762 // YYYYYYYYYYYY - containing entirely. |
1737 | 1763 |
1738 for (int i = 0; i < 9; i++) { | 1764 for (int i = 0; i < 9; i++) { |
1739 l1.Add(CharacterRange::Range(offset + 6, offset + 15)); // Length 8. | 1765 l1.Add(CharacterRange::Range(offset + 6, offset + 15), zone); // Length 8. |
1740 l2.Add(CharacterRange::Range(offset + 2 * i, offset + 2 * i + 3)); | 1766 l2.Add(CharacterRange::Range(offset + 2 * i, offset + 2 * i + 3), zone); |
1741 offset += 22; | 1767 offset += 22; |
1742 } | 1768 } |
1743 l1.Add(CharacterRange::Range(offset + 6, offset + 15)); | 1769 l1.Add(CharacterRange::Range(offset + 6, offset + 15), zone); |
1744 l2.Add(CharacterRange::Range(offset + 6, offset + 15)); | 1770 l2.Add(CharacterRange::Range(offset + 6, offset + 15), zone); |
1745 offset += 22; | 1771 offset += 22; |
1746 l1.Add(CharacterRange::Range(offset + 6, offset + 15)); | 1772 l1.Add(CharacterRange::Range(offset + 6, offset + 15), zone); |
1747 l2.Add(CharacterRange::Range(offset + 4, offset + 17)); | 1773 l2.Add(CharacterRange::Range(offset + 4, offset + 17), zone); |
1748 offset += 22; | 1774 offset += 22; |
1749 | 1775 |
1750 // Different kinds of multi-range overlap: | 1776 // Different kinds of multi-range overlap: |
1751 // XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX | 1777 // XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX |
1752 // YYYY Y YYYY Y YYYY Y YYYY Y YYYY Y YYYY Y | 1778 // YYYY Y YYYY Y YYYY Y YYYY Y YYYY Y YYYY Y |
1753 | 1779 |
1754 l1.Add(CharacterRange::Range(offset, offset + 21)); | 1780 l1.Add(CharacterRange::Range(offset, offset + 21), zone); |
1755 l1.Add(CharacterRange::Range(offset + 31, offset + 52)); | 1781 l1.Add(CharacterRange::Range(offset + 31, offset + 52), zone); |
1756 for (int i = 0; i < 6; i++) { | 1782 for (int i = 0; i < 6; i++) { |
1757 l2.Add(CharacterRange::Range(offset + 2, offset + 5)); | 1783 l2.Add(CharacterRange::Range(offset + 2, offset + 5), zone); |
1758 l2.Add(CharacterRange::Singleton(offset + 8)); | 1784 l2.Add(CharacterRange::Singleton(offset + 8), zone); |
1759 offset += 9; | 1785 offset += 9; |
1760 } | 1786 } |
1761 | 1787 |
1762 ASSERT(CharacterRange::IsCanonical(&l1)); | 1788 ASSERT(CharacterRange::IsCanonical(&l1)); |
1763 ASSERT(CharacterRange::IsCanonical(&l2)); | 1789 ASSERT(CharacterRange::IsCanonical(&l2)); |
1764 | 1790 |
1765 ZoneList<CharacterRange> first_only(4); | 1791 ZoneList<CharacterRange> first_only(4, Isolate::Current()->zone()); |
1766 ZoneList<CharacterRange> second_only(4); | 1792 ZoneList<CharacterRange> second_only(4, Isolate::Current()->zone()); |
1767 ZoneList<CharacterRange> both(4); | 1793 ZoneList<CharacterRange> both(4, Isolate::Current()->zone()); |
1768 } | 1794 } |
1769 | 1795 |
1770 | 1796 |
1771 TEST(Graph) { | 1797 TEST(Graph) { |
1772 V8::Initialize(NULL); | 1798 V8::Initialize(NULL); |
1773 Execute("\\b\\w+\\b", false, true, true); | 1799 Execute("\\b\\w+\\b", false, true, true); |
1774 } | 1800 } |
OLD | NEW |