85ab1f
From 76b7c82c2947d64a3494175ef6530b3fba8a499d Mon Sep 17 00:00:00 2001
85ab1f
From: Zefram <zefram@fysh.org>
85ab1f
Date: Wed, 10 Jan 2018 21:09:45 +0000
85ab1f
Subject: [PATCH] fix Data-Dumper postentry for quoted glob
85ab1f
MIME-Version: 1.0
85ab1f
Content-Type: text/plain; charset=UTF-8
85ab1f
Content-Transfer-Encoding: 8bit
85ab1f
85ab1f
In Data-Dumper, where a glob with a quoted name required a postentry,
85ab1f
the name part of the postentry was being emitted as just "}".  This was
85ab1f
an old bug affecting upgraded glob names, which the recent commit
85ab1f
abda9fe0fe75ae824723761c1c98af958f17a41c made affect all quoted glob
85ab1f
names.  Fix the postentry name to encompass the entire quoted name.
85ab1f
Fixes [perl #132695].
85ab1f
85ab1f
Petr Písař: Ported to Data-Dumpe-2.167 from perl
85ab1f
fb5043174b070927d312677f0a2f04a29b11349a.
85ab1f
85ab1f
Signed-off-by: Petr Písař <ppisar@redhat.com>
85ab1f
---
85ab1f
 Dumper.xs  | 11 ++++++-----
85ab1f
 t/dumper.t | 32 +++++++++++++++++++++++++++++++-
85ab1f
 2 files changed, 37 insertions(+), 6 deletions(-)
85ab1f
85ab1f
diff --git a/Dumper.xs b/Dumper.xs
85ab1f
index 8a16e04..206e8b5 100644
85ab1f
--- a/Dumper.xs
85ab1f
+++ b/Dumper.xs
85ab1f
@@ -1300,11 +1300,11 @@ DD_dump(pTHX_ SV *val, const char *name, STRLEN namelen, SV *retval, HV *seenhv,
85ab1f
 		    i = 0; else i -= 4;
85ab1f
 	    }
85ab1f
             if (globname_needs_quote(c,i)) {
85ab1f
-		sv_grow(retval, SvCUR(retval)+2);
85ab1f
+		sv_grow(retval, SvCUR(retval)+3);
85ab1f
 		r = SvPVX(retval)+SvCUR(retval);
85ab1f
-		r[0] = '*'; r[1] = '{';
85ab1f
+		r[0] = '*'; r[1] = '{'; r[2] = 0;
85ab1f
 		SvCUR_set(retval, SvCUR(retval)+2);
85ab1f
-                esc_q_utf8(aTHX_ retval, c, i,
85ab1f
+                i = 3 + esc_q_utf8(aTHX_ retval, c, i,
85ab1f
 #ifdef GvNAMEUTF8
85ab1f
 			!!GvNAMEUTF8(val)
85ab1f
 #else
85ab1f
@@ -1314,15 +1314,16 @@ DD_dump(pTHX_ SV *val, const char *name, STRLEN namelen, SV *retval, HV *seenhv,
85ab1f
 		sv_grow(retval, SvCUR(retval)+2);
85ab1f
 		r = SvPVX(retval)+SvCUR(retval);
85ab1f
 		r[0] = '}'; r[1] = '\0';
85ab1f
-		i = 1;
85ab1f
+		SvCUR_set(retval, SvCUR(retval)+1);
85ab1f
+		r = r+1 - i;
85ab1f
 	    }
85ab1f
 	    else {
85ab1f
 		sv_grow(retval, SvCUR(retval)+i+2);
85ab1f
 		r = SvPVX(retval)+SvCUR(retval);
85ab1f
 		r[0] = '*'; strcpy(r+1, c);
85ab1f
 		i++;
85ab1f
+		SvCUR_set(retval, SvCUR(retval)+i);
85ab1f
 	    }
85ab1f
-	    SvCUR_set(retval, SvCUR(retval)+i);
85ab1f
 
85ab1f
             if (style->purity) {
85ab1f
 		static const char* const entries[] = { "{SCALAR}", "{ARRAY}", "{HASH}" };
85ab1f
diff --git a/t/dumper.t b/t/dumper.t
85ab1f
index 0c12f34..e09a2dd 100644
85ab1f
--- a/t/dumper.t
85ab1f
+++ b/t/dumper.t
85ab1f
@@ -108,7 +108,7 @@ sub SKIP_TEST {
85ab1f
   ++$TNUM; print "ok $TNUM # skip $reason\n";
85ab1f
 }
85ab1f
 
85ab1f
-$TMAX = 456;
85ab1f
+$TMAX = 468;
85ab1f
 
85ab1f
 # Force Data::Dumper::Dump to use perl. We test Dumpxs explicitly by calling
85ab1f
 # it direct. Out here it lets us knobble the next if to test that the perl
85ab1f
@@ -1773,3 +1773,33 @@ EOT
85ab1f
   TEST (q(Data::Dumper->Dumpxs([\@globs], ["globs"])), 'globs: Dumpxs()')
85ab1f
     if $XS;
85ab1f
 }
85ab1f
+#############
85ab1f
+$WANT = <<'EOT';
85ab1f
+#$v = {
85ab1f
+#  a => \*::ppp,
85ab1f
+#  b => \*{'::a/b'},
85ab1f
+#  c => \*{"::a\x{2603}b"}
85ab1f
+#};
85ab1f
+#*::ppp = {
85ab1f
+#  a => 1
85ab1f
+#};
85ab1f
+#*{'::a/b'} = {
85ab1f
+#  b => 3
85ab1f
+#};
85ab1f
+#*{"::a\x{2603}b"} = {
85ab1f
+#  c => 5
85ab1f
+#};
85ab1f
+EOT
85ab1f
+{
85ab1f
+  *ppp = { a => 1 };
85ab1f
+  *{"a/b"} = { b => 3 };
85ab1f
+  *{"a\x{2603}b"} = { c => 5 };
85ab1f
+  our $v = { a => \*ppp, b => \*{"a/b"}, c => \*{"a\x{2603}b"} };
85ab1f
+  local $Data::Dumper::Purity = 1;
85ab1f
+  TEST (q(Data::Dumper->Dump([$v], ["v"])), 'glob purity: Dump()');
85ab1f
+  TEST (q(Data::Dumper->Dumpxs([$v], ["v"])), 'glob purity: Dumpxs()') if $XS;
85ab1f
+  $WANT =~ tr/'/"/;
85ab1f
+  local $Data::Dumper::Useqq = 1;
85ab1f
+  TEST (q(Data::Dumper->Dump([$v], ["v"])), 'glob purity: Dump()');
85ab1f
+  TEST (q(Data::Dumper->Dumpxs([$v], ["v"])), 'glob purity: Dumpxs()') if $XS;
85ab1f
+}
85ab1f
-- 
85ab1f
2.13.6
85ab1f