X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/d0693cf4b8b5224643f91c827658fb88fe377947..41ec1a254c67a6bbd3ce97b91fb9521876a2e91b:/SL/LXDebug.pm diff --git a/SL/LXDebug.pm b/SL/LXDebug.pm index e0b7cca3c..40ec54c8a 100644 --- a/SL/LXDebug.pm +++ b/SL/LXDebug.pm @@ -20,6 +20,7 @@ use constant STDERR_TARGET => 1; use Data::Dumper; use POSIX qw(strftime getpid); +use Scalar::Util qw(blessed refaddr weaken); use Time::HiRes qw(gettimeofday tv_interval); use YAML; use SL::Request (); @@ -159,12 +160,48 @@ sub warn { sub dump { my ($self, $level, $name, $variable, %options) = @_; - my $password; - if ($variable && ('Form' eq ref $variable) && defined $variable->{password}) { - $password = $variable->{password}; - $variable->{password} = 'X' x 8; - } + my %dumped; + + my $clone_for_dump; + $clone_for_dump = sub { + my ($src) = @_; + + return undef if !defined($src); + + my $addr = refaddr($src); + + return $dumped{$addr} if $dumped{$addr // ''}; + + + if (blessed($src) && $src->can('as_debug_info')) { + $dumped{$addr} = $src->as_debug_info; + + } elsif (ref($src) eq 'ARRAY') { + $dumped{$addr} = []; + + foreach my $entry (@{ $src }) { + my $exists = !!$dumped{refaddr($entry) // ''}; + push @{ $dumped{$addr} }, $clone_for_dump->($entry); + + weaken($dumped{$addr}->[-1]) if $exists; + + } + + } elsif (ref($src) =~ m{^(?:HASH|Form|SL::.+)$}) { + $dumped{$addr} = {}; + foreach my $key (keys %{ $src }) { + my $exists = !!$dumped{refaddr($src->{$key}) // ''}; + $dumped{$addr}->{$key} = $clone_for_dump->($src->{$key}); + + weaken($dumped{$addr}->{$key}) if $exists; + } + } + + return $dumped{$addr} // "$src"; + }; + + $variable = $clone_for_dump->($variable); my $dumper = Data::Dumper->new([$variable]); $dumper->Sortkeys(1); $dumper->Indent(2); @@ -172,15 +209,6 @@ sub dump { my $output = $dumper->Dump(); $self->message($level, "dumping ${name}:\n" . $output); - $variable->{password} = $password if (defined $password); - - # Data::Dumper does not reset the iterator belonging to this hash - # if 'Sortkeys' is true. Therefore clear the iterator manually. - # See "perldoc -f each". - if ($variable && (('HASH' eq ref $variable) || ('Form' eq ref $variable))) { - keys %{ $variable }; - } - return $output; } @@ -218,17 +246,6 @@ sub dump_sql_result { $self->message($level, $prefix . sprintf('(%d row%s)', scalar @{ $results }, scalar @{ $results } > 1 ? 's' : '')); } -sub dump_object { - my ($self, $level, $text, $object) = @_; - - my $copy; - if ($object) { - $copy->{$_} = $object->$_ for $object->meta->columns; - } - - $self->dump($level, $text, $copy); -} - sub show_diff { my ($self, $level, $item1, $item2, %params) = @_;