This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regexec.c: Stop looking for match even sooner
authorKarl Williamson <public@khwilliamson.com>
Wed, 9 Nov 2011 17:42:10 +0000 (10:42 -0700)
committerKarl Williamson <public@khwilliamson.com>
Wed, 9 Nov 2011 17:59:41 +0000 (10:59 -0700)
This revised commit e067297c376fbbb5a0dc8428c65d922f11e1f4c6
slightly so that we round up to get the search stopping point.

We aren't matching partial characters, so if we were to match 3+1/3
characters, we really have to match 4 characters.

regexec.c

index 4b8af52..56d1a5c 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -1552,10 +1552,10 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
             * fact that the Latin 1 folds are already determined, and the
             * only multi-char fold in that range is the sharp-s folding to
             * 'ss'.  Thus, a pattern character can match as little as 1/3 of a
-            * string character.  Adjust lnc accordingly, always matching at
-            * least 1 */
+            * string character.  Adjust lnc accordingly, rounding up, so that
+            * if we need to match at least 4+1/3 chars, that really is 5. */
            expansion = (utf8_target) ? UTF8_MAX_FOLD_CHAR_EXPAND : 2;
-           lnc = (lnc < expansion) ? 1 : lnc / expansion;
+           lnc = (lnc + expansion - 1) / expansion;
 
            /* As in the non-UTF8 case, if we have to match 3 characters, and
             * only 2 are left, it's guaranteed to fail, so don't start a