| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 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 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 TestCharacterClassEscapes('D', NotDigit); | 481 TestCharacterClassEscapes('D', NotDigit); |
| 482 TestCharacterClassEscapes('s', IsWhiteSpace); | 482 TestCharacterClassEscapes('s', IsWhiteSpace); |
| 483 TestCharacterClassEscapes('S', NotWhiteSpace); | 483 TestCharacterClassEscapes('S', NotWhiteSpace); |
| 484 TestCharacterClassEscapes('w', IsRegExpWord); | 484 TestCharacterClassEscapes('w', IsRegExpWord); |
| 485 TestCharacterClassEscapes('W', NotWord); | 485 TestCharacterClassEscapes('W', NotWord); |
| 486 } | 486 } |
| 487 | 487 |
| 488 | 488 |
| 489 static RegExpNode* Compile(const char* input, bool multiline, bool is_ascii) { | 489 static RegExpNode* Compile(const char* input, bool multiline, bool is_ascii) { |
| 490 V8::Initialize(NULL); | 490 V8::Initialize(NULL); |
| 491 Isolate* isolate = Isolate::Current(); | 491 FlatStringReader reader(Isolate::Current(), CStrVector(input)); |
| 492 FlatStringReader reader(isolate, CStrVector(input)); | |
| 493 RegExpCompileData compile_data; | 492 RegExpCompileData compile_data; |
| 494 if (!v8::internal::RegExpParser::ParseRegExp(&reader, multiline, | 493 if (!v8::internal::RegExpParser::ParseRegExp(&reader, multiline, |
| 495 &compile_data)) | 494 &compile_data)) |
| 496 return NULL; | 495 return NULL; |
| 497 Handle<String> pattern = isolate->factory()-> | 496 Handle<String> pattern = FACTORY->NewStringFromUtf8(CStrVector(input)); |
| 498 NewStringFromUtf8(CStrVector(input)); | |
| 499 RegExpEngine::Compile(&compile_data, false, multiline, pattern, is_ascii); | 497 RegExpEngine::Compile(&compile_data, false, multiline, pattern, is_ascii); |
| 500 return compile_data.node; | 498 return compile_data.node; |
| 501 } | 499 } |
| 502 | 500 |
| 503 | 501 |
| 504 static void Execute(const char* input, | 502 static void Execute(const char* input, |
| 505 bool multiline, | 503 bool multiline, |
| 506 bool is_ascii, | 504 bool is_ascii, |
| 507 bool dot_output = false) { | 505 bool dot_output = false) { |
| 508 v8::HandleScope scope; | 506 v8::HandleScope scope; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 input_start, | 708 input_start, |
| 711 input_end, | 709 input_end, |
| 712 captures, | 710 captures, |
| 713 Isolate::Current()); | 711 Isolate::Current()); |
| 714 } | 712 } |
| 715 | 713 |
| 716 | 714 |
| 717 TEST(MacroAssemblerNativeSuccess) { | 715 TEST(MacroAssemblerNativeSuccess) { |
| 718 v8::V8::Initialize(); | 716 v8::V8::Initialize(); |
| 719 ContextInitializer initializer; | 717 ContextInitializer initializer; |
| 720 Factory* factory = Isolate::Current()->factory(); | |
| 721 | 718 |
| 722 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 719 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); |
| 723 | 720 |
| 724 m.Succeed(); | 721 m.Succeed(); |
| 725 | 722 |
| 726 Handle<String> source = factory->NewStringFromAscii(CStrVector("")); | 723 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("")); |
| 727 Handle<Object> code_object = m.GetCode(source); | 724 Handle<Object> code_object = m.GetCode(source); |
| 728 Handle<Code> code = Handle<Code>::cast(code_object); | 725 Handle<Code> code = Handle<Code>::cast(code_object); |
| 729 | 726 |
| 730 int captures[4] = {42, 37, 87, 117}; | 727 int captures[4] = {42, 37, 87, 117}; |
| 731 Handle<String> input = factory->NewStringFromAscii(CStrVector("foofoo")); | 728 Handle<String> input = FACTORY->NewStringFromAscii(CStrVector("foofoo")); |
| 732 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 729 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 733 const byte* start_adr = | 730 const byte* start_adr = |
| 734 reinterpret_cast<const byte*>(seq_input->GetCharsAddress()); | 731 reinterpret_cast<const byte*>(seq_input->GetCharsAddress()); |
| 735 | 732 |
| 736 NativeRegExpMacroAssembler::Result result = | 733 NativeRegExpMacroAssembler::Result result = |
| 737 Execute(*code, | 734 Execute(*code, |
| 738 *input, | 735 *input, |
| 739 0, | 736 0, |
| 740 start_adr, | 737 start_adr, |
| 741 start_adr + seq_input->length(), | 738 start_adr + seq_input->length(), |
| 742 captures); | 739 captures); |
| 743 | 740 |
| 744 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 741 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 745 CHECK_EQ(-1, captures[0]); | 742 CHECK_EQ(-1, captures[0]); |
| 746 CHECK_EQ(-1, captures[1]); | 743 CHECK_EQ(-1, captures[1]); |
| 747 CHECK_EQ(-1, captures[2]); | 744 CHECK_EQ(-1, captures[2]); |
| 748 CHECK_EQ(-1, captures[3]); | 745 CHECK_EQ(-1, captures[3]); |
| 749 } | 746 } |
| 750 | 747 |
| 751 | 748 |
| 752 TEST(MacroAssemblerNativeSimple) { | 749 TEST(MacroAssemblerNativeSimple) { |
| 753 v8::V8::Initialize(); | 750 v8::V8::Initialize(); |
| 754 ContextInitializer initializer; | 751 ContextInitializer initializer; |
| 755 Factory* factory = Isolate::Current()->factory(); | |
| 756 | 752 |
| 757 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 753 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); |
| 758 | 754 |
| 759 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 755 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
| 760 Vector<const uc16> foo(foo_chars, 3); | 756 Vector<const uc16> foo(foo_chars, 3); |
| 761 | 757 |
| 762 Label fail; | 758 Label fail; |
| 763 m.CheckCharacters(foo, 0, &fail, true); | 759 m.CheckCharacters(foo, 0, &fail, true); |
| 764 m.WriteCurrentPositionToRegister(0, 0); | 760 m.WriteCurrentPositionToRegister(0, 0); |
| 765 m.AdvanceCurrentPosition(3); | 761 m.AdvanceCurrentPosition(3); |
| 766 m.WriteCurrentPositionToRegister(1, 0); | 762 m.WriteCurrentPositionToRegister(1, 0); |
| 767 m.Succeed(); | 763 m.Succeed(); |
| 768 m.Bind(&fail); | 764 m.Bind(&fail); |
| 769 m.Fail(); | 765 m.Fail(); |
| 770 | 766 |
| 771 Handle<String> source = factory->NewStringFromAscii(CStrVector("^foo")); | 767 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("^foo")); |
| 772 Handle<Object> code_object = m.GetCode(source); | 768 Handle<Object> code_object = m.GetCode(source); |
| 773 Handle<Code> code = Handle<Code>::cast(code_object); | 769 Handle<Code> code = Handle<Code>::cast(code_object); |
| 774 | 770 |
| 775 int captures[4] = {42, 37, 87, 117}; | 771 int captures[4] = {42, 37, 87, 117}; |
| 776 Handle<String> input = factory->NewStringFromAscii(CStrVector("foofoo")); | 772 Handle<String> input = FACTORY->NewStringFromAscii(CStrVector("foofoo")); |
| 777 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 773 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 778 Address start_adr = seq_input->GetCharsAddress(); | 774 Address start_adr = seq_input->GetCharsAddress(); |
| 779 | 775 |
| 780 NativeRegExpMacroAssembler::Result result = | 776 NativeRegExpMacroAssembler::Result result = |
| 781 Execute(*code, | 777 Execute(*code, |
| 782 *input, | 778 *input, |
| 783 0, | 779 0, |
| 784 start_adr, | 780 start_adr, |
| 785 start_adr + input->length(), | 781 start_adr + input->length(), |
| 786 captures); | 782 captures); |
| 787 | 783 |
| 788 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 784 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 789 CHECK_EQ(0, captures[0]); | 785 CHECK_EQ(0, captures[0]); |
| 790 CHECK_EQ(3, captures[1]); | 786 CHECK_EQ(3, captures[1]); |
| 791 CHECK_EQ(-1, captures[2]); | 787 CHECK_EQ(-1, captures[2]); |
| 792 CHECK_EQ(-1, captures[3]); | 788 CHECK_EQ(-1, captures[3]); |
| 793 | 789 |
| 794 input = factory->NewStringFromAscii(CStrVector("barbarbar")); | 790 input = FACTORY->NewStringFromAscii(CStrVector("barbarbar")); |
| 795 seq_input = Handle<SeqAsciiString>::cast(input); | 791 seq_input = Handle<SeqAsciiString>::cast(input); |
| 796 start_adr = seq_input->GetCharsAddress(); | 792 start_adr = seq_input->GetCharsAddress(); |
| 797 | 793 |
| 798 result = Execute(*code, | 794 result = Execute(*code, |
| 799 *input, | 795 *input, |
| 800 0, | 796 0, |
| 801 start_adr, | 797 start_adr, |
| 802 start_adr + input->length(), | 798 start_adr + input->length(), |
| 803 captures); | 799 captures); |
| 804 | 800 |
| 805 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); | 801 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); |
| 806 } | 802 } |
| 807 | 803 |
| 808 | 804 |
| 809 TEST(MacroAssemblerNativeSimpleUC16) { | 805 TEST(MacroAssemblerNativeSimpleUC16) { |
| 810 v8::V8::Initialize(); | 806 v8::V8::Initialize(); |
| 811 ContextInitializer initializer; | 807 ContextInitializer initializer; |
| 812 Factory* factory = Isolate::Current()->factory(); | |
| 813 | 808 |
| 814 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); | 809 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); |
| 815 | 810 |
| 816 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 811 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
| 817 Vector<const uc16> foo(foo_chars, 3); | 812 Vector<const uc16> foo(foo_chars, 3); |
| 818 | 813 |
| 819 Label fail; | 814 Label fail; |
| 820 m.CheckCharacters(foo, 0, &fail, true); | 815 m.CheckCharacters(foo, 0, &fail, true); |
| 821 m.WriteCurrentPositionToRegister(0, 0); | 816 m.WriteCurrentPositionToRegister(0, 0); |
| 822 m.AdvanceCurrentPosition(3); | 817 m.AdvanceCurrentPosition(3); |
| 823 m.WriteCurrentPositionToRegister(1, 0); | 818 m.WriteCurrentPositionToRegister(1, 0); |
| 824 m.Succeed(); | 819 m.Succeed(); |
| 825 m.Bind(&fail); | 820 m.Bind(&fail); |
| 826 m.Fail(); | 821 m.Fail(); |
| 827 | 822 |
| 828 Handle<String> source = factory->NewStringFromAscii(CStrVector("^foo")); | 823 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("^foo")); |
| 829 Handle<Object> code_object = m.GetCode(source); | 824 Handle<Object> code_object = m.GetCode(source); |
| 830 Handle<Code> code = Handle<Code>::cast(code_object); | 825 Handle<Code> code = Handle<Code>::cast(code_object); |
| 831 | 826 |
| 832 int captures[4] = {42, 37, 87, 117}; | 827 int captures[4] = {42, 37, 87, 117}; |
| 833 const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o', '\xa0'}; | 828 const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o', '\xa0'}; |
| 834 Handle<String> input = | 829 Handle<String> input = |
| 835 factory->NewStringFromTwoByte(Vector<const uc16>(input_data, 6)); | 830 FACTORY->NewStringFromTwoByte(Vector<const uc16>(input_data, 6)); |
| 836 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); | 831 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); |
| 837 Address start_adr = seq_input->GetCharsAddress(); | 832 Address start_adr = seq_input->GetCharsAddress(); |
| 838 | 833 |
| 839 NativeRegExpMacroAssembler::Result result = | 834 NativeRegExpMacroAssembler::Result result = |
| 840 Execute(*code, | 835 Execute(*code, |
| 841 *input, | 836 *input, |
| 842 0, | 837 0, |
| 843 start_adr, | 838 start_adr, |
| 844 start_adr + input->length(), | 839 start_adr + input->length(), |
| 845 captures); | 840 captures); |
| 846 | 841 |
| 847 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 842 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 848 CHECK_EQ(0, captures[0]); | 843 CHECK_EQ(0, captures[0]); |
| 849 CHECK_EQ(3, captures[1]); | 844 CHECK_EQ(3, captures[1]); |
| 850 CHECK_EQ(-1, captures[2]); | 845 CHECK_EQ(-1, captures[2]); |
| 851 CHECK_EQ(-1, captures[3]); | 846 CHECK_EQ(-1, captures[3]); |
| 852 | 847 |
| 853 const uc16 input_data2[9] = {'b', 'a', 'r', 'b', 'a', 'r', 'b', 'a', '\xa0'}; | 848 const uc16 input_data2[9] = {'b', 'a', 'r', 'b', 'a', 'r', 'b', 'a', '\xa0'}; |
| 854 input = factory->NewStringFromTwoByte(Vector<const uc16>(input_data2, 9)); | 849 input = FACTORY->NewStringFromTwoByte(Vector<const uc16>(input_data2, 9)); |
| 855 seq_input = Handle<SeqTwoByteString>::cast(input); | 850 seq_input = Handle<SeqTwoByteString>::cast(input); |
| 856 start_adr = seq_input->GetCharsAddress(); | 851 start_adr = seq_input->GetCharsAddress(); |
| 857 | 852 |
| 858 result = Execute(*code, | 853 result = Execute(*code, |
| 859 *input, | 854 *input, |
| 860 0, | 855 0, |
| 861 start_adr, | 856 start_adr, |
| 862 start_adr + input->length() * 2, | 857 start_adr + input->length() * 2, |
| 863 captures); | 858 captures); |
| 864 | 859 |
| 865 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); | 860 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); |
| 866 } | 861 } |
| 867 | 862 |
| 868 | 863 |
| 869 TEST(MacroAssemblerNativeBacktrack) { | 864 TEST(MacroAssemblerNativeBacktrack) { |
| 870 v8::V8::Initialize(); | 865 v8::V8::Initialize(); |
| 871 ContextInitializer initializer; | 866 ContextInitializer initializer; |
| 872 Factory* factory = Isolate::Current()->factory(); | |
| 873 | 867 |
| 874 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); | 868 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); |
| 875 | 869 |
| 876 Label fail; | 870 Label fail; |
| 877 Label backtrack; | 871 Label backtrack; |
| 878 m.LoadCurrentCharacter(10, &fail); | 872 m.LoadCurrentCharacter(10, &fail); |
| 879 m.Succeed(); | 873 m.Succeed(); |
| 880 m.Bind(&fail); | 874 m.Bind(&fail); |
| 881 m.PushBacktrack(&backtrack); | 875 m.PushBacktrack(&backtrack); |
| 882 m.LoadCurrentCharacter(10, NULL); | 876 m.LoadCurrentCharacter(10, NULL); |
| 883 m.Succeed(); | 877 m.Succeed(); |
| 884 m.Bind(&backtrack); | 878 m.Bind(&backtrack); |
| 885 m.Fail(); | 879 m.Fail(); |
| 886 | 880 |
| 887 Handle<String> source = factory->NewStringFromAscii(CStrVector("..........")); | 881 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("..........")); |
| 888 Handle<Object> code_object = m.GetCode(source); | 882 Handle<Object> code_object = m.GetCode(source); |
| 889 Handle<Code> code = Handle<Code>::cast(code_object); | 883 Handle<Code> code = Handle<Code>::cast(code_object); |
| 890 | 884 |
| 891 Handle<String> input = factory->NewStringFromAscii(CStrVector("foofoo")); | 885 Handle<String> input = FACTORY->NewStringFromAscii(CStrVector("foofoo")); |
| 892 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 886 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 893 Address start_adr = seq_input->GetCharsAddress(); | 887 Address start_adr = seq_input->GetCharsAddress(); |
| 894 | 888 |
| 895 NativeRegExpMacroAssembler::Result result = | 889 NativeRegExpMacroAssembler::Result result = |
| 896 Execute(*code, | 890 Execute(*code, |
| 897 *input, | 891 *input, |
| 898 0, | 892 0, |
| 899 start_adr, | 893 start_adr, |
| 900 start_adr + input->length(), | 894 start_adr + input->length(), |
| 901 NULL); | 895 NULL); |
| 902 | 896 |
| 903 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); | 897 CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result); |
| 904 } | 898 } |
| 905 | 899 |
| 906 | 900 |
| 907 TEST(MacroAssemblerNativeBackReferenceASCII) { | 901 TEST(MacroAssemblerNativeBackReferenceASCII) { |
| 908 v8::V8::Initialize(); | 902 v8::V8::Initialize(); |
| 909 ContextInitializer initializer; | 903 ContextInitializer initializer; |
| 910 Factory* factory = Isolate::Current()->factory(); | |
| 911 | 904 |
| 912 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 905 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); |
| 913 | 906 |
| 914 m.WriteCurrentPositionToRegister(0, 0); | 907 m.WriteCurrentPositionToRegister(0, 0); |
| 915 m.AdvanceCurrentPosition(2); | 908 m.AdvanceCurrentPosition(2); |
| 916 m.WriteCurrentPositionToRegister(1, 0); | 909 m.WriteCurrentPositionToRegister(1, 0); |
| 917 Label nomatch; | 910 Label nomatch; |
| 918 m.CheckNotBackReference(0, &nomatch); | 911 m.CheckNotBackReference(0, &nomatch); |
| 919 m.Fail(); | 912 m.Fail(); |
| 920 m.Bind(&nomatch); | 913 m.Bind(&nomatch); |
| 921 m.AdvanceCurrentPosition(2); | 914 m.AdvanceCurrentPosition(2); |
| 922 Label missing_match; | 915 Label missing_match; |
| 923 m.CheckNotBackReference(0, &missing_match); | 916 m.CheckNotBackReference(0, &missing_match); |
| 924 m.WriteCurrentPositionToRegister(2, 0); | 917 m.WriteCurrentPositionToRegister(2, 0); |
| 925 m.Succeed(); | 918 m.Succeed(); |
| 926 m.Bind(&missing_match); | 919 m.Bind(&missing_match); |
| 927 m.Fail(); | 920 m.Fail(); |
| 928 | 921 |
| 929 Handle<String> source = factory->NewStringFromAscii(CStrVector("^(..)..\1")); | 922 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("^(..)..\1")); |
| 930 Handle<Object> code_object = m.GetCode(source); | 923 Handle<Object> code_object = m.GetCode(source); |
| 931 Handle<Code> code = Handle<Code>::cast(code_object); | 924 Handle<Code> code = Handle<Code>::cast(code_object); |
| 932 | 925 |
| 933 Handle<String> input = factory->NewStringFromAscii(CStrVector("fooofo")); | 926 Handle<String> input = FACTORY->NewStringFromAscii(CStrVector("fooofo")); |
| 934 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 927 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 935 Address start_adr = seq_input->GetCharsAddress(); | 928 Address start_adr = seq_input->GetCharsAddress(); |
| 936 | 929 |
| 937 int output[4]; | 930 int output[4]; |
| 938 NativeRegExpMacroAssembler::Result result = | 931 NativeRegExpMacroAssembler::Result result = |
| 939 Execute(*code, | 932 Execute(*code, |
| 940 *input, | 933 *input, |
| 941 0, | 934 0, |
| 942 start_adr, | 935 start_adr, |
| 943 start_adr + input->length(), | 936 start_adr + input->length(), |
| 944 output); | 937 output); |
| 945 | 938 |
| 946 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 939 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 947 CHECK_EQ(0, output[0]); | 940 CHECK_EQ(0, output[0]); |
| 948 CHECK_EQ(2, output[1]); | 941 CHECK_EQ(2, output[1]); |
| 949 CHECK_EQ(6, output[2]); | 942 CHECK_EQ(6, output[2]); |
| 950 CHECK_EQ(-1, output[3]); | 943 CHECK_EQ(-1, output[3]); |
| 951 } | 944 } |
| 952 | 945 |
| 953 | 946 |
| 954 TEST(MacroAssemblerNativeBackReferenceUC16) { | 947 TEST(MacroAssemblerNativeBackReferenceUC16) { |
| 955 v8::V8::Initialize(); | 948 v8::V8::Initialize(); |
| 956 ContextInitializer initializer; | 949 ContextInitializer initializer; |
| 957 Factory* factory = Isolate::Current()->factory(); | |
| 958 | 950 |
| 959 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); | 951 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4); |
| 960 | 952 |
| 961 m.WriteCurrentPositionToRegister(0, 0); | 953 m.WriteCurrentPositionToRegister(0, 0); |
| 962 m.AdvanceCurrentPosition(2); | 954 m.AdvanceCurrentPosition(2); |
| 963 m.WriteCurrentPositionToRegister(1, 0); | 955 m.WriteCurrentPositionToRegister(1, 0); |
| 964 Label nomatch; | 956 Label nomatch; |
| 965 m.CheckNotBackReference(0, &nomatch); | 957 m.CheckNotBackReference(0, &nomatch); |
| 966 m.Fail(); | 958 m.Fail(); |
| 967 m.Bind(&nomatch); | 959 m.Bind(&nomatch); |
| 968 m.AdvanceCurrentPosition(2); | 960 m.AdvanceCurrentPosition(2); |
| 969 Label missing_match; | 961 Label missing_match; |
| 970 m.CheckNotBackReference(0, &missing_match); | 962 m.CheckNotBackReference(0, &missing_match); |
| 971 m.WriteCurrentPositionToRegister(2, 0); | 963 m.WriteCurrentPositionToRegister(2, 0); |
| 972 m.Succeed(); | 964 m.Succeed(); |
| 973 m.Bind(&missing_match); | 965 m.Bind(&missing_match); |
| 974 m.Fail(); | 966 m.Fail(); |
| 975 | 967 |
| 976 Handle<String> source = factory->NewStringFromAscii(CStrVector("^(..)..\1")); | 968 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("^(..)..\1")); |
| 977 Handle<Object> code_object = m.GetCode(source); | 969 Handle<Object> code_object = m.GetCode(source); |
| 978 Handle<Code> code = Handle<Code>::cast(code_object); | 970 Handle<Code> code = Handle<Code>::cast(code_object); |
| 979 | 971 |
| 980 const uc16 input_data[6] = {'f', 0x2028, 'o', 'o', 'f', 0x2028}; | 972 const uc16 input_data[6] = {'f', 0x2028, 'o', 'o', 'f', 0x2028}; |
| 981 Handle<String> input = | 973 Handle<String> input = |
| 982 factory->NewStringFromTwoByte(Vector<const uc16>(input_data, 6)); | 974 FACTORY->NewStringFromTwoByte(Vector<const uc16>(input_data, 6)); |
| 983 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); | 975 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); |
| 984 Address start_adr = seq_input->GetCharsAddress(); | 976 Address start_adr = seq_input->GetCharsAddress(); |
| 985 | 977 |
| 986 int output[4]; | 978 int output[4]; |
| 987 NativeRegExpMacroAssembler::Result result = | 979 NativeRegExpMacroAssembler::Result result = |
| 988 Execute(*code, | 980 Execute(*code, |
| 989 *input, | 981 *input, |
| 990 0, | 982 0, |
| 991 start_adr, | 983 start_adr, |
| 992 start_adr + input->length() * 2, | 984 start_adr + input->length() * 2, |
| 993 output); | 985 output); |
| 994 | 986 |
| 995 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 987 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 996 CHECK_EQ(0, output[0]); | 988 CHECK_EQ(0, output[0]); |
| 997 CHECK_EQ(2, output[1]); | 989 CHECK_EQ(2, output[1]); |
| 998 CHECK_EQ(6, output[2]); | 990 CHECK_EQ(6, output[2]); |
| 999 CHECK_EQ(-1, output[3]); | 991 CHECK_EQ(-1, output[3]); |
| 1000 } | 992 } |
| 1001 | 993 |
| 1002 | 994 |
| 1003 | 995 |
| 1004 TEST(MacroAssemblernativeAtStart) { | 996 TEST(MacroAssemblernativeAtStart) { |
| 1005 v8::V8::Initialize(); | 997 v8::V8::Initialize(); |
| 1006 ContextInitializer initializer; | 998 ContextInitializer initializer; |
| 1007 Factory* factory = Isolate::Current()->factory(); | |
| 1008 | 999 |
| 1009 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); | 1000 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); |
| 1010 | 1001 |
| 1011 Label not_at_start, newline, fail; | 1002 Label not_at_start, newline, fail; |
| 1012 m.CheckNotAtStart(¬_at_start); | 1003 m.CheckNotAtStart(¬_at_start); |
| 1013 // Check that prevchar = '\n' and current = 'f'. | 1004 // Check that prevchar = '\n' and current = 'f'. |
| 1014 m.CheckCharacter('\n', &newline); | 1005 m.CheckCharacter('\n', &newline); |
| 1015 m.Bind(&fail); | 1006 m.Bind(&fail); |
| 1016 m.Fail(); | 1007 m.Fail(); |
| 1017 m.Bind(&newline); | 1008 m.Bind(&newline); |
| 1018 m.LoadCurrentCharacter(0, &fail); | 1009 m.LoadCurrentCharacter(0, &fail); |
| 1019 m.CheckNotCharacter('f', &fail); | 1010 m.CheckNotCharacter('f', &fail); |
| 1020 m.Succeed(); | 1011 m.Succeed(); |
| 1021 | 1012 |
| 1022 m.Bind(¬_at_start); | 1013 m.Bind(¬_at_start); |
| 1023 // Check that prevchar = 'o' and current = 'b'. | 1014 // Check that prevchar = 'o' and current = 'b'. |
| 1024 Label prevo; | 1015 Label prevo; |
| 1025 m.CheckCharacter('o', &prevo); | 1016 m.CheckCharacter('o', &prevo); |
| 1026 m.Fail(); | 1017 m.Fail(); |
| 1027 m.Bind(&prevo); | 1018 m.Bind(&prevo); |
| 1028 m.LoadCurrentCharacter(0, &fail); | 1019 m.LoadCurrentCharacter(0, &fail); |
| 1029 m.CheckNotCharacter('b', &fail); | 1020 m.CheckNotCharacter('b', &fail); |
| 1030 m.Succeed(); | 1021 m.Succeed(); |
| 1031 | 1022 |
| 1032 Handle<String> source = factory->NewStringFromAscii(CStrVector("(^f|ob)")); | 1023 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("(^f|ob)")); |
| 1033 Handle<Object> code_object = m.GetCode(source); | 1024 Handle<Object> code_object = m.GetCode(source); |
| 1034 Handle<Code> code = Handle<Code>::cast(code_object); | 1025 Handle<Code> code = Handle<Code>::cast(code_object); |
| 1035 | 1026 |
| 1036 Handle<String> input = factory->NewStringFromAscii(CStrVector("foobar")); | 1027 Handle<String> input = FACTORY->NewStringFromAscii(CStrVector("foobar")); |
| 1037 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 1028 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 1038 Address start_adr = seq_input->GetCharsAddress(); | 1029 Address start_adr = seq_input->GetCharsAddress(); |
| 1039 | 1030 |
| 1040 NativeRegExpMacroAssembler::Result result = | 1031 NativeRegExpMacroAssembler::Result result = |
| 1041 Execute(*code, | 1032 Execute(*code, |
| 1042 *input, | 1033 *input, |
| 1043 0, | 1034 0, |
| 1044 start_adr, | 1035 start_adr, |
| 1045 start_adr + input->length(), | 1036 start_adr + input->length(), |
| 1046 NULL); | 1037 NULL); |
| 1047 | 1038 |
| 1048 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 1039 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 1049 | 1040 |
| 1050 result = Execute(*code, | 1041 result = Execute(*code, |
| 1051 *input, | 1042 *input, |
| 1052 3, | 1043 3, |
| 1053 start_adr + 3, | 1044 start_adr + 3, |
| 1054 start_adr + input->length(), | 1045 start_adr + input->length(), |
| 1055 NULL); | 1046 NULL); |
| 1056 | 1047 |
| 1057 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 1048 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 1058 } | 1049 } |
| 1059 | 1050 |
| 1060 | 1051 |
| 1061 TEST(MacroAssemblerNativeBackRefNoCase) { | 1052 TEST(MacroAssemblerNativeBackRefNoCase) { |
| 1062 v8::V8::Initialize(); | 1053 v8::V8::Initialize(); |
| 1063 ContextInitializer initializer; | 1054 ContextInitializer initializer; |
| 1064 Factory* factory = Isolate::Current()->factory(); | |
| 1065 | 1055 |
| 1066 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); | 1056 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4); |
| 1067 | 1057 |
| 1068 Label fail, succ; | 1058 Label fail, succ; |
| 1069 | 1059 |
| 1070 m.WriteCurrentPositionToRegister(0, 0); | 1060 m.WriteCurrentPositionToRegister(0, 0); |
| 1071 m.WriteCurrentPositionToRegister(2, 0); | 1061 m.WriteCurrentPositionToRegister(2, 0); |
| 1072 m.AdvanceCurrentPosition(3); | 1062 m.AdvanceCurrentPosition(3); |
| 1073 m.WriteCurrentPositionToRegister(3, 0); | 1063 m.WriteCurrentPositionToRegister(3, 0); |
| 1074 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". | 1064 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". |
| 1075 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". | 1065 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". |
| 1076 Label expected_fail; | 1066 Label expected_fail; |
| 1077 m.CheckNotBackReferenceIgnoreCase(2, &expected_fail); | 1067 m.CheckNotBackReferenceIgnoreCase(2, &expected_fail); |
| 1078 m.Bind(&fail); | 1068 m.Bind(&fail); |
| 1079 m.Fail(); | 1069 m.Fail(); |
| 1080 | 1070 |
| 1081 m.Bind(&expected_fail); | 1071 m.Bind(&expected_fail); |
| 1082 m.AdvanceCurrentPosition(3); // Skip "xYz" | 1072 m.AdvanceCurrentPosition(3); // Skip "xYz" |
| 1083 m.CheckNotBackReferenceIgnoreCase(2, &succ); | 1073 m.CheckNotBackReferenceIgnoreCase(2, &succ); |
| 1084 m.Fail(); | 1074 m.Fail(); |
| 1085 | 1075 |
| 1086 m.Bind(&succ); | 1076 m.Bind(&succ); |
| 1087 m.WriteCurrentPositionToRegister(1, 0); | 1077 m.WriteCurrentPositionToRegister(1, 0); |
| 1088 m.Succeed(); | 1078 m.Succeed(); |
| 1089 | 1079 |
| 1090 Handle<String> source = | 1080 Handle<String> source = |
| 1091 factory->NewStringFromAscii(CStrVector("^(abc)\1\1(?!\1)...(?!\1)")); | 1081 FACTORY->NewStringFromAscii(CStrVector("^(abc)\1\1(?!\1)...(?!\1)")); |
| 1092 Handle<Object> code_object = m.GetCode(source); | 1082 Handle<Object> code_object = m.GetCode(source); |
| 1093 Handle<Code> code = Handle<Code>::cast(code_object); | 1083 Handle<Code> code = Handle<Code>::cast(code_object); |
| 1094 | 1084 |
| 1095 Handle<String> input = | 1085 Handle<String> input = |
| 1096 factory->NewStringFromAscii(CStrVector("aBcAbCABCxYzab")); | 1086 FACTORY->NewStringFromAscii(CStrVector("aBcAbCABCxYzab")); |
| 1097 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 1087 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 1098 Address start_adr = seq_input->GetCharsAddress(); | 1088 Address start_adr = seq_input->GetCharsAddress(); |
| 1099 | 1089 |
| 1100 int output[4]; | 1090 int output[4]; |
| 1101 NativeRegExpMacroAssembler::Result result = | 1091 NativeRegExpMacroAssembler::Result result = |
| 1102 Execute(*code, | 1092 Execute(*code, |
| 1103 *input, | 1093 *input, |
| 1104 0, | 1094 0, |
| 1105 start_adr, | 1095 start_adr, |
| 1106 start_adr + input->length(), | 1096 start_adr + input->length(), |
| 1107 output); | 1097 output); |
| 1108 | 1098 |
| 1109 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 1099 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 1110 CHECK_EQ(0, output[0]); | 1100 CHECK_EQ(0, output[0]); |
| 1111 CHECK_EQ(12, output[1]); | 1101 CHECK_EQ(12, output[1]); |
| 1112 CHECK_EQ(0, output[2]); | 1102 CHECK_EQ(0, output[2]); |
| 1113 CHECK_EQ(3, output[3]); | 1103 CHECK_EQ(3, output[3]); |
| 1114 } | 1104 } |
| 1115 | 1105 |
| 1116 | 1106 |
| 1117 | 1107 |
| 1118 TEST(MacroAssemblerNativeRegisters) { | 1108 TEST(MacroAssemblerNativeRegisters) { |
| 1119 v8::V8::Initialize(); | 1109 v8::V8::Initialize(); |
| 1120 ContextInitializer initializer; | 1110 ContextInitializer initializer; |
| 1121 Factory* factory = Isolate::Current()->factory(); | |
| 1122 | 1111 |
| 1123 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6); | 1112 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6); |
| 1124 | 1113 |
| 1125 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 1114 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
| 1126 Vector<const uc16> foo(foo_chars, 3); | 1115 Vector<const uc16> foo(foo_chars, 3); |
| 1127 | 1116 |
| 1128 enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt }; | 1117 enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt }; |
| 1129 Label fail; | 1118 Label fail; |
| 1130 Label backtrack; | 1119 Label backtrack; |
| 1131 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] | 1120 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 m.Bind(&exit_loop3); | 1169 m.Bind(&exit_loop3); |
| 1181 m.PopCurrentPosition(); | 1170 m.PopCurrentPosition(); |
| 1182 m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9,-1] | 1171 m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9,-1] |
| 1183 | 1172 |
| 1184 m.Succeed(); | 1173 m.Succeed(); |
| 1185 | 1174 |
| 1186 m.Bind(&fail); | 1175 m.Bind(&fail); |
| 1187 m.Fail(); | 1176 m.Fail(); |
| 1188 | 1177 |
| 1189 Handle<String> source = | 1178 Handle<String> source = |
| 1190 factory->NewStringFromAscii(CStrVector("<loop test>")); | 1179 FACTORY->NewStringFromAscii(CStrVector("<loop test>")); |
| 1191 Handle<Object> code_object = m.GetCode(source); | 1180 Handle<Object> code_object = m.GetCode(source); |
| 1192 Handle<Code> code = Handle<Code>::cast(code_object); | 1181 Handle<Code> code = Handle<Code>::cast(code_object); |
| 1193 | 1182 |
| 1194 // String long enough for test (content doesn't matter). | 1183 // String long enough for test (content doesn't matter). |
| 1195 Handle<String> input = | 1184 Handle<String> input = |
| 1196 factory->NewStringFromAscii(CStrVector("foofoofoofoofoo")); | 1185 FACTORY->NewStringFromAscii(CStrVector("foofoofoofoofoo")); |
| 1197 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 1186 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 1198 Address start_adr = seq_input->GetCharsAddress(); | 1187 Address start_adr = seq_input->GetCharsAddress(); |
| 1199 | 1188 |
| 1200 int output[6]; | 1189 int output[6]; |
| 1201 NativeRegExpMacroAssembler::Result result = | 1190 NativeRegExpMacroAssembler::Result result = |
| 1202 Execute(*code, | 1191 Execute(*code, |
| 1203 *input, | 1192 *input, |
| 1204 0, | 1193 0, |
| 1205 start_adr, | 1194 start_adr, |
| 1206 start_adr + input->length(), | 1195 start_adr + input->length(), |
| 1207 output); | 1196 output); |
| 1208 | 1197 |
| 1209 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 1198 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 1210 CHECK_EQ(0, output[0]); | 1199 CHECK_EQ(0, output[0]); |
| 1211 CHECK_EQ(3, output[1]); | 1200 CHECK_EQ(3, output[1]); |
| 1212 CHECK_EQ(6, output[2]); | 1201 CHECK_EQ(6, output[2]); |
| 1213 CHECK_EQ(9, output[3]); | 1202 CHECK_EQ(9, output[3]); |
| 1214 CHECK_EQ(9, output[4]); | 1203 CHECK_EQ(9, output[4]); |
| 1215 CHECK_EQ(-1, output[5]); | 1204 CHECK_EQ(-1, output[5]); |
| 1216 } | 1205 } |
| 1217 | 1206 |
| 1218 | 1207 |
| 1219 TEST(MacroAssemblerStackOverflow) { | 1208 TEST(MacroAssemblerStackOverflow) { |
| 1220 v8::V8::Initialize(); | 1209 v8::V8::Initialize(); |
| 1221 ContextInitializer initializer; | 1210 ContextInitializer initializer; |
| 1222 Isolate* isolate = Isolate::Current(); | |
| 1223 Factory* factory = isolate->factory(); | |
| 1224 | 1211 |
| 1225 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); | 1212 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0); |
| 1226 | 1213 |
| 1227 Label loop; | 1214 Label loop; |
| 1228 m.Bind(&loop); | 1215 m.Bind(&loop); |
| 1229 m.PushBacktrack(&loop); | 1216 m.PushBacktrack(&loop); |
| 1230 m.GoTo(&loop); | 1217 m.GoTo(&loop); |
| 1231 | 1218 |
| 1232 Handle<String> source = | 1219 Handle<String> source = |
| 1233 factory->NewStringFromAscii(CStrVector("<stack overflow test>")); | 1220 FACTORY->NewStringFromAscii(CStrVector("<stack overflow test>")); |
| 1234 Handle<Object> code_object = m.GetCode(source); | 1221 Handle<Object> code_object = m.GetCode(source); |
| 1235 Handle<Code> code = Handle<Code>::cast(code_object); | 1222 Handle<Code> code = Handle<Code>::cast(code_object); |
| 1236 | 1223 |
| 1237 // String long enough for test (content doesn't matter). | 1224 // String long enough for test (content doesn't matter). |
| 1238 Handle<String> input = | 1225 Handle<String> input = |
| 1239 factory->NewStringFromAscii(CStrVector("dummy")); | 1226 FACTORY->NewStringFromAscii(CStrVector("dummy")); |
| 1240 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 1227 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 1241 Address start_adr = seq_input->GetCharsAddress(); | 1228 Address start_adr = seq_input->GetCharsAddress(); |
| 1242 | 1229 |
| 1243 NativeRegExpMacroAssembler::Result result = | 1230 NativeRegExpMacroAssembler::Result result = |
| 1244 Execute(*code, | 1231 Execute(*code, |
| 1245 *input, | 1232 *input, |
| 1246 0, | 1233 0, |
| 1247 start_adr, | 1234 start_adr, |
| 1248 start_adr + input->length(), | 1235 start_adr + input->length(), |
| 1249 NULL); | 1236 NULL); |
| 1250 | 1237 |
| 1251 CHECK_EQ(NativeRegExpMacroAssembler::EXCEPTION, result); | 1238 CHECK_EQ(NativeRegExpMacroAssembler::EXCEPTION, result); |
| 1252 CHECK(isolate->has_pending_exception()); | 1239 CHECK(Isolate::Current()->has_pending_exception()); |
| 1253 isolate->clear_pending_exception(); | 1240 Isolate::Current()->clear_pending_exception(); |
| 1254 } | 1241 } |
| 1255 | 1242 |
| 1256 | 1243 |
| 1257 TEST(MacroAssemblerNativeLotsOfRegisters) { | 1244 TEST(MacroAssemblerNativeLotsOfRegisters) { |
| 1258 v8::V8::Initialize(); | 1245 v8::V8::Initialize(); |
| 1259 ContextInitializer initializer; | 1246 ContextInitializer initializer; |
| 1260 Isolate* isolate = Isolate::Current(); | |
| 1261 Factory* factory = isolate->factory(); | |
| 1262 | 1247 |
| 1263 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 2); | 1248 ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 2); |
| 1264 | 1249 |
| 1265 // At least 2048, to ensure the allocated space for registers | 1250 // At least 2048, to ensure the allocated space for registers |
| 1266 // span one full page. | 1251 // span one full page. |
| 1267 const int large_number = 8000; | 1252 const int large_number = 8000; |
| 1268 m.WriteCurrentPositionToRegister(large_number, 42); | 1253 m.WriteCurrentPositionToRegister(large_number, 42); |
| 1269 m.WriteCurrentPositionToRegister(0, 0); | 1254 m.WriteCurrentPositionToRegister(0, 0); |
| 1270 m.WriteCurrentPositionToRegister(1, 1); | 1255 m.WriteCurrentPositionToRegister(1, 1); |
| 1271 Label done; | 1256 Label done; |
| 1272 m.CheckNotBackReference(0, &done); // Performs a system-stack push. | 1257 m.CheckNotBackReference(0, &done); // Performs a system-stack push. |
| 1273 m.Bind(&done); | 1258 m.Bind(&done); |
| 1274 m.PushRegister(large_number, RegExpMacroAssembler::kNoStackLimitCheck); | 1259 m.PushRegister(large_number, RegExpMacroAssembler::kNoStackLimitCheck); |
| 1275 m.PopRegister(1); | 1260 m.PopRegister(1); |
| 1276 m.Succeed(); | 1261 m.Succeed(); |
| 1277 | 1262 |
| 1278 Handle<String> source = | 1263 Handle<String> source = |
| 1279 factory->NewStringFromAscii(CStrVector("<huge register space test>")); | 1264 FACTORY->NewStringFromAscii(CStrVector("<huge register space test>")); |
| 1280 Handle<Object> code_object = m.GetCode(source); | 1265 Handle<Object> code_object = m.GetCode(source); |
| 1281 Handle<Code> code = Handle<Code>::cast(code_object); | 1266 Handle<Code> code = Handle<Code>::cast(code_object); |
| 1282 | 1267 |
| 1283 // String long enough for test (content doesn't matter). | 1268 // String long enough for test (content doesn't matter). |
| 1284 Handle<String> input = | 1269 Handle<String> input = |
| 1285 factory->NewStringFromAscii(CStrVector("sample text")); | 1270 FACTORY->NewStringFromAscii(CStrVector("sample text")); |
| 1286 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 1271 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 1287 Address start_adr = seq_input->GetCharsAddress(); | 1272 Address start_adr = seq_input->GetCharsAddress(); |
| 1288 | 1273 |
| 1289 int captures[2]; | 1274 int captures[2]; |
| 1290 NativeRegExpMacroAssembler::Result result = | 1275 NativeRegExpMacroAssembler::Result result = |
| 1291 Execute(*code, | 1276 Execute(*code, |
| 1292 *input, | 1277 *input, |
| 1293 0, | 1278 0, |
| 1294 start_adr, | 1279 start_adr, |
| 1295 start_adr + input->length(), | 1280 start_adr + input->length(), |
| 1296 captures); | 1281 captures); |
| 1297 | 1282 |
| 1298 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); | 1283 CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result); |
| 1299 CHECK_EQ(0, captures[0]); | 1284 CHECK_EQ(0, captures[0]); |
| 1300 CHECK_EQ(42, captures[1]); | 1285 CHECK_EQ(42, captures[1]); |
| 1301 | 1286 |
| 1302 isolate->clear_pending_exception(); | 1287 Isolate::Current()->clear_pending_exception(); |
| 1303 } | 1288 } |
| 1304 | 1289 |
| 1305 #else // V8_INTERPRETED_REGEXP | 1290 #else // V8_INTERPRETED_REGEXP |
| 1306 | 1291 |
| 1307 TEST(MacroAssembler) { | 1292 TEST(MacroAssembler) { |
| 1308 V8::Initialize(NULL); | 1293 V8::Initialize(NULL); |
| 1309 byte codes[1024]; | 1294 byte codes[1024]; |
| 1310 RegExpMacroAssemblerIrregexp m(Vector<byte>(codes, 1024)); | 1295 RegExpMacroAssemblerIrregexp m(Vector<byte>(codes, 1024)); |
| 1311 // ^f(o)o. | 1296 // ^f(o)o. |
| 1312 Label fail, fail2, start; | 1297 Label fail, fail2, start; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1335 m.Succeed(); | 1320 m.Succeed(); |
| 1336 | 1321 |
| 1337 m.Bind(&fail); | 1322 m.Bind(&fail); |
| 1338 m.Backtrack(); | 1323 m.Backtrack(); |
| 1339 m.Succeed(); | 1324 m.Succeed(); |
| 1340 | 1325 |
| 1341 m.Bind(&fail2); | 1326 m.Bind(&fail2); |
| 1342 m.PopRegister(0); | 1327 m.PopRegister(0); |
| 1343 m.Fail(); | 1328 m.Fail(); |
| 1344 | 1329 |
| 1345 Isolate* isolate = Isolate::Current(); | 1330 v8::HandleScope scope; |
| 1346 Factory* factory = isolate->factory(); | |
| 1347 HandleScope scope(isolate); | |
| 1348 | 1331 |
| 1349 Handle<String> source = factory->NewStringFromAscii(CStrVector("^f(o)o")); | 1332 Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("^f(o)o")); |
| 1350 Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode(source)); | 1333 Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode(source)); |
| 1351 int captures[5]; | 1334 int captures[5]; |
| 1352 | 1335 |
| 1353 const uc16 str1[] = {'f', 'o', 'o', 'b', 'a', 'r'}; | 1336 const uc16 str1[] = {'f', 'o', 'o', 'b', 'a', 'r'}; |
| 1354 Handle<String> f1_16 = | 1337 Handle<String> f1_16 = |
| 1355 factory->NewStringFromTwoByte(Vector<const uc16>(str1, 6)); | 1338 FACTORY->NewStringFromTwoByte(Vector<const uc16>(str1, 6)); |
| 1356 | 1339 |
| 1357 CHECK(IrregexpInterpreter::Match(isolate, array, f1_16, captures, 0)); | 1340 CHECK(IrregexpInterpreter::Match(array, f1_16, captures, 0)); |
| 1358 CHECK_EQ(0, captures[0]); | 1341 CHECK_EQ(0, captures[0]); |
| 1359 CHECK_EQ(3, captures[1]); | 1342 CHECK_EQ(3, captures[1]); |
| 1360 CHECK_EQ(1, captures[2]); | 1343 CHECK_EQ(1, captures[2]); |
| 1361 CHECK_EQ(2, captures[3]); | 1344 CHECK_EQ(2, captures[3]); |
| 1362 CHECK_EQ(84, captures[4]); | 1345 CHECK_EQ(84, captures[4]); |
| 1363 | 1346 |
| 1364 const uc16 str2[] = {'b', 'a', 'r', 'f', 'o', 'o'}; | 1347 const uc16 str2[] = {'b', 'a', 'r', 'f', 'o', 'o'}; |
| 1365 Handle<String> f2_16 = | 1348 Handle<String> f2_16 = |
| 1366 factory->NewStringFromTwoByte(Vector<const uc16>(str2, 6)); | 1349 FACTORY->NewStringFromTwoByte(Vector<const uc16>(str2, 6)); |
| 1367 | 1350 |
| 1368 CHECK(!IrregexpInterpreter::Match(isolate, array, f2_16, captures, 0)); | 1351 CHECK(!IrregexpInterpreter::Match(array, f2_16, captures, 0)); |
| 1369 CHECK_EQ(42, captures[0]); | 1352 CHECK_EQ(42, captures[0]); |
| 1370 } | 1353 } |
| 1371 | 1354 |
| 1372 #endif // V8_INTERPRETED_REGEXP | 1355 #endif // V8_INTERPRETED_REGEXP |
| 1373 | 1356 |
| 1374 | 1357 |
| 1375 TEST(AddInverseToTable) { | 1358 TEST(AddInverseToTable) { |
| 1376 v8::internal::V8::Initialize(NULL); | 1359 v8::internal::V8::Initialize(NULL); |
| 1377 static const int kLimit = 1000; | 1360 static const int kLimit = 1000; |
| 1378 static const int kRangeCount = 16; | 1361 static const int kRangeCount = 16; |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1817 bool in_second = CharacterInSet(&l2, i); | 1800 bool in_second = CharacterInSet(&l2, i); |
| 1818 CHECK((in_first || in_second) == CharacterInSet(&all, i)); | 1801 CHECK((in_first || in_second) == CharacterInSet(&all, i)); |
| 1819 } | 1802 } |
| 1820 } | 1803 } |
| 1821 | 1804 |
| 1822 | 1805 |
| 1823 TEST(Graph) { | 1806 TEST(Graph) { |
| 1824 V8::Initialize(NULL); | 1807 V8::Initialize(NULL); |
| 1825 Execute("\\b\\w+\\b", false, true, true); | 1808 Execute("\\b\\w+\\b", false, true, true); |
| 1826 } | 1809 } |
| OLD | NEW |