X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Flib%2FDBICTest%2FUtil%2FLeakTracer.pm;h=b3984b60f6198ee1db48dbb714386eea309cdf77;hb=bf302897b5be1fe2e857b6be427dd66e82587547;hp=08b9fa69a16c465245403e4846a2bb7bae9532ae;hpb=6ae62c5c162c519053b7354065b8f6c33e990b6e;p=dbsrgits%2FDBIx-Class.git diff --git a/t/lib/DBICTest/Util/LeakTracer.pm b/t/lib/DBICTest/Util/LeakTracer.pm index 08b9fa6..b3984b6 100644 --- a/t/lib/DBICTest/Util/LeakTracer.pm +++ b/t/lib/DBICTest/Util/LeakTracer.pm @@ -5,7 +5,7 @@ use strict; use Carp; use Scalar::Util qw(isweak weaken blessed reftype); -use DBIx::Class::_Util 'refcount'; +use DBIx::Class::_Util qw(refcount hrefaddr); use DBIx::Class::Optional::Dependencies; use Data::Dumper::Concise; use DBICTest::Util 'stacktrace'; @@ -15,14 +15,12 @@ use constant { }; use base 'Exporter'; -our @EXPORT_OK = qw(populate_weakregistry assert_empty_weakregistry hrefaddr visit_refs); +our @EXPORT_OK = qw(populate_weakregistry assert_empty_weakregistry visit_refs); my $refs_traced = 0; my $leaks_found = 0; my %reg_of_regs; -sub hrefaddr { sprintf '0x%x', &Scalar::Util::refaddr } - # so we don't trigger stringification sub _describe_ref { sprintf '%s%s(%s)', @@ -131,25 +129,29 @@ sub visit_refs { # $visited_cnt += visit_refs({ %$args, refs => [ $t ] }); #} - my $type = reftype $r; - if ($type eq 'HASH') { - $visited_cnt += visit_refs({ %$args, refs => [ map { - ( !isweak($r->{$_}) ) ? $r->{$_} : () - } keys %$r ] }); - } - elsif ($type eq 'ARRAY') { - $visited_cnt += visit_refs({ %$args, refs => [ map { - ( !isweak($r->[$_]) ) ? $r->[$_] : () - } 0..$#$r ] }); - } - elsif ($type eq 'REF' and !isweak($$r)) { - $visited_cnt += visit_refs({ %$args, refs => [ $$r ] }); - } - elsif (CV_TRACING and $type eq 'CODE') { - $visited_cnt += visit_refs({ %$args, refs => [ map { - ( !isweak($_) ) ? $_ : () - } scalar PadWalker::closed_over($r) ] }); # scalar due to RT#92269 - } + local $@; + eval { + my $type = reftype $r; + if ($type eq 'HASH') { + $visited_cnt += visit_refs({ %$args, refs => [ map { + ( !isweak($r->{$_}) ) ? $r->{$_} : () + } keys %$r ] }); + } + elsif ($type eq 'ARRAY') { + $visited_cnt += visit_refs({ %$args, refs => [ map { + ( !isweak($r->[$_]) ) ? $r->[$_] : () + } 0..$#$r ] }); + } + elsif ($type eq 'REF' and !isweak($$r)) { + $visited_cnt += visit_refs({ %$args, refs => [ $$r ] }); + } + elsif (CV_TRACING and $type eq 'CODE') { + $visited_cnt += visit_refs({ %$args, refs => [ map { + ( !isweak($_) ) ? $_ : () + } scalar PadWalker::closed_over($r) ] }); # scalar due to RT#92269 + } + 1; + } or warn "Could not descend into @{[ _describe_ref($r) ]}: $@\n"; } $visited_cnt; }