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