| Index: src/jsregexp.cc
|
| ===================================================================
|
| --- src/jsregexp.cc (revision 11608)
|
| +++ src/jsregexp.cc (working copy)
|
| @@ -2174,12 +2174,13 @@
|
|
|
|
|
| void ActionNode::FillInBMInfo(int offset,
|
| + int recursion_depth,
|
| BoyerMooreLookahead* bm,
|
| bool not_at_start) {
|
| if (type_ == BEGIN_SUBMATCH) {
|
| bm->SetRest(offset);
|
| } else if (type_ != POSITIVE_SUBMATCH_SUCCESS) {
|
| - on_success()->FillInBMInfo(offset, bm, not_at_start);
|
| + on_success()->FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start);
|
| }
|
| SaveBMInfo(bm, not_at_start, offset);
|
| }
|
| @@ -2201,11 +2202,13 @@
|
| }
|
|
|
|
|
| -void AssertionNode::FillInBMInfo(
|
| - int offset, BoyerMooreLookahead* bm, bool not_at_start) {
|
| +void AssertionNode::FillInBMInfo(int offset,
|
| + int recursion_depth,
|
| + BoyerMooreLookahead* bm,
|
| + bool not_at_start) {
|
| // Match the behaviour of EatsAtLeast on this node.
|
| if (type() == AT_START && not_at_start) return;
|
| - on_success()->FillInBMInfo(offset, bm, not_at_start);
|
| + on_success()->FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start);
|
| SaveBMInfo(bm, not_at_start, offset);
|
| }
|
|
|
| @@ -2786,14 +2789,17 @@
|
| }
|
|
|
|
|
| -void LoopChoiceNode::FillInBMInfo(
|
| - int offset, BoyerMooreLookahead* bm, bool not_at_start) {
|
| - if (body_can_be_zero_length_) {
|
| +void LoopChoiceNode::FillInBMInfo(int offset,
|
| + int recursion_depth,
|
| + BoyerMooreLookahead* bm,
|
| + bool not_at_start) {
|
| + if (body_can_be_zero_length_ ||
|
| + recursion_depth > RegExpCompiler::kMaxRecursion) {
|
| bm->SetRest(offset);
|
| SaveBMInfo(bm, not_at_start, offset);
|
| return;
|
| }
|
| - ChoiceNode::FillInBMInfo(offset, bm, not_at_start);
|
| + ChoiceNode::FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start);
|
| SaveBMInfo(bm, not_at_start, offset);
|
| }
|
|
|
| @@ -2895,7 +2901,7 @@
|
| if (eats_at_least >= 1) {
|
| BoyerMooreLookahead* bm =
|
| new BoyerMooreLookahead(eats_at_least, compiler);
|
| - FillInBMInfo(0, bm, not_at_start);
|
| + FillInBMInfo(0, 0, bm, not_at_start);
|
| if (bm->at(0)->is_non_word()) next_is_word_character = Trace::FALSE;
|
| if (bm->at(0)->is_word()) next_is_word_character = Trace::TRUE;
|
| }
|
| @@ -3833,7 +3839,7 @@
|
| BoyerMooreLookahead* bm =
|
| new BoyerMooreLookahead(eats_at_least, compiler);
|
| GuardedAlternative alt0 = alternatives_->at(0);
|
| - alt0.node()->FillInBMInfo(0, bm, not_at_start);
|
| + alt0.node()->FillInBMInfo(0, 0, bm, not_at_start);
|
| skip_was_emitted = bm->EmitSkipInstructions(macro_assembler);
|
| }
|
| } else {
|
| @@ -5572,8 +5578,10 @@
|
| }
|
|
|
|
|
| -void BackReferenceNode::FillInBMInfo(
|
| - int offset, BoyerMooreLookahead* bm, bool not_at_start) {
|
| +void BackReferenceNode::FillInBMInfo(int offset,
|
| + int recursion_depth,
|
| + BoyerMooreLookahead* bm,
|
| + bool not_at_start) {
|
| // Working out the set of characters that a backreference can match is too
|
| // hard, so we just say that any character can match.
|
| bm->SetRest(offset);
|
| @@ -5585,8 +5593,10 @@
|
| RegExpMacroAssembler::kTableSize);
|
|
|
|
|
| -void ChoiceNode::FillInBMInfo(
|
| - int offset, BoyerMooreLookahead* bm, bool not_at_start) {
|
| +void ChoiceNode::FillInBMInfo(int offset,
|
| + int recursion_depth,
|
| + BoyerMooreLookahead* bm,
|
| + bool not_at_start) {
|
| ZoneList<GuardedAlternative>* alts = alternatives();
|
| for (int i = 0; i < alts->length(); i++) {
|
| GuardedAlternative& alt = alts->at(i);
|
| @@ -5595,14 +5605,16 @@
|
| SaveBMInfo(bm, not_at_start, offset);
|
| return;
|
| }
|
| - alt.node()->FillInBMInfo(offset, bm, not_at_start);
|
| + alt.node()->FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start);
|
| }
|
| SaveBMInfo(bm, not_at_start, offset);
|
| }
|
|
|
|
|
| -void TextNode::FillInBMInfo(
|
| - int initial_offset, BoyerMooreLookahead* bm, bool not_at_start) {
|
| +void TextNode::FillInBMInfo(int initial_offset,
|
| + int recursion_depth,
|
| + BoyerMooreLookahead* bm,
|
| + bool not_at_start) {
|
| if (initial_offset >= bm->length()) return;
|
| int offset = initial_offset;
|
| int max_char = bm->max_char();
|
| @@ -5656,6 +5668,7 @@
|
| return;
|
| }
|
| on_success()->FillInBMInfo(offset,
|
| + recursion_depth + 1,
|
| bm,
|
| true); // Not at start after a text node.
|
| if (initial_offset == 0) set_bm_info(not_at_start, bm);
|
|
|