regcomp.c: Slightly relax restriction of SIMPLE nodes
authorKarl Williamson <public@khwilliamson.com>
Sat, 6 Oct 2012 17:21:02 +0000 (11:21 -0600)
committerKarl Williamson <public@khwilliamson.com>
Tue, 9 Oct 2012 17:16:05 +0000 (11:16 -0600)
Currently all EXACTish nodes that are SIMPLE must be a single UTF-8
invariant character.  It turns out that the code works not just for
these, but for all Latin1 characters (when the pattern isn't UTF-8)
except the SHARP S under /d folding.

SIMPLE nodes allow for better optimization possibilities, such as CURLY
instead of CURLYM.

There is still a discrepancy in that non-EXACTish nodes that match a
single character, such as the dot (SANY), can be SIMPLE, but EXACTish
nodes have to be just a single byte.

regcomp.c
regexec.c

index acb1a7e..7d9e3c4 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -9974,8 +9974,11 @@ S_alloc_maybe_populate_EXACT(pTHX_ RExC_state_t *pRExC_state, regnode *node, I32
     }
 
     *flagp |= HASWIDTH;
-    if (len == 1 && UNI_IS_INVARIANT(code_point))
+    if (len == 1 && (code_point != LATIN_SMALL_LETTER_SHARP_S
+                     || ! FOLD || ! DEPENDS_SEMANTICS))
+    {
         *flagp |= SIMPLE;
+    }
 }
 
 /*
index 6438526..f2833ac 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -6403,7 +6403,6 @@ S_regrepeat(pTHX_ const regexp *prog, char **startposp, const regnode *p, I32 ma
 
     do_exactf:
        c = (U8)*STRING(p);
-       assert(! UTF_PATTERN || UNI_IS_INVARIANT(c));
 
        if (utf8_target || OP(p) == EXACTFU_SS) { /* Use full Unicode fold matching */
            char *tmpeol = loceol;