diff options
author | David Golden <dagolden@cpan.org> | 2009-11-04 17:33:11 -0500 |
---|---|---|
committer | David Golden <dagolden@cpan.org> | 2009-11-06 06:32:47 -0500 |
commit | 45a2d9782bd1c90e53c52dacd30d9b185db62239 (patch) | |
tree | b64248cb575c02053066e2fb266401869bfe9698 | |
parent | 406ca277873a56e20923a72ee65ea50159954a30 (diff) | |
download | perl-45a2d9782bd1c90e53c52dacd30d9b185db62239.tar.gz |
Have Carp respect CORE::GLOBAL::caller if it exists
Carp frequently gets loaded very early, before tools that want to
override caller(). Previously, caller() was only in Carp::Heavy,
which was only loaded on demand (thus after any CORE::GLOBAL::caller
override). This patch unbreaks anything expecting the old behavior.
-rw-r--r-- | lib/Carp.pm | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/Carp.pm b/lib/Carp.pm index 69d5c1f8ff..0826016536 100644 --- a/lib/Carp.pm +++ b/lib/Carp.pm @@ -43,7 +43,7 @@ sub longmess { # 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(); + my $call_pack = exists $CORE::GLOBAL::{caller} ? $CORE::GLOBAL::{caller}->() : caller(); if ($Internal{$call_pack} or $CarpInternal{$call_pack}) { return longmess_heavy(@_); } @@ -55,7 +55,7 @@ sub longmess { sub shortmess { # Icky backwards compatibility wrapper. :-( - local @CARP_NOT = caller(); + local @CARP_NOT = exists $CORE::GLOBAL::{caller} ? $CORE::GLOBAL::{caller}->() : caller(); shortmess_heavy(@_); }; @@ -70,7 +70,7 @@ sub caller_info { my %call_info; @call_info{ qw(pack file line sub has_args wantarray evaltext is_require) - } = caller($i); + } = exists $CORE::GLOBAL::{caller} ? $CORE::GLOBAL::{caller}->($i) : caller($i); unless (defined $call_info{pack}) { return (); @@ -149,7 +149,8 @@ sub long_error_loc { my $i; my $lvl = $CarpLevel; { - my $pkg = caller(++$i); + ++$i; + my $pkg = exists $CORE::GLOBAL::{caller} ? $CORE::GLOBAL::{caller}->($i) : caller($i); unless(defined($pkg)) { # This *shouldn't* happen. if (%Internal) { @@ -224,8 +225,10 @@ sub short_error_loc { my $i = 1; my $lvl = $CarpLevel; { - my $called = caller($i++); - my $caller = caller($i); + + my $called = exists $CORE::GLOBAL::{caller} ? $CORE::GLOBAL::{caller}->($i) : caller($i); + $i++; + my $caller = exists $CORE::GLOBAL::{caller} ? $CORE::GLOBAL::{caller}->($i) : caller($i); return 0 unless defined($caller); # What happened? redo if $Internal{$caller}; |