Deparse.pm: tr/...//c was failing
authorDavid Mitchell <davem@iabyn.com>
Tue, 13 Mar 2018 12:20:03 +0000 (12:20 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 20 Mar 2018 07:59:26 +0000 (07:59 +0000)
Deparsing a tr/....//c (complement and an empty replacement list)
was failing due to the 'delete RHS if LHS == RHS' action not triggering,
due the LHS having already been complemented.

At the same time, expand the set deparse tr/// tests;

lib/B/Deparse.pm
lib/B/Deparse.t

index 5f3a591..d3ab507 100644 (file)
@@ -5642,7 +5642,12 @@ sub tr_decode_byte {
        }
     }
     @from = (@from, @delfrom);
+
     if ($flags & OPpTRANS_COMPLEMENT) {
+        unless ($flags & OPpTRANS_DELETE) {
+            @to = () if ("@from" eq "@to");
+        }
+
        my @newfrom = ();
        my %from;
        @from{@from} = (1) x @from;
index ffdfc6c..983956d 100644 (file)
@@ -1438,11 +1438,34 @@ s/X//r;
 use feature 'unicode_strings';
 s/X//d;
 ####
-# all the flags (tr///)
-tr/X/Y/c;
-tr/X//d;
-tr/X//s;
-tr/X//r;
+# tr/// with all the flags: empty replacement
+tr/B-G//;
+tr/B-G//c;
+tr/B-G//d;
+tr/B-G//s;
+tr/B-G//cd;
+tr/B-G//ds;
+tr/B-G//cs;
+tr/B-G//cds;
+tr/B-G//r;
+####
+# tr/// with all the flags: short replacement
+tr/B-G/b/;
+tr/B-G/b/c;
+tr/B-G/b/d;
+tr/B-G/b/s;
+tr/B-G/b/cd;
+tr/B-G/b/ds;
+tr/B-G/b/cs;
+tr/B-G/b/cds;
+tr/B-G/b/r;
+####
+# tr/// with all the flags: equal length replacement
+tr/B-G/b-g/;
+tr/B-G/b-g/c;
+tr/B-G/b-g/s;
+tr/B-G/b-g/cs;
+tr/B-G/b-g/r;
 ####
 # tr with extended table (/c)
 tr/\000-\375/AB/c;