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

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

Issue 1451373003: Revert of Experimental support for RegExp lookbehind. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 | « src/regexp/interpreter-irregexp.cc ('k') | 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 10
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 380
381 #define FOR_EACH_NODE_TYPE(VISIT) \ 381 #define FOR_EACH_NODE_TYPE(VISIT) \
382 VISIT(End) \ 382 VISIT(End) \
383 VISIT(Action) \ 383 VISIT(Action) \
384 VISIT(Choice) \ 384 VISIT(Choice) \
385 VISIT(BackReference) \ 385 VISIT(BackReference) \
386 VISIT(Assertion) \ 386 VISIT(Assertion) \
387 VISIT(Text) 387 VISIT(Text)
388 388
389 389
390 #define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \ 390 #define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \
391 VISIT(Disjunction) \ 391 VISIT(Disjunction) \
392 VISIT(Alternative) \ 392 VISIT(Alternative) \
393 VISIT(Assertion) \ 393 VISIT(Assertion) \
394 VISIT(CharacterClass) \ 394 VISIT(CharacterClass) \
395 VISIT(Atom) \ 395 VISIT(Atom) \
396 VISIT(Quantifier) \ 396 VISIT(Quantifier) \
397 VISIT(Capture) \ 397 VISIT(Capture) \
398 VISIT(Lookaround) \ 398 VISIT(Lookahead) \
399 VISIT(BackReference) \ 399 VISIT(BackReference) \
400 VISIT(Empty) \ 400 VISIT(Empty) \
401 VISIT(Text) 401 VISIT(Text)
402 402
403 403
404 #define FORWARD_DECLARE(Name) class RegExp##Name; 404 #define FORWARD_DECLARE(Name) class RegExp##Name;
405 FOR_EACH_REG_EXP_TREE_TYPE(FORWARD_DECLARE) 405 FOR_EACH_REG_EXP_TREE_TYPE(FORWARD_DECLARE)
406 #undef FORWARD_DECLARE 406 #undef FORWARD_DECLARE
407 407
408 408
409 class TextElement final BASE_EMBEDDED { 409 class TextElement final BASE_EMBEDDED {
410 public: 410 public:
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 QuickCheckDetails* details_return, 596 QuickCheckDetails* details_return,
597 bool fall_through_on_failure); 597 bool fall_through_on_failure);
598 // For a given number of characters this returns a mask and a value. The 598 // For a given number of characters this returns a mask and a value. The
599 // next n characters are anded with the mask and compared with the value. 599 // next n characters are anded with the mask and compared with the value.
600 // A comparison failure indicates the node cannot match the next n characters. 600 // A comparison failure indicates the node cannot match the next n characters.
601 // A comparison success indicates the node may match. 601 // A comparison success indicates the node may match.
602 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 602 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
603 RegExpCompiler* compiler, 603 RegExpCompiler* compiler,
604 int characters_filled_in, 604 int characters_filled_in,
605 bool not_at_start) = 0; 605 bool not_at_start) = 0;
606 static const int kNodeIsTooComplexForGreedyLoops = kMinInt; 606 static const int kNodeIsTooComplexForGreedyLoops = -1;
607 virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; } 607 virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; }
608 // Only returns the successor for a text node of length 1 that matches any 608 // Only returns the successor for a text node of length 1 that matches any
609 // character and that has no guards on it. 609 // character and that has no guards on it.
610 virtual RegExpNode* GetSuccessorOfOmnivorousTextNode( 610 virtual RegExpNode* GetSuccessorOfOmnivorousTextNode(
611 RegExpCompiler* compiler) { 611 RegExpCompiler* compiler) {
612 return NULL; 612 return NULL;
613 } 613 }
614 614
615 // Collects information on the possible code units (mod 128) that can match if 615 // Collects information on the possible code units (mod 128) that can match if
616 // we look forward. This is used for a Boyer-Moore-like string searching 616 // we look forward. This is used for a Boyer-Moore-like string searching
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 ActionNode(ActionType action_type, RegExpNode* on_success) 820 ActionNode(ActionType action_type, RegExpNode* on_success)
821 : SeqRegExpNode(on_success), 821 : SeqRegExpNode(on_success),
822 action_type_(action_type) { } 822 action_type_(action_type) { }
823 ActionType action_type_; 823 ActionType action_type_;
824 friend class DotPrinter; 824 friend class DotPrinter;
825 }; 825 };
826 826
827 827
828 class TextNode: public SeqRegExpNode { 828 class TextNode: public SeqRegExpNode {
829 public: 829 public:
830 TextNode(ZoneList<TextElement>* elms, bool read_backward, 830 TextNode(ZoneList<TextElement>* elms,
831 RegExpNode* on_success)
832 : SeqRegExpNode(on_success), elms_(elms), read_backward_(read_backward) {}
833 TextNode(RegExpCharacterClass* that, bool read_backward,
834 RegExpNode* on_success) 831 RegExpNode* on_success)
835 : SeqRegExpNode(on_success), 832 : SeqRegExpNode(on_success),
836 elms_(new (zone()) ZoneList<TextElement>(1, zone())), 833 elms_(elms) { }
837 read_backward_(read_backward) { 834 TextNode(RegExpCharacterClass* that,
835 RegExpNode* on_success)
836 : SeqRegExpNode(on_success),
837 elms_(new(zone()) ZoneList<TextElement>(1, zone())) {
838 elms_->Add(TextElement::CharClass(that), zone()); 838 elms_->Add(TextElement::CharClass(that), zone());
839 } 839 }
840 virtual void Accept(NodeVisitor* visitor); 840 virtual void Accept(NodeVisitor* visitor);
841 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 841 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
842 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 842 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
843 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 843 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
844 RegExpCompiler* compiler, 844 RegExpCompiler* compiler,
845 int characters_filled_in, 845 int characters_filled_in,
846 bool not_at_start); 846 bool not_at_start);
847 ZoneList<TextElement>* elements() { return elms_; } 847 ZoneList<TextElement>* elements() { return elms_; }
848 bool read_backward() { return read_backward_; }
849 void MakeCaseIndependent(Isolate* isolate, bool is_one_byte); 848 void MakeCaseIndependent(Isolate* isolate, bool is_one_byte);
850 virtual int GreedyLoopTextLength(); 849 virtual int GreedyLoopTextLength();
851 virtual RegExpNode* GetSuccessorOfOmnivorousTextNode( 850 virtual RegExpNode* GetSuccessorOfOmnivorousTextNode(
852 RegExpCompiler* compiler); 851 RegExpCompiler* compiler);
853 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget, 852 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
854 BoyerMooreLookahead* bm, bool not_at_start); 853 BoyerMooreLookahead* bm, bool not_at_start);
855 void CalculateOffsets(); 854 void CalculateOffsets();
856 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case); 855 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
857 856
858 private: 857 private:
859 enum TextEmitPassType { 858 enum TextEmitPassType {
860 NON_LATIN1_MATCH, // Check for characters that can't match. 859 NON_LATIN1_MATCH, // Check for characters that can't match.
861 SIMPLE_CHARACTER_MATCH, // Case-dependent single character check. 860 SIMPLE_CHARACTER_MATCH, // Case-dependent single character check.
862 NON_LETTER_CHARACTER_MATCH, // Check characters that have no case equivs. 861 NON_LETTER_CHARACTER_MATCH, // Check characters that have no case equivs.
863 CASE_CHARACTER_MATCH, // Case-independent single character check. 862 CASE_CHARACTER_MATCH, // Case-independent single character check.
864 CHARACTER_CLASS_MATCH // Character class. 863 CHARACTER_CLASS_MATCH // Character class.
865 }; 864 };
866 static bool SkipPass(int pass, bool ignore_case); 865 static bool SkipPass(int pass, bool ignore_case);
867 static const int kFirstRealPass = SIMPLE_CHARACTER_MATCH; 866 static const int kFirstRealPass = SIMPLE_CHARACTER_MATCH;
868 static const int kLastPass = CHARACTER_CLASS_MATCH; 867 static const int kLastPass = CHARACTER_CLASS_MATCH;
869 void TextEmitPass(RegExpCompiler* compiler, 868 void TextEmitPass(RegExpCompiler* compiler,
870 TextEmitPassType pass, 869 TextEmitPassType pass,
871 bool preloaded, 870 bool preloaded,
872 Trace* trace, 871 Trace* trace,
873 bool first_element_checked, 872 bool first_element_checked,
874 int* checked_up_to); 873 int* checked_up_to);
875 int Length(); 874 int Length();
876 ZoneList<TextElement>* elms_; 875 ZoneList<TextElement>* elms_;
877 bool read_backward_;
878 }; 876 };
879 877
880 878
881 class AssertionNode: public SeqRegExpNode { 879 class AssertionNode: public SeqRegExpNode {
882 public: 880 public:
883 enum AssertionType { 881 enum AssertionType {
884 AT_END, 882 AT_END,
885 AT_START, 883 AT_START,
886 AT_BOUNDARY, 884 AT_BOUNDARY,
887 AT_NON_BOUNDARY, 885 AT_NON_BOUNDARY,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 Trace* trace, 918 Trace* trace,
921 IfPrevious backtrack_if_previous); 919 IfPrevious backtrack_if_previous);
922 AssertionNode(AssertionType t, RegExpNode* on_success) 920 AssertionNode(AssertionType t, RegExpNode* on_success)
923 : SeqRegExpNode(on_success), assertion_type_(t) { } 921 : SeqRegExpNode(on_success), assertion_type_(t) { }
924 AssertionType assertion_type_; 922 AssertionType assertion_type_;
925 }; 923 };
926 924
927 925
928 class BackReferenceNode: public SeqRegExpNode { 926 class BackReferenceNode: public SeqRegExpNode {
929 public: 927 public:
930 BackReferenceNode(int start_reg, int end_reg, bool read_backward, 928 BackReferenceNode(int start_reg,
929 int end_reg,
931 RegExpNode* on_success) 930 RegExpNode* on_success)
932 : SeqRegExpNode(on_success), 931 : SeqRegExpNode(on_success),
933 start_reg_(start_reg), 932 start_reg_(start_reg),
934 end_reg_(end_reg), 933 end_reg_(end_reg) { }
935 read_backward_(read_backward) {}
936 virtual void Accept(NodeVisitor* visitor); 934 virtual void Accept(NodeVisitor* visitor);
937 int start_register() { return start_reg_; } 935 int start_register() { return start_reg_; }
938 int end_register() { return end_reg_; } 936 int end_register() { return end_reg_; }
939 bool read_backward() { return read_backward_; }
940 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 937 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
941 virtual int EatsAtLeast(int still_to_find, 938 virtual int EatsAtLeast(int still_to_find,
942 int recursion_depth, 939 int recursion_depth,
943 bool not_at_start); 940 bool not_at_start);
944 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 941 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
945 RegExpCompiler* compiler, 942 RegExpCompiler* compiler,
946 int characters_filled_in, 943 int characters_filled_in,
947 bool not_at_start) { 944 bool not_at_start) {
948 return; 945 return;
949 } 946 }
950 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget, 947 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
951 BoyerMooreLookahead* bm, bool not_at_start); 948 BoyerMooreLookahead* bm, bool not_at_start);
952 949
953 private: 950 private:
954 int start_reg_; 951 int start_reg_;
955 int end_reg_; 952 int end_reg_;
956 bool read_backward_;
957 }; 953 };
958 954
959 955
960 class EndNode: public RegExpNode { 956 class EndNode: public RegExpNode {
961 public: 957 public:
962 enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS }; 958 enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS };
963 explicit EndNode(Action action, Zone* zone) 959 explicit EndNode(Action action, Zone* zone)
964 : RegExpNode(zone), action_(action) { } 960 : RegExpNode(zone), action_(action) { }
965 virtual void Accept(NodeVisitor* visitor); 961 virtual void Accept(NodeVisitor* visitor);
966 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 962 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 BoyerMooreLookahead* bm, bool not_at_start); 1067 BoyerMooreLookahead* bm, bool not_at_start);
1072 1068
1073 bool being_calculated() { return being_calculated_; } 1069 bool being_calculated() { return being_calculated_; }
1074 bool not_at_start() { return not_at_start_; } 1070 bool not_at_start() { return not_at_start_; }
1075 void set_not_at_start() { not_at_start_ = true; } 1071 void set_not_at_start() { not_at_start_ = true; }
1076 void set_being_calculated(bool b) { being_calculated_ = b; } 1072 void set_being_calculated(bool b) { being_calculated_ = b; }
1077 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) { 1073 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
1078 return true; 1074 return true;
1079 } 1075 }
1080 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case); 1076 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
1081 virtual bool read_backward() { return false; }
1082 1077
1083 protected: 1078 protected:
1084 int GreedyLoopTextLengthForAlternative(GuardedAlternative* alternative); 1079 int GreedyLoopTextLengthForAlternative(GuardedAlternative* alternative);
1085 ZoneList<GuardedAlternative>* alternatives_; 1080 ZoneList<GuardedAlternative>* alternatives_;
1086 1081
1087 private: 1082 private:
1088 friend class DispatchTableConstructor; 1083 friend class DispatchTableConstructor;
1089 friend class Analysis; 1084 friend class Analysis;
1090 void GenerateGuard(RegExpMacroAssembler* macro_assembler, 1085 void GenerateGuard(RegExpMacroAssembler* macro_assembler,
1091 Guard* guard, 1086 Guard* guard,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 // part in that calculation (EatsAtLeast) so the assumptions don't hold. 1143 // part in that calculation (EatsAtLeast) so the assumptions don't hold.
1149 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) { 1144 virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
1150 return !is_first; 1145 return !is_first;
1151 } 1146 }
1152 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case); 1147 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
1153 }; 1148 };
1154 1149
1155 1150
1156 class LoopChoiceNode: public ChoiceNode { 1151 class LoopChoiceNode: public ChoiceNode {
1157 public: 1152 public:
1158 LoopChoiceNode(bool body_can_be_zero_length, bool read_backward, Zone* zone) 1153 explicit LoopChoiceNode(bool body_can_be_zero_length, Zone* zone)
1159 : ChoiceNode(2, zone), 1154 : ChoiceNode(2, zone),
1160 loop_node_(NULL), 1155 loop_node_(NULL),
1161 continue_node_(NULL), 1156 continue_node_(NULL),
1162 body_can_be_zero_length_(body_can_be_zero_length), 1157 body_can_be_zero_length_(body_can_be_zero_length)
1163 read_backward_(read_backward) {} 1158 { }
1164 void AddLoopAlternative(GuardedAlternative alt); 1159 void AddLoopAlternative(GuardedAlternative alt);
1165 void AddContinueAlternative(GuardedAlternative alt); 1160 void AddContinueAlternative(GuardedAlternative alt);
1166 virtual void Emit(RegExpCompiler* compiler, Trace* trace); 1161 virtual void Emit(RegExpCompiler* compiler, Trace* trace);
1167 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); 1162 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
1168 virtual void GetQuickCheckDetails(QuickCheckDetails* details, 1163 virtual void GetQuickCheckDetails(QuickCheckDetails* details,
1169 RegExpCompiler* compiler, 1164 RegExpCompiler* compiler,
1170 int characters_filled_in, 1165 int characters_filled_in,
1171 bool not_at_start); 1166 bool not_at_start);
1172 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget, 1167 virtual void FillInBMInfo(Isolate* isolate, int offset, int budget,
1173 BoyerMooreLookahead* bm, bool not_at_start); 1168 BoyerMooreLookahead* bm, bool not_at_start);
1174 RegExpNode* loop_node() { return loop_node_; } 1169 RegExpNode* loop_node() { return loop_node_; }
1175 RegExpNode* continue_node() { return continue_node_; } 1170 RegExpNode* continue_node() { return continue_node_; }
1176 bool body_can_be_zero_length() { return body_can_be_zero_length_; } 1171 bool body_can_be_zero_length() { return body_can_be_zero_length_; }
1177 virtual bool read_backward() { return read_backward_; }
1178 virtual void Accept(NodeVisitor* visitor); 1172 virtual void Accept(NodeVisitor* visitor);
1179 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case); 1173 virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
1180 1174
1181 private: 1175 private:
1182 // AddAlternative is made private for loop nodes because alternatives 1176 // AddAlternative is made private for loop nodes because alternatives
1183 // should not be added freely, we need to keep track of which node 1177 // should not be added freely, we need to keep track of which node
1184 // goes back to the node itself. 1178 // goes back to the node itself.
1185 void AddAlternative(GuardedAlternative node) { 1179 void AddAlternative(GuardedAlternative node) {
1186 ChoiceNode::AddAlternative(node); 1180 ChoiceNode::AddAlternative(node);
1187 } 1181 }
1188 1182
1189 RegExpNode* loop_node_; 1183 RegExpNode* loop_node_;
1190 RegExpNode* continue_node_; 1184 RegExpNode* continue_node_;
1191 bool body_can_be_zero_length_; 1185 bool body_can_be_zero_length_;
1192 bool read_backward_;
1193 }; 1186 };
1194 1187
1195 1188
1196 // Improve the speed that we scan for an initial point where a non-anchored 1189 // Improve the speed that we scan for an initial point where a non-anchored
1197 // regexp can match by using a Boyer-Moore-like table. This is done by 1190 // regexp can match by using a Boyer-Moore-like table. This is done by
1198 // identifying non-greedy non-capturing loops in the nodes that eat any 1191 // identifying non-greedy non-capturing loops in the nodes that eat any
1199 // character one at a time. For example in the middle of the regexp 1192 // character one at a time. For example in the middle of the regexp
1200 // /foo[\s\S]*?bar/ we find such a loop. There is also such a loop implicitly 1193 // /foo[\s\S]*?bar/ we find such a loop. There is also such a loop implicitly
1201 // inserted at the start of any non-anchored regexp. 1194 // inserted at the start of any non-anchored regexp.
1202 // 1195 //
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 bool is_trivial() { 1431 bool is_trivial() {
1439 return backtrack_ == NULL && 1432 return backtrack_ == NULL &&
1440 actions_ == NULL && 1433 actions_ == NULL &&
1441 cp_offset_ == 0 && 1434 cp_offset_ == 0 &&
1442 characters_preloaded_ == 0 && 1435 characters_preloaded_ == 0 &&
1443 bound_checked_up_to_ == 0 && 1436 bound_checked_up_to_ == 0 &&
1444 quick_check_performed_.characters() == 0 && 1437 quick_check_performed_.characters() == 0 &&
1445 at_start_ == UNKNOWN; 1438 at_start_ == UNKNOWN;
1446 } 1439 }
1447 TriBool at_start() { return at_start_; } 1440 TriBool at_start() { return at_start_; }
1448 void set_at_start(TriBool at_start) { at_start_ = at_start; } 1441 void set_at_start(bool at_start) {
1442 at_start_ = at_start ? TRUE_VALUE : FALSE_VALUE;
1443 }
1449 Label* backtrack() { return backtrack_; } 1444 Label* backtrack() { return backtrack_; }
1450 Label* loop_label() { return loop_label_; } 1445 Label* loop_label() { return loop_label_; }
1451 RegExpNode* stop_node() { return stop_node_; } 1446 RegExpNode* stop_node() { return stop_node_; }
1452 int characters_preloaded() { return characters_preloaded_; } 1447 int characters_preloaded() { return characters_preloaded_; }
1453 int bound_checked_up_to() { return bound_checked_up_to_; } 1448 int bound_checked_up_to() { return bound_checked_up_to_; }
1454 int flush_budget() { return flush_budget_; } 1449 int flush_budget() { return flush_budget_; }
1455 QuickCheckDetails* quick_check_performed() { return &quick_check_performed_; } 1450 QuickCheckDetails* quick_check_performed() { return &quick_check_performed_; }
1456 bool mentions_reg(int reg); 1451 bool mentions_reg(int reg);
1457 // Returns true if a deferred position store exists to the specified 1452 // Returns true if a deferred position store exists to the specified
1458 // register and stores the offset in the out-parameter. Otherwise 1453 // register and stores the offset in the out-parameter. Otherwise
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1685 static const int kStringOffset = 0; 1680 static const int kStringOffset = 0;
1686 static const int kPatternOffset = 1; 1681 static const int kPatternOffset = 1;
1687 static const int kArrayOffset = 2; 1682 static const int kArrayOffset = 2;
1688 static const int kLastMatchOffset = 3; 1683 static const int kLastMatchOffset = 3;
1689 }; 1684 };
1690 1685
1691 } // namespace internal 1686 } // namespace internal
1692 } // namespace v8 1687 } // namespace v8
1693 1688
1694 #endif // V8_REGEXP_JSREGEXP_H_ 1689 #endif // V8_REGEXP_JSREGEXP_H_
OLDNEW
« no previous file with comments | « src/regexp/interpreter-irregexp.cc ('k') | src/regexp/jsregexp.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698