| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 VISIT(Text) | 422 VISIT(Text) |
| 423 | 423 |
| 424 | 424 |
| 425 #define FORWARD_DECLARE(Name) class RegExp##Name; | 425 #define FORWARD_DECLARE(Name) class RegExp##Name; |
| 426 FOR_EACH_REG_EXP_TREE_TYPE(FORWARD_DECLARE) | 426 FOR_EACH_REG_EXP_TREE_TYPE(FORWARD_DECLARE) |
| 427 #undef FORWARD_DECLARE | 427 #undef FORWARD_DECLARE |
| 428 | 428 |
| 429 | 429 |
| 430 class TextElement { | 430 class TextElement { |
| 431 public: | 431 public: |
| 432 enum Type {UNINITIALIZED, ATOM, CHAR_CLASS}; | 432 enum TextType {UNINITIALIZED, ATOM, CHAR_CLASS}; |
| 433 TextElement() : type(UNINITIALIZED) { } | 433 TextElement() : text_type(UNINITIALIZED) { } |
| 434 explicit TextElement(Type t) : type(t), cp_offset(-1) { } | 434 explicit TextElement(TextType t) : text_type(t), cp_offset(-1) { } |
| 435 static TextElement Atom(RegExpAtom* atom); | 435 static TextElement Atom(RegExpAtom* atom); |
| 436 static TextElement CharClass(RegExpCharacterClass* char_class); | 436 static TextElement CharClass(RegExpCharacterClass* char_class); |
| 437 int length(); | 437 int length(); |
| 438 Type type; | 438 TextType text_type; |
| 439 union { | 439 union { |
| 440 RegExpAtom* u_atom; | 440 RegExpAtom* u_atom; |
| 441 RegExpCharacterClass* u_char_class; | 441 RegExpCharacterClass* u_char_class; |
| 442 } data; | 442 } data; |
| 443 int cp_offset; | 443 int cp_offset; |
| 444 }; | 444 }; |
| 445 | 445 |
| 446 | 446 |
| 447 class Trace; | 447 class Trace; |
| 448 | 448 |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 protected: | 732 protected: |
| 733 RegExpNode* FilterSuccessor(int depth, bool ignore_case); | 733 RegExpNode* FilterSuccessor(int depth, bool ignore_case); |
| 734 | 734 |
| 735 private: | 735 private: |
| 736 RegExpNode* on_success_; | 736 RegExpNode* on_success_; |
| 737 }; | 737 }; |
| 738 | 738 |
| 739 | 739 |
| 740 class ActionNode: public SeqRegExpNode { | 740 class ActionNode: public SeqRegExpNode { |
| 741 public: | 741 public: |
| 742 enum Type { | 742 enum ActionType { |
| 743 SET_REGISTER, | 743 SET_REGISTER, |
| 744 INCREMENT_REGISTER, | 744 INCREMENT_REGISTER, |
| 745 STORE_POSITION, | 745 STORE_POSITION, |
| 746 BEGIN_SUBMATCH, | 746 BEGIN_SUBMATCH, |
| 747 POSITIVE_SUBMATCH_SUCCESS, | 747 POSITIVE_SUBMATCH_SUCCESS, |
| 748 EMPTY_MATCH_CHECK, | 748 EMPTY_MATCH_CHECK, |
| 749 CLEAR_CAPTURES | 749 CLEAR_CAPTURES |
| 750 }; | 750 }; |
| 751 static ActionNode* SetRegister(int reg, int val, RegExpNode* on_success); | 751 static ActionNode* SetRegister(int reg, int val, RegExpNode* on_success); |
| 752 static ActionNode* IncrementRegister(int reg, RegExpNode* on_success); | 752 static ActionNode* IncrementRegister(int reg, RegExpNode* on_success); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 773 RegExpCompiler* compiler, | 773 RegExpCompiler* compiler, |
| 774 int filled_in, | 774 int filled_in, |
| 775 bool not_at_start) { | 775 bool not_at_start) { |
| 776 return on_success()->GetQuickCheckDetails( | 776 return on_success()->GetQuickCheckDetails( |
| 777 details, compiler, filled_in, not_at_start); | 777 details, compiler, filled_in, not_at_start); |
| 778 } | 778 } |
| 779 virtual void FillInBMInfo(int offset, | 779 virtual void FillInBMInfo(int offset, |
| 780 int budget, | 780 int budget, |
| 781 BoyerMooreLookahead* bm, | 781 BoyerMooreLookahead* bm, |
| 782 bool not_at_start); | 782 bool not_at_start); |
| 783 Type type() { return type_; } | 783 ActionType action_type() { return action_type_; } |
| 784 // TODO(erikcorry): We should allow some action nodes in greedy loops. | 784 // TODO(erikcorry): We should allow some action nodes in greedy loops. |
| 785 virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; } | 785 virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; } |
| 786 | 786 |
| 787 private: | 787 private: |
| 788 union { | 788 union { |
| 789 struct { | 789 struct { |
| 790 int reg; | 790 int reg; |
| 791 int value; | 791 int value; |
| 792 } u_store_register; | 792 } u_store_register; |
| 793 struct { | 793 struct { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 806 struct { | 806 struct { |
| 807 int start_register; | 807 int start_register; |
| 808 int repetition_register; | 808 int repetition_register; |
| 809 int repetition_limit; | 809 int repetition_limit; |
| 810 } u_empty_match_check; | 810 } u_empty_match_check; |
| 811 struct { | 811 struct { |
| 812 int range_from; | 812 int range_from; |
| 813 int range_to; | 813 int range_to; |
| 814 } u_clear_captures; | 814 } u_clear_captures; |
| 815 } data_; | 815 } data_; |
| 816 ActionNode(Type type, RegExpNode* on_success) | 816 ActionNode(ActionType action_type, RegExpNode* on_success) |
| 817 : SeqRegExpNode(on_success), | 817 : SeqRegExpNode(on_success), |
| 818 type_(type) { } | 818 action_type_(action_type) { } |
| 819 Type type_; | 819 ActionType action_type_; |
| 820 friend class DotPrinter; | 820 friend class DotPrinter; |
| 821 }; | 821 }; |
| 822 | 822 |
| 823 | 823 |
| 824 class TextNode: public SeqRegExpNode { | 824 class TextNode: public SeqRegExpNode { |
| 825 public: | 825 public: |
| 826 TextNode(ZoneList<TextElement>* elms, | 826 TextNode(ZoneList<TextElement>* elms, |
| 827 RegExpNode* on_success) | 827 RegExpNode* on_success) |
| 828 : SeqRegExpNode(on_success), | 828 : SeqRegExpNode(on_success), |
| 829 elms_(elms) { } | 829 elms_(elms) { } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 Trace* trace, | 869 Trace* trace, |
| 870 bool first_element_checked, | 870 bool first_element_checked, |
| 871 int* checked_up_to); | 871 int* checked_up_to); |
| 872 int Length(); | 872 int Length(); |
| 873 ZoneList<TextElement>* elms_; | 873 ZoneList<TextElement>* elms_; |
| 874 }; | 874 }; |
| 875 | 875 |
| 876 | 876 |
| 877 class AssertionNode: public SeqRegExpNode { | 877 class AssertionNode: public SeqRegExpNode { |
| 878 public: | 878 public: |
| 879 enum AssertionNodeType { | 879 enum AssertionType { |
| 880 AT_END, | 880 AT_END, |
| 881 AT_START, | 881 AT_START, |
| 882 AT_BOUNDARY, | 882 AT_BOUNDARY, |
| 883 AT_NON_BOUNDARY, | 883 AT_NON_BOUNDARY, |
| 884 AFTER_NEWLINE | 884 AFTER_NEWLINE |
| 885 }; | 885 }; |
| 886 static AssertionNode* AtEnd(RegExpNode* on_success) { | 886 static AssertionNode* AtEnd(RegExpNode* on_success) { |
| 887 return new(on_success->zone()) AssertionNode(AT_END, on_success); | 887 return new(on_success->zone()) AssertionNode(AT_END, on_success); |
| 888 } | 888 } |
| 889 static AssertionNode* AtStart(RegExpNode* on_success) { | 889 static AssertionNode* AtStart(RegExpNode* on_success) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 902 virtual void Emit(RegExpCompiler* compiler, Trace* trace); | 902 virtual void Emit(RegExpCompiler* compiler, Trace* trace); |
| 903 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); | 903 virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start); |
| 904 virtual void GetQuickCheckDetails(QuickCheckDetails* details, | 904 virtual void GetQuickCheckDetails(QuickCheckDetails* details, |
| 905 RegExpCompiler* compiler, | 905 RegExpCompiler* compiler, |
| 906 int filled_in, | 906 int filled_in, |
| 907 bool not_at_start); | 907 bool not_at_start); |
| 908 virtual void FillInBMInfo(int offset, | 908 virtual void FillInBMInfo(int offset, |
| 909 int budget, | 909 int budget, |
| 910 BoyerMooreLookahead* bm, | 910 BoyerMooreLookahead* bm, |
| 911 bool not_at_start); | 911 bool not_at_start); |
| 912 AssertionNodeType type() { return type_; } | 912 AssertionType assertion_type() { return assertion_type_; } |
| 913 void set_type(AssertionNodeType type) { type_ = type; } | |
| 914 | 913 |
| 915 private: | 914 private: |
| 916 void EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace); | 915 void EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace); |
| 917 enum IfPrevious { kIsNonWord, kIsWord }; | 916 enum IfPrevious { kIsNonWord, kIsWord }; |
| 918 void BacktrackIfPrevious(RegExpCompiler* compiler, | 917 void BacktrackIfPrevious(RegExpCompiler* compiler, |
| 919 Trace* trace, | 918 Trace* trace, |
| 920 IfPrevious backtrack_if_previous); | 919 IfPrevious backtrack_if_previous); |
| 921 AssertionNode(AssertionNodeType t, RegExpNode* on_success) | 920 AssertionNode(AssertionType t, RegExpNode* on_success) |
| 922 : SeqRegExpNode(on_success), type_(t) { } | 921 : SeqRegExpNode(on_success), assertion_type_(t) { } |
| 923 AssertionNodeType type_; | 922 AssertionType assertion_type_; |
| 924 }; | 923 }; |
| 925 | 924 |
| 926 | 925 |
| 927 class BackReferenceNode: public SeqRegExpNode { | 926 class BackReferenceNode: public SeqRegExpNode { |
| 928 public: | 927 public: |
| 929 BackReferenceNode(int start_reg, | 928 BackReferenceNode(int start_reg, |
| 930 int end_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), |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1330 class Trace { | 1329 class Trace { |
| 1331 public: | 1330 public: |
| 1332 // A value for a property that is either known to be true, know to be false, | 1331 // A value for a property that is either known to be true, know to be false, |
| 1333 // or not known. | 1332 // or not known. |
| 1334 enum TriBool { | 1333 enum TriBool { |
| 1335 UNKNOWN = -1, FALSE = 0, TRUE = 1 | 1334 UNKNOWN = -1, FALSE = 0, TRUE = 1 |
| 1336 }; | 1335 }; |
| 1337 | 1336 |
| 1338 class DeferredAction { | 1337 class DeferredAction { |
| 1339 public: | 1338 public: |
| 1340 DeferredAction(ActionNode::Type type, int reg) | 1339 DeferredAction(ActionNode::ActionType action_type, int reg) |
| 1341 : type_(type), reg_(reg), next_(NULL) { } | 1340 : action_type_(action_type), reg_(reg), next_(NULL) { } |
| 1342 DeferredAction* next() { return next_; } | 1341 DeferredAction* next() { return next_; } |
| 1343 bool Mentions(int reg); | 1342 bool Mentions(int reg); |
| 1344 int reg() { return reg_; } | 1343 int reg() { return reg_; } |
| 1345 ActionNode::Type type() { return type_; } | 1344 ActionNode::ActionType action_type() { return action_type_; } |
| 1346 private: | 1345 private: |
| 1347 ActionNode::Type type_; | 1346 ActionNode::ActionType action_type_; |
| 1348 int reg_; | 1347 int reg_; |
| 1349 DeferredAction* next_; | 1348 DeferredAction* next_; |
| 1350 friend class Trace; | 1349 friend class Trace; |
| 1351 }; | 1350 }; |
| 1352 | 1351 |
| 1353 class DeferredCapture : public DeferredAction { | 1352 class DeferredCapture : public DeferredAction { |
| 1354 public: | 1353 public: |
| 1355 DeferredCapture(int reg, bool is_capture, Trace* trace) | 1354 DeferredCapture(int reg, bool is_capture, Trace* trace) |
| 1356 : DeferredAction(ActionNode::STORE_POSITION, reg), | 1355 : DeferredAction(ActionNode::STORE_POSITION, reg), |
| 1357 cp_offset_(trace->cp_offset()), | 1356 cp_offset_(trace->cp_offset()), |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1615 Handle<String> sample_subject, | 1614 Handle<String> sample_subject, |
| 1616 bool is_ascii, Zone* zone); | 1615 bool is_ascii, Zone* zone); |
| 1617 | 1616 |
| 1618 static void DotPrint(const char* label, RegExpNode* node, bool ignore_case); | 1617 static void DotPrint(const char* label, RegExpNode* node, bool ignore_case); |
| 1619 }; | 1618 }; |
| 1620 | 1619 |
| 1621 | 1620 |
| 1622 } } // namespace v8::internal | 1621 } } // namespace v8::internal |
| 1623 | 1622 |
| 1624 #endif // V8_JSREGEXP_H_ | 1623 #endif // V8_JSREGEXP_H_ |
| OLD | NEW |