This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
/iaa doesn't work when the result is trie'd
authorKarl Williamson <public@khwilliamson.com>
Sun, 8 May 2011 15:59:13 +0000 (09:59 -0600)
committerKarl Williamson <public@khwilliamson.com>
Thu, 19 May 2011 03:56:18 +0000 (21:56 -0600)
It turns out that caseless tries currently only work on UTF-8 EXACTFU
nodes.  The code attempted to test that by using UNI_SEMANTICS, but that
doesn't actually work; what is important is the semantics of the current
node.

regcomp.c
t/re/fold_grind.t

index 47590b9..cc04524 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -3048,20 +3048,17 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
                                 }
                             } else {
 /* 
-    Currently we do not believe that the trie logic can
-    handle case insensitive matching properly when the
-    pattern is not unicode (thus forcing unicode semantics).
+    Currently the trie logic handles case insensitive matching properly only
+    when the pattern is UTF-8 and the node is EXACTFU (thus forcing unicode
+    semantics).
 
     If/when this is fixed the following define can be swapped
     in below to fully enable trie logic.
 
-    XXX It may work if not UTF and/or /a (AT_LEAST_UNI_SEMANTICS) but perhaps
-    not /aa
-
 #define TRIE_TYPE_IS_SAFE 1
 
 */
-#define TRIE_TYPE_IS_SAFE ((UTF && UNI_SEMANTICS) || optype==EXACT)
+#define TRIE_TYPE_IS_SAFE ((UTF && optype == EXACTFU) || optype==EXACT)
 
                                 if ( last && TRIE_TYPE_IS_SAFE ) {
                                     make_trie( pRExC_state, 
index 460d296..0e482de 100644 (file)
@@ -446,6 +446,10 @@ foreach my $test (sort { numerically } keys %tests) {
           # XXX Doesn't currently test multi-char folds in pattern
           next if @pattern != 1;
 
+          # See if works on what could be a simple trie.
+          $eval = "my \$c = \"$lhs\"; my \$p = qr/$rhs|xyz/i$charset;$upgrade_target$upgrade_pattern \$c $op \$p";
+          run_test($eval, ++$count, "", "");
+
           my $okays = 0;
           my $this_iteration = 0;