X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCarp%2FHeavy.pm;h=4355584d20653ed9a10effc8b74dedd7112dcd0e;hb=d735c2efe0b08b05adfb893625476bf4480a2ece;hp=0180dcfda40067aca27ba8d812af090afbae9be8;hpb=29ddba3bfaa890fa4ba09cd9e59d0dd375d96279;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Carp/Heavy.pm b/lib/Carp/Heavy.pm index 0180dcf..4355584 100644 --- a/lib/Carp/Heavy.pm +++ b/lib/Carp/Heavy.pm @@ -15,10 +15,6 @@ use Carp; our $VERSION = $Carp::VERSION; # these are called, they require Carp::Heavy which installs the real # routines. -# Comments added by Andy Wardley 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 @@ -28,12 +24,6 @@ use Carp; our $VERSION = $Carp::VERSION; # $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 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}++; @@ -48,6 +38,11 @@ our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose); sub longmess_real { # Icky backwards compatibility wrapper. :-( + # + # The story is that the original implementation hard-coded the + # number of call levels to go back, so calls to longmess were off + # by one. Other code began calling longmess and expecting this + # behaviour, so the replacement has to emulate that behaviour. my $call_pack = caller(); if ($Internal{$call_pack} or $CarpInternal{$call_pack}) { return longmess_heavy(@_); @@ -103,11 +98,10 @@ sub caller_info { # Transform an argument to a function into a string. sub format_arg { my $arg = shift; - if (not defined($arg)) { - $arg = 'undef'; - } - elsif (ref($arg)) { + if (ref($arg)) { $arg = defined($overload::VERSION) ? overload::StrVal($arg) : "$arg"; + }elsif (not defined($arg)) { + $arg = 'undef'; } $arg =~ s/'/\\'/g; $arg = str_len_trim($arg, $MaxArgLen); @@ -116,9 +110,10 @@ sub format_arg { $arg = "'$arg'" unless $arg =~ /^-?[\d.]+\z/; # The following handling of "control chars" is direct from - # the original code - I think it is broken on Unicode though. + # the original code - it is broken on Unicode though. # Suggestions? - $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg; + utf8::is_utf8($arg) + or $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg; return $arg; } @@ -234,6 +229,7 @@ sub short_error_loc { return 0 unless defined($caller); # What happened? redo if $Internal{$caller}; + redo if $CarpInternal{$caller}; redo if $CarpInternal{$called}; redo if trusts($called, $caller, $cache); redo if trusts($caller, $called, $cache);