diff options
-rw-r--r-- | regcomp.c | 4 | ||||
-rw-r--r-- | regexec.c | 22 | ||||
-rwxr-xr-x | t/op/pat.t | 8 | ||||
-rw-r--r-- | t/op/re_tests | 1 |
4 files changed, 24 insertions, 11 deletions
@@ -1076,7 +1076,9 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm) r->check_offset_min = data.offset_float_min; r->check_offset_max = data.offset_float_max; } - if (r->check_substr) { + /* XXXX Currently intuiting is not compatible with ANCH_GPOS. + This should be changed ASAP! */ + if (r->check_substr && !(r->reganch & ROPT_ANCH_GPOS)) { r->reganch |= RE_USE_INTUIT; if (SvTAIL(r->check_substr)) r->reganch |= RE_INTUIT_TAIL; @@ -739,19 +739,23 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char * /* If there is a "must appear" string, look for it. */ s = startpos; - if (prog->reganch & ROPT_GPOS_SEEN) { + if (prog->reganch & ROPT_GPOS_SEEN) { /* Need to have PL_reg_ganch */ MAGIC *mg; - if (!(flags & REXEC_IGNOREPOS) && sv && SvTYPE(sv) >= SVt_PVMG - && SvMAGIC(sv) && (mg = mg_find(sv, 'g')) && mg->mg_len >= 0) - PL_reg_ganch = strbeg + mg->mg_len; - else + if (flags & REXEC_IGNOREPOS) /* Means: check only at start */ PL_reg_ganch = startpos; - if (prog->reganch & ROPT_ANCH_GPOS) { - if (s > PL_reg_ganch) - goto phooey; - s = PL_reg_ganch; + else if (sv && SvTYPE(sv) >= SVt_PVMG + && SvMAGIC(sv) + && (mg = mg_find(sv, 'g')) && mg->mg_len >= 0) { + PL_reg_ganch = strbeg + mg->mg_len; /* Defined pos() */ + if (prog->reganch & ROPT_ANCH_GPOS) { + if (s > PL_reg_ganch) + goto phooey; + s = PL_reg_ganch; + } } + else /* pos() not defined */ + PL_reg_ganch = strbeg; } if (!(flags & REXEC_CHECKED) && prog->check_substr != Nullsv) { diff --git a/t/op/pat.t b/t/op/pat.t index 89cc2bb0a9..f36394edc2 100755 --- a/t/op/pat.t +++ b/t/op/pat.t @@ -4,7 +4,7 @@ # the format supported by op/regexp.t. If you want to add a test # that does fit that format, add it to op/re_tests, not here. -print "1..192\n"; +print "1..193\n"; BEGIN { chdir 't' if -d 't'; @@ -887,3 +887,9 @@ pos=1; m/^-.*bb/mg and print "not "; print "ok $test\n"; $test++; + +$text = "aaXbXcc"; +pos($text)=0; +$text =~ /\GXb*X/g and print 'not '; +print "ok $test\n"; +$test++; diff --git a/t/op/re_tests b/t/op/re_tests index b35e964dc1..695672da71 100644 --- a/t/op/re_tests +++ b/t/op/re_tests @@ -739,3 +739,4 @@ tt+$ xxxtt y - - [\w-z] - c - /[\w-z]/: invalid [] range in regexp [0-[:digit:]] - c - /[0-[:digit:]]/: invalid [] range in regexp [[:digit:]-9] - c - /[[:digit:]-9]/: invalid [] range in regexp +\GX.*X aaaXbX n - - |