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

Side by Side Diff: src/regexp/jsregexp.h

Issue 1661483002: Revert of [regexp] implement /ui to mirror the implementation for /i. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: add cause of revert as test case Created 4 years, 10 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
« no previous file with comments | « no previous file | src/regexp/jsregexp.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_REGEXP_JSREGEXP_H_ 5 #ifndef V8_REGEXP_JSREGEXP_H_
6 #define V8_REGEXP_JSREGEXP_H_ 6 #define V8_REGEXP_JSREGEXP_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/assembler.h" 9 #include "src/assembler.h"
10 #include "src/regexp/regexp-ast.h" 10 #include "src/regexp/regexp-ast.h"
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 return NULL; 522 return NULL;
523 } 523 }
524 524
525 // Collects information on the possible code units (mod 128) that can match if 525 // Collects information on the possible code units (mod 128) that can match if
526 // we look forward. This is used for a Boyer-Moore-like string searching 526 // we look forward. This is used for a Boyer-Moore-like string searching
527 // implementation. TODO(erikcorry): This should share more code with 527 // implementation. TODO(erikcorry): This should share more code with
528 // EatsAtLeast, GetQuickCheckDetails. The budget argument is used to limit 528 // EatsAtLeast, GetQuickCheckDetails. The budget argument is used to limit
529 // the number of nodes we are willing to look at in order to create this data. 529 // the number of nodes we are willing to look at in order to create this data.
530 static const int kRecursionBudget = 200; 530 static const int kRecursionBudget = 200;
531 bool KeepRecursing(RegExpCompiler* compiler); 531 bool KeepRecursing(RegExpCompiler* compiler);
532 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 532 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
533 BoyerMooreLookahead* bm, bool not_at_start) { 533 BoyerMooreLookahead* bm, bool not_at_start) {
534 UNREACHABLE(); 534 UNREACHABLE();
535 } 535 }
536 536
537 // If we know that the input is one-byte then there are some nodes that can 537 // If we know that the input is one-byte then there are some nodes that can
538 // never match. This method returns a node that can be substituted for 538 // never match. This method returns a node that can be substituted for
539 // itself, or NULL if the node can never match. 539 // itself, or NULL if the node can never match.
540 virtual RegExpNode* FilterOneByte(int depth, RegExpCompiler* compiler) { 540 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case) {
541 return this; 541 return this;
542 } 542 }
543 // Helper for FilterOneByte. 543 // Helper for FilterOneByte.
544 RegExpNode* replacement() { 544 RegExpNode* replacement() {
545 DCHECK(info()->replacement_calculated); 545 DCHECK(info()->replacement_calculated);
546 return replacement_; 546 return replacement_;
547 } 547 }
548 RegExpNode* set_replacement(RegExpNode* replacement) { 548 RegExpNode* set_replacement(RegExpNode* replacement) {
549 info()->replacement_calculated = true; 549 info()->replacement_calculated = true;
550 replacement_ = replacement; 550 replacement_ = replacement;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 Zone* zone_; 604 Zone* zone_;
605 }; 605 };
606 606
607 607
608 class SeqRegExpNode: public RegExpNode { 608 class SeqRegExpNode: public RegExpNode {
609 public: 609 public:
610 explicit SeqRegExpNode(RegExpNode* on_success) 610 explicit SeqRegExpNode(RegExpNode* on_success)
611 : RegExpNode(on_success->zone()), on_success_(on_success) { } 611 : RegExpNode(on_success->zone()), on_success_(on_success) { }
612 RegExpNode* on_success() { return on_success_; } 612 RegExpNode* on_success() { return on_success_; }
613 void set_on_success(RegExpNode* node) { on_success_ = node; } 613 void set_on_success(RegExpNode* node) { on_success_ = node; }
614 virtual RegExpNode* FilterOneByte(int depth, RegExpCompiler* compiler); 614 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
615 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 615 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
616 BoyerMooreLookahead* bm, bool not_at_start) { 616 BoyerMooreLookahead* bm, bool not_at_start) {
617 on_success_->FillInBMInfo(compiler, offset, budget - 1, bm, not_at_start); 617 on_success_->FillInBMInfo(isolate, offset, budget - 1, bm, not_at_start);
618 if (offset == 0) set_bm_info(not_at_start, bm); 618 if (offset == 0) set_bm_info(not_at_start, bm);
619 } 619 }
620 620
621 protected: 621 protected:
622 RegExpNode* FilterSuccessor(int depth, RegExpCompiler* compiler); 622 RegExpNode* FilterSuccessor(int depth, bool ignore_case);
623 623
624 private: 624 private:
625 RegExpNode* on_success_; 625 RegExpNode* on_success_;
626 }; 626 };
627 627
628 628
629 class ActionNode: public SeqRegExpNode { 629 class ActionNode: public SeqRegExpNode {
630 public: 630 public:
631 enum ActionType { 631 enum ActionType {
632 SET_REGISTER, 632 SET_REGISTER,
(...skipping 25 matching lines...) Expand all
658 virtual void Accept(NodeVisitor* visitor); 658 virtual void Accept(NodeVisitor* visitor);
659 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 659 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
660 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 660 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
661 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 661 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
662 RegExpCompiler* compiler, 662 RegExpCompiler* compiler,
663 int filled_in, 663 int filled_in,
664 bool not_at_start) { 664 bool not_at_start) {
665 return on_success()->GetQuickCheckDetails( 665 return on_success()->GetQuickCheckDetails(
666 details, compiler, filled_in, not_at_start); 666 details, compiler, filled_in, not_at_start);
667 } 667 }
668 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 668 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
669 BoyerMooreLookahead* bm, bool not_at_start); 669 BoyerMooreLookahead* bm, bool not_at_start);
670 ActionType action_type() { return action_type_; } 670 ActionType action_type() { return action_type_; }
671 // TODO(erikcorry): We should allow some action nodes in greedy loops. 671 // TODO(erikcorry): We should allow some action nodes in greedy loops.
672 virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; } 672 virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; }
673 673
674 private: 674 private:
675 union { 675 union {
676 struct { 676 struct {
677 int reg; 677 int reg;
678 int value; 678 int value;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 737 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
738 RegExpCompiler* compiler, 738 RegExpCompiler* compiler,
739 int characters_filled_in, 739 int characters_filled_in,
740 bool not_at_start); 740 bool not_at_start);
741 ZoneList<TextElement>* elements() { return elms_; } 741 ZoneList<TextElement>* elements() { return elms_; }
742 bool read_backward() { return read_backward_; } 742 bool read_backward() { return read_backward_; }
743 void MakeCaseIndependent(Isolate* isolate, bool is_one_byte); 743 void MakeCaseIndependent(Isolate* isolate, bool is_one_byte);
744 virtual int GreedyLoopTextLength(); 744 virtual int GreedyLoopTextLength();
745 virtual RegExpNode* GetSuccessorOfOmnivorousTextNode( 745 virtual RegExpNode* GetSuccessorOfOmnivorousTextNode(
746 RegExpCompiler* compiler); 746 RegExpCompiler* compiler);
747 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 747 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
748 BoyerMooreLookahead* bm, bool not_at_start); 748 BoyerMooreLookahead* bm, bool not_at_start);
749 void CalculateOffsets(); 749 void CalculateOffsets();
750 virtual RegExpNode* FilterOneByte(int depth, RegExpCompiler* compiler); 750 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
751 751
752 private: 752 private:
753 enum TextEmitPassType { 753 enum TextEmitPassType {
754 NON_LATIN1_MATCH, // Check for characters that can't match. 754 NON_LATIN1_MATCH, // Check for characters that can't match.
755 SIMPLE_CHARACTER_MATCH, // Case-dependent single character check. 755 SIMPLE_CHARACTER_MATCH, // Case-dependent single character check.
756 NON_LETTER_CHARACTER_MATCH, // Check characters that have no case equivs. 756 NON_LETTER_CHARACTER_MATCH, // Check characters that have no case equivs.
757 CASE_CHARACTER_MATCH, // Case-independent single character check. 757 CASE_CHARACTER_MATCH, // Case-independent single character check.
758 CHARACTER_CLASS_MATCH // Character class. 758 CHARACTER_CLASS_MATCH // Character class.
759 }; 759 };
760 static bool SkipPass(int pass, bool ignore_case); 760 static bool SkipPass(int pass, bool ignore_case);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 static AssertionNode* AfterNewline(RegExpNode* on_success) { 796 static AssertionNode* AfterNewline(RegExpNode* on_success) {
797 return new(on_success->zone()) AssertionNode(AFTER_NEWLINE, on_success); 797 return new(on_success->zone()) AssertionNode(AFTER_NEWLINE, on_success);
798 } 798 }
799 virtual void Accept(NodeVisitor* visitor); 799 virtual void Accept(NodeVisitor* visitor);
800 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 800 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
801 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 801 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
802 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 802 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
803 RegExpCompiler* compiler, 803 RegExpCompiler* compiler,
804 int filled_in, 804 int filled_in,
805 bool not_at_start); 805 bool not_at_start);
806 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 806 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
807 BoyerMooreLookahead* bm, bool not_at_start); 807 BoyerMooreLookahead* bm, bool not_at_start);
808 AssertionType assertion_type() { return assertion_type_; } 808 AssertionType assertion_type() { return assertion_type_; }
809 809
810 private: 810 private:
811 void EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace); 811 void EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace);
812 enum IfPrevious { kIsNonWord, kIsWord }; 812 enum IfPrevious { kIsNonWord, kIsWord };
813 void BacktrackIfPrevious(RegExpCompiler* compiler, 813 void BacktrackIfPrevious(RegExpCompiler* compiler,
814 Trace* trace, 814 Trace* trace,
815 IfPrevious backtrack_if_previous); 815 IfPrevious backtrack_if_previous);
816 AssertionNode(AssertionType t, RegExpNode* on_success) 816 AssertionNode(AssertionType t, RegExpNode* on_success)
(...skipping 17 matching lines...) Expand all
834 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 834 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
835 virtual int EatsAtLeast(int still_to_find, 835 virtual int EatsAtLeast(int still_to_find,
836 int recursion_depth, 836 int recursion_depth,
837 bool not_at_start); 837 bool not_at_start);
838 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 838 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
839 RegExpCompiler* compiler, 839 RegExpCompiler* compiler,
840 int characters_filled_in, 840 int characters_filled_in,
841 bool not_at_start) { 841 bool not_at_start) {
842 return; 842 return;
843 } 843 }
844 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 844 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
845 BoyerMooreLookahead* bm, bool not_at_start); 845 BoyerMooreLookahead* bm, bool not_at_start);
846 846
847 private: 847 private:
848 int start_reg_; 848 int start_reg_;
849 int end_reg_; 849 int end_reg_;
850 bool read_backward_; 850 bool read_backward_;
851 }; 851 };
852 852
853 853
854 class EndNode: public RegExpNode { 854 class EndNode: public RegExpNode {
855 public: 855 public:
856 enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS }; 856 enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS };
857 EndNode(Action action, Zone* zone) : RegExpNode(zone), action_(action) {} 857 EndNode(Action action, Zone* zone) : RegExpNode(zone), action_(action) {}
858 virtual void Accept(NodeVisitor* visitor); 858 virtual void Accept(NodeVisitor* visitor);
859 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 859 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
860 virtual int EatsAtLeast(int still_to_find, 860 virtual int EatsAtLeast(int still_to_find,
861 int recursion_depth, 861 int recursion_depth,
862 bool not_at_start) { return 0; } 862 bool not_at_start) { return 0; }
863 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 863 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
864 RegExpCompiler* compiler, 864 RegExpCompiler* compiler,
865 int characters_filled_in, 865 int characters_filled_in,
866 bool not_at_start) { 866 bool not_at_start) {
867 // Returning 0 from EatsAtLeast should ensure we never get here. 867 // Returning 0 from EatsAtLeast should ensure we never get here.
868 UNREACHABLE(); 868 UNREACHABLE();
869 } 869 }
870 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 870 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
871 BoyerMooreLookahead* bm, bool not_at_start) { 871 BoyerMooreLookahead* bm, bool not_at_start) {
872 // Returning 0 from EatsAtLeast should ensure we never get here. 872 // Returning 0 from EatsAtLeast should ensure we never get here.
873 UNREACHABLE(); 873 UNREACHABLE();
874 } 874 }
875 875
876 private: 876 private:
877 Action action_; 877 Action action_;
878 }; 878 };
879 879
880 880
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 953 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
954 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 954 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
955 int EatsAtLeastHelper(int still_to_find, 955 int EatsAtLeastHelper(int still_to_find,
956 int budget, 956 int budget,
957 RegExpNode* ignore_this_node, 957 RegExpNode* ignore_this_node,
958 bool not_at_start); 958 bool not_at_start);
959 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 959 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
960 RegExpCompiler* compiler, 960 RegExpCompiler* compiler,
961 int characters_filled_in, 961 int characters_filled_in,
962 bool not_at_start); 962 bool not_at_start);
963 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 963 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
964 BoyerMooreLookahead* bm, bool not_at_start); 964 BoyerMooreLookahead* bm, bool not_at_start);
965 965
966 bool being_calculated() { return being_calculated_; } 966 bool being_calculated() { return being_calculated_; }
967 bool not_at_start() { return not_at_start_; } 967 bool not_at_start() { return not_at_start_; }
968 void set_not_at_start() { not_at_start_ = true; } 968 void set_not_at_start() { not_at_start_ = true; }
969 void set_being_calculated(bool b) { being_calculated_ = b; } 969 void set_being_calculated(bool b) { being_calculated_ = b; }
970 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) { 970 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
971 return true; 971 return true;
972 } 972 }
973 virtual RegExpNode* FilterOneByte(int depth, RegExpCompiler* compiler); 973 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
974 virtual bool read_backward() { return false; } 974 virtual bool read_backward() { return false; }
975 975
976 protected: 976 protected:
977 int GreedyLoopTextLengthForAlternative(GuardedAlternative* alternative); 977 int GreedyLoopTextLengthForAlternative(GuardedAlternative* alternative);
978 ZoneList<GuardedAlternative>* alternatives_; 978 ZoneList<GuardedAlternative>* alternatives_;
979 979
980 private: 980 private:
981 friend class DispatchTableConstructor; 981 friend class DispatchTableConstructor;
982 friend class Analysis; 982 friend class Analysis;
983 void GenerateGuard(RegExpMacroAssembler* macro_assembler, 983 void GenerateGuard(RegExpMacroAssembler* macro_assembler,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 Zone* zone) 1021 Zone* zone)
1022 : ChoiceNode(2, zone) { 1022 : ChoiceNode(2, zone) {
1023 AddAlternative(this_must_fail); 1023 AddAlternative(this_must_fail);
1024 AddAlternative(then_do_this); 1024 AddAlternative(then_do_this);
1025 } 1025 }
1026 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 1026 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
1027 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 1027 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
1028 RegExpCompiler* compiler, 1028 RegExpCompiler* compiler,
1029 int characters_filled_in, 1029 int characters_filled_in,
1030 bool not_at_start); 1030 bool not_at_start);
1031 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 1031 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
1032 BoyerMooreLookahead* bm, bool not_at_start) { 1032 BoyerMooreLookahead* bm, bool not_at_start) {
1033 alternatives_->at(1).node()->FillInBMInfo(compiler, offset, budget - 1, bm, 1033 alternatives_->at(1).node()->FillInBMInfo(isolate, offset, budget - 1, bm,
1034 not_at_start); 1034 not_at_start);
1035 if (offset == 0) set_bm_info(not_at_start, bm); 1035 if (offset == 0) set_bm_info(not_at_start, bm);
1036 } 1036 }
1037 // For a negative lookahead we don't emit the quick check for the 1037 // For a negative lookahead we don't emit the quick check for the
1038 // alternative that is expected to fail. This is because quick check code 1038 // alternative that is expected to fail. This is because quick check code
1039 // starts by loading enough characters for the alternative that takes fewest 1039 // starts by loading enough characters for the alternative that takes fewest
1040 // characters, but on a negative lookahead the negative branch did not take 1040 // characters, but on a negative lookahead the negative branch did not take
1041 // part in that calculation (EatsAtLeast) so the assumptions don't hold. 1041 // part in that calculation (EatsAtLeast) so the assumptions don't hold.
1042 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) { 1042 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
1043 return !is_first; 1043 return !is_first;
1044 } 1044 }
1045 virtual RegExpNode* FilterOneByte(int depth, RegExpCompiler* compiler); 1045 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
1046 }; 1046 };
1047 1047
1048 1048
1049 class LoopChoiceNode: public ChoiceNode { 1049 class LoopChoiceNode: public ChoiceNode {
1050 public: 1050 public:
1051 LoopChoiceNode(bool body_can_be_zero_length, bool read_backward, Zone* zone) 1051 LoopChoiceNode(bool body_can_be_zero_length, bool read_backward, Zone* zone)
1052 : ChoiceNode(2, zone), 1052 : ChoiceNode(2, zone),
1053 loop_node_(NULL), 1053 loop_node_(NULL),
1054 continue_node_(NULL), 1054 continue_node_(NULL),
1055 body_can_be_zero_length_(body_can_be_zero_length), 1055 body_can_be_zero_length_(body_can_be_zero_length),
1056 read_backward_(read_backward) {} 1056 read_backward_(read_backward) {}
1057 void AddLoopAlternative(GuardedAlternative alt); 1057 void AddLoopAlternative(GuardedAlternative alt);
1058 void AddContinueAlternative(GuardedAlternative alt); 1058 void AddContinueAlternative(GuardedAlternative alt);
1059 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 1059 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
1060 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 1060 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
1061 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 1061 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
1062 RegExpCompiler* compiler, 1062 RegExpCompiler* compiler,
1063 int characters_filled_in, 1063 int characters_filled_in,
1064 bool not_at_start); 1064 bool not_at_start);
1065 virtual void FillInBMInfo(RegExpCompiler* compiler, int offset, int budget, 1065 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
1066 BoyerMooreLookahead* bm, bool not_at_start); 1066 BoyerMooreLookahead* bm, bool not_at_start);
1067 RegExpNode* loop_node() { return loop_node_; } 1067 RegExpNode* loop_node() { return loop_node_; }
1068 RegExpNode* continue_node() { return continue_node_; } 1068 RegExpNode* continue_node() { return continue_node_; }
1069 bool body_can_be_zero_length() { return body_can_be_zero_length_; } 1069 bool body_can_be_zero_length() { return body_can_be_zero_length_; }
1070 virtual bool read_backward() { return read_backward_; } 1070 virtual bool read_backward() { return read_backward_; }
1071 virtual void Accept(NodeVisitor* visitor); 1071 virtual void Accept(NodeVisitor* visitor);
1072 virtual RegExpNode* FilterOneByte(int depth, RegExpCompiler* compiler); 1072 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
1073 1073
1074 private: 1074 private:
1075 // AddAlternative is made private for loop nodes because alternatives 1075 // AddAlternative is made private for loop nodes because alternatives
1076 // should not be added freely, we need to keep track of which node 1076 // should not be added freely, we need to keep track of which node
1077 // goes back to the node itself. 1077 // goes back to the node itself.
1078 void AddAlternative(GuardedAlternative node) { 1078 void AddAlternative(GuardedAlternative node) {
1079 ChoiceNode::AddAlternative(node); 1079 ChoiceNode::AddAlternative(node);
1080 } 1080 }
1081 1081
1082 RegExpNode* loop_node_; 1082 RegExpNode* loop_node_;
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 static const int kStringOffset = 0; 1581 static const int kStringOffset = 0;
1582 static const int kPatternOffset = 1; 1582 static const int kPatternOffset = 1;
1583 static const int kArrayOffset = 2; 1583 static const int kArrayOffset = 2;
1584 static const int kLastMatchOffset = 3; 1584 static const int kLastMatchOffset = 3;
1585 }; 1585 };
1586 1586
1587 } // namespace internal 1587 } // namespace internal
1588 } // namespace v8 1588 } // namespace v8
1589 1589
1590 #endif // V8_REGEXP_JSREGEXP_H_ 1590 #endif // V8_REGEXP_JSREGEXP_H_
OLDNEW
« no previous file with comments | « no previous file | src/regexp/jsregexp.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698