Extended leading repeat optimization to more cases.

[SVN r42992]
This commit is contained in:
John Maddock
2008-01-27 18:43:35 +00:00
parent 37040f4bfd
commit 0915f19c03
2 changed files with 22 additions and 0 deletions

View File

@ -1270,6 +1270,19 @@ void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* st
state = state->next.p; state = state->next.p;
continue; continue;
} }
if((static_cast<re_brace*>(state)->index == -1)
|| (static_cast<re_brace*>(state)->index == -2))
{
// skip past the zero width assertion:
state = static_cast<const re_jump*>(state->next.p)->alt.p->next.p;
continue;
}
if(static_cast<re_brace*>(state)->index == -3)
{
// Have to skip the leading jump state:
state = state->next.p->next.p;
continue;
}
return; return;
case syntax_element_endmark: case syntax_element_endmark:
case syntax_element_start_line: case syntax_element_start_line:

View File

@ -1193,6 +1193,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat(bool r)
pstate = rep->next.p; pstate = rep->next.p;
}while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip)); }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
} }
// remember where we got to if this is a leading repeat:
if((rep->leading) && (count < rep->max))
restart = position;
if(position == last) if(position == last)
{ {
// can't repeat any more, remove the pushed state: // can't repeat any more, remove the pushed state:
@ -1259,6 +1262,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat(bool
pstate = rep->next.p; pstate = rep->next.p;
}while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip)); }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
} }
// remember where we got to if this is a leading repeat:
if((rep->leading) && (count < rep->max))
restart = position;
if(position == last) if(position == last)
{ {
// can't repeat any more, remove the pushed state: // can't repeat any more, remove the pushed state:
@ -1326,6 +1332,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat(bool
pstate = rep->next.p; pstate = rep->next.p;
}while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip)); }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
} }
// remember where we got to if this is a leading repeat:
if((rep->leading) && (count < rep->max))
restart = position;
if(position == last) if(position == last)
{ {
// can't repeat any more, remove the pushed state: // can't repeat any more, remove the pushed state: