| Index: src/parser.h
|
| diff --git a/src/parser.h b/src/parser.h
|
| index b674a9d2e2323d8014edceab988c52474e0c6ca3..ac2a77bec8c1abc3274da898c9d7ff42e695a63b 100644
|
| --- a/src/parser.h
|
| +++ b/src/parser.h
|
| @@ -370,7 +370,7 @@ class BufferedZoneList {
|
| // Accumulates RegExp atoms and assertions into lists of terms and alternatives.
|
| class RegExpBuilder: public ZoneObject {
|
| public:
|
| - explicit RegExpBuilder(Zone* zone);
|
| + RegExpBuilder(Zone* zone, RegExpTree::ReadDirection read_direction);
|
| void AddCharacter(uc16 character);
|
| // "Adds" an empty expression. Does nothing except consume a
|
| // following quantifier
|
| @@ -394,6 +394,7 @@ class RegExpBuilder: public ZoneObject {
|
| BufferedZoneList<RegExpTree, 2> terms_;
|
| BufferedZoneList<RegExpTree, 2> text_;
|
| BufferedZoneList<RegExpTree, 2> alternatives_;
|
| + RegExpTree::ReadDirection read_direction_;
|
| #ifdef DEBUG
|
| enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_;
|
| #define LAST(x) last_added_ = x;
|
| @@ -415,7 +416,7 @@ class RegExpParser BASE_EMBEDDED {
|
| RegExpTree* ParsePattern();
|
| RegExpTree* ParseDisjunction();
|
| RegExpTree* ParseGroup();
|
| - RegExpTree* ParseCharacterClass();
|
| + RegExpTree* ParseCharacterClass(RegExpTree::ReadDirection read_direction);
|
|
|
| // Parses a {...,...} quantifier and stores the range in the given
|
| // out parameters.
|
| @@ -450,7 +451,7 @@ class RegExpParser BASE_EMBEDDED {
|
| bool simple();
|
| bool contains_anchor() { return contains_anchor_; }
|
| void set_contains_anchor() { contains_anchor_ = true; }
|
| - int captures_started() { return captures_ == NULL ? 0 : captures_->length(); }
|
| + int captures_started() { return captures_started_; }
|
| int position() { return next_pos_ - 1; }
|
| bool failed() { return failed_; }
|
|
|
| @@ -472,11 +473,12 @@ class RegExpParser BASE_EMBEDDED {
|
| public:
|
| RegExpParserState(RegExpParserState* previous_state,
|
| SubexpressionType group_type,
|
| - int disjunction_capture_index,
|
| - Zone* zone)
|
| + RegExpTree::ReadDirection read_direction,
|
| + int disjunction_capture_index, Zone* zone)
|
| : previous_state_(previous_state),
|
| - builder_(new(zone) RegExpBuilder(zone)),
|
| + builder_(new (zone) RegExpBuilder(zone, read_direction)),
|
| group_type_(group_type),
|
| + read_direction_(read_direction),
|
| disjunction_capture_index_(disjunction_capture_index) {}
|
| // Parser state of containing expression, if any.
|
| RegExpParserState* previous_state() { return previous_state_; }
|
| @@ -485,6 +487,8 @@ class RegExpParser BASE_EMBEDDED {
|
| RegExpBuilder* builder() { return builder_; }
|
| // Type of regexp being parsed (parenthesized group or entire regexp).
|
| SubexpressionType group_type() { return group_type_; }
|
| + // Lookahead or Lookbehind.
|
| + RegExpTree::ReadDirection read_direction() { return read_direction_; }
|
| // Index in captures array of first capture in this sub-expression, if any.
|
| // Also the capture index of this sub-expression itself, if group_type
|
| // is CAPTURE.
|
| @@ -497,10 +501,15 @@ class RegExpParser BASE_EMBEDDED {
|
| RegExpBuilder* builder_;
|
| // Stored disjunction type (capture, look-ahead or grouping), if any.
|
| SubexpressionType group_type_;
|
| + // Stored read direction.
|
| + RegExpTree::ReadDirection read_direction_;
|
| // Stored disjunction's capture index (if any).
|
| int disjunction_capture_index_;
|
| };
|
|
|
| + // Return the 1-indexed RegExpCapture object, allocate if necessary.
|
| + RegExpCapture* GetCapture(int index);
|
| +
|
| Isolate* isolate() { return isolate_; }
|
| Zone* zone() const { return zone_; }
|
|
|
| @@ -518,6 +527,7 @@ class RegExpParser BASE_EMBEDDED {
|
| FlatStringReader* in_;
|
| uc32 current_;
|
| int next_pos_;
|
| + int captures_started_;
|
| // The capture count is only valid after we have scanned for captures.
|
| int capture_count_;
|
| bool has_more_;
|
|
|