This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Improve -Dr output
authorKarl Williamson <khw@cpan.org>
Wed, 6 Jul 2016 01:37:46 +0000 (19:37 -0600)
committerKarl Williamson <khw@cpan.org>
Sat, 16 Jul 2016 23:42:39 +0000 (17:42 -0600)
Previously when dumping the compiled ANYOF node under -Dr, it could say
something like \x1B-\x1B.  A single element range should be dumped as a
single element.

regcomp.c
t/re/anyof.t

index 14c328b..f9c3435 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -19748,15 +19748,19 @@ S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals)
          * mnemonic names.  Split off any of those at the beginning and end of
          * the range to print mnemonically.  It isn't possible for many of
          * these to be in a row, so this won't overwhelm with output */
+        if (   start <= end
+            && (isMNEMONIC_CNTRL(start) || isMNEMONIC_CNTRL(end)))
+        {
         while (isMNEMONIC_CNTRL(start) && start <= end) {
             put_code_point(sv, start);
             start++;
         }
-        if (start < end && isMNEMONIC_CNTRL(end)) {
 
-            /* Here, the final character in the range has a mnemonic name.
-             * Work backwards from the end to find the final non-mnemonic */
-            UV temp_end = end - 1;
+        /* If this didn't take care of the whole range ... */
+        if (start <= end) {
+
+            /* Look backwards from the end to find the final non-mnemonic */
+            UV temp_end = end;
             while (isMNEMONIC_CNTRL(temp_end)) {
                 temp_end--;
             }
@@ -19773,6 +19777,7 @@ S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals)
             }
             break;
         }
+        }
 
         /* As a final resort, output the range or subrange as hex. */
 
index 2980cc8..88b7a80 100644 (file)
@@ -34,6 +34,7 @@ my @tests = (
     '[^\/\|,\$\%%\@\ \%"\<\>\:\#\&\*\{\}\[\]\(\)]' => 'ANYOF[^ "#$%&()*,/:<>@[\]\{|\}][0100-INFINITY]',
     '[ [:blank:]]' => 'ANYOFD[\t {utf8}\xA0][1680 2000-200A 202F 205F 3000]',
     '[\xA0[:^blank:]]' => 'ANYOF[^\t ][0100-167F 1681-1FFF 200B-202E 2030-205E 2060-2FFF 3001-INFINITY]',
+    '[\x{07}-\x{0B}]' => 'ANYOF[\a\b\t\n\x0B]',
     '(?il:[\x{212A}])' => 'ANYOFL{i}[{utf8 locale}Kk][212A]',
     '(?il:(?[\x{212A}]))' => 'ANYOFL{utf8-locale-reqd}[Kk][212A]',