summaryrefslogtreecommitdiff
path: root/lib/Carp.pm
diff options
context:
space:
mode:
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>1996-07-25 02:24:34 +0000
committerCharles Bailey <bailey@genetics.upenn.edu>1996-07-25 02:24:34 +0000
commit9c7d862108a3f02f3db65204f8154cdfe689040e (patch)
treee4c015f3b21f2ecb584d02b88ffb6165a747927c /lib/Carp.pm
parent21c92a1de962a30d8936572d83b08b08e916d3e4 (diff)
downloadperl-9c7d862108a3f02f3db65204f8154cdfe689040e.tar.gz
perl 5.003_01: lib/Carp.pm
Eliminate $& to avoid runtime penalty Consider @ISA when tracing call stack
Diffstat (limited to 'lib/Carp.pm')
-rw-r--r--lib/Carp.pm38
1 files changed, 29 insertions, 9 deletions
diff --git a/lib/Carp.pm b/lib/Carp.pm
index f30bd24135..5de8f83d14 100644
--- a/lib/Carp.pm
+++ b/lib/Carp.pm
@@ -47,7 +47,7 @@ sub longmess {
if ($require) {
$sub = "require $eval";
} else {
- $eval =~ s/[\\\']/\\$&/g;
+ $eval =~ s/([\\\'])/\\$1/g;
if ($MaxEvalLen && length($eval) > $MaxEvalLen) {
substr($eval,$MaxEvalLen) = '...';
}
@@ -66,20 +66,40 @@ sub longmess {
sub shortmess { # Short-circuit &longmess if called via multiple packages
my $error = $_[0]; # Instead of "shift"
- my ($curpack) = caller(1);
+ my ($prevpack) = caller(1);
my $extra = $CarpLevel;
my $i = 2;
my ($pack,$file,$line);
+ my %isa = ($prevpack,1);
+
+ @isa{@{"${prevpack}::ISA"}} = ()
+ if(defined @{"${prevpack}::ISA"});
+
while (($pack,$file,$line) = caller($i++)) {
- if ($pack ne $curpack) {
- if ($extra-- > 0) {
- $curpack = $pack;
- }
- else {
- return "$error at $file line $line\n";
- }
+ if(defined @{$pack . "::ISA"}) {
+ my @i = @{$pack . "::ISA"};
+ my %i;
+ @i{@i} = ();
+ @isa{@i,$pack} = ()
+ if(exists $i{$prevpack} || exists $isa{$pack});
+ }
+
+ next
+ if(exists $isa{$pack});
+
+ if ($extra-- > 0) {
+ %isa = ($pack,1);
+ @isa{@{$pack . "::ISA"}} = ()
+ if(defined @{$pack . "::ISA"});
+ }
+ else {
+ return "$error at $file line $line\n";
}
}
+ continue {
+ $prevpack = $pack;
+ }
+
goto &longmess;
}