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

Side by Side Diff: src/ast.h

Issue 7193007: Refix issue 1472. The previous fix worked for the example in the bug (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/jsregexp.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 1731 matching lines...) Expand 10 before | Expand all | Expand 10 after
1742 #define MAKE_CASE(Name) \ 1742 #define MAKE_CASE(Name) \
1743 virtual void* Visit##Name(RegExp##Name*, void* data) = 0; 1743 virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
1744 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) 1744 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
1745 #undef MAKE_CASE 1745 #undef MAKE_CASE
1746 }; 1746 };
1747 1747
1748 1748
1749 class RegExpTree: public ZoneObject { 1749 class RegExpTree: public ZoneObject {
1750 public: 1750 public:
1751 static const int kInfinity = kMaxInt; 1751 static const int kInfinity = kMaxInt;
1752 RegExpTree() : contains_expanded_quantifier_(false) { }
1753 virtual ~RegExpTree() { } 1752 virtual ~RegExpTree() { }
1754 virtual void* Accept(RegExpVisitor* visitor, void* data) = 0; 1753 virtual void* Accept(RegExpVisitor* visitor, void* data) = 0;
1755 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1754 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1756 RegExpNode* on_success) = 0; 1755 RegExpNode* on_success) = 0;
1757 virtual bool IsTextElement() { return false; } 1756 virtual bool IsTextElement() { return false; }
1758 virtual bool IsAnchoredAtStart() { return false; } 1757 virtual bool IsAnchoredAtStart() { return false; }
1759 virtual bool IsAnchoredAtEnd() { return false; } 1758 virtual bool IsAnchoredAtEnd() { return false; }
1760 virtual int min_match() = 0; 1759 virtual int min_match() = 0;
1761 virtual int max_match() = 0; 1760 virtual int max_match() = 0;
1762 virtual bool ContainsExpandedQuantifier() {
1763 return contains_expanded_quantifier_;
1764 }
1765 void set_contains_expanded_quantifier(bool value) {
1766 contains_expanded_quantifier_ = value;
1767 }
1768 // Returns the interval of registers used for captures within this 1761 // Returns the interval of registers used for captures within this
1769 // expression. 1762 // expression.
1770 virtual Interval CaptureRegisters() { return Interval::Empty(); } 1763 virtual Interval CaptureRegisters() { return Interval::Empty(); }
1771 virtual void AppendToText(RegExpText* text); 1764 virtual void AppendToText(RegExpText* text);
1772 SmartPointer<const char> ToString(); 1765 SmartPointer<const char> ToString();
1773 #define MAKE_ASTYPE(Name) \ 1766 #define MAKE_ASTYPE(Name) \
1774 virtual RegExp##Name* As##Name(); \ 1767 virtual RegExp##Name* As##Name(); \
1775 virtual bool Is##Name(); 1768 virtual bool Is##Name();
1776 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE) 1769 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE)
1777 #undef MAKE_ASTYPE 1770 #undef MAKE_ASTYPE
1778
1779 protected:
1780 bool contains_expanded_quantifier_;
1781 }; 1771 };
1782 1772
1783 1773
1784 class RegExpDisjunction: public RegExpTree { 1774 class RegExpDisjunction: public RegExpTree {
1785 public: 1775 public:
1786 explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives); 1776 explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives);
1787 virtual void* Accept(RegExpVisitor* visitor, void* data); 1777 virtual void* Accept(RegExpVisitor* visitor, void* data);
1788 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1778 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1789 RegExpNode* on_success); 1779 RegExpNode* on_success);
1790 virtual RegExpDisjunction* AsDisjunction(); 1780 virtual RegExpDisjunction* AsDisjunction();
1791 virtual Interval CaptureRegisters(); 1781 virtual Interval CaptureRegisters();
1792 virtual bool IsDisjunction(); 1782 virtual bool IsDisjunction();
1793 virtual bool IsAnchoredAtStart(); 1783 virtual bool IsAnchoredAtStart();
1794 virtual bool IsAnchoredAtEnd(); 1784 virtual bool IsAnchoredAtEnd();
1795 virtual int min_match() { return min_match_; } 1785 virtual int min_match() { return min_match_; }
1796 virtual int max_match() { return max_match_; } 1786 virtual int max_match() { return max_match_; }
1797 virtual bool ContainsExpandedQuantifier();
1798 ZoneList<RegExpTree*>* alternatives() { return alternatives_; } 1787 ZoneList<RegExpTree*>* alternatives() { return alternatives_; }
1799 private: 1788 private:
1800 ZoneList<RegExpTree*>* alternatives_; 1789 ZoneList<RegExpTree*>* alternatives_;
1801 int min_match_; 1790 int min_match_;
1802 int max_match_; 1791 int max_match_;
1803 }; 1792 };
1804 1793
1805 1794
1806 class RegExpAlternative: public RegExpTree { 1795 class RegExpAlternative: public RegExpTree {
1807 public: 1796 public:
1808 explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes); 1797 explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes);
1809 virtual void* Accept(RegExpVisitor* visitor, void* data); 1798 virtual void* Accept(RegExpVisitor* visitor, void* data);
1810 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1799 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1811 RegExpNode* on_success); 1800 RegExpNode* on_success);
1812 virtual RegExpAlternative* AsAlternative(); 1801 virtual RegExpAlternative* AsAlternative();
1813 virtual Interval CaptureRegisters(); 1802 virtual Interval CaptureRegisters();
1814 virtual bool IsAlternative(); 1803 virtual bool IsAlternative();
1815 virtual bool IsAnchoredAtStart(); 1804 virtual bool IsAnchoredAtStart();
1816 virtual bool IsAnchoredAtEnd(); 1805 virtual bool IsAnchoredAtEnd();
1817 virtual int min_match() { return min_match_; } 1806 virtual int min_match() { return min_match_; }
1818 virtual int max_match() { return max_match_; } 1807 virtual int max_match() { return max_match_; }
1819 virtual bool ContainsExpandedQuantifier();
1820 ZoneList<RegExpTree*>* nodes() { return nodes_; } 1808 ZoneList<RegExpTree*>* nodes() { return nodes_; }
1821 private: 1809 private:
1822 ZoneList<RegExpTree*>* nodes_; 1810 ZoneList<RegExpTree*>* nodes_;
1823 int min_match_; 1811 int min_match_;
1824 int max_match_; 1812 int max_match_;
1825 }; 1813 };
1826 1814
1827 1815
1828 class RegExpAssertion: public RegExpTree { 1816 class RegExpAssertion: public RegExpTree {
1829 public: 1817 public:
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 1947
1960 1948
1961 class RegExpQuantifier: public RegExpTree { 1949 class RegExpQuantifier: public RegExpTree {
1962 public: 1950 public:
1963 enum Type { GREEDY, NON_GREEDY, POSSESSIVE }; 1951 enum Type { GREEDY, NON_GREEDY, POSSESSIVE };
1964 RegExpQuantifier(int min, int max, Type type, RegExpTree* body) 1952 RegExpQuantifier(int min, int max, Type type, RegExpTree* body)
1965 : body_(body), 1953 : body_(body),
1966 min_(min), 1954 min_(min),
1967 max_(max), 1955 max_(max),
1968 min_match_(min * body->min_match()), 1956 min_match_(min * body->min_match()),
1969 type_(type), 1957 type_(type) {
1970 contains_expanded_quantifier_(false) {
1971 if (max > 0 && body->max_match() > kInfinity / max) { 1958 if (max > 0 && body->max_match() > kInfinity / max) {
1972 max_match_ = kInfinity; 1959 max_match_ = kInfinity;
1973 } else { 1960 } else {
1974 max_match_ = max * body->max_match(); 1961 max_match_ = max * body->max_match();
1975 } 1962 }
1976 } 1963 }
1977 virtual void* Accept(RegExpVisitor* visitor, void* data); 1964 virtual void* Accept(RegExpVisitor* visitor, void* data);
1978 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 1965 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
1979 RegExpNode* on_success); 1966 RegExpNode* on_success);
1980 static RegExpNode* ToNode(int min, 1967 static RegExpNode* ToNode(int min,
1981 int max, 1968 int max,
1982 bool is_greedy, 1969 bool is_greedy,
1983 RegExpTree* body, 1970 RegExpTree* body,
1984 RegExpCompiler* compiler, 1971 RegExpCompiler* compiler,
1985 RegExpNode* on_success, 1972 RegExpNode* on_success,
1986 bool not_at_start = false); 1973 bool not_at_start = false);
1987 virtual RegExpQuantifier* AsQuantifier(); 1974 virtual RegExpQuantifier* AsQuantifier();
1988 virtual Interval CaptureRegisters(); 1975 virtual Interval CaptureRegisters();
1989 virtual bool IsQuantifier(); 1976 virtual bool IsQuantifier();
1990 virtual int min_match() { return min_match_; } 1977 virtual int min_match() { return min_match_; }
1991 virtual int max_match() { return max_match_; } 1978 virtual int max_match() { return max_match_; }
1992 virtual bool ContainsExpandedQuantifier() {
1993 return contains_expanded_quantifier_ || body_->ContainsExpandedQuantifier();
1994 }
1995 int min() { return min_; } 1979 int min() { return min_; }
1996 int max() { return max_; } 1980 int max() { return max_; }
1997 bool is_possessive() { return type_ == POSSESSIVE; } 1981 bool is_possessive() { return type_ == POSSESSIVE; }
1998 bool is_non_greedy() { return type_ == NON_GREEDY; } 1982 bool is_non_greedy() { return type_ == NON_GREEDY; }
1999 bool is_greedy() { return type_ == GREEDY; } 1983 bool is_greedy() { return type_ == GREEDY; }
2000 RegExpTree* body() { return body_; } 1984 RegExpTree* body() { return body_; }
2001 1985
2002 private: 1986 private:
2003 RegExpTree* body_; 1987 RegExpTree* body_;
2004 int min_; 1988 int min_;
2005 int max_; 1989 int max_;
2006 int min_match_; 1990 int min_match_;
2007 int max_match_; 1991 int max_match_;
2008 Type type_; 1992 Type type_;
2009 bool contains_expanded_quantifier_;
2010 }; 1993 };
2011 1994
2012 1995
2013 class RegExpCapture: public RegExpTree { 1996 class RegExpCapture: public RegExpTree {
2014 public: 1997 public:
2015 explicit RegExpCapture(RegExpTree* body, int index) 1998 explicit RegExpCapture(RegExpTree* body, int index)
2016 : body_(body), index_(index) { } 1999 : body_(body), index_(index) { }
2017 virtual void* Accept(RegExpVisitor* visitor, void* data); 2000 virtual void* Accept(RegExpVisitor* visitor, void* data);
2018 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2001 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2019 RegExpNode* on_success); 2002 RegExpNode* on_success);
2020 static RegExpNode* ToNode(RegExpTree* body, 2003 static RegExpNode* ToNode(RegExpTree* body,
2021 int index, 2004 int index,
2022 RegExpCompiler* compiler, 2005 RegExpCompiler* compiler,
2023 RegExpNode* on_success); 2006 RegExpNode* on_success);
2024 virtual RegExpCapture* AsCapture(); 2007 virtual RegExpCapture* AsCapture();
2025 virtual bool IsAnchoredAtStart(); 2008 virtual bool IsAnchoredAtStart();
2026 virtual bool IsAnchoredAtEnd(); 2009 virtual bool IsAnchoredAtEnd();
2027 virtual Interval CaptureRegisters(); 2010 virtual Interval CaptureRegisters();
2028 virtual bool IsCapture(); 2011 virtual bool IsCapture();
2029 virtual int min_match() { return body_->min_match(); } 2012 virtual int min_match() { return body_->min_match(); }
2030 virtual int max_match() { return body_->max_match(); } 2013 virtual int max_match() { return body_->max_match(); }
2031 virtual bool ContainsExpandedQuantifier() {
2032 return contains_expanded_quantifier_ || body_->ContainsExpandedQuantifier();
2033 }
2034 RegExpTree* body() { return body_; } 2014 RegExpTree* body() { return body_; }
2035 int index() { return index_; } 2015 int index() { return index_; }
2036 static int StartRegister(int index) { return index * 2; } 2016 static int StartRegister(int index) { return index * 2; }
2037 static int EndRegister(int index) { return index * 2 + 1; } 2017 static int EndRegister(int index) { return index * 2 + 1; }
2038 2018
2039 private: 2019 private:
2040 RegExpTree* body_; 2020 RegExpTree* body_;
2041 int index_; 2021 int index_;
2042 }; 2022 };
2043 2023
(...skipping 11 matching lines...) Expand all
2055 2035
2056 virtual void* Accept(RegExpVisitor* visitor, void* data); 2036 virtual void* Accept(RegExpVisitor* visitor, void* data);
2057 virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2037 virtual RegExpNode* ToNode(RegExpCompiler* compiler,
2058 RegExpNode* on_success); 2038 RegExpNode* on_success);
2059 virtual RegExpLookahead* AsLookahead(); 2039 virtual RegExpLookahead* AsLookahead();
2060 virtual Interval CaptureRegisters(); 2040 virtual Interval CaptureRegisters();
2061 virtual bool IsLookahead(); 2041 virtual bool IsLookahead();
2062 virtual bool IsAnchoredAtStart(); 2042 virtual bool IsAnchoredAtStart();
2063 virtual int min_match() { return 0; } 2043 virtual int min_match() { return 0; }
2064 virtual int max_match() { return 0; } 2044 virtual int max_match() { return 0; }
2065 virtual bool ContainsExpandedQuantifier() {
2066 return contains_expanded_quantifier_ || body_->ContainsExpandedQuantifier();
2067 }
2068 RegExpTree* body() { return body_; } 2045 RegExpTree* body() { return body_; }
2069 bool is_positive() { return is_positive_; } 2046 bool is_positive() { return is_positive_; }
2070 int capture_count() { return capture_count_; } 2047 int capture_count() { return capture_count_; }
2071 int capture_from() { return capture_from_; } 2048 int capture_from() { return capture_from_; }
2072 2049
2073 private: 2050 private:
2074 RegExpTree* body_; 2051 RegExpTree* body_;
2075 bool is_positive_; 2052 bool is_positive_;
2076 int capture_count_; 2053 int capture_count_;
2077 int capture_from_; 2054 int capture_from_;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2153 2130
2154 private: 2131 private:
2155 Isolate* isolate_; 2132 Isolate* isolate_;
2156 bool stack_overflow_; 2133 bool stack_overflow_;
2157 }; 2134 };
2158 2135
2159 2136
2160 } } // namespace v8::internal 2137 } } // namespace v8::internal
2161 2138
2162 #endif // V8_AST_H_ 2139 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | src/jsregexp.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698