Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Side by Side Diff: src/jsregexp.cc

Issue 10310041: Merged r11518, r11519 into trunk branch. (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/ic-ia32.cc ('k') | src/mips/ic-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
5877 } 5884 }
5878 5885
5879 return compiler.Assemble(&macro_assembler, 5886 return compiler.Assemble(&macro_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
OLDNEW
« no previous file with comments | « src/ia32/ic-ia32.cc ('k') | src/mips/ic-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698