From: Nicholas Clark Date: Sun, 26 Nov 2006 18:00:05 +0000 (+0000) Subject: Make the cache in Carp::trusts actually persist across calls :-) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=1ff09fbafb1bac228ed8d2a6d60971f9319e4977;p=p5sagit%2Fp5-mst-13.2.git Make the cache in Carp::trusts actually persist across calls :-) I made a similar mistake once long ago, and now spot the pattern. p4raw-id: //depot/perl@29385 --- diff --git a/lib/Carp/Heavy.pm b/lib/Carp/Heavy.pm index 2caeb27..a293b59 100644 --- a/lib/Carp/Heavy.pm +++ b/lib/Carp/Heavy.pm @@ -224,7 +224,10 @@ sub ret_summary { sub short_error_loc { - my $cache; + # You have to create your (hash)ref out here, rather than defaulting it + # inside trusts *on a lexical*, as you want it to persist across calls. + # (You can default it on $_[2], but that gets messy) + my $cache = {}; my $i = 1; my $lvl = $CarpLevel; { @@ -274,7 +277,7 @@ sub str_len_trim { sub trusts { my $child = shift; my $parent = shift; - my $cache = shift || {}; + my $cache = shift; my ($known, $partial) = get_status($cache, $child); # Figure out consequences until we have an answer while (@$partial and not exists $known->{$parent}) {