summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYves Orton <demerphq@gmail.com>2012-01-29 00:06:23 +0100
committerYves Orton <demerphq@gmail.com>2012-01-29 00:06:23 +0100
commit21eede782bed11b0263f9bff02b9ca7b7dfcd6eb (patch)
tree2435203d2ccb8e1f5b405748e03d915241548b4a
parent745b54e4438760197284db88e618b43be29d74ab (diff)
downloadperl-21eede782bed11b0263f9bff02b9ca7b7dfcd6eb.tar.gz
Fix bug #109206: ANCH_MBOL with while /.*/g
We had a fencepost error when ANCH_MBOL was enabled that meant we did not "see" matches at the end of string. This fixes the problem and adds tests.
-rw-r--r--regexec.c4
-rw-r--r--t/re/pat.t14
2 files changed, 15 insertions, 3 deletions
diff --git a/regexec.c b/regexec.c
index 6bd8b20b60..b84dcbd8b7 100644
--- a/regexec.c
+++ b/regexec.c
@@ -2245,8 +2245,8 @@ Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, register char *stre
/*XXX: The s-- is almost definitely wrong here under unicode - demeprhq*/
s--;
}
- /* We can use a more efficient search as newlines are the same in unicode as they are in latin */
- while (s < end) {
+ /* We can use a more efficient search as newlines are the same in unicode as they are in latin */
+ while (s <= end) { /* note it could be possible to match at the end of the string */
if (*s++ == '\n') { /* don't need PL_utf8skip here */
if (regtry(&reginfo, &s))
goto got_it;
diff --git a/t/re/pat.t b/t/re/pat.t
index 8ea531c63f..b4b7ac477f 100644
--- a/t/re/pat.t
+++ b/t/re/pat.t
@@ -21,7 +21,7 @@ BEGIN {
require './test.pl';
}
-plan tests => 466; # Update this when adding/deleting tests.
+plan tests => 469; # Update this when adding/deleting tests.
run_tests() unless caller;
@@ -1241,6 +1241,18 @@ EOP
is "@refs", "Regexp", '/$o$qr/ passes qr ref to cat overload meth';
}
+ {
+ my $count=0;
+ my $str="\n";
+ $count++ while $str=~/.*/g;
+ is $count, 2, 'test that ANCH_MBOL works properly. We should get 2 from $count++ while "\n"=~/.*/g';
+ my $class_count= 0;
+ $class_count++ while $str=~/[^\n]*/g;
+ is $class_count, $count, 'while "\n"=~/.*/g and while "\n"=~/[^\n]*/g should behave the same';
+ my $anch_count= 0;
+ $anch_count++ while $str=~/^.*/mg;
+ is $anch_count, 1, 'while "\n"=~/^.*/mg should match only once';
+ }
} # End of sub run_tests
1;