forked from boostorg/regex
Don't optimise leading repeats when there are backreferences involved.
[SVN r22705]
This commit is contained in:
@ -1350,6 +1350,7 @@ unsigned int BOOST_REGEX_CALL reg_expression<charT, traits, Allocator>::set_expr
|
|||||||
data.clear();
|
data.clear();
|
||||||
_flags = f;
|
_flags = f;
|
||||||
fail(REG_NOERROR); // clear any error
|
fail(REG_NOERROR); // clear any error
|
||||||
|
_leading_len = 0; // set this to non-zero if there are any backrefs, we'll refer to it later...
|
||||||
|
|
||||||
if(arg_first >= arg_last)
|
if(arg_first >= arg_last)
|
||||||
{
|
{
|
||||||
@ -1600,6 +1601,7 @@ unsigned int BOOST_REGEX_CALL reg_expression<charT, traits, Allocator>::set_expr
|
|||||||
dat = add_simple(dat, re_detail::syntax_element_backref, sizeof(re_detail::re_brace));
|
dat = add_simple(dat, re_detail::syntax_element_backref, sizeof(re_detail::re_brace));
|
||||||
static_cast<re_detail::re_brace*>(dat)->index = i;
|
static_cast<re_detail::re_brace*>(dat)->index = i;
|
||||||
++ptr;
|
++ptr;
|
||||||
|
_leading_len = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2141,7 +2143,7 @@ unsigned int BOOST_REGEX_CALL reg_expression<charT, traits, Allocator>::fixup_le
|
|||||||
case re_detail::syntax_element_char_rep:
|
case re_detail::syntax_element_char_rep:
|
||||||
case re_detail::syntax_element_short_set_rep:
|
case re_detail::syntax_element_short_set_rep:
|
||||||
case re_detail::syntax_element_long_set_rep:
|
case re_detail::syntax_element_long_set_rep:
|
||||||
if((len == 0) && (1 == fixup_leading_rep(dat->next.p, static_cast<re_detail::re_repeat*>(dat)->alt.p) ))
|
if((len == 0) && (_leading_len == 0) && (1 == fixup_leading_rep(dat->next.p, static_cast<re_detail::re_repeat*>(dat)->alt.p) ))
|
||||||
{
|
{
|
||||||
static_cast<re_detail::re_repeat*>(dat)->leading = leading_lit;
|
static_cast<re_detail::re_repeat*>(dat)->leading = leading_lit;
|
||||||
return len;
|
return len;
|
||||||
|
Reference in New Issue
Block a user