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

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

Issue 559913002: Rename ascii to one-byte where applicable. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
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 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 TestCharacterClassEscapes('.', IsRegExpNewline); 498 TestCharacterClassEscapes('.', IsRegExpNewline);
499 TestCharacterClassEscapes('d', IsDigit); 499 TestCharacterClassEscapes('d', IsDigit);
500 TestCharacterClassEscapes('D', NotDigit); 500 TestCharacterClassEscapes('D', NotDigit);
501 TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator); 501 TestCharacterClassEscapes('s', IsWhiteSpaceOrLineTerminator);
502 TestCharacterClassEscapes('S', NotWhiteSpaceNorLineTermiantor); 502 TestCharacterClassEscapes('S', NotWhiteSpaceNorLineTermiantor);
503 TestCharacterClassEscapes('w', IsRegExpWord); 503 TestCharacterClassEscapes('w', IsRegExpWord);
504 TestCharacterClassEscapes('W', NotWord); 504 TestCharacterClassEscapes('W', NotWord);
505 } 505 }
506 506
507 507
508 static RegExpNode* Compile(const char* input, 508 static RegExpNode* Compile(const char* input, bool multiline, bool is_one_byte,
509 bool multiline,
510 bool is_ascii,
511 Zone* zone) { 509 Zone* zone) {
512 V8::Initialize(NULL); 510 V8::Initialize(NULL);
513 Isolate* isolate = CcTest::i_isolate(); 511 Isolate* isolate = CcTest::i_isolate();
514 FlatStringReader reader(isolate, CStrVector(input)); 512 FlatStringReader reader(isolate, CStrVector(input));
515 RegExpCompileData compile_data; 513 RegExpCompileData compile_data;
516 if (!v8::internal::RegExpParser::ParseRegExp(&reader, multiline, 514 if (!v8::internal::RegExpParser::ParseRegExp(&reader, multiline,
517 &compile_data, zone)) 515 &compile_data, zone))
518 return NULL; 516 return NULL;
519 Handle<String> pattern = isolate->factory()-> 517 Handle<String> pattern = isolate->factory()->
520 NewStringFromUtf8(CStrVector(input)).ToHandleChecked(); 518 NewStringFromUtf8(CStrVector(input)).ToHandleChecked();
521 Handle<String> sample_subject = 519 Handle<String> sample_subject =
522 isolate->factory()->NewStringFromUtf8(CStrVector("")).ToHandleChecked(); 520 isolate->factory()->NewStringFromUtf8(CStrVector("")).ToHandleChecked();
523 RegExpEngine::Compile(&compile_data, 521 RegExpEngine::Compile(&compile_data, false, false, multiline, pattern,
524 false, 522 sample_subject, is_one_byte, zone);
525 false,
526 multiline,
527 pattern,
528 sample_subject,
529 is_ascii,
530 zone);
531 return compile_data.node; 523 return compile_data.node;
532 } 524 }
533 525
534 526
535 static void Execute(const char* input, 527 static void Execute(const char* input, bool multiline, bool is_one_byte,
536 bool multiline,
537 bool is_ascii,
538 bool dot_output = false) { 528 bool dot_output = false) {
539 v8::HandleScope scope(CcTest::isolate()); 529 v8::HandleScope scope(CcTest::isolate());
540 Zone zone(CcTest::i_isolate()); 530 Zone zone(CcTest::i_isolate());
541 RegExpNode* node = Compile(input, multiline, is_ascii, &zone); 531 RegExpNode* node = Compile(input, multiline, is_one_byte, &zone);
542 USE(node); 532 USE(node);
543 #ifdef DEBUG 533 #ifdef DEBUG
544 if (dot_output) { 534 if (dot_output) {
545 RegExpEngine::DotPrint(input, node, false); 535 RegExpEngine::DotPrint(input, node, false);
546 } 536 }
547 #endif // DEBUG 537 #endif // DEBUG
548 } 538 }
549 539
550 540
551 class TestConfig { 541 class TestConfig {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 } 739 }
750 740
751 741
752 TEST(MacroAssemblerNativeSuccess) { 742 TEST(MacroAssemblerNativeSuccess) {
753 v8::V8::Initialize(); 743 v8::V8::Initialize();
754 ContextInitializer initializer; 744 ContextInitializer initializer;
755 Isolate* isolate = CcTest::i_isolate(); 745 Isolate* isolate = CcTest::i_isolate();
756 Factory* factory = isolate->factory(); 746 Factory* factory = isolate->factory();
757 Zone zone(isolate); 747 Zone zone(isolate);
758 748
759 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, &zone); 749 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 4, &zone);
760 750
761 m.Succeed(); 751 m.Succeed();
762 752
763 Handle<String> source = factory->NewStringFromStaticAscii(""); 753 Handle<String> source = factory->NewStringFromStaticChars("");
764 Handle<Object> code_object = m.GetCode(source); 754 Handle<Object> code_object = m.GetCode(source);
765 Handle<Code> code = Handle<Code>::cast(code_object); 755 Handle<Code> code = Handle<Code>::cast(code_object);
766 756
767 int captures[4] = {42, 37, 87, 117}; 757 int captures[4] = {42, 37, 87, 117};
768 Handle<String> input = factory->NewStringFromStaticAscii("foofoo"); 758 Handle<String> input = factory->NewStringFromStaticChars("foofoo");
769 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 759 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
770 const byte* start_adr = 760 const byte* start_adr =
771 reinterpret_cast<const byte*>(seq_input->GetCharsAddress()); 761 reinterpret_cast<const byte*>(seq_input->GetCharsAddress());
772 762
773 NativeRegExpMacroAssembler::Result result = 763 NativeRegExpMacroAssembler::Result result =
774 Execute(*code, 764 Execute(*code,
775 *input, 765 *input,
776 0, 766 0,
777 start_adr, 767 start_adr,
778 start_adr + seq_input->length(), 768 start_adr + seq_input->length(),
779 captures); 769 captures);
780 770
781 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); 771 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
782 CHECK_EQ(-1, captures[0]); 772 CHECK_EQ(-1, captures[0]);
783 CHECK_EQ(-1, captures[1]); 773 CHECK_EQ(-1, captures[1]);
784 CHECK_EQ(-1, captures[2]); 774 CHECK_EQ(-1, captures[2]);
785 CHECK_EQ(-1, captures[3]); 775 CHECK_EQ(-1, captures[3]);
786 } 776 }
787 777
788 778
789 TEST(MacroAssemblerNativeSimple) { 779 TEST(MacroAssemblerNativeSimple) {
790 v8::V8::Initialize(); 780 v8::V8::Initialize();
791 ContextInitializer initializer; 781 ContextInitializer initializer;
792 Isolate* isolate = CcTest::i_isolate(); 782 Isolate* isolate = CcTest::i_isolate();
793 Factory* factory = isolate->factory(); 783 Factory* factory = isolate->factory();
794 Zone zone(isolate); 784 Zone zone(isolate);
795 785
796 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, &zone); 786 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 4, &zone);
797 787
798 Label fail, backtrack; 788 Label fail, backtrack;
799 m.PushBacktrack(&fail); 789 m.PushBacktrack(&fail);
800 m.CheckNotAtStart(NULL); 790 m.CheckNotAtStart(NULL);
801 m.LoadCurrentCharacter(2, NULL); 791 m.LoadCurrentCharacter(2, NULL);
802 m.CheckNotCharacter('o', NULL); 792 m.CheckNotCharacter('o', NULL);
803 m.LoadCurrentCharacter(1, NULL, false); 793 m.LoadCurrentCharacter(1, NULL, false);
804 m.CheckNotCharacter('o', NULL); 794 m.CheckNotCharacter('o', NULL);
805 m.LoadCurrentCharacter(0, NULL, false); 795 m.LoadCurrentCharacter(0, NULL, false);
806 m.CheckNotCharacter('f', NULL); 796 m.CheckNotCharacter('f', NULL);
807 m.WriteCurrentPositionToRegister(0, 0); 797 m.WriteCurrentPositionToRegister(0, 0);
808 m.WriteCurrentPositionToRegister(1, 3); 798 m.WriteCurrentPositionToRegister(1, 3);
809 m.AdvanceCurrentPosition(3); 799 m.AdvanceCurrentPosition(3);
810 m.PushBacktrack(&backtrack); 800 m.PushBacktrack(&backtrack);
811 m.Succeed(); 801 m.Succeed();
812 m.Bind(&backtrack); 802 m.Bind(&backtrack);
813 m.Backtrack(); 803 m.Backtrack();
814 m.Bind(&fail); 804 m.Bind(&fail);
815 m.Fail(); 805 m.Fail();
816 806
817 Handle<String> source = factory->NewStringFromStaticAscii("^foo"); 807 Handle<String> source = factory->NewStringFromStaticChars("^foo");
818 Handle<Object> code_object = m.GetCode(source); 808 Handle<Object> code_object = m.GetCode(source);
819 Handle<Code> code = Handle<Code>::cast(code_object); 809 Handle<Code> code = Handle<Code>::cast(code_object);
820 810
821 int captures[4] = {42, 37, 87, 117}; 811 int captures[4] = {42, 37, 87, 117};
822 Handle<String> input = factory->NewStringFromStaticAscii("foofoo"); 812 Handle<String> input = factory->NewStringFromStaticChars("foofoo");
823 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 813 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
824 Address start_adr = seq_input->GetCharsAddress(); 814 Address start_adr = seq_input->GetCharsAddress();
825 815
826 NativeRegExpMacroAssembler::Result result = 816 NativeRegExpMacroAssembler::Result result =
827 Execute(*code, 817 Execute(*code,
828 *input, 818 *input,
829 0, 819 0,
830 start_adr, 820 start_adr,
831 start_adr + input->length(), 821 start_adr + input->length(),
832 captures); 822 captures);
833 823
834 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); 824 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
835 CHECK_EQ(0, captures[0]); 825 CHECK_EQ(0, captures[0]);
836 CHECK_EQ(3, captures[1]); 826 CHECK_EQ(3, captures[1]);
837 CHECK_EQ(-1, captures[2]); 827 CHECK_EQ(-1, captures[2]);
838 CHECK_EQ(-1, captures[3]); 828 CHECK_EQ(-1, captures[3]);
839 829
840 input = factory->NewStringFromStaticAscii("barbarbar"); 830 input = factory->NewStringFromStaticChars("barbarbar");
841 seq_input = Handle<SeqOneByteString>::cast(input); 831 seq_input = Handle<SeqOneByteString>::cast(input);
842 start_adr = seq_input->GetCharsAddress(); 832 start_adr = seq_input->GetCharsAddress();
843 833
844 result = Execute(*code, 834 result = Execute(*code,
845 *input, 835 *input,
846 0, 836 0,
847 start_adr, 837 start_adr,
848 start_adr + input->length(), 838 start_adr + input->length(),
849 captures); 839 captures);
850 840
(...skipping 22 matching lines...) Expand all
873 m.WriteCurrentPositionToRegister(0, 0); 863 m.WriteCurrentPositionToRegister(0, 0);
874 m.WriteCurrentPositionToRegister(1, 3); 864 m.WriteCurrentPositionToRegister(1, 3);
875 m.AdvanceCurrentPosition(3); 865 m.AdvanceCurrentPosition(3);
876 m.PushBacktrack(&backtrack); 866 m.PushBacktrack(&backtrack);
877 m.Succeed(); 867 m.Succeed();
878 m.Bind(&backtrack); 868 m.Bind(&backtrack);
879 m.Backtrack(); 869 m.Backtrack();
880 m.Bind(&fail); 870 m.Bind(&fail);
881 m.Fail(); 871 m.Fail();
882 872
883 Handle<String> source = factory->NewStringFromStaticAscii("^foo"); 873 Handle<String> source = factory->NewStringFromStaticChars("^foo");
884 Handle<Object> code_object = m.GetCode(source); 874 Handle<Object> code_object = m.GetCode(source);
885 Handle<Code> code = Handle<Code>::cast(code_object); 875 Handle<Code> code = Handle<Code>::cast(code_object);
886 876
887 int captures[4] = {42, 37, 87, 117}; 877 int captures[4] = {42, 37, 87, 117};
888 const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o', 878 const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o',
889 static_cast<uc16>(0x2603)}; 879 static_cast<uc16>(0x2603)};
890 Handle<String> input = factory->NewStringFromTwoByte( 880 Handle<String> input = factory->NewStringFromTwoByte(
891 Vector<const uc16>(input_data, 6)).ToHandleChecked(); 881 Vector<const uc16>(input_data, 6)).ToHandleChecked();
892 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); 882 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input);
893 Address start_adr = seq_input->GetCharsAddress(); 883 Address start_adr = seq_input->GetCharsAddress();
(...skipping 30 matching lines...) Expand all
924 } 914 }
925 915
926 916
927 TEST(MacroAssemblerNativeBacktrack) { 917 TEST(MacroAssemblerNativeBacktrack) {
928 v8::V8::Initialize(); 918 v8::V8::Initialize();
929 ContextInitializer initializer; 919 ContextInitializer initializer;
930 Isolate* isolate = CcTest::i_isolate(); 920 Isolate* isolate = CcTest::i_isolate();
931 Factory* factory = isolate->factory(); 921 Factory* factory = isolate->factory();
932 Zone zone(isolate); 922 Zone zone(isolate);
933 923
934 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0, &zone); 924 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 0, &zone);
935 925
936 Label fail; 926 Label fail;
937 Label backtrack; 927 Label backtrack;
938 m.LoadCurrentCharacter(10, &fail); 928 m.LoadCurrentCharacter(10, &fail);
939 m.Succeed(); 929 m.Succeed();
940 m.Bind(&fail); 930 m.Bind(&fail);
941 m.PushBacktrack(&backtrack); 931 m.PushBacktrack(&backtrack);
942 m.LoadCurrentCharacter(10, NULL); 932 m.LoadCurrentCharacter(10, NULL);
943 m.Succeed(); 933 m.Succeed();
944 m.Bind(&backtrack); 934 m.Bind(&backtrack);
945 m.Fail(); 935 m.Fail();
946 936
947 Handle<String> source = factory->NewStringFromStaticAscii(".........."); 937 Handle<String> source = factory->NewStringFromStaticChars("..........");
948 Handle<Object> code_object = m.GetCode(source); 938 Handle<Object> code_object = m.GetCode(source);
949 Handle<Code> code = Handle<Code>::cast(code_object); 939 Handle<Code> code = Handle<Code>::cast(code_object);
950 940
951 Handle<String> input = factory->NewStringFromStaticAscii("foofoo"); 941 Handle<String> input = factory->NewStringFromStaticChars("foofoo");
952 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 942 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
953 Address start_adr = seq_input->GetCharsAddress(); 943 Address start_adr = seq_input->GetCharsAddress();
954 944
955 NativeRegExpMacroAssembler::Result result = 945 NativeRegExpMacroAssembler::Result result =
956 Execute(*code, 946 Execute(*code,
957 *input, 947 *input,
958 0, 948 0,
959 start_adr, 949 start_adr,
960 start_adr + input->length(), 950 start_adr + input->length(),
961 NULL); 951 NULL);
962 952
963 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); 953 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result);
964 } 954 }
965 955
966 956
967 TEST(MacroAssemblerNativeBackReferenceASCII) { 957 TEST(MacroAssemblerNativeBackReferenceLATIN1) {
968 v8::V8::Initialize(); 958 v8::V8::Initialize();
969 ContextInitializer initializer; 959 ContextInitializer initializer;
970 Isolate* isolate = CcTest::i_isolate(); 960 Isolate* isolate = CcTest::i_isolate();
971 Factory* factory = isolate->factory(); 961 Factory* factory = isolate->factory();
972 Zone zone(isolate); 962 Zone zone(isolate);
973 963
974 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, &zone); 964 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 4, &zone);
975 965
976 m.WriteCurrentPositionToRegister(0, 0); 966 m.WriteCurrentPositionToRegister(0, 0);
977 m.AdvanceCurrentPosition(2); 967 m.AdvanceCurrentPosition(2);
978 m.WriteCurrentPositionToRegister(1, 0); 968 m.WriteCurrentPositionToRegister(1, 0);
979 Label nomatch; 969 Label nomatch;
980 m.CheckNotBackReference(0, &nomatch); 970 m.CheckNotBackReference(0, &nomatch);
981 m.Fail(); 971 m.Fail();
982 m.Bind(&nomatch); 972 m.Bind(&nomatch);
983 m.AdvanceCurrentPosition(2); 973 m.AdvanceCurrentPosition(2);
984 Label missing_match; 974 Label missing_match;
985 m.CheckNotBackReference(0, &missing_match); 975 m.CheckNotBackReference(0, &missing_match);
986 m.WriteCurrentPositionToRegister(2, 0); 976 m.WriteCurrentPositionToRegister(2, 0);
987 m.Succeed(); 977 m.Succeed();
988 m.Bind(&missing_match); 978 m.Bind(&missing_match);
989 m.Fail(); 979 m.Fail();
990 980
991 Handle<String> source = factory->NewStringFromStaticAscii("^(..)..\1"); 981 Handle<String> source = factory->NewStringFromStaticChars("^(..)..\1");
992 Handle<Object> code_object = m.GetCode(source); 982 Handle<Object> code_object = m.GetCode(source);
993 Handle<Code> code = Handle<Code>::cast(code_object); 983 Handle<Code> code = Handle<Code>::cast(code_object);
994 984
995 Handle<String> input = factory->NewStringFromStaticAscii("fooofo"); 985 Handle<String> input = factory->NewStringFromStaticChars("fooofo");
996 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 986 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
997 Address start_adr = seq_input->GetCharsAddress(); 987 Address start_adr = seq_input->GetCharsAddress();
998 988
999 int output[4]; 989 int output[4];
1000 NativeRegExpMacroAssembler::Result result = 990 NativeRegExpMacroAssembler::Result result =
1001 Execute(*code, 991 Execute(*code,
1002 *input, 992 *input,
1003 0, 993 0,
1004 start_adr, 994 start_adr,
1005 start_adr + input->length(), 995 start_adr + input->length(),
(...skipping 24 matching lines...) Expand all
1030 m.Fail(); 1020 m.Fail();
1031 m.Bind(&nomatch); 1021 m.Bind(&nomatch);
1032 m.AdvanceCurrentPosition(2); 1022 m.AdvanceCurrentPosition(2);
1033 Label missing_match; 1023 Label missing_match;
1034 m.CheckNotBackReference(0, &missing_match); 1024 m.CheckNotBackReference(0, &missing_match);
1035 m.WriteCurrentPositionToRegister(2, 0); 1025 m.WriteCurrentPositionToRegister(2, 0);
1036 m.Succeed(); 1026 m.Succeed();
1037 m.Bind(&missing_match); 1027 m.Bind(&missing_match);
1038 m.Fail(); 1028 m.Fail();
1039 1029
1040 Handle<String> source = factory->NewStringFromStaticAscii("^(..)..\1"); 1030 Handle<String> source = factory->NewStringFromStaticChars("^(..)..\1");
1041 Handle<Object> code_object = m.GetCode(source); 1031 Handle<Object> code_object = m.GetCode(source);
1042 Handle<Code> code = Handle<Code>::cast(code_object); 1032 Handle<Code> code = Handle<Code>::cast(code_object);
1043 1033
1044 const uc16 input_data[6] = {'f', 0x2028, 'o', 'o', 'f', 0x2028}; 1034 const uc16 input_data[6] = {'f', 0x2028, 'o', 'o', 'f', 0x2028};
1045 Handle<String> input = factory->NewStringFromTwoByte( 1035 Handle<String> input = factory->NewStringFromTwoByte(
1046 Vector<const uc16>(input_data, 6)).ToHandleChecked(); 1036 Vector<const uc16>(input_data, 6)).ToHandleChecked();
1047 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); 1037 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input);
1048 Address start_adr = seq_input->GetCharsAddress(); 1038 Address start_adr = seq_input->GetCharsAddress();
1049 1039
1050 int output[4]; 1040 int output[4];
(...skipping 14 matching lines...) Expand all
1065 1055
1066 1056
1067 1057
1068 TEST(MacroAssemblernativeAtStart) { 1058 TEST(MacroAssemblernativeAtStart) {
1069 v8::V8::Initialize(); 1059 v8::V8::Initialize();
1070 ContextInitializer initializer; 1060 ContextInitializer initializer;
1071 Isolate* isolate = CcTest::i_isolate(); 1061 Isolate* isolate = CcTest::i_isolate();
1072 Factory* factory = isolate->factory(); 1062 Factory* factory = isolate->factory();
1073 Zone zone(isolate); 1063 Zone zone(isolate);
1074 1064
1075 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0, &zone); 1065 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 0, &zone);
1076 1066
1077 Label not_at_start, newline, fail; 1067 Label not_at_start, newline, fail;
1078 m.CheckNotAtStart(&not_at_start); 1068 m.CheckNotAtStart(&not_at_start);
1079 // Check that prevchar = '\n' and current = 'f'. 1069 // Check that prevchar = '\n' and current = 'f'.
1080 m.CheckCharacter('\n', &newline); 1070 m.CheckCharacter('\n', &newline);
1081 m.Bind(&fail); 1071 m.Bind(&fail);
1082 m.Fail(); 1072 m.Fail();
1083 m.Bind(&newline); 1073 m.Bind(&newline);
1084 m.LoadCurrentCharacter(0, &fail); 1074 m.LoadCurrentCharacter(0, &fail);
1085 m.CheckNotCharacter('f', &fail); 1075 m.CheckNotCharacter('f', &fail);
1086 m.Succeed(); 1076 m.Succeed();
1087 1077
1088 m.Bind(&not_at_start); 1078 m.Bind(&not_at_start);
1089 // Check that prevchar = 'o' and current = 'b'. 1079 // Check that prevchar = 'o' and current = 'b'.
1090 Label prevo; 1080 Label prevo;
1091 m.CheckCharacter('o', &prevo); 1081 m.CheckCharacter('o', &prevo);
1092 m.Fail(); 1082 m.Fail();
1093 m.Bind(&prevo); 1083 m.Bind(&prevo);
1094 m.LoadCurrentCharacter(0, &fail); 1084 m.LoadCurrentCharacter(0, &fail);
1095 m.CheckNotCharacter('b', &fail); 1085 m.CheckNotCharacter('b', &fail);
1096 m.Succeed(); 1086 m.Succeed();
1097 1087
1098 Handle<String> source = factory->NewStringFromStaticAscii("(^f|ob)"); 1088 Handle<String> source = factory->NewStringFromStaticChars("(^f|ob)");
1099 Handle<Object> code_object = m.GetCode(source); 1089 Handle<Object> code_object = m.GetCode(source);
1100 Handle<Code> code = Handle<Code>::cast(code_object); 1090 Handle<Code> code = Handle<Code>::cast(code_object);
1101 1091
1102 Handle<String> input = factory->NewStringFromStaticAscii("foobar"); 1092 Handle<String> input = factory->NewStringFromStaticChars("foobar");
1103 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 1093 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
1104 Address start_adr = seq_input->GetCharsAddress(); 1094 Address start_adr = seq_input->GetCharsAddress();
1105 1095
1106 NativeRegExpMacroAssembler::Result result = 1096 NativeRegExpMacroAssembler::Result result =
1107 Execute(*code, 1097 Execute(*code,
1108 *input, 1098 *input,
1109 0, 1099 0,
1110 start_adr, 1100 start_adr,
1111 start_adr + input->length(), 1101 start_adr + input->length(),
1112 NULL); 1102 NULL);
(...skipping 11 matching lines...) Expand all
1124 } 1114 }
1125 1115
1126 1116
1127 TEST(MacroAssemblerNativeBackRefNoCase) { 1117 TEST(MacroAssemblerNativeBackRefNoCase) {
1128 v8::V8::Initialize(); 1118 v8::V8::Initialize();
1129 ContextInitializer initializer; 1119 ContextInitializer initializer;
1130 Isolate* isolate = CcTest::i_isolate(); 1120 Isolate* isolate = CcTest::i_isolate();
1131 Factory* factory = isolate->factory(); 1121 Factory* factory = isolate->factory();
1132 Zone zone(isolate); 1122 Zone zone(isolate);
1133 1123
1134 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4, &zone); 1124 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 4, &zone);
1135 1125
1136 Label fail, succ; 1126 Label fail, succ;
1137 1127
1138 m.WriteCurrentPositionToRegister(0, 0); 1128 m.WriteCurrentPositionToRegister(0, 0);
1139 m.WriteCurrentPositionToRegister(2, 0); 1129 m.WriteCurrentPositionToRegister(2, 0);
1140 m.AdvanceCurrentPosition(3); 1130 m.AdvanceCurrentPosition(3);
1141 m.WriteCurrentPositionToRegister(3, 0); 1131 m.WriteCurrentPositionToRegister(3, 0);
1142 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". 1132 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC".
1143 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". 1133 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC".
1144 Label expected_fail; 1134 Label expected_fail;
1145 m.CheckNotBackReferenceIgnoreCase(2, &expected_fail); 1135 m.CheckNotBackReferenceIgnoreCase(2, &expected_fail);
1146 m.Bind(&fail); 1136 m.Bind(&fail);
1147 m.Fail(); 1137 m.Fail();
1148 1138
1149 m.Bind(&expected_fail); 1139 m.Bind(&expected_fail);
1150 m.AdvanceCurrentPosition(3); // Skip "xYz" 1140 m.AdvanceCurrentPosition(3); // Skip "xYz"
1151 m.CheckNotBackReferenceIgnoreCase(2, &succ); 1141 m.CheckNotBackReferenceIgnoreCase(2, &succ);
1152 m.Fail(); 1142 m.Fail();
1153 1143
1154 m.Bind(&succ); 1144 m.Bind(&succ);
1155 m.WriteCurrentPositionToRegister(1, 0); 1145 m.WriteCurrentPositionToRegister(1, 0);
1156 m.Succeed(); 1146 m.Succeed();
1157 1147
1158 Handle<String> source = 1148 Handle<String> source =
1159 factory->NewStringFromStaticAscii("^(abc)\1\1(?!\1)...(?!\1)"); 1149 factory->NewStringFromStaticChars("^(abc)\1\1(?!\1)...(?!\1)");
1160 Handle<Object> code_object = m.GetCode(source); 1150 Handle<Object> code_object = m.GetCode(source);
1161 Handle<Code> code = Handle<Code>::cast(code_object); 1151 Handle<Code> code = Handle<Code>::cast(code_object);
1162 1152
1163 Handle<String> input = 1153 Handle<String> input = factory->NewStringFromStaticChars("aBcAbCABCxYzab");
1164 factory->NewStringFromStaticAscii("aBcAbCABCxYzab");
1165 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 1154 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
1166 Address start_adr = seq_input->GetCharsAddress(); 1155 Address start_adr = seq_input->GetCharsAddress();
1167 1156
1168 int output[4]; 1157 int output[4];
1169 NativeRegExpMacroAssembler::Result result = 1158 NativeRegExpMacroAssembler::Result result =
1170 Execute(*code, 1159 Execute(*code,
1171 *input, 1160 *input,
1172 0, 1161 0,
1173 start_adr, 1162 start_adr,
1174 start_adr + input->length(), 1163 start_adr + input->length(),
1175 output); 1164 output);
1176 1165
1177 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); 1166 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1178 CHECK_EQ(0, output[0]); 1167 CHECK_EQ(0, output[0]);
1179 CHECK_EQ(12, output[1]); 1168 CHECK_EQ(12, output[1]);
1180 CHECK_EQ(0, output[2]); 1169 CHECK_EQ(0, output[2]);
1181 CHECK_EQ(3, output[3]); 1170 CHECK_EQ(3, output[3]);
1182 } 1171 }
1183 1172
1184 1173
1185 1174
1186 TEST(MacroAssemblerNativeRegisters) { 1175 TEST(MacroAssemblerNativeRegisters) {
1187 v8::V8::Initialize(); 1176 v8::V8::Initialize();
1188 ContextInitializer initializer; 1177 ContextInitializer initializer;
1189 Isolate* isolate = CcTest::i_isolate(); 1178 Isolate* isolate = CcTest::i_isolate();
1190 Factory* factory = isolate->factory(); 1179 Factory* factory = isolate->factory();
1191 Zone zone(isolate); 1180 Zone zone(isolate);
1192 1181
1193 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6, &zone); 1182 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 6, &zone);
1194 1183
1195 uc16 foo_chars[3] = {'f', 'o', 'o'}; 1184 uc16 foo_chars[3] = {'f', 'o', 'o'};
1196 Vector<const uc16> foo(foo_chars, 3); 1185 Vector<const uc16> foo(foo_chars, 3);
1197 1186
1198 enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt }; 1187 enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt };
1199 Label fail; 1188 Label fail;
1200 Label backtrack; 1189 Label backtrack;
1201 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] 1190 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0]
1202 m.PushRegister(out1, RegExpMacroAssembler::kNoStackLimitCheck); 1191 m.PushRegister(out1, RegExpMacroAssembler::kNoStackLimitCheck);
1203 m.PushBacktrack(&backtrack); 1192 m.PushBacktrack(&backtrack);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1249 m.GoTo(&loop3); 1238 m.GoTo(&loop3);
1250 m.Bind(&exit_loop3); 1239 m.Bind(&exit_loop3);
1251 m.PopCurrentPosition(); 1240 m.PopCurrentPosition();
1252 m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9,-1] 1241 m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9,-1]
1253 1242
1254 m.Succeed(); 1243 m.Succeed();
1255 1244
1256 m.Bind(&fail); 1245 m.Bind(&fail);
1257 m.Fail(); 1246 m.Fail();
1258 1247
1259 Handle<String> source = 1248 Handle<String> source = factory->NewStringFromStaticChars("<loop test>");
1260 factory->NewStringFromStaticAscii("<loop test>");
1261 Handle<Object> code_object = m.GetCode(source); 1249 Handle<Object> code_object = m.GetCode(source);
1262 Handle<Code> code = Handle<Code>::cast(code_object); 1250 Handle<Code> code = Handle<Code>::cast(code_object);
1263 1251
1264 // String long enough for test (content doesn't matter). 1252 // String long enough for test (content doesn't matter).
1265 Handle<String> input = 1253 Handle<String> input = factory->NewStringFromStaticChars("foofoofoofoofoo");
1266 factory->NewStringFromStaticAscii("foofoofoofoofoo");
1267 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 1254 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
1268 Address start_adr = seq_input->GetCharsAddress(); 1255 Address start_adr = seq_input->GetCharsAddress();
1269 1256
1270 int output[6]; 1257 int output[6];
1271 NativeRegExpMacroAssembler::Result result = 1258 NativeRegExpMacroAssembler::Result result =
1272 Execute(*code, 1259 Execute(*code,
1273 *input, 1260 *input,
1274 0, 1261 0,
1275 start_adr, 1262 start_adr,
1276 start_adr + input->length(), 1263 start_adr + input->length(),
1277 output); 1264 output);
1278 1265
1279 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); 1266 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1280 CHECK_EQ(0, output[0]); 1267 CHECK_EQ(0, output[0]);
1281 CHECK_EQ(3, output[1]); 1268 CHECK_EQ(3, output[1]);
1282 CHECK_EQ(6, output[2]); 1269 CHECK_EQ(6, output[2]);
1283 CHECK_EQ(9, output[3]); 1270 CHECK_EQ(9, output[3]);
1284 CHECK_EQ(9, output[4]); 1271 CHECK_EQ(9, output[4]);
1285 CHECK_EQ(-1, output[5]); 1272 CHECK_EQ(-1, output[5]);
1286 } 1273 }
1287 1274
1288 1275
1289 TEST(MacroAssemblerStackOverflow) { 1276 TEST(MacroAssemblerStackOverflow) {
1290 v8::V8::Initialize(); 1277 v8::V8::Initialize();
1291 ContextInitializer initializer; 1278 ContextInitializer initializer;
1292 Isolate* isolate = CcTest::i_isolate(); 1279 Isolate* isolate = CcTest::i_isolate();
1293 Factory* factory = isolate->factory(); 1280 Factory* factory = isolate->factory();
1294 Zone zone(isolate); 1281 Zone zone(isolate);
1295 1282
1296 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0, &zone); 1283 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 0, &zone);
1297 1284
1298 Label loop; 1285 Label loop;
1299 m.Bind(&loop); 1286 m.Bind(&loop);
1300 m.PushBacktrack(&loop); 1287 m.PushBacktrack(&loop);
1301 m.GoTo(&loop); 1288 m.GoTo(&loop);
1302 1289
1303 Handle<String> source = 1290 Handle<String> source =
1304 factory->NewStringFromStaticAscii("<stack overflow test>"); 1291 factory->NewStringFromStaticChars("<stack overflow test>");
1305 Handle<Object> code_object = m.GetCode(source); 1292 Handle<Object> code_object = m.GetCode(source);
1306 Handle<Code> code = Handle<Code>::cast(code_object); 1293 Handle<Code> code = Handle<Code>::cast(code_object);
1307 1294
1308 // String long enough for test (content doesn't matter). 1295 // String long enough for test (content doesn't matter).
1309 Handle<String> input = 1296 Handle<String> input = factory->NewStringFromStaticChars("dummy");
1310 factory->NewStringFromStaticAscii("dummy");
1311 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 1297 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
1312 Address start_adr = seq_input->GetCharsAddress(); 1298 Address start_adr = seq_input->GetCharsAddress();
1313 1299
1314 NativeRegExpMacroAssembler::Result result = 1300 NativeRegExpMacroAssembler::Result result =
1315 Execute(*code, 1301 Execute(*code,
1316 *input, 1302 *input,
1317 0, 1303 0,
1318 start_adr, 1304 start_adr,
1319 start_adr + input->length(), 1305 start_adr + input->length(),
1320 NULL); 1306 NULL);
1321 1307
1322 CHECK_EQ(NativeRegExpMacroAssembler::EXCEPTION, result); 1308 CHECK_EQ(NativeRegExpMacroAssembler::EXCEPTION, result);
1323 CHECK(isolate->has_pending_exception()); 1309 CHECK(isolate->has_pending_exception());
1324 isolate->clear_pending_exception(); 1310 isolate->clear_pending_exception();
1325 } 1311 }
1326 1312
1327 1313
1328 TEST(MacroAssemblerNativeLotsOfRegisters) { 1314 TEST(MacroAssemblerNativeLotsOfRegisters) {
1329 v8::V8::Initialize(); 1315 v8::V8::Initialize();
1330 ContextInitializer initializer; 1316 ContextInitializer initializer;
1331 Isolate* isolate = CcTest::i_isolate(); 1317 Isolate* isolate = CcTest::i_isolate();
1332 Factory* factory = isolate->factory(); 1318 Factory* factory = isolate->factory();
1333 Zone zone(isolate); 1319 Zone zone(isolate);
1334 1320
1335 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 2, &zone); 1321 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::LATIN1, 2, &zone);
1336 1322
1337 // At least 2048, to ensure the allocated space for registers 1323 // At least 2048, to ensure the allocated space for registers
1338 // span one full page. 1324 // span one full page.
1339 const int large_number = 8000; 1325 const int large_number = 8000;
1340 m.WriteCurrentPositionToRegister(large_number, 42); 1326 m.WriteCurrentPositionToRegister(large_number, 42);
1341 m.WriteCurrentPositionToRegister(0, 0); 1327 m.WriteCurrentPositionToRegister(0, 0);
1342 m.WriteCurrentPositionToRegister(1, 1); 1328 m.WriteCurrentPositionToRegister(1, 1);
1343 Label done; 1329 Label done;
1344 m.CheckNotBackReference(0, &done); // Performs a system-stack push. 1330 m.CheckNotBackReference(0, &done); // Performs a system-stack push.
1345 m.Bind(&done); 1331 m.Bind(&done);
1346 m.PushRegister(large_number, RegExpMacroAssembler::kNoStackLimitCheck); 1332 m.PushRegister(large_number, RegExpMacroAssembler::kNoStackLimitCheck);
1347 m.PopRegister(1); 1333 m.PopRegister(1);
1348 m.Succeed(); 1334 m.Succeed();
1349 1335
1350 Handle<String> source = 1336 Handle<String> source =
1351 factory->NewStringFromStaticAscii("<huge register space test>"); 1337 factory->NewStringFromStaticChars("<huge register space test>");
1352 Handle<Object> code_object = m.GetCode(source); 1338 Handle<Object> code_object = m.GetCode(source);
1353 Handle<Code> code = Handle<Code>::cast(code_object); 1339 Handle<Code> code = Handle<Code>::cast(code_object);
1354 1340
1355 // String long enough for test (content doesn't matter). 1341 // String long enough for test (content doesn't matter).
1356 Handle<String> input = 1342 Handle<String> input = factory->NewStringFromStaticChars("sample text");
1357 factory->NewStringFromStaticAscii("sample text");
1358 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input); 1343 Handle<SeqOneByteString> seq_input = Handle<SeqOneByteString>::cast(input);
1359 Address start_adr = seq_input->GetCharsAddress(); 1344 Address start_adr = seq_input->GetCharsAddress();
1360 1345
1361 int captures[2]; 1346 int captures[2];
1362 NativeRegExpMacroAssembler::Result result = 1347 NativeRegExpMacroAssembler::Result result =
1363 Execute(*code, 1348 Execute(*code,
1364 *input, 1349 *input,
1365 0, 1350 0,
1366 start_adr, 1351 start_adr,
1367 start_adr + input->length(), 1352 start_adr + input->length(),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 m.ClearRegisters(2, 3); 1394 m.ClearRegisters(2, 3);
1410 m.Backtrack(); 1395 m.Backtrack();
1411 m.Bind(&fail); 1396 m.Bind(&fail);
1412 m.PopRegister(0); 1397 m.PopRegister(0);
1413 m.Fail(); 1398 m.Fail();
1414 1399
1415 Isolate* isolate = CcTest::i_isolate(); 1400 Isolate* isolate = CcTest::i_isolate();
1416 Factory* factory = isolate->factory(); 1401 Factory* factory = isolate->factory();
1417 HandleScope scope(isolate); 1402 HandleScope scope(isolate);
1418 1403
1419 Handle<String> source = factory->NewStringFromStaticAscii("^f(o)o"); 1404 Handle<String> source = factory->NewStringFromStaticChars("^f(o)o");
1420 Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode(source)); 1405 Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode(source));
1421 int captures[5]; 1406 int captures[5];
1422 1407
1423 const uc16 str1[] = {'f', 'o', 'o', 'b', 'a', 'r'}; 1408 const uc16 str1[] = {'f', 'o', 'o', 'b', 'a', 'r'};
1424 Handle<String> f1_16 = factory->NewStringFromTwoByte( 1409 Handle<String> f1_16 = factory->NewStringFromTwoByte(
1425 Vector<const uc16>(str1, 6)).ToHandleChecked(); 1410 Vector<const uc16>(str1, 6)).ToHandleChecked();
1426 1411
1427 CHECK(IrregexpInterpreter::Match(isolate, array, f1_16, captures, 0)); 1412 CHECK(IrregexpInterpreter::Match(isolate, array, f1_16, captures, 0));
1428 CHECK_EQ(0, captures[0]); 1413 CHECK_EQ(0, captures[0]);
1429 CHECK_EQ(3, captures[1]); 1414 CHECK_EQ(3, captures[1]);
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1819 ZoneList<CharacterRange> first_only(4, &zone); 1804 ZoneList<CharacterRange> first_only(4, &zone);
1820 ZoneList<CharacterRange> second_only(4, &zone); 1805 ZoneList<CharacterRange> second_only(4, &zone);
1821 ZoneList<CharacterRange> both(4, &zone); 1806 ZoneList<CharacterRange> both(4, &zone);
1822 } 1807 }
1823 1808
1824 1809
1825 TEST(Graph) { 1810 TEST(Graph) {
1826 V8::Initialize(NULL); 1811 V8::Initialize(NULL);
1827 Execute("\\b\\w+\\b", false, true, true); 1812 Execute("\\b\\w+\\b", false, true, true);
1828 } 1813 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698