diff options
author | Yves Orton <demerphq@gmail.com> | 2012-01-29 00:06:23 +0100 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2012-01-29 00:06:23 +0100 |
commit | 21eede782bed11b0263f9bff02b9ca7b7dfcd6eb (patch) | |
tree | 2435203d2ccb8e1f5b405748e03d915241548b4a | |
parent | 745b54e4438760197284db88e618b43be29d74ab (diff) | |
download | perl-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.c | 4 | ||||
-rw-r--r-- | t/re/pat.t | 14 |
2 files changed, 15 insertions, 3 deletions
@@ -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(®info, &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; |