in reply to Deep Recursion Limit
This can be done, but not quite as simply as you had perhaps hoped
So that disables the recursion warning, and then wraps the foo() in a closure that emits a recursion warning for every $limitth recursion.use strict; use warnings; ## disable perl's warning mechanism no warnings 'recursion'; use B 'svref_2object'; use Symbol 'qualify_to_ref'; sub change_depth_warn { my($subname, $limit) = @_; my $subref = \&$subname; my $gv = svref_2object($subref)->GV; my $lineno = 0; no warnings 'redefine'; *{ qualify_to_ref $subname } = sub { if( $gv->CV->DEPTH % $limit == 0 ) { $lineno = do { my $i = 0; 1 while caller $i++; (caller($i - 2))[2] } unless $lineno; warn sprintf "Deep recursion on subroutine '%s' at %s line %d.\n", join('::', $gv->STASH->NAME, $gv->NAME), $0, $lineno; } &$subref(@_); }; } my $cnt = 0; sub foo { &foo while $cnt++ < $_[0] } my $maxdepth = 1000; my $recdepth = 3000; change_depth_warn('foo', $maxdepth); printf "calling foo(), expecting %d warnings ...\n", $recdepth / $maxdepth; foo($recdepth); __output__ calling foo(), expecting 3 warnings ... Deep recursion on subroutine 'main::foo' at perlmonks/pmsopw_324564.pl + line 43. Deep recursion on subroutine 'main::foo' at perlmonks/pmsopw_324564.pl + line 43. Deep recursion on subroutine 'main::foo' at perlmonks/pmsopw_324564.pl + line 43.
HTH
_________
broquaint
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Re: Deep Recursion Limit
by dragonchild (Archbishop) on Jan 28, 2004 at 03:59 UTC |
In Section
Seekers of Perl Wisdom