Carp: distinguish deleted stash from top of stack
authorRicardo Signes <rjbs@cpan.org>
Wed, 1 May 2013 15:41:50 +0000 (11:41 -0400)
committerRicardo Signes <rjbs@cpan.org>
Thu, 2 May 2013 02:25:20 +0000 (22:25 -0400)
The change to work with deleted stashes broke the behavior of Carp
at the top of the stack.

This change distinguishes between the two cases: at the top of the
stack, caller(1) returns ().  If the stash has been deleted, it
returns a populated list with an undefined package name.  The test
used here is to check for a defined line number, which should be
sufficient.

dist/Carp/lib/Carp.pm
dist/Carp/lib/Carp/Heavy.pm

index 23abb48..69caac3 100644 (file)
@@ -24,7 +24,7 @@ BEGIN {
     }
 }
 
-our $VERSION = '1.28';
+our $VERSION = '1.29';
 
 our $MaxEvalLen = 0;
 our $Verbose    = 0;
@@ -256,7 +256,8 @@ sub long_error_loc {
     {
         ++$i;
         my $cgc = _cgc();
-        my $pkg = $cgc ? $cgc->($i) : caller($i);
+        my @caller = $cgc ? $cgc->($i) : caller($i);
+        my $pkg = $caller[0];
         unless ( defined($pkg) ) {
 
             # This *shouldn't* happen.
@@ -265,7 +266,7 @@ sub long_error_loc {
                 $i = long_error_loc();
                 last;
             }
-            else {
+            elsif (defined $caller[2]) {
                 # this can happen when the stash has been deleted
                 # in that case, just assume that it's a reasonable place to
                 # stop (the file and line data will still be intact in any
@@ -275,6 +276,9 @@ sub long_error_loc {
                 redo unless 0 > --$lvl;
                 last;
             }
+            else {
+                return 2;
+            }
         }
         redo if $CarpInternal{$pkg};
         redo unless 0 > --$lvl;
index 5b2b448..283b09b 100644 (file)
@@ -2,7 +2,7 @@ package Carp::Heavy;
 
 use Carp ();
 
-our $VERSION = '1.28';
+our $VERSION = '1.29';
 
 1;