| OLD | NEW | 
|---|
| 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 2704 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2715   if (depth < 0) return this; | 2715   if (depth < 0) return this; | 
| 2716   if (info()->visited) return this; | 2716   if (info()->visited) return this; | 
| 2717   VisitMarker marker(info()); | 2717   VisitMarker marker(info()); | 
| 2718   int choice_count = alternatives_->length(); | 2718   int choice_count = alternatives_->length(); | 
| 2719   int surviving = 0; | 2719   int surviving = 0; | 
| 2720   RegExpNode* survivor = NULL; | 2720   RegExpNode* survivor = NULL; | 
| 2721   for (int i = 0; i < choice_count; i++) { | 2721   for (int i = 0; i < choice_count; i++) { | 
| 2722     GuardedAlternative alternative = alternatives_->at(i); | 2722     GuardedAlternative alternative = alternatives_->at(i); | 
| 2723     RegExpNode* replacement = alternative.node()->FilterASCII(depth - 1); | 2723     RegExpNode* replacement = alternative.node()->FilterASCII(depth - 1); | 
| 2724     ASSERT(replacement != this);  // No missing EMPTY_MATCH_CHECK. | 2724     ASSERT(replacement != this);  // No missing EMPTY_MATCH_CHECK. | 
| 2725     alternatives_->at(i).set_node(replacement); |  | 
| 2726     if (replacement != NULL) { | 2725     if (replacement != NULL) { | 
|  | 2726       alternatives_->at(i).set_node(replacement); | 
| 2727       surviving++; | 2727       surviving++; | 
| 2728       survivor = replacement; | 2728       survivor = replacement; | 
| 2729     } | 2729     } | 
| 2730   } | 2730   } | 
| 2731   if (surviving < 2) return set_replacement(survivor); | 2731   if (surviving < 2) return set_replacement(survivor); | 
| 2732 | 2732 | 
| 2733   set_replacement(this); | 2733   set_replacement(this); | 
| 2734   if (surviving == choice_count) { | 2734   if (surviving == choice_count) { | 
| 2735     return this; | 2735     return this; | 
| 2736   } | 2736   } | 
| 2737   // Only some of the nodes survived the filtering.  We need to rebuild the | 2737   // Only some of the nodes survived the filtering.  We need to rebuild the | 
| 2738   // alternatives list. | 2738   // alternatives list. | 
| 2739   ZoneList<GuardedAlternative>* new_alternatives = | 2739   ZoneList<GuardedAlternative>* new_alternatives = | 
| 2740       new ZoneList<GuardedAlternative>(surviving); | 2740       new ZoneList<GuardedAlternative>(surviving); | 
| 2741   for (int i = 0; i < choice_count; i++) { | 2741   for (int i = 0; i < choice_count; i++) { | 
| 2742     GuardedAlternative alternative = alternatives_->at(i); | 2742     RegExpNode* replacement = | 
| 2743     if (alternative.node() != NULL) { | 2743         alternatives_->at(i).node()->FilterASCII(depth - 1); | 
| 2744       new_alternatives->Add(alternative); | 2744     if (replacement != NULL) { | 
|  | 2745       alternatives_->at(i).set_node(replacement); | 
|  | 2746       new_alternatives->Add(alternatives_->at(i)); | 
| 2745     } | 2747     } | 
| 2746   } | 2748   } | 
| 2747   alternatives_ = new_alternatives; | 2749   alternatives_ = new_alternatives; | 
| 2748   return this; | 2750   return this; | 
| 2749 } | 2751 } | 
| 2750 | 2752 | 
| 2751 | 2753 | 
| 2752 RegExpNode* NegativeLookaheadChoiceNode::FilterASCII(int depth) { | 2754 RegExpNode* NegativeLookaheadChoiceNode::FilterASCII(int depth) { | 
| 2753   if (info()->replacement_calculated) return replacement(); | 2755   if (info()->replacement_calculated) return replacement(); | 
| 2754   if (depth < 0) return this; | 2756   if (depth < 0) return this; | 
| (...skipping 3070 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5825       // at the start of input. | 5827       // at the start of input. | 
| 5826       ChoiceNode* first_step_node = new ChoiceNode(2); | 5828       ChoiceNode* first_step_node = new ChoiceNode(2); | 
| 5827       first_step_node->AddAlternative(GuardedAlternative(captured_body)); | 5829       first_step_node->AddAlternative(GuardedAlternative(captured_body)); | 
| 5828       first_step_node->AddAlternative(GuardedAlternative( | 5830       first_step_node->AddAlternative(GuardedAlternative( | 
| 5829           new TextNode(new RegExpCharacterClass('*'), loop_node))); | 5831           new TextNode(new RegExpCharacterClass('*'), loop_node))); | 
| 5830       node = first_step_node; | 5832       node = first_step_node; | 
| 5831     } else { | 5833     } else { | 
| 5832       node = loop_node; | 5834       node = loop_node; | 
| 5833     } | 5835     } | 
| 5834   } | 5836   } | 
| 5835   if (is_ascii) node = node->FilterASCII(RegExpCompiler::kMaxRecursion); | 5837   if (is_ascii) { | 
|  | 5838     node = node->FilterASCII(RegExpCompiler::kMaxRecursion); | 
|  | 5839     // Do it again to propagate the new nodes to places where they were not | 
|  | 5840     // put because they had not been calculated yet. | 
|  | 5841     if (node != NULL) node = node->FilterASCII(RegExpCompiler::kMaxRecursion); | 
|  | 5842   } | 
| 5836 | 5843 | 
| 5837   if (node == NULL) node = new EndNode(EndNode::BACKTRACK); | 5844   if (node == NULL) node = new EndNode(EndNode::BACKTRACK); | 
| 5838   data->node = node; | 5845   data->node = node; | 
| 5839   Analysis analysis(ignore_case, is_ascii); | 5846   Analysis analysis(ignore_case, is_ascii); | 
| 5840   analysis.EnsureAnalyzed(node); | 5847   analysis.EnsureAnalyzed(node); | 
| 5841   if (analysis.has_failed()) { | 5848   if (analysis.has_failed()) { | 
| 5842     const char* error_message = analysis.error_message(); | 5849     const char* error_message = analysis.error_message(); | 
| 5843     return CompilationResult(error_message); | 5850     return CompilationResult(error_message); | 
| 5844   } | 5851   } | 
| 5845 | 5852 | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5877   } | 5884   } | 
| 5878 | 5885 | 
| 5879   return compiler.Assemble(¯o_assembler, | 5886   return compiler.Assemble(¯o_assembler, | 
| 5880                            node, | 5887                            node, | 
| 5881                            data->capture_count, | 5888                            data->capture_count, | 
| 5882                            pattern); | 5889                            pattern); | 
| 5883 } | 5890 } | 
| 5884 | 5891 | 
| 5885 | 5892 | 
| 5886 }}  // namespace v8::internal | 5893 }}  // namespace v8::internal | 
| OLD | NEW | 
|---|