line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Pod::Coverage::Careful; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1417
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
29
|
|
4
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
38
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
our $VERSION = "v1.1.0"; |
7
|
|
|
|
|
|
|
|
8
|
1
|
|
|
1
|
|
6
|
use B; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
39
|
|
9
|
1
|
|
|
1
|
|
5
|
use Devel::Symdump; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
19
|
|
10
|
1
|
|
|
1
|
|
5
|
use Pod::Coverage; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
57
|
|
11
|
|
|
|
|
|
|
our @ISA = qw(Pod::Coverage); |
12
|
|
|
|
|
|
|
|
13
|
1
|
|
|
1
|
|
286
|
BEGIN { *TRACE_ALL = \&Pod::Coverage::TRACE_ALL; } |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
sub name_of_coderef { |
16
|
0
|
|
|
0
|
0
|
|
require B; |
17
|
0
|
|
|
|
|
|
my($coderef) = @_; |
18
|
|
|
|
|
|
|
|
19
|
0
|
|
|
|
|
|
my $cv = B::svref_2object($coderef); |
20
|
0
|
0
|
|
|
|
|
return unless $cv->isa("B::CV"); |
21
|
|
|
|
|
|
|
|
22
|
0
|
|
|
|
|
|
my $gv = $cv->GV; |
23
|
0
|
0
|
|
|
|
|
return if $gv->isa("B::SPECIAL"); |
24
|
|
|
|
|
|
|
|
25
|
0
|
|
|
|
|
|
my $subname = $gv->NAME; |
26
|
0
|
|
|
|
|
|
my $packname = $gv->STASH->NAME; |
27
|
|
|
|
|
|
|
|
28
|
0
|
|
|
|
|
|
return $packname . "::" . $subname; |
29
|
|
|
|
|
|
|
} |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
# Shamelessly lifted from Pod::Coverage, which it |
32
|
|
|
|
|
|
|
# modifies as needed. |
33
|
|
|
|
|
|
|
# this one walks the symbol tree |
34
|
|
|
|
|
|
|
sub _get_syms { |
35
|
0
|
|
|
0
|
|
|
my $self = shift; |
36
|
0
|
|
|
|
|
|
my $package = shift; |
37
|
|
|
|
|
|
|
|
38
|
0
|
|
|
|
|
|
print "requiring '$package'\n" if TRACE_ALL; |
39
|
0
|
|
|
|
|
|
eval qq{ require $package }; |
40
|
0
|
0
|
|
|
|
|
if ($@) { |
41
|
0
|
|
|
|
|
|
print "require failed with $@\n" if TRACE_ALL; |
42
|
0
|
|
|
|
|
|
$self->{why_unrated} = "requiring '$package' failed"; |
43
|
0
|
|
|
|
|
|
return; |
44
|
|
|
|
|
|
|
} |
45
|
|
|
|
|
|
|
|
46
|
0
|
|
|
|
|
|
print "walking symbols\n" if TRACE_ALL; |
47
|
0
|
|
|
|
|
|
my $syms = Devel::Symdump->new($package); |
48
|
|
|
|
|
|
|
|
49
|
0
|
|
|
|
|
|
my @symbols; |
50
|
0
|
|
|
|
|
|
for my $sym ( $syms->functions ) { |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
# See if said method wasn't just imported *FROM ELSEWHERE*; --tchrist |
53
|
1
|
|
|
1
|
|
8
|
my $glob = do { no strict 'refs'; \*{$sym} }; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
236
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
54
|
0
|
|
|
|
|
|
my $cv = B::svref_2object($glob); |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
# in 5.005 this flag is not exposed via B, though it exists |
57
|
0
|
|
0
|
|
|
|
my $imported_cv = eval { B::GVf_IMPORTED_CV() } || 0x80; |
58
|
0
|
0
|
|
|
|
|
if ($cv->GvFLAGS & $imported_cv) { |
59
|
|
|
|
|
|
|
# Only count if as absolved via import if its name hasn't changed; --tchrist |
60
|
0
|
|
|
|
|
|
my $was_name = name_of_coderef(*{$glob}{CODE}); |
|
0
|
|
|
|
|
|
|
61
|
0
|
0
|
|
|
|
|
next if join("::", $package, $sym) eq $was_name; |
62
|
0
|
|
|
|
|
|
my $his_pack = $was_name; |
63
|
0
|
|
|
|
|
|
$his_pack =~ s/::[^:]*$//; |
64
|
0
|
0
|
|
|
|
|
next if $package ne $his_pack; |
65
|
|
|
|
|
|
|
} |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
# check if it's on the whitelist |
68
|
0
|
|
|
|
|
|
$sym =~ s/$self->{package}:://; |
69
|
0
|
0
|
|
|
|
|
next if $self->_private_check($sym); |
70
|
|
|
|
|
|
|
|
71
|
0
|
|
|
|
|
|
push @symbols, $sym; |
72
|
|
|
|
|
|
|
} |
73
|
0
|
|
|
|
|
|
return @symbols; |
74
|
|
|
|
|
|
|
} |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
1; |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
__END__ |