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';
};
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)',
# $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;
}