regexec.c: Less work in /i matching
authorKarl Williamson <public@khwilliamson.com>
Sun, 16 Oct 2011 18:47:21 +0000 (12:47 -0600)
committerKarl Williamson <public@khwilliamson.com>
Tue, 18 Oct 2011 03:52:17 +0000 (21:52 -0600)
If you watch an execution trace of regexec /i, often you will see it
folding the same thing over and over, as it backtracks or searches
ahead.  regcomp.c has now been changed to always fold UTF-8 encoded
EXACTF and EXCACTFU nodes.  This allows these to not be re-folded each
time.

This commit does it just for find_by_class().  Other commits will expand
this technique for other cases.

regexec.c

index 6100fce..071eec6 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -1465,7 +1465,9 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
        case EXACTF:
            if (UTF_PATTERN || utf8_target) {
-               utf8_fold_flags = 0;
+
+               /* regcomp.c already folded this if pattern is in UTF-8 */
+               utf8_fold_flags = (UTF_PATTERN) ? FOLDEQ_S2_ALREADY_FOLDED : 0;
                goto do_exactf_utf8;
            }
            fold_array = PL_fold;
@@ -1483,7 +1485,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
 
        case EXACTFU:
            if (UTF_PATTERN || utf8_target) {
-               utf8_fold_flags = 0;
+               utf8_fold_flags = (UTF_PATTERN) ? FOLDEQ_S2_ALREADY_FOLDED : 0;
                goto do_exactf_utf8;
            }