 Chromium Code Reviews
 Chromium Code Reviews Issue 10448117:
  Limit work done analyzing regexps with very large fanout.  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
    
  
    Issue 10448117:
  Limit work done analyzing regexps with very large fanout.  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/| Index: src/jsregexp.cc | 
| =================================================================== | 
| --- src/jsregexp.cc (revision 11692) | 
| +++ src/jsregexp.cc (working copy) | 
| @@ -2192,12 +2192,14 @@ | 
| void ActionNode::FillInBMInfo(int offset, | 
| int recursion_depth, | 
| + int budget, | 
| BoyerMooreLookahead* bm, | 
| bool not_at_start) { | 
| if (type_ == BEGIN_SUBMATCH) { | 
| bm->SetRest(offset); | 
| } else if (type_ != POSITIVE_SUBMATCH_SUCCESS) { | 
| - on_success()->FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start); | 
| + on_success()->FillInBMInfo( | 
| + offset, recursion_depth + 1, budget - 1, bm, not_at_start); | 
| } | 
| SaveBMInfo(bm, not_at_start, offset); | 
| } | 
| @@ -2221,11 +2223,13 @@ | 
| void AssertionNode::FillInBMInfo(int offset, | 
| int recursion_depth, | 
| + int budget, | 
| 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, recursion_depth + 1, bm, not_at_start); | 
| + on_success()->FillInBMInfo( | 
| + offset, recursion_depth + 1, budget - 1, bm, not_at_start); | 
| SaveBMInfo(bm, not_at_start, offset); | 
| } | 
| @@ -2808,15 +2812,18 @@ | 
| void LoopChoiceNode::FillInBMInfo(int offset, | 
| int recursion_depth, | 
| + int budget, | 
| BoyerMooreLookahead* bm, | 
| bool not_at_start) { | 
| if (body_can_be_zero_length_ || | 
| - recursion_depth > RegExpCompiler::kMaxRecursion) { | 
| + recursion_depth > RegExpCompiler::kMaxRecursion || | 
| + budget <= 0) { | 
| bm->SetRest(offset); | 
| SaveBMInfo(bm, not_at_start, offset); | 
| return; | 
| } | 
| - ChoiceNode::FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start); | 
| + ChoiceNode::FillInBMInfo( | 
| + offset, recursion_depth + 1, budget, bm, not_at_start); | 
| 
ulan
2012/06/01 11:24:04
We either need to decrement the budget or add a co
 | 
| SaveBMInfo(bm, not_at_start, offset); | 
| } | 
| @@ -2918,7 +2925,7 @@ | 
| if (eats_at_least >= 1) { | 
| BoyerMooreLookahead* bm = | 
| new BoyerMooreLookahead(eats_at_least, compiler); | 
| - FillInBMInfo(0, 0, bm, not_at_start); | 
| + FillInBMInfo(0, 0, kFillInBMBudget, 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; | 
| } | 
| @@ -3856,7 +3863,7 @@ | 
| BoyerMooreLookahead* bm = | 
| new BoyerMooreLookahead(eats_at_least, compiler); | 
| GuardedAlternative alt0 = alternatives_->at(0); | 
| - alt0.node()->FillInBMInfo(0, 0, bm, not_at_start); | 
| + alt0.node()->FillInBMInfo(0, 0, kFillInBMBudget, bm, not_at_start); | 
| skip_was_emitted = bm->EmitSkipInstructions(macro_assembler); | 
| } | 
| } else { | 
| @@ -5597,6 +5604,7 @@ | 
| void BackReferenceNode::FillInBMInfo(int offset, | 
| int recursion_depth, | 
| + int budget, | 
| BoyerMooreLookahead* bm, | 
| bool not_at_start) { | 
| // Working out the set of characters that a backreference can match is too | 
| @@ -5612,9 +5620,11 @@ | 
| void ChoiceNode::FillInBMInfo(int offset, | 
| int recursion_depth, | 
| + int budget, | 
| BoyerMooreLookahead* bm, | 
| bool not_at_start) { | 
| ZoneList<GuardedAlternative>* alts = alternatives(); | 
| + budget /= alts->length(); | 
| for (int i = 0; i < alts->length(); i++) { | 
| GuardedAlternative& alt = alts->at(i); | 
| if (alt.guards() != NULL && alt.guards()->length() != 0) { | 
| @@ -5622,7 +5632,8 @@ | 
| SaveBMInfo(bm, not_at_start, offset); | 
| return; | 
| } | 
| - alt.node()->FillInBMInfo(offset, recursion_depth + 1, bm, not_at_start); | 
| + alt.node()->FillInBMInfo( | 
| + offset, recursion_depth + 1, budget, bm, not_at_start); | 
| } | 
| SaveBMInfo(bm, not_at_start, offset); | 
| } | 
| @@ -5630,6 +5641,7 @@ | 
| void TextNode::FillInBMInfo(int initial_offset, | 
| int recursion_depth, | 
| + int budget, | 
| BoyerMooreLookahead* bm, | 
| bool not_at_start) { | 
| if (initial_offset >= bm->length()) return; | 
| @@ -5686,6 +5698,7 @@ | 
| } | 
| on_success()->FillInBMInfo(offset, | 
| recursion_depth + 1, | 
| + budget - 1, | 
| bm, | 
| true); // Not at start after a text node. | 
| if (initial_offset == 0) set_bm_info(not_at_start, bm); |