regcomp.c: generate folded for EXACTF and EXACTFU
authorKarl Williamson <public@khwilliamson.com>
Sun, 16 Oct 2011 18:00:13 +0000 (12:00 -0600)
committerKarl Williamson <public@khwilliamson.com>
Tue, 18 Oct 2011 03:52:16 +0000 (21:52 -0600)
regcomp.c folds the string in these two nodes except in one case.
Change that case to correspond with the predominant behavior.  This
enables future optimizations

globvar.sym
regcomp.c
t/porting/globvar.t

index a8067e5..93eca43 100644 (file)
@@ -18,6 +18,7 @@ hexdigit
 interp_size
 interp_size_5_16_0
 keyword_plugin
+latin1_lc
 magic_data
 magic_vtable_names
 magic_vtables
index 579dabe..40d08e9 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -10702,8 +10702,14 @@ parseit:
            else {
                op = EXACT;
            }
-       }   /* else 2 chars in the bit map: the folds of each other */
-       else if (AT_LEAST_UNI_SEMANTICS || !isASCII(value)) {
+       }
+       else {   /* else 2 chars in the bit map: the folds of each other */
+
+           /* Use the folded value, which for the cases where we get here,
+            * is just the lower case of the current one (which may resolve to
+            * itself, or to the other one */
+           value = toLOWER_LATIN1(value);
+           if (AT_LEAST_UNI_SEMANTICS || !isASCII(value)) {
 
            /* To join adjacent nodes, they must be the exact EXACTish type.
             * Try to use the most likely type, by using EXACTFU if the regex
@@ -10714,6 +10720,7 @@ parseit:
        else {    /* Otherwise, more likely to be EXACTF type */
            op = EXACTF;
        }
+       }
 
        ret = reg_node(pRExC_state, op);
         RExC_parse = (char *)cur_parse;
index aa26695..795673b 100644 (file)
@@ -14,7 +14,7 @@ skip_all("Code to read symbols not ported to $^O")
 my %skip = map { ("PL_$_", 1) }
     qw(
          DBcv bitcount cshname force_link_funcs generation lastgotoprobe
-         latin1_lc mod_latin1_uc modcount no_symref_sv timesbuf uudmap
+         mod_latin1_uc modcount no_symref_sv timesbuf uudmap
          watchaddr watchok warn_uninit_sv
      );