Data-Decycle
view release on metacpan or search on metacpan
lib/Data/Decycle.pm view on Meta::CPAN
}
for (@{$self}){
next unless ref $_;
carp "decyling ($_)" if $DEBUG;
decycle_deeply($_);
}
}
our $CALLEE;
sub recsub(&) {
my $code = shift;
sub {
local *CALLEE = \$code;
$code->(@_);
}
}
sub _mkfinder(&) {
my $cb = shift;
return recsub {
return unless ref $_[0];
no warnings 'uninitialized';
return $cb->( $_[0] ) if $_[1]->{ refaddr $_[0] }++;
if ( UNIVERSAL::isa( $_[0], 'HASH' ) ) {
for ( values %{ $_[0] } ) {
next unless ref $_;
return 1 if $CALLEE->( $_, $_[1] );
}
lib/Data/Decycle.pm view on Meta::CPAN
return;
}
}
*_has_cyclic_ref = _mkfinder { 1 };
sub has_cyclic_ref($){ _has_cyclic_ref($_[0], {}) }
*_may_leak = _mkfinder { !isweak($_[0]) };
sub may_leak($){ _may_leak($_[0], {}) }
sub _mkwalker(&){
my $cb = shift;
return recsub {
return unless ref $_[0];
no warnings 'uninitialized';
return $cb->( $_[0] ) if $_[1]->{ refaddr $_[0] }++;
if ( UNIVERSAL::isa( $_[0], 'HASH' ) ) {
$CALLEE->( $_, $_[1] ) for values %{ $_[0] };
}
elsif ( UNIVERSAL::isa( $_[0], 'ARRAY' ) ) {
$CALLEE->( $_, $_[1] ) for @{ $_[0] };
( run in 1.284 second using v1.01-cache-2.11-cpan-49f99fa48dc )