Re: [ID 20010624.001] debugger T, and Carp::carp don't trace arg of
Mike Guy [Sun, 24 Jun 2001 15:28:39 +0000 (16:28 +0100)]
Message-Id: <E15EAsR-0007Bi-00@draco.cus.cam.ac.uk>

Fix an ancient (5.002) bug.

p4raw-id: //depot/perl@10891

lib/Carp/Heavy.pm

index 9d3e000..06d57b5 100644 (file)
@@ -28,8 +28,7 @@ sub caller_info {
 
   my $sub_name = Carp::get_subname(\%call_info);
   if ($call_info{has_args}) {
-    # Reuse the @args array to avoid warnings. :-)
-    local @args = map {Carp::format_arg($_)} @args;
+    my @args = map {Carp::format_arg($_)} @args;
     if ($MaxArgNums and @args > $MaxArgNums) { # More than we want to show?
       $#args = $MaxArgNums;
       push @args, '...';
@@ -120,7 +119,7 @@ sub long_error_loc {
 
 
 sub longmess_heavy {
-  return @_ if ref($_[0]); # WHAT IS THIS FOR???
+  return @_ if ref($_[0]); # don't break references as exceptions
   my $i = long_error_loc();
   return ret_backtrace($i, @_);
 }
@@ -139,19 +138,19 @@ sub ret_backtrace {
     $tid_msg = " thread $tid" if $tid;
   }
 
-  if ($err =~ /\n$/) {
+  { if ($err =~ /\n$/) {       # extra block to localise $1 etc
     $mess = $err;
   }
   else {
     my %i = caller_info($i);
     $mess = "$err at $i{file} line $i{line}$tid_msg\n";
-  }
+  }}
 
   while (my %i = caller_info(++$i)) {
       $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n";
   }
   
-  return $mess || $err;
+  return $mess;
 }
 
 sub ret_summary {
@@ -190,7 +189,7 @@ sub short_error_loc {
 
 sub shortmess_heavy {
   return longmess_heavy(@_) if $Verbose;
-  return @_ if ref($_[0]); # WHAT IS THIS FOR???
+  return @_ if ref($_[0]); # don't break references as exceptions
   my $i = short_error_loc();
   if ($i) {
     ret_summary($i, @_);