File Coverage

lib/Carp/Trace.pm
Criterion Covered Total %
statement 42 42 100.0
branch 15 18 83.3
condition 5 9 55.5
subroutine 7 7 100.0
pod 1 1 100.0
total 70 77 90.9


line stmt bran cond sub pod time code
1             package Carp::Trace;
2 1     1   1352 use strict;
  1         2  
  1         39  
3 1     1   2042 use Data::Dumper;
  1         9420  
  1         83  
4 1     1   904 use Devel::Caller::Perl qw[called_args];
  1         4347  
  1         7  
5              
6             BEGIN {
7 1     1   36 use vars qw[@ISA @EXPORT $VERSION $DEPTH $OFFSET $ARGUMENTS];
  1         2  
  1         90  
8 1     1   5 use Exporter;
  1         2  
  1         55  
9              
10 1     1   19 @ISA = 'Exporter';
11 1         409 @EXPORT = 'trace';
12             }
13              
14             $OFFSET = 0;
15             $DEPTH = 0;
16             $ARGUMENTS = 0;
17             $VERSION = '0.12';
18              
19             sub trace {
20 2   50 2 1 10410 my $level = shift || $DEPTH || 0;
21 2   50     16 my $offset = shift || $OFFSET || 0;
22 2   100     14 my $args = shift || $ARGUMENTS || 0;
23              
24 2         4 my $trace = '';
25 2         3 my $i = 1 + $OFFSET;
26              
27 2         4 while (1) {
28 11 50 33     37 last if $level && $level < $i;
29              
30 11         50 my @caller = caller($i);
31 11 100       637 last unless scalar @caller;
32              
33 9         25 my ($package, $filename, $line, $subroutine, $hasargs, $wantarray,
34             $evaltext, $is_require, $hints, $bitmask) = @caller;
35              
36 9 50       43 my $string = $subroutine eq '(eval)'
    100          
37             ? $package . '::' . $subroutine . qq| [$i]|
38             . (defined $evaltext ? qq[\n\t$evaltext] : '')
39             : $subroutine . qq| [$i]|;
40 9         13 $string =~ s/\n;$/;/gs;
41              
42 9         11 $string .= qq[\n\t];
43              
44 9 50       18 $string .= q[require|use - ] if $is_require;
45 9 100       22 $string .= defined $wantarray
    100          
46             ? $wantarray ? 'list - ' : 'scalar - '
47             : 'void - ';
48 9 100       19 $string .= $hasargs ? 'new stash' : 'no new stash';
49 9         20 $string .= qq[\n\t] . $filename . ' line ' . $line . qq[\n];
50              
51 9 100       19 if ($args) {
52 4         5 local $Data::Dumper::Varname = 'ARGS';
53 4         5 local $Data::Dumper::Indent = 1;
54              
55 4         26 for my $line ( split $/, Dumper( called_args($i) ) ) {
56 8         122 $string .= "\t$line\n";
57             }
58             }
59              
60 9         162 $trace = $string . $trace;
61              
62 9         25 $i++;
63             }
64              
65 2         75 return $trace;
66             }
67              
68             __END__