-require 5.002; # For (defined ref)
+require 5.014; # For more reliable $@ after eval
package dumpvar;
# Needed for PrettyPrinter only:
# This one is good for variable names:
sub unctrl {
- local($_) = @_;
+ for (my($dummy) = shift) {
local($v) ;
return \$_ if ref \$_ eq "GLOB";
- s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
- $_;
+ if (ord('A') == 193) { # EBCDIC.
+ # EBCDIC has no concept of "\cA" or "A" being related
+ # to each other by a linear/boolean mapping.
+ } else {
+ s/([\001-\037\177])/'^'.pack('c',ord($1)^64)/eg;
+ }
+ return $_;
+ }
}
sub uniescape {
}
sub stringify {
- local($_,$noticks) = @_;
+ my $string;
+ if (eval { $string = _stringify(@_); 1 }) {
+ return $string;
+ }
+
+ return "<< value could not be dumped: $@ >>";
+}
+
+sub _stringify {
+ (my $__, local $noticks) = @_;
+ for ($__) {
local($v) ;
my $tick = $tick;
and %overload:: and defined &{'overload::StrVal'};
if ($tick eq 'auto') {
- if (/[\000-\011\013-\037\177]/) {
- $tick = '"';
- }else {
- $tick = "'";
- }
+ if (ord('A') == 193) {
+ if (/[\000-\011]/ or /[\013-\024\31-\037\177]/) {
+ $tick = '"';
+ } else {
+ $tick = "'";
+ }
+ } else {
+ if (/[\000-\011\013-\037\177]/) {
+ $tick = '"';
+ } else {
+ $tick = "'";
+ }
+ }
}
if ($tick eq "'") {
s/([\'\\])/\\$1/g;
} elsif ($unctrl eq 'quote') {
s/([\"\\\$\@])/\\$1/g if $tick eq '"';
s/\033/\\e/g;
- s/([\000-\037\177])/'\\c'.chr(ord($1)^64)/eg;
+ if (ord('A') == 193) { # EBCDIC.
+ s/([\000-\037\177])/'\\c'.chr(193)/eg; # Unfinished.
+ } else {
+ s/([\000-\037\177])/'\\c'._escaped_ord($1)/eg;
+ }
}
$_ = uniescape($_);
s/([\200-\377])/'\\'.sprintf('%3o',ord($1))/eg if $quoteHighBit;
- ($noticks || /^\d+(\.\d*)?\Z/)
+ return ($noticks || /^\d+(\.\d*)?\Z/)
? $_
: $tick . $_ . $tick;
+ }
+}
+
+# Ensure a resulting \ is escaped to be \\
+sub _escaped_ord {
+ my $chr = shift;
+ $chr = chr(ord($chr)^64);
+ $chr =~ s{\\}{\\\\}g;
+ return $chr;
}
sub ShortArray {
$sp = " " x $s ;
$s += 3 ;
+ eval {
# Check for reused addresses
if (ref $v) {
my $val = $v;
# Match type and address.
# Unblessed references will look like TYPE(0x...)
# Blessed references will look like Class=TYPE(0x...)
- ($start_part, $val) = split /=/,$val;
- $val = $start_part unless defined $val;
+ $val =~ s/^.*=//; # suppress the Class part, just keep TYPE(0x...)
($item_type, $address) =
$val =~ /([^\(]+) # Keep stuff that's
# not an open paren
if ($#$v >= 0) {
$short = $sp . "0..$#{$v} " .
join(" ",
- map {exists $v->[$_] ? stringify $v->[$_] : "empty"} ($[..$tArrayDepth)
+ map {exists $v->[$_] ? stringify $v->[$_] : "empty"} (0..$tArrayDepth)
) . "$shortmore";
} else {
$short = $sp . "empty array";
# print "$short\n";
# return;
#}
- for $num ($[ .. $tArrayDepth) {
+ for $num (0 .. $tArrayDepth) {
return if $DB::signal;
print "$sp$num ";
if (exists $v->[$num]) {
if ($globPrint) {
$s += 3;
dumpglob($s, "{$$v}", $$v, 1, $m-1);
- } elsif (defined ($fileno = fileno($v))) {
+ } elsif (defined ($fileno = eval {fileno($v)})) {
print( (' ' x ($s+3)) . "FileHandle({$$v}) => fileno($fileno)\n" );
}
} elsif (ref \$v eq 'GLOB') {
# Raw glob (again?)
if ($globPrint) {
dumpglob($s, "{$v}", $v, 1, $m-1) if $globPrint;
- } elsif (defined ($fileno = fileno(\$v))) {
+ } elsif (defined ($fileno = eval {fileno(\$v)})) {
print( (' ' x $s) . "FileHandle({$v}) => fileno($fileno)\n" );
}
}
+ };
+ if ($@) {
+ print( (' ' x $s) . "<< value could not be dumped: $@ >>\n");
+ }
+
+ return;
}
sub matchlex {
if ($in eq 'unctrl' or $in eq 'quote') {
$unctrl = $in;
} else {
- print "Unknown value for `unctrl'.\n";
+ print "Unknown value for 'unctrl'.\n";
}
}
$unctrl;
unwrap(\%entry,3+$off,$m) ;
print( (' ' x $off) . ")\n" );
}
- if (defined ($fileno = fileno(*entry))) {
+ if (defined ($fileno = eval{fileno(*entry)})) {
print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" );
}
if ($all) {