| 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 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 } | 355 } |
| 356 | 356 |
| 357 | 357 |
| 358 static RegExpNode* Compile(const char* input, bool multiline) { | 358 static RegExpNode* Compile(const char* input, bool multiline) { |
| 359 V8::Initialize(NULL); | 359 V8::Initialize(NULL); |
| 360 FlatStringReader reader(CStrVector(input)); | 360 FlatStringReader reader(CStrVector(input)); |
| 361 RegExpParseResult result; | 361 RegExpParseResult result; |
| 362 if (!v8::internal::ParseRegExp(&reader, multiline, &result)) | 362 if (!v8::internal::ParseRegExp(&reader, multiline, &result)) |
| 363 return NULL; | 363 return NULL; |
| 364 RegExpNode* node = NULL; | 364 RegExpNode* node = NULL; |
| 365 RegExpEngine::Compile(&result, &node, false, multiline); | 365 Handle<String> pattern = Factory::NewStringFromUtf8(CStrVector(input)); |
| 366 RegExpEngine::Compile(&result, &node, false, multiline, pattern); |
| 366 return node; | 367 return node; |
| 367 } | 368 } |
| 368 | 369 |
| 369 | 370 |
| 370 static void Execute(const char* input, | 371 static void Execute(const char* input, |
| 371 bool multiline, | 372 bool multiline, |
| 372 bool dot_output = false) { | 373 bool dot_output = false) { |
| 373 v8::HandleScope scope; | 374 v8::HandleScope scope; |
| 374 ZoneScope zone_scope(DELETE_ON_EXIT); | 375 ZoneScope zone_scope(DELETE_ON_EXIT); |
| 375 RegExpNode* node = Compile(input, multiline); | 376 RegExpNode* node = Compile(input, multiline); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 foo_chars[1] = 'o'; | 514 foo_chars[1] = 'o'; |
| 514 foo_chars[2] = 'o'; | 515 foo_chars[2] = 'o'; |
| 515 Vector<const uc16> foo(foo_chars, 3); | 516 Vector<const uc16> foo(foo_chars, 3); |
| 516 m.SetRegister(4, 42); | 517 m.SetRegister(4, 42); |
| 517 m.PushRegister(4); | 518 m.PushRegister(4); |
| 518 m.AdvanceRegister(4, 42); | 519 m.AdvanceRegister(4, 42); |
| 519 m.GoTo(&start); | 520 m.GoTo(&start); |
| 520 m.Fail(); | 521 m.Fail(); |
| 521 m.Bind(&start); | 522 m.Bind(&start); |
| 522 m.PushBacktrack(&fail2); | 523 m.PushBacktrack(&fail2); |
| 523 m.CheckCharacters(foo, 0, &fail); | 524 m.CheckCharacters(foo, 0, &fail, true); |
| 524 m.WriteCurrentPositionToRegister(0); | 525 m.WriteCurrentPositionToRegister(0, 0); |
| 525 m.PushCurrentPosition(); | 526 m.PushCurrentPosition(); |
| 526 m.AdvanceCurrentPosition(3); | 527 m.AdvanceCurrentPosition(3); |
| 527 m.WriteCurrentPositionToRegister(1); | 528 m.WriteCurrentPositionToRegister(1, 0); |
| 528 m.PopCurrentPosition(); | 529 m.PopCurrentPosition(); |
| 529 m.AdvanceCurrentPosition(1); | 530 m.AdvanceCurrentPosition(1); |
| 530 m.WriteCurrentPositionToRegister(2); | 531 m.WriteCurrentPositionToRegister(2, 0); |
| 531 m.AdvanceCurrentPosition(1); | 532 m.AdvanceCurrentPosition(1); |
| 532 m.WriteCurrentPositionToRegister(3); | 533 m.WriteCurrentPositionToRegister(3, 0); |
| 533 m.Succeed(); | 534 m.Succeed(); |
| 534 | 535 |
| 535 m.Bind(&fail); | 536 m.Bind(&fail); |
| 536 m.Backtrack(); | 537 m.Backtrack(); |
| 537 m.Succeed(); | 538 m.Succeed(); |
| 538 | 539 |
| 539 m.Bind(&fail2); | 540 m.Bind(&fail2); |
| 540 m.PopRegister(0); | 541 m.PopRegister(0); |
| 541 m.Fail(); | 542 m.Fail(); |
| 542 | 543 |
| 543 v8::HandleScope scope; | 544 v8::HandleScope scope; |
| 544 | 545 |
| 545 Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode()); | 546 Handle<String> source = Factory::NewStringFromAscii(CStrVector("^f(o)o")); |
| 547 Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode(source)); |
| 546 int captures[5]; | 548 int captures[5]; |
| 547 | 549 |
| 548 Handle<String> f1 = | 550 Handle<String> f1 = |
| 549 Factory::NewStringFromAscii(CStrVector("foobar")); | 551 Factory::NewStringFromAscii(CStrVector("foobar")); |
| 550 Handle<String> f1_16 = RegExpImpl::StringToTwoByte(f1); | 552 Handle<String> f1_16 = RegExpImpl::StringToTwoByte(f1); |
| 551 CHECK(IrregexpInterpreter::Match(array, f1_16, captures, 0)); | 553 CHECK(IrregexpInterpreter::Match(array, f1_16, captures, 0)); |
| 552 CHECK_EQ(0, captures[0]); | 554 CHECK_EQ(0, captures[0]); |
| 553 CHECK_EQ(3, captures[1]); | 555 CHECK_EQ(3, captures[1]); |
| 554 CHECK_EQ(1, captures[2]); | 556 CHECK_EQ(1, captures[2]); |
| 555 CHECK_EQ(2, captures[3]); | 557 CHECK_EQ(2, captures[3]); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 569 V8::Initialize(NULL); | 571 V8::Initialize(NULL); |
| 570 | 572 |
| 571 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 573 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 572 // byte-arrays for constants. | 574 // byte-arrays for constants. |
| 573 v8::HandleScope scope; | 575 v8::HandleScope scope; |
| 574 | 576 |
| 575 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 4); | 577 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 4); |
| 576 | 578 |
| 577 m.Succeed(); | 579 m.Succeed(); |
| 578 | 580 |
| 579 Handle<Object> code_object = m.GetCode(); | 581 Handle<String> source = Factory::NewStringFromAscii(CStrVector("")); |
| 582 Handle<Object> code_object = m.GetCode(source); |
| 580 Handle<Code> code = Handle<Code>::cast(code_object); | 583 Handle<Code> code = Handle<Code>::cast(code_object); |
| 581 | 584 |
| 582 int captures[4] = {42, 37, 87, 117}; | 585 int captures[4] = {42, 37, 87, 117}; |
| 583 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo")); | 586 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo")); |
| 584 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 587 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 585 Address start_adr = seq_input->GetCharsAddress(); | 588 Address start_adr = seq_input->GetCharsAddress(); |
| 586 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 589 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 587 int end_offset = start_offset + seq_input->length(); | 590 int end_offset = start_offset + seq_input->length(); |
| 588 | 591 |
| 589 bool success = RegExpMacroAssemblerIA32::Execute(*code, | 592 bool success = RegExpMacroAssemblerIA32::Execute(*code, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 607 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 610 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 608 // byte-arrays for constants. | 611 // byte-arrays for constants. |
| 609 v8::HandleScope scope; | 612 v8::HandleScope scope; |
| 610 | 613 |
| 611 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 4); | 614 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 4); |
| 612 | 615 |
| 613 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 616 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
| 614 Vector<const uc16> foo(foo_chars, 3); | 617 Vector<const uc16> foo(foo_chars, 3); |
| 615 | 618 |
| 616 Label fail; | 619 Label fail; |
| 617 m.CheckCharacters(foo, 0, &fail); | 620 m.CheckCharacters(foo, 0, &fail, true); |
| 618 m.WriteCurrentPositionToRegister(0); | 621 m.WriteCurrentPositionToRegister(0, 0); |
| 619 m.AdvanceCurrentPosition(3); | 622 m.AdvanceCurrentPosition(3); |
| 620 m.WriteCurrentPositionToRegister(1); | 623 m.WriteCurrentPositionToRegister(1, 0); |
| 621 m.Succeed(); | 624 m.Succeed(); |
| 622 m.Bind(&fail); | 625 m.Bind(&fail); |
| 623 m.Fail(); | 626 m.Fail(); |
| 624 | 627 |
| 625 Handle<Object> code_object = m.GetCode(); | 628 Handle<String> source = Factory::NewStringFromAscii(CStrVector("^foo")); |
| 629 Handle<Object> code_object = m.GetCode(source); |
| 626 Handle<Code> code = Handle<Code>::cast(code_object); | 630 Handle<Code> code = Handle<Code>::cast(code_object); |
| 627 | 631 |
| 628 int captures[4] = {42, 37, 87, 117}; | 632 int captures[4] = {42, 37, 87, 117}; |
| 629 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo")); | 633 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo")); |
| 630 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 634 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 631 Address start_adr = seq_input->GetCharsAddress(); | 635 Address start_adr = seq_input->GetCharsAddress(); |
| 632 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 636 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 633 int end_offset = start_offset + seq_input->length(); | 637 int end_offset = start_offset + seq_input->length(); |
| 634 | 638 |
| 635 bool success = RegExpMacroAssemblerIA32::Execute(*code, | 639 bool success = RegExpMacroAssemblerIA32::Execute(*code, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 672 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 669 // byte-arrays for constants. | 673 // byte-arrays for constants. |
| 670 v8::HandleScope scope; | 674 v8::HandleScope scope; |
| 671 | 675 |
| 672 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::UC16, 4); | 676 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::UC16, 4); |
| 673 | 677 |
| 674 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 678 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
| 675 Vector<const uc16> foo(foo_chars, 3); | 679 Vector<const uc16> foo(foo_chars, 3); |
| 676 | 680 |
| 677 Label fail; | 681 Label fail; |
| 678 m.CheckCharacters(foo, 0, &fail); | 682 m.CheckCharacters(foo, 0, &fail, true); |
| 679 m.WriteCurrentPositionToRegister(0); | 683 m.WriteCurrentPositionToRegister(0, 0); |
| 680 m.AdvanceCurrentPosition(3); | 684 m.AdvanceCurrentPosition(3); |
| 681 m.WriteCurrentPositionToRegister(1); | 685 m.WriteCurrentPositionToRegister(1, 0); |
| 682 m.Succeed(); | 686 m.Succeed(); |
| 683 m.Bind(&fail); | 687 m.Bind(&fail); |
| 684 m.Fail(); | 688 m.Fail(); |
| 685 | 689 |
| 686 Handle<Object> code_object = m.GetCode(); | 690 Handle<String> source = Factory::NewStringFromAscii(CStrVector("^foo")); |
| 691 Handle<Object> code_object = m.GetCode(source); |
| 687 Handle<Code> code = Handle<Code>::cast(code_object); | 692 Handle<Code> code = Handle<Code>::cast(code_object); |
| 688 | 693 |
| 689 int captures[4] = {42, 37, 87, 117}; | 694 int captures[4] = {42, 37, 87, 117}; |
| 690 const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o', '\xa0'}; | 695 const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o', '\xa0'}; |
| 691 Handle<String> input = | 696 Handle<String> input = |
| 692 Factory::NewStringFromTwoByte(Vector<const uc16>(input_data, 6)); | 697 Factory::NewStringFromTwoByte(Vector<const uc16>(input_data, 6)); |
| 693 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); | 698 Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input); |
| 694 Address start_adr = seq_input->GetCharsAddress(); | 699 Address start_adr = seq_input->GetCharsAddress(); |
| 695 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 700 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 696 int end_offset = start_offset + seq_input->length() * sizeof(uc16); | 701 int end_offset = start_offset + seq_input->length() * sizeof(uc16); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 | 733 |
| 729 TEST(MacroAssemblerIA32Backtrack) { | 734 TEST(MacroAssemblerIA32Backtrack) { |
| 730 V8::Initialize(NULL); | 735 V8::Initialize(NULL); |
| 731 | 736 |
| 732 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 737 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 733 // byte-arrays for constants. | 738 // byte-arrays for constants. |
| 734 v8::HandleScope scope; | 739 v8::HandleScope scope; |
| 735 | 740 |
| 736 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 0); | 741 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 0); |
| 737 | 742 |
| 738 uc16 foo_chars[3] = {'f', 'o', 'o'}; | |
| 739 Vector<const uc16> foo(foo_chars, 3); | |
| 740 | |
| 741 Label fail; | 743 Label fail; |
| 742 Label backtrack; | 744 Label backtrack; |
| 743 m.LoadCurrentCharacter(10, &fail); | 745 m.LoadCurrentCharacter(10, &fail); |
| 744 m.Succeed(); | 746 m.Succeed(); |
| 745 m.Bind(&fail); | 747 m.Bind(&fail); |
| 746 m.PushBacktrack(&backtrack); | 748 m.PushBacktrack(&backtrack); |
| 747 m.LoadCurrentCharacter(10, NULL); | 749 m.LoadCurrentCharacter(10, NULL); |
| 748 m.Succeed(); | 750 m.Succeed(); |
| 749 m.Bind(&backtrack); | 751 m.Bind(&backtrack); |
| 750 m.Fail(); | 752 m.Fail(); |
| 751 | 753 |
| 752 Handle<Object> code_object = m.GetCode(); | 754 Handle<String> source = Factory::NewStringFromAscii(CStrVector("..........")); |
| 755 Handle<Object> code_object = m.GetCode(source); |
| 753 Handle<Code> code = Handle<Code>::cast(code_object); | 756 Handle<Code> code = Handle<Code>::cast(code_object); |
| 754 | 757 |
| 755 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo")); | 758 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo")); |
| 756 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 759 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 757 Address start_adr = seq_input->GetCharsAddress(); | 760 Address start_adr = seq_input->GetCharsAddress(); |
| 758 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 761 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 759 int end_offset = start_offset + seq_input->length(); | 762 int end_offset = start_offset + seq_input->length(); |
| 760 | 763 |
| 761 bool success = RegExpMacroAssemblerIA32::Execute(*code, | 764 bool success = RegExpMacroAssemblerIA32::Execute(*code, |
| 762 seq_input.location(), | 765 seq_input.location(), |
| 763 start_offset, | 766 start_offset, |
| 764 end_offset, | 767 end_offset, |
| 765 NULL, | 768 NULL, |
| 766 true); | 769 true); |
| 767 | 770 |
| 768 CHECK(!success); | 771 CHECK(!success); |
| 769 } | 772 } |
| 770 | 773 |
| 771 | 774 |
| 772 TEST(MacroAssemblerIA32BackReference) { | 775 TEST(MacroAssemblerIA32BackReference) { |
| 773 V8::Initialize(NULL); | 776 V8::Initialize(NULL); |
| 774 | 777 |
| 775 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 778 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 776 // byte-arrays for constants. | 779 // byte-arrays for constants. |
| 777 v8::HandleScope scope; | 780 v8::HandleScope scope; |
| 778 | 781 |
| 779 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 3); | 782 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 3); |
| 780 | 783 |
| 781 m.WriteCurrentPositionToRegister(0); | 784 m.WriteCurrentPositionToRegister(0, 0); |
| 782 m.AdvanceCurrentPosition(2); | 785 m.AdvanceCurrentPosition(2); |
| 783 m.WriteCurrentPositionToRegister(1); | 786 m.WriteCurrentPositionToRegister(1, 0); |
| 784 Label nomatch; | 787 Label nomatch; |
| 785 m.CheckNotBackReference(0, &nomatch); | 788 m.CheckNotBackReference(0, &nomatch); |
| 786 m.Fail(); | 789 m.Fail(); |
| 787 m.Bind(&nomatch); | 790 m.Bind(&nomatch); |
| 788 m.AdvanceCurrentPosition(2); | 791 m.AdvanceCurrentPosition(2); |
| 789 Label missing_match; | 792 Label missing_match; |
| 790 m.CheckNotBackReference(0, &missing_match); | 793 m.CheckNotBackReference(0, &missing_match); |
| 791 m.WriteCurrentPositionToRegister(2); | 794 m.WriteCurrentPositionToRegister(2, 0); |
| 792 m.Succeed(); | 795 m.Succeed(); |
| 793 m.Bind(&missing_match); | 796 m.Bind(&missing_match); |
| 794 m.Fail(); | 797 m.Fail(); |
| 795 | 798 |
| 796 Handle<Object> code_object = m.GetCode(); | 799 Handle<String> source = Factory::NewStringFromAscii(CStrVector("^(..)..\1")); |
| 800 Handle<Object> code_object = m.GetCode(source); |
| 797 Handle<Code> code = Handle<Code>::cast(code_object); | 801 Handle<Code> code = Handle<Code>::cast(code_object); |
| 798 | 802 |
| 799 Handle<String> input = Factory::NewStringFromAscii(CStrVector("fooofo")); | 803 Handle<String> input = Factory::NewStringFromAscii(CStrVector("fooofo")); |
| 800 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 804 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 801 Address start_adr = seq_input->GetCharsAddress(); | 805 Address start_adr = seq_input->GetCharsAddress(); |
| 802 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 806 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 803 int end_offset = start_offset + seq_input->length(); | 807 int end_offset = start_offset + seq_input->length(); |
| 804 | 808 |
| 805 int output[3]; | 809 int output[3]; |
| 806 bool success = RegExpMacroAssemblerIA32::Execute(*code, | 810 bool success = RegExpMacroAssemblerIA32::Execute(*code, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 819 | 823 |
| 820 TEST(MacroAssemblerIA32AtStart) { | 824 TEST(MacroAssemblerIA32AtStart) { |
| 821 V8::Initialize(NULL); | 825 V8::Initialize(NULL); |
| 822 | 826 |
| 823 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 827 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 824 // byte-arrays for constants. | 828 // byte-arrays for constants. |
| 825 v8::HandleScope scope; | 829 v8::HandleScope scope; |
| 826 | 830 |
| 827 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 0); | 831 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 0); |
| 828 | 832 |
| 829 uc16 foo_chars[3] = {'f', 'o', 'o'}; | |
| 830 Vector<const uc16> foo(foo_chars, 3); | |
| 831 | |
| 832 Label not_at_start, newline, fail; | 833 Label not_at_start, newline, fail; |
| 833 m.CheckNotAtStart(¬_at_start); | 834 m.CheckNotAtStart(¬_at_start); |
| 834 // Check that prevchar = '\n' and current = 'f'. | 835 // Check that prevchar = '\n' and current = 'f'. |
| 835 m.CheckCharacter('\n', &newline); | 836 m.CheckCharacter('\n', &newline); |
| 836 m.Bind(&fail); | 837 m.Bind(&fail); |
| 837 m.Fail(); | 838 m.Fail(); |
| 838 m.Bind(&newline); | 839 m.Bind(&newline); |
| 839 m.LoadCurrentCharacter(0, &fail); | 840 m.LoadCurrentCharacter(0, &fail); |
| 840 m.CheckNotCharacter('f', &fail); | 841 m.CheckNotCharacter('f', &fail); |
| 841 m.Succeed(); | 842 m.Succeed(); |
| 842 | 843 |
| 843 m.Bind(¬_at_start); | 844 m.Bind(¬_at_start); |
| 844 // Check that prevchar = 'o' and current = 'b'. | 845 // Check that prevchar = 'o' and current = 'b'. |
| 845 Label prevo; | 846 Label prevo; |
| 846 m.CheckCharacter('o', &prevo); | 847 m.CheckCharacter('o', &prevo); |
| 847 m.Fail(); | 848 m.Fail(); |
| 848 m.Bind(&prevo); | 849 m.Bind(&prevo); |
| 849 m.LoadCurrentCharacter(0, &fail); | 850 m.LoadCurrentCharacter(0, &fail); |
| 850 m.CheckNotCharacter('b', &fail); | 851 m.CheckNotCharacter('b', &fail); |
| 851 m.Succeed(); | 852 m.Succeed(); |
| 852 | 853 |
| 853 Handle<Object> code_object = m.GetCode(); | 854 Handle<String> source = Factory::NewStringFromAscii(CStrVector("(^f|ob)")); |
| 855 Handle<Object> code_object = m.GetCode(source); |
| 854 Handle<Code> code = Handle<Code>::cast(code_object); | 856 Handle<Code> code = Handle<Code>::cast(code_object); |
| 855 | 857 |
| 856 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foobar")); | 858 Handle<String> input = Factory::NewStringFromAscii(CStrVector("foobar")); |
| 857 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 859 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 858 Address start_adr = seq_input->GetCharsAddress(); | 860 Address start_adr = seq_input->GetCharsAddress(); |
| 859 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 861 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 860 int end_offset = start_offset + seq_input->length(); | 862 int end_offset = start_offset + seq_input->length(); |
| 861 | 863 |
| 862 bool success = RegExpMacroAssemblerIA32::Execute(*code, | 864 bool success = RegExpMacroAssemblerIA32::Execute(*code, |
| 863 seq_input.location(), | 865 seq_input.location(), |
| (...skipping 22 matching lines...) Expand all Loading... |
| 886 V8::Initialize(NULL); | 888 V8::Initialize(NULL); |
| 887 | 889 |
| 888 // regexp-macro-assembler-ia32 needs a handle scope to allocate | 890 // regexp-macro-assembler-ia32 needs a handle scope to allocate |
| 889 // byte-arrays for constants. | 891 // byte-arrays for constants. |
| 890 v8::HandleScope scope; | 892 v8::HandleScope scope; |
| 891 | 893 |
| 892 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 4); | 894 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 4); |
| 893 | 895 |
| 894 Label fail, succ; | 896 Label fail, succ; |
| 895 | 897 |
| 896 m.WriteCurrentPositionToRegister(0); | 898 m.WriteCurrentPositionToRegister(0, 0); |
| 897 m.WriteCurrentPositionToRegister(2); | 899 m.WriteCurrentPositionToRegister(2, 0); |
| 898 m.AdvanceCurrentPosition(3); | 900 m.AdvanceCurrentPosition(3); |
| 899 m.WriteCurrentPositionToRegister(3); | 901 m.WriteCurrentPositionToRegister(3, 0); |
| 900 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". | 902 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC". |
| 901 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". | 903 m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC". |
| 902 Label expected_fail; | 904 Label expected_fail; |
| 903 m.CheckNotBackReferenceIgnoreCase(2, &expected_fail); | 905 m.CheckNotBackReferenceIgnoreCase(2, &expected_fail); |
| 904 m.Bind(&fail); | 906 m.Bind(&fail); |
| 905 m.Fail(); | 907 m.Fail(); |
| 906 | 908 |
| 907 m.Bind(&expected_fail); | 909 m.Bind(&expected_fail); |
| 908 m.AdvanceCurrentPosition(3); // Skip "xYz" | 910 m.AdvanceCurrentPosition(3); // Skip "xYz" |
| 909 m.CheckNotBackReferenceIgnoreCase(2, &succ); | 911 m.CheckNotBackReferenceIgnoreCase(2, &succ); |
| 910 m.Fail(); | 912 m.Fail(); |
| 911 | 913 |
| 912 m.Bind(&succ); | 914 m.Bind(&succ); |
| 913 m.WriteCurrentPositionToRegister(1); | 915 m.WriteCurrentPositionToRegister(1, 0); |
| 914 m.Succeed(); | 916 m.Succeed(); |
| 915 | 917 |
| 916 Handle<Object> code_object = m.GetCode(); | 918 Handle<String> source = |
| 919 Factory::NewStringFromAscii(CStrVector("^(abc)\1\1(?!\1)...(?!\1)")); |
| 920 Handle<Object> code_object = m.GetCode(source); |
| 917 Handle<Code> code = Handle<Code>::cast(code_object); | 921 Handle<Code> code = Handle<Code>::cast(code_object); |
| 918 | 922 |
| 919 Handle<String> input = | 923 Handle<String> input = |
| 920 Factory::NewStringFromAscii(CStrVector("aBcAbCABCxYzab")); | 924 Factory::NewStringFromAscii(CStrVector("aBcAbCABCxYzab")); |
| 921 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 925 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 922 Address start_adr = seq_input->GetCharsAddress(); | 926 Address start_adr = seq_input->GetCharsAddress(); |
| 923 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 927 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 924 int end_offset = start_offset + seq_input->length(); | 928 int end_offset = start_offset + seq_input->length(); |
| 925 | 929 |
| 926 int output[4]; | 930 int output[4]; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 948 v8::HandleScope scope; | 952 v8::HandleScope scope; |
| 949 | 953 |
| 950 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 5); | 954 RegExpMacroAssemblerIA32 m(RegExpMacroAssemblerIA32::ASCII, 5); |
| 951 | 955 |
| 952 uc16 foo_chars[3] = {'f', 'o', 'o'}; | 956 uc16 foo_chars[3] = {'f', 'o', 'o'}; |
| 953 Vector<const uc16> foo(foo_chars, 3); | 957 Vector<const uc16> foo(foo_chars, 3); |
| 954 | 958 |
| 955 enum registers { out1, out2, out3, out4, out5, sp, loop_cnt }; | 959 enum registers { out1, out2, out3, out4, out5, sp, loop_cnt }; |
| 956 Label fail; | 960 Label fail; |
| 957 Label backtrack; | 961 Label backtrack; |
| 958 m.WriteCurrentPositionToRegister(out1); // Output: [0] | 962 m.WriteCurrentPositionToRegister(out1, 0); // Output: [0] |
| 959 m.PushRegister(out1); | 963 m.PushRegister(out1); |
| 960 m.PushBacktrack(&backtrack); | 964 m.PushBacktrack(&backtrack); |
| 961 m.WriteStackPointerToRegister(sp); | 965 m.WriteStackPointerToRegister(sp); |
| 962 // Fill stack and registers | 966 // Fill stack and registers |
| 963 m.AdvanceCurrentPosition(2); | 967 m.AdvanceCurrentPosition(2); |
| 964 m.WriteCurrentPositionToRegister(out1); | 968 m.WriteCurrentPositionToRegister(out1, 0); |
| 965 m.PushRegister(out1); | 969 m.PushRegister(out1); |
| 966 m.PushBacktrack(&fail); | 970 m.PushBacktrack(&fail); |
| 967 // Drop backtrack stack frames. | 971 // Drop backtrack stack frames. |
| 968 m.ReadStackPointerFromRegister(sp); | 972 m.ReadStackPointerFromRegister(sp); |
| 969 // And take the first backtrack (to &backtrack) | 973 // And take the first backtrack (to &backtrack) |
| 970 m.Backtrack(); | 974 m.Backtrack(); |
| 971 | 975 |
| 972 m.PushCurrentPosition(); | 976 m.PushCurrentPosition(); |
| 973 m.AdvanceCurrentPosition(2); | 977 m.AdvanceCurrentPosition(2); |
| 974 m.PopCurrentPosition(); | 978 m.PopCurrentPosition(); |
| 975 | 979 |
| 976 m.Bind(&backtrack); | 980 m.Bind(&backtrack); |
| 977 m.PopRegister(out1); | 981 m.PopRegister(out1); |
| 978 m.ReadCurrentPositionFromRegister(out1); | 982 m.ReadCurrentPositionFromRegister(out1); |
| 979 m.AdvanceCurrentPosition(3); | 983 m.AdvanceCurrentPosition(3); |
| 980 m.WriteCurrentPositionToRegister(out2); // [0,3] | 984 m.WriteCurrentPositionToRegister(out2, 0); // [0,3] |
| 981 | 985 |
| 982 Label loop; | 986 Label loop; |
| 983 m.SetRegister(loop_cnt, 0); // loop counter | 987 m.SetRegister(loop_cnt, 0); // loop counter |
| 984 m.Bind(&loop); | 988 m.Bind(&loop); |
| 985 m.AdvanceRegister(loop_cnt, 1); | 989 m.AdvanceRegister(loop_cnt, 1); |
| 986 m.AdvanceCurrentPosition(1); | 990 m.AdvanceCurrentPosition(1); |
| 987 m.IfRegisterLT(loop_cnt, 3, &loop); | 991 m.IfRegisterLT(loop_cnt, 3, &loop); |
| 988 m.WriteCurrentPositionToRegister(out3); // [0,3,6] | 992 m.WriteCurrentPositionToRegister(out3, 0); // [0,3,6] |
| 989 | 993 |
| 990 Label loop2; | 994 Label loop2; |
| 991 m.SetRegister(loop_cnt, 2); // loop counter | 995 m.SetRegister(loop_cnt, 2); // loop counter |
| 992 m.Bind(&loop2); | 996 m.Bind(&loop2); |
| 993 m.AdvanceRegister(loop_cnt, -1); | 997 m.AdvanceRegister(loop_cnt, -1); |
| 994 m.AdvanceCurrentPosition(1); | 998 m.AdvanceCurrentPosition(1); |
| 995 m.IfRegisterGE(loop_cnt, 0, &loop2); | 999 m.IfRegisterGE(loop_cnt, 0, &loop2); |
| 996 m.WriteCurrentPositionToRegister(out4); // [0,3,6,9] | 1000 m.WriteCurrentPositionToRegister(out4, 0); // [0,3,6,9] |
| 997 | 1001 |
| 998 Label loop3; | 1002 Label loop3; |
| 999 Label exit_loop3; | 1003 Label exit_loop3; |
| 1004 m.PushRegister(out4); |
| 1005 m.PushRegister(out4); |
| 1000 m.ReadCurrentPositionFromRegister(out3); | 1006 m.ReadCurrentPositionFromRegister(out3); |
| 1001 m.Bind(&loop3); | 1007 m.Bind(&loop3); |
| 1002 m.AdvanceCurrentPosition(1); | 1008 m.AdvanceCurrentPosition(1); |
| 1003 m.CheckCurrentPosition(out4, &exit_loop3); | 1009 m.CheckGreedyLoop(&exit_loop3); |
| 1004 m.GoTo(&loop3); | 1010 m.GoTo(&loop3); |
| 1005 m.Bind(&exit_loop3); | 1011 m.Bind(&exit_loop3); |
| 1006 m.WriteCurrentPositionToRegister(out5); // [0,3,6,9,9] | 1012 m.PopCurrentPosition(); |
| 1013 m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9] |
| 1007 | 1014 |
| 1008 m.Succeed(); | 1015 m.Succeed(); |
| 1009 | 1016 |
| 1010 m.Bind(&fail); | 1017 m.Bind(&fail); |
| 1011 m.Fail(); | 1018 m.Fail(); |
| 1012 | 1019 |
| 1013 Handle<Object> code_object = m.GetCode(); | 1020 Handle<String> source = |
| 1021 Factory::NewStringFromAscii(CStrVector("<loop test>")); |
| 1022 Handle<Object> code_object = m.GetCode(source); |
| 1014 Handle<Code> code = Handle<Code>::cast(code_object); | 1023 Handle<Code> code = Handle<Code>::cast(code_object); |
| 1015 | 1024 |
| 1016 // String long enough for test (content doesn't matter). | 1025 // String long enough for test (content doesn't matter). |
| 1017 Handle<String> input = | 1026 Handle<String> input = |
| 1018 Factory::NewStringFromAscii(CStrVector("foofoofoofoofoo")); | 1027 Factory::NewStringFromAscii(CStrVector("foofoofoofoofoo")); |
| 1019 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); | 1028 Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input); |
| 1020 Address start_adr = seq_input->GetCharsAddress(); | 1029 Address start_adr = seq_input->GetCharsAddress(); |
| 1021 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); | 1030 int start_offset = start_adr - reinterpret_cast<Address>(*seq_input); |
| 1022 int end_offset = start_offset + seq_input->length(); | 1031 int end_offset = start_offset + seq_input->length(); |
| 1023 | 1032 |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 } else { | 1293 } else { |
| 1285 CHECK(!InClass(i, included)); | 1294 CHECK(!InClass(i, included)); |
| 1286 CHECK(!InClass(i, excluded)); | 1295 CHECK(!InClass(i, excluded)); |
| 1287 } | 1296 } |
| 1288 } | 1297 } |
| 1289 } | 1298 } |
| 1290 | 1299 |
| 1291 | 1300 |
| 1292 TEST(Graph) { | 1301 TEST(Graph) { |
| 1293 V8::Initialize(NULL); | 1302 V8::Initialize(NULL); |
| 1294 Execute("\\b\\w", false, true); | 1303 Execute("(?=[d#.])", false, true); |
| 1295 } | 1304 } |
| OLD | NEW |