summaryrefslogtreecommitdiff
path: root/ext/Data
diff options
context:
space:
mode:
authorRafael Garcia-Suarez <rgarciasuarez@gmail.com>2004-11-03 17:38:01 +0100
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2005-05-02 14:48:04 +0000
commit2728842dc82a9f71891d065b28cf34767a63fb0c (patch)
tree9a6cb9f557ed94bb3dc310389ff3e33d890ef9d7 /ext/Data
parentabd70938721b65db3288384c514cb47b77a12268 (diff)
downloadperl-2728842dc82a9f71891d065b28cf34767a63fb0c.tar.gz
Re: [perl #31793] Data::Dumper: Useqq interacts badly with overloading
Message-ID: <20041103163801.6839be30@valis.local> p4raw-id: //depot/perl@24364
Diffstat (limited to 'ext/Data')
-rw-r--r--ext/Data/Dumper/Dumper.pm25
1 files changed, 20 insertions, 5 deletions
diff --git a/ext/Data/Dumper/Dumper.pm b/ext/Data/Dumper/Dumper.pm
index 0a91414509..3d297c338a 100644
--- a/ext/Data/Dumper/Dumper.pm
+++ b/ext/Data/Dumper/Dumper.pm
@@ -9,7 +9,7 @@
package Data::Dumper;
-$VERSION = '2.121_05';
+$VERSION = '2.121_06';
#$| = 1;
@@ -101,6 +101,18 @@ sub new {
return bless($s, $c);
}
+sub init_refaddr_format {
+ require Config;
+ my $f = $Config::Config{uvxformat};
+ $f =~ tr/"//d;
+ our $refaddr_format = "0x%" . $f;
+}
+
+sub format_refaddr {
+ require Scalar::Util;
+ sprintf our $refaddr_format, Scalar::Util::refaddr(shift);
+}
+
#
# add-to or query the table of already seen references
#
@@ -110,7 +122,7 @@ sub Seen {
my($k, $v, $id);
while (($k, $v) = each %$g) {
if (defined $v and ref $v) {
- ($id) = (overload::StrVal($v) =~ /\((.*)\)$/);
+ $id = format_refaddr($v);
if ($k =~ /^[*](.*)$/) {
$k = (ref $v eq 'ARRAY') ? ( "\\\@" . $1 ) :
(ref $v eq 'HASH') ? ( "\\\%" . $1 ) :
@@ -180,6 +192,7 @@ sub Dumpperl {
my(@out, $val, $name);
my($i) = 0;
local(@post);
+ init_refaddr_format();
$s = $s->new(@_) unless ref $s;
@@ -249,8 +262,10 @@ sub _dump {
warn "WARNING(Freezer method call failed): $@" if $@;
}
- ($realpack, $realtype, $id) =
- (overload::StrVal($val) =~ /^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$/);
+ require Scalar::Util;
+ $realpack = Scalar::Util::blessed($val);
+ $realtype = $realpack ? Scalar::Util::reftype($val) : ref $val;
+ $id = format_refaddr($val);
# if it has a name, we need to either look it up, or keep a tab
# on it so we know when we hit it later
@@ -419,7 +434,7 @@ sub _dump {
my $ref = \$_[1];
# first, catalog the scalar
if ($name ne '') {
- ($id) = ("$ref" =~ /\(([^\(]*)\)$/);
+ $id = format_refaddr($ref);
if (exists $s->{seen}{$id}) {
if ($s->{seen}{$id}[2]) {
$out = $s->{seen}{$id}[0];