| Index: src/regexp/jsregexp.h
|
| diff --git a/src/regexp/jsregexp.h b/src/regexp/jsregexp.h
|
| index 537bdff8e2ac43daeebaae9b47e3c71f4e726e5a..d6a74ea19d77159ff8e4c4332330273e37c89748 100644
|
| --- a/src/regexp/jsregexp.h
|
| +++ b/src/regexp/jsregexp.h
|
| @@ -387,17 +387,17 @@ class DispatchTable : public ZoneObject {
|
| VISIT(Text)
|
|
|
|
|
| -#define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \
|
| - VISIT(Disjunction) \
|
| - VISIT(Alternative) \
|
| - VISIT(Assertion) \
|
| - VISIT(CharacterClass) \
|
| - VISIT(Atom) \
|
| - VISIT(Quantifier) \
|
| - VISIT(Capture) \
|
| - VISIT(Lookahead) \
|
| - VISIT(BackReference) \
|
| - VISIT(Empty) \
|
| +#define FOR_EACH_REG_EXP_TREE_TYPE(VISIT) \
|
| + VISIT(Disjunction) \
|
| + VISIT(Alternative) \
|
| + VISIT(Assertion) \
|
| + VISIT(CharacterClass) \
|
| + VISIT(Atom) \
|
| + VISIT(Quantifier) \
|
| + VISIT(Capture) \
|
| + VISIT(Lookaround) \
|
| + VISIT(BackReference) \
|
| + VISIT(Empty) \
|
| VISIT(Text)
|
|
|
|
|
| @@ -603,7 +603,7 @@ class RegExpNode: public ZoneObject {
|
| RegExpCompiler* compiler,
|
| int characters_filled_in,
|
| bool not_at_start) = 0;
|
| - static const int kNodeIsTooComplexForGreedyLoops = -1;
|
| + static const int kNodeIsTooComplexForGreedyLoops = kMinInt;
|
| virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; }
|
| // Only returns the successor for a text node of length 1 that matches any
|
| // character and that has no guards on it.
|
| @@ -827,14 +827,14 @@ class ActionNode: public SeqRegExpNode {
|
|
|
| class TextNode: public SeqRegExpNode {
|
| public:
|
| - TextNode(ZoneList<TextElement>* elms,
|
| + TextNode(ZoneList<TextElement>* elms, bool read_backward,
|
| RegExpNode* on_success)
|
| - : SeqRegExpNode(on_success),
|
| - elms_(elms) { }
|
| - TextNode(RegExpCharacterClass* that,
|
| + : SeqRegExpNode(on_success), elms_(elms), read_backward_(read_backward) {}
|
| + TextNode(RegExpCharacterClass* that, bool read_backward,
|
| RegExpNode* on_success)
|
| : SeqRegExpNode(on_success),
|
| - elms_(new(zone()) ZoneList<TextElement>(1, zone())) {
|
| + elms_(new (zone()) ZoneList<TextElement>(1, zone())),
|
| + read_backward_(read_backward) {
|
| elms_->Add(TextElement::CharClass(that), zone());
|
| }
|
| virtual void Accept(NodeVisitor* visitor);
|
| @@ -845,6 +845,7 @@ class TextNode: public SeqRegExpNode {
|
| int characters_filled_in,
|
| bool not_at_start);
|
| ZoneList<TextElement>* elements() { return elms_; }
|
| + bool read_backward() { return read_backward_; }
|
| void MakeCaseIndependent(Isolate* isolate, bool is_one_byte);
|
| virtual int GreedyLoopTextLength();
|
| virtual RegExpNode* GetSuccessorOfOmnivorousTextNode(
|
| @@ -873,6 +874,7 @@ class TextNode: public SeqRegExpNode {
|
| int* checked_up_to);
|
| int Length();
|
| ZoneList<TextElement>* elms_;
|
| + bool read_backward_;
|
| };
|
|
|
|
|
| @@ -925,15 +927,16 @@ class AssertionNode: public SeqRegExpNode {
|
|
|
| class BackReferenceNode: public SeqRegExpNode {
|
| public:
|
| - BackReferenceNode(int start_reg,
|
| - int end_reg,
|
| + BackReferenceNode(int start_reg, int end_reg, bool read_backward,
|
| RegExpNode* on_success)
|
| : SeqRegExpNode(on_success),
|
| start_reg_(start_reg),
|
| - end_reg_(end_reg) { }
|
| + end_reg_(end_reg),
|
| + read_backward_(read_backward) {}
|
| virtual void Accept(NodeVisitor* visitor);
|
| int start_register() { return start_reg_; }
|
| int end_register() { return end_reg_; }
|
| + bool read_backward() { return read_backward_; }
|
| virtual void Emit(RegExpCompiler* compiler, Trace* trace);
|
| virtual int EatsAtLeast(int still_to_find,
|
| int recursion_depth,
|
| @@ -950,6 +953,7 @@ class BackReferenceNode: public SeqRegExpNode {
|
| private:
|
| int start_reg_;
|
| int end_reg_;
|
| + bool read_backward_;
|
| };
|
|
|
|
|
| @@ -1074,6 +1078,7 @@ class ChoiceNode: public RegExpNode {
|
| return true;
|
| }
|
| virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
|
| + virtual bool read_backward() { return false; }
|
|
|
| protected:
|
| int GreedyLoopTextLengthForAlternative(GuardedAlternative* alternative);
|
| @@ -1150,12 +1155,12 @@ class NegativeLookaheadChoiceNode: public ChoiceNode {
|
|
|
| class LoopChoiceNode: public ChoiceNode {
|
| public:
|
| - explicit LoopChoiceNode(bool body_can_be_zero_length, Zone* zone)
|
| + LoopChoiceNode(bool body_can_be_zero_length, bool read_backward, Zone* zone)
|
| : ChoiceNode(2, zone),
|
| loop_node_(NULL),
|
| continue_node_(NULL),
|
| - body_can_be_zero_length_(body_can_be_zero_length)
|
| - { }
|
| + body_can_be_zero_length_(body_can_be_zero_length),
|
| + read_backward_(read_backward) {}
|
| void AddLoopAlternative(GuardedAlternative alt);
|
| void AddContinueAlternative(GuardedAlternative alt);
|
| virtual void Emit(RegExpCompiler* compiler, Trace* trace);
|
| @@ -1169,6 +1174,7 @@ class LoopChoiceNode: public ChoiceNode {
|
| RegExpNode* loop_node() { return loop_node_; }
|
| RegExpNode* continue_node() { return continue_node_; }
|
| bool body_can_be_zero_length() { return body_can_be_zero_length_; }
|
| + virtual bool read_backward() { return read_backward_; }
|
| virtual void Accept(NodeVisitor* visitor);
|
| virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
|
|
|
| @@ -1183,6 +1189,7 @@ class LoopChoiceNode: public ChoiceNode {
|
| RegExpNode* loop_node_;
|
| RegExpNode* continue_node_;
|
| bool body_can_be_zero_length_;
|
| + bool read_backward_;
|
| };
|
|
|
|
|
| @@ -1438,9 +1445,7 @@ class Trace {
|
| at_start_ == UNKNOWN;
|
| }
|
| TriBool at_start() { return at_start_; }
|
| - void set_at_start(bool at_start) {
|
| - at_start_ = at_start ? TRUE_VALUE : FALSE_VALUE;
|
| - }
|
| + void set_at_start(TriBool at_start) { at_start_ = at_start; }
|
| Label* backtrack() { return backtrack_; }
|
| Label* loop_label() { return loop_label_; }
|
| RegExpNode* stop_node() { return stop_node_; }
|
|
|