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