fix perl #115078, ternary folding logic failure
authorYves Orton <demerphq@gmail.com>
Sat, 29 Sep 2012 21:01:25 +0000 (23:01 +0200)
committerYves Orton <demerphq@gmail.com>
Sat, 29 Sep 2012 21:01:25 +0000 (23:01 +0200)
regcharclass.h
regen/regcharclass.pl

index 0b1beb5..c492d33 100644 (file)
 : 0 )
 
 /*
-       FOR_TESTING_DEMO: This is used to test if we generate incorrect code (currently is bad)
+       FOR_TESTING_DEMO: This is used to test if we generate incorrect code (currently it is ok)
 
        "\x{3B7}\x{342}"
        "\x{3B9}\x{308}\x{301}"
 */
 /*** GENERATED CODE ***/
 #define is_FOR_TESTING_DEMO_utf8_safe(s,e)                                  \
-( ( ((e)-(s) > 5) && ( 0xCE == ((U8*)s)[0] ) ) ? ( ( 0xB7 == ((U8*)s)[1] ) ?\
-           ( ( 0xCD == ((U8*)s)[2] ) ?                                     \
-               ( ( 0x82 == ((U8*)s)[3] ) ? 4 : 0 )                         \
+( ((e)-(s) > 5) ?                                                           \
+    ( ( 0xCE == ((U8*)s)[0] ) ?                                             \
+       ( ( 0xB7 == ((U8*)s)[1] ) ?                                         \
+           ( ( ( 0xCD == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\
        : ( 0xB9 == ((U8*)s)[1] ) ?                                         \
            ( ( ( ( ( 0xCC == ((U8*)s)[2] ) && ( 0x88 == ((U8*)s)[3] ) ) && ( 0xCC == ((U8*)s)[4] ) ) && ( 0x81 == ((U8*)s)[5] ) ) ? 6 : 0 )\
        : 0 )                                                               \
index ab3302d..f9d2da4 100755 (executable)
@@ -201,14 +201,31 @@ sub __uni_latin1 {
 
 sub __clean {
     my ( $expr )= @_;
+
     our $parens;
     $parens= qr/ (?> \( (?> (?: (?> [^()]+ ) | (??{ $parens }) )* ) \) ) /x;
 
-    #print "$parens\n$expr\n";
+    ## remove redundant parens
     1 while $expr =~ s/ \( \s* ( $parens ) \s* \) /$1/gx;
-    1 while $expr =~ s/ \( \s* ($parens) \s* \? \s*
-        \( \s* ($parens) \s* \? \s* ($parens|[^:]+?) \s* : \s* ($parens|[^)]+?) \s* \)
-        \s* : \s* \4 \s* \)/( ( $1 && $2 ) ? $3 : 0 )/gx;
+
+
+    # repeatedly simplify conditions like
+    #       ( (cond1) ? ( (cond2) ? X : Y ) : Y )
+    # into
+    #       ( ( (cond1) && (cond2) ) ? X : Y )
+    #
+    1 while $expr =~ s/
+        \(  \s*
+            ($parens) \s*
+            \? \s*
+                \( \s* ($parens) \s*
+                    \? \s* ($parens|[^()?:]+?) \s*
+                    :  \s* ($parens|[^()?:]+?) \s*
+                \) \s*
+            : \s* \4 \s*
+        \)
+    /( ( $1 && $2 ) ? $3 : $4 )/gx;
+
     return $expr;
 }
 
@@ -1182,7 +1199,7 @@ QUOTEMETA: Meta-characters that \Q should quote
 => high :fast
 \p{_Perl_Quotemeta}
 
-FOR_TESTING_DEMO: This is used to test if we generate incorrect code (currently is bad)
+FOR_TESTING_DEMO: This is used to test if we generate incorrect code (currently it is ok)
 => UTF8 :safe
 "\x{3B7}\x{342}"
 "\x{3B9}\x{308}\x{301}"