regcomp.c: Can join certain EXACTish node types
authorKarl Williamson <khw@cpan.org>
Mon, 3 Dec 2018 18:33:49 +0000 (11:33 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 8 Dec 2018 04:12:16 +0000 (21:12 -0700)
The optimization phase of regular expression pattern compilation looks
for adjacent EXACTish nodes and joins them if they are the same flavor
of EXACT.  Commits a9f8c7ac75c364c3e05305718f38c5f8ccd935d8 and
f6b4b99d2e584fbcd85eeed475eea10b87858e54 introduced two new nodes
that are so close to existing flavors that they are joinable with their
respective flavor.  This commit does that.

regcomp.c

index 300c608..834af8d 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -3987,7 +3987,23 @@ S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan,
             if (oldl + STR_LEN(n) > U8_MAX)
                 break;
 
-            if (OP(scan) != OP(n)) {
+            /* Joining something that requires UTF-8 with something that
+             * doesn't, means the result requires UTF-8. */
+            if (OP(scan) == EXACT && (OP(n) == EXACT_ONLY8)) {
+                OP(scan) = EXACT_ONLY8;
+            }
+            else if (OP(scan) == EXACT_ONLY8 && (OP(n) == EXACT)) {
+                ;   /* join is compatible, no need to change OP */
+            }
+            else if ((OP(scan) == EXACTFU) && (OP(n) == EXACTFU_ONLY8)) {
+                OP(scan) = EXACTFU_ONLY8;
+            }
+            else if ((OP(scan) == EXACTFU_ONLY8) && (OP(n) == EXACTFU)) {
+                ;   /* join is compatible, no need to change OP */
+            }
+            else if (OP(scan) != OP(n)) {
+
+                /* The only other compatible joinings are the same node type */
                 break;
             }