Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Module/Implementation.pm |
Statements | Executed 141 statements in 1.75ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 1.42ms | 1.60ms | BEGIN@9 | Module::Implementation::
2 | 1 | 1 | 42µs | 50µs | _copy_symbols | Module::Implementation::
2 | 1 | 1 | 37µs | 12.5ms | _load_implementation | Module::Implementation::
2 | 1 | 1 | 23µs | 29µs | _build_loader | Module::Implementation::
1 | 1 | 1 | 19µs | 21µs | BEGIN@5 | Module::Implementation::
2 | 2 | 2 | 19µs | 12.6ms | __ANON__[:52] | Module::Implementation::
2 | 1 | 1 | 15µs | 12.4ms | try {...} | Module::Implementation::
14 | 2 | 1 | 14µs | 14µs | CORE:subst (opcode) | Module::Implementation::
1 | 1 | 1 | 13µs | 31µs | BEGIN@8 | Module::Implementation::
2 | 2 | 2 | 8µs | 37µs | build_loader_sub | Module::Implementation::
1 | 1 | 1 | 8µs | 14µs | BEGIN@128 | Module::Implementation::
1 | 1 | 1 | 7µs | 26µs | BEGIN@129 | Module::Implementation::
1 | 1 | 1 | 3µs | 54µs | BEGIN@6 | Module::Implementation::
1 | 1 | 1 | 2µs | 2µs | implementation_for | Module::Implementation::
0 | 0 | 0 | 0s | 0s | __ANON__[:78] | Module::Implementation::
0 | 0 | 0 | 0s | 0s | __ANON__[:82] | Module::Implementation::
0 | 0 | 0 | 0s | 0s | __ANON__[:95] | Module::Implementation::
0 | 0 | 0 | 0s | 0s | __ANON__[:98] | Module::Implementation::
0 | 0 | 0 | 0s | 0s | catch {...} | Module::Implementation::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Module::Implementation; | ||||
2 | # git description: v0.08-2-gd599347 | ||||
3 | 1 | 1µs | $Module::Implementation::VERSION = '0.09'; | ||
4 | |||||
5 | 2 | 25µs | 2 | 23µs | # spent 21µs (19+2) within Module::Implementation::BEGIN@5 which was called:
# once (19µs+2µs) by B::Hooks::EndOfScope::BEGIN@13 at line 5 # spent 21µs making 1 call to Module::Implementation::BEGIN@5
# spent 2µs making 1 call to strict::import |
6 | 2 | 16µs | 2 | 105µs | # spent 54µs (3+51) within Module::Implementation::BEGIN@6 which was called:
# once (3µs+51µs) by B::Hooks::EndOfScope::BEGIN@13 at line 6 # spent 54µs making 1 call to Module::Implementation::BEGIN@6
# spent 51µs making 1 call to warnings::import |
7 | |||||
8 | 3 | 30µs | 3 | 49µs | # spent 31µs (13+18) within Module::Implementation::BEGIN@8 which was called:
# once (13µs+18µs) by B::Hooks::EndOfScope::BEGIN@13 at line 8 # spent 31µs making 1 call to Module::Implementation::BEGIN@8
# spent 10µs making 1 call to Module::Runtime::import
# spent 8µs making 1 call to UNIVERSAL::VERSION |
9 | 2 | 1.34ms | 2 | 1.62ms | # spent 1.60ms (1.42+177µs) within Module::Implementation::BEGIN@9 which was called:
# once (1.42ms+177µs) by B::Hooks::EndOfScope::BEGIN@13 at line 9 # spent 1.60ms making 1 call to Module::Implementation::BEGIN@9
# spent 23µs making 1 call to Exporter::import |
10 | |||||
11 | # This is needed for the benefit of Test::CleanNamespaces, which in turn loads | ||||
12 | # Package::Stash, which in turn loads this module and expects a minimum | ||||
13 | # version. | ||||
14 | 1 | 1µs | unless ( exists $Module::Implementation::{VERSION} | ||
15 | && ${ $Module::Implementation::{VERSION} } ) { | ||||
16 | |||||
17 | $Module::Implementation::{VERSION} = \42; | ||||
18 | } | ||||
19 | |||||
20 | 1 | 1µs | my %Implementation; | ||
21 | |||||
22 | # spent 37µs (8+29) within Module::Implementation::build_loader_sub which was called 2 times, avg 19µs/call:
# once (5µs+14µs) by B::Hooks::EndOfScope::BEGIN@12 at line 14 of B/Hooks/EndOfScope.pm
# once (3µs+15µs) by Package::Stash::BEGIN@12 at line 16 of Package/Stash.pm | ||||
23 | 2 | 2µs | my $caller = caller(); | ||
24 | |||||
25 | 2 | 7µs | 2 | 29µs | return _build_loader( $caller, @_ ); # spent 29µs making 2 calls to Module::Implementation::_build_loader, avg 14µs/call |
26 | } | ||||
27 | |||||
28 | # spent 29µs (23+6) within Module::Implementation::_build_loader which was called 2 times, avg 14µs/call:
# 2 times (23µs+6µs) by Module::Implementation::build_loader_sub at line 25, avg 14µs/call | ||||
29 | 2 | 1µs | my $package = shift; | ||
30 | 2 | 2µs | my %args = @_; | ||
31 | |||||
32 | 2 | 2µs | my @implementations = @{ $args{implementations} }; | ||
33 | 2 | 3µs | my @symbols = @{ $args{symbols} || [] }; | ||
34 | |||||
35 | 2 | 0s | my $implementation; | ||
36 | 2 | 2µs | my $env_var = uc $package; | ||
37 | 2 | 10µs | 2 | 6µs | $env_var =~ s/::/_/g; # spent 6µs making 2 calls to Module::Implementation::CORE:subst, avg 3µs/call |
38 | 2 | 2µs | $env_var .= '_IMPLEMENTATION'; | ||
39 | |||||
40 | # spent 12.6ms (19µs+12.6) within Module::Implementation::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Module/Implementation.pm:52] which was called 2 times, avg 6.30ms/call:
# once (10µs+8.21ms) by B::Hooks::EndOfScope::BEGIN@12 at line 14 of B/Hooks/EndOfScope.pm
# once (9µs+4.36ms) by Package::Stash::BEGIN@12 at line 16 of Package/Stash.pm | ||||
41 | my ( $implementation, $loaded ) = _load_implementation( | ||||
42 | $package, | ||||
43 | 2 | 7µs | 2 | 12.5ms | $ENV{$env_var}, # spent 12.5ms making 2 calls to Module::Implementation::_load_implementation, avg 6.26ms/call |
44 | \@implementations, | ||||
45 | ); | ||||
46 | |||||
47 | 2 | 3µs | $Implementation{$package} = $implementation; | ||
48 | |||||
49 | 2 | 3µs | 2 | 50µs | _copy_symbols( $loaded, $package, \@symbols ); # spent 50µs making 2 calls to Module::Implementation::_copy_symbols, avg 25µs/call |
50 | |||||
51 | 2 | 5µs | return $loaded; | ||
52 | 2 | 8µs | }; | ||
53 | } | ||||
54 | |||||
55 | # spent 2µs within Module::Implementation::implementation_for which was called:
# once (2µs+0s) by Package::Stash::BEGIN@12 at line 32 of Package/Stash.pm | ||||
56 | 1 | 1µs | my $package = shift; | ||
57 | |||||
58 | 1 | 2µs | return $Implementation{$package}; | ||
59 | } | ||||
60 | |||||
61 | # spent 12.5ms (37µs+12.5) within Module::Implementation::_load_implementation which was called 2 times, avg 6.26ms/call:
# 2 times (37µs+12.5ms) by Module::Implementation::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Module/Implementation.pm:52] at line 43, avg 6.26ms/call | ||||
62 | 2 | 1µs | my $package = shift; | ||
63 | 2 | 2µs | my $env_value = shift; | ||
64 | 2 | 0s | my $implementations = shift; | ||
65 | |||||
66 | 2 | 0s | if ($env_value) { | ||
67 | die "$env_value is not a valid implementation for $package" | ||||
68 | unless grep { $_ eq $env_value } @{$implementations}; | ||||
69 | |||||
70 | my $requested = "${package}::$env_value"; | ||||
71 | |||||
72 | # Values from the %ENV hash are tainted. We know it's safe to untaint | ||||
73 | # this value because the value was one of our known implementations. | ||||
74 | ($requested) = $requested =~ /^(.+)$/; | ||||
75 | |||||
76 | try { | ||||
77 | require_module($requested); | ||||
78 | } | ||||
79 | catch { | ||||
80 | require Carp; | ||||
81 | Carp::croak("Could not load $requested: $_"); | ||||
82 | }; | ||||
83 | |||||
84 | return ( $env_value, $requested ); | ||||
85 | } | ||||
86 | else { | ||||
87 | 2 | 0s | my $err; | ||
88 | 2 | 1µs | for my $possible ( @{$implementations} ) { | ||
89 | 2 | 2µs | my $try = "${package}::$possible"; | ||
90 | |||||
91 | 2 | 0s | my $ok; | ||
92 | # spent 12.4ms (15µs+12.4) within Module::Implementation::try {...} which was called 2 times, avg 6.21ms/call:
# 2 times (15µs+12.4ms) by Try::Tiny::try at line 102 of Try/Tiny.pm, avg 6.21ms/call | ||||
93 | 2 | 5µs | 2 | 12.4ms | require_module($try); # spent 12.4ms making 2 calls to Module::Runtime::require_module, avg 6.20ms/call |
94 | 2 | 5µs | $ok = 1; | ||
95 | } | ||||
96 | catch { | ||||
97 | $err .= $_ if defined $_; | ||||
98 | 2 | 21µs | 4 | 12.5ms | }; # spent 12.5ms making 2 calls to Try::Tiny::try, avg 6.23ms/call
# spent 23µs making 2 calls to Try::Tiny::catch, avg 12µs/call |
99 | |||||
100 | 2 | 8µs | return ( $possible, $try ) if $ok; | ||
101 | } | ||||
102 | |||||
103 | require Carp; | ||||
104 | if ( defined $err && length $err ) { | ||||
105 | Carp::croak( | ||||
106 | "Could not find a suitable $package implementation: $err"); | ||||
107 | } | ||||
108 | else { | ||||
109 | Carp::croak( | ||||
110 | 'Module::Runtime failed to load a module but did not throw a real error. This should never happen. Something is very broken' | ||||
111 | ); | ||||
112 | } | ||||
113 | } | ||||
114 | } | ||||
115 | |||||
116 | # spent 50µs (42+8) within Module::Implementation::_copy_symbols which was called 2 times, avg 25µs/call:
# 2 times (42µs+8µs) by Module::Implementation::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Module/Implementation.pm:52] at line 49, avg 25µs/call | ||||
117 | 2 | 2µs | my $from_package = shift; | ||
118 | 2 | 0s | my $to_package = shift; | ||
119 | 2 | 1µs | my $symbols = shift; | ||
120 | |||||
121 | 2 | 6µs | for my $sym ( @{$symbols} ) { | ||
122 | 12 | 17µs | 12 | 8µs | my $type = $sym =~ s/^([\$\@\%\&\*])// ? $1 : '&'; # spent 8µs making 12 calls to Module::Implementation::CORE:subst, avg 667ns/call |
123 | |||||
124 | 12 | 1µs | my $from = "${from_package}::$sym"; | ||
125 | 12 | 2µs | my $to = "${to_package}::$sym"; | ||
126 | |||||
127 | { | ||||
128 | 14 | 33µs | 2 | 20µs | # spent 14µs (8+6) within Module::Implementation::BEGIN@128 which was called:
# once (8µs+6µs) by B::Hooks::EndOfScope::BEGIN@13 at line 128 # spent 14µs making 1 call to Module::Implementation::BEGIN@128
# spent 6µs making 1 call to strict::unimport |
129 | 2 | 145µs | 2 | 45µs | # spent 26µs (7+19) within Module::Implementation::BEGIN@129 which was called:
# once (7µs+19µs) by B::Hooks::EndOfScope::BEGIN@13 at line 129 # spent 26µs making 1 call to Module::Implementation::BEGIN@129
# spent 19µs making 1 call to warnings::unimport |
130 | |||||
131 | # Copied from Exporter | ||||
132 | *{$to} | ||||
133 | = $type eq '&' ? \&{$from} | ||||
134 | : $type eq '$' ? \${$from} | ||||
135 | : $type eq '@' ? \@{$from} | ||||
136 | : $type eq '%' ? \%{$from} | ||||
137 | 12 | 20µs | : $type eq '*' ? *{$from} | ||
138 | : die | ||||
139 | "Can't copy symbol from $from_package to $to_package: $type$sym"; | ||||
140 | } | ||||
141 | } | ||||
142 | } | ||||
143 | |||||
144 | 1 | 7µs | 1; | ||
145 | |||||
146 | # ABSTRACT: Loads one of several alternate underlying implementations for a module | ||||
147 | |||||
148 | __END__ | ||||
sub Module::Implementation::CORE:subst; # opcode |