diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2005-06-27 16:34:34 +0000 |
---|---|---|
committer | Dave Mitchell <davem@fdisolutions.com> | 2005-06-27 16:34:34 +0000 |
commit | 29ddba3bfaa890fa4ba09cd9e59d0dd375d96279 (patch) | |
tree | ae568943532503a194d0143a4653c0f9658178c7 /lib/Carp | |
parent | aa0165afdda5e71e536a890f6b073619c221d9bd (diff) | |
download | perl-29ddba3bfaa890fa4ba09cd9e59d0dd375d96279.tar.gz |
Make Carp.pm even lighter (and Carp::Heavy even heavier)
Also move carp.pm pod to carp.pod
p4raw-id: //depot/perl@24995
Diffstat (limited to 'lib/Carp')
-rw-r--r-- | lib/Carp/Heavy.pm | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/lib/Carp/Heavy.pm b/lib/Carp/Heavy.pm index fe7fec4585..0180dcfda4 100644 --- a/lib/Carp/Heavy.pm +++ b/lib/Carp/Heavy.pm @@ -7,13 +7,73 @@ Carp::Heavy - heavy machinery, no user serviceable parts inside =cut -# use strict; # not yet - # On one line so MakeMaker will see it. use Carp; our $VERSION = $Carp::VERSION; +# use strict; # not yet + +# 'use Carp' just installs some very lightweight stubs; the first time +# these are called, they require Carp::Heavy which installs the real +# routines. + +# Comments added by Andy Wardley <abw@kfs.org> 09-Apr-98, based on an +# _almost_ complete understanding of the package. Corrections and +# comments are welcome. + +# The members of %Internal are packages that are internal to perl. +# Carp will not report errors from within these packages if it +# can. The members of %CarpInternal are internal to Perl's warning +# system. Carp will not report errors from within these packages +# either, and will not report calls *to* these packages for carp and +# croak. They replace $CarpLevel, which is deprecated. The +# $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval +# text and function arguments should be formatted when printed. + +# Comments added by Jos I. Boumans <kane@dwim.org> 11-Aug-2004 +# I can not get %CarpInternal or %Internal to work as advertised, +# therefore leaving it out of the below documentation. +# $CarpLevel may be decprecated according to the last comment, but +# after 6 years, it's still around and in heavy use ;) + +# disable these by default, so they can live w/o require Carp +$CarpInternal{Carp}++; +$CarpInternal{warnings}++; +$Internal{Exporter}++; +$Internal{'Exporter::Heavy'}++; + our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose); +# XXX longmess_real and shortmess_real should really be merged into +# XXX {long|sort}mess_heavy at some point + +sub longmess_real { + # Icky backwards compatibility wrapper. :-( + my $call_pack = caller(); + if ($Internal{$call_pack} or $CarpInternal{$call_pack}) { + return longmess_heavy(@_); + } + else { + local $CarpLevel = $CarpLevel + 1; + return longmess_heavy(@_); + } +}; + +sub shortmess_real { + # Icky backwards compatibility wrapper. :-( + my $call_pack = caller(); + local @CARP_NOT = caller(); + shortmess_heavy(@_); +}; + +# replace the two hooks added by Carp + +# aliasing the whole glob rather than just the CV slot avoids 'redefined' +# warnings, even in the presence of perl -W (as used by lib/warnings.t !) + +*longmess_jmp = *longmess_real; +*shortmess_jmp = *shortmess_real; + + sub caller_info { my $i = shift(@_) + 1; package DB; @@ -171,6 +231,7 @@ sub short_error_loc { { my $called = caller($i++); my $caller = caller($i); + return 0 unless defined($caller); # What happened? redo if $Internal{$caller}; redo if $CarpInternal{$called}; @@ -181,6 +242,7 @@ sub short_error_loc { return $i - 1; } + sub shortmess_heavy { return longmess_heavy(@_) if $Verbose; return @_ if ref($_[0]); # don't break references as exceptions |