Filename | /usr/share/perl5/Moo/_Utils.pm |
Statements | Executed 3338 statements in 12.4ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
547 | 2 | 2 | 3.02ms | 8.50ms | _install_coderef | Moo::_Utils::
584 | 7 | 3 | 1.87ms | 1.87ms | _getglob | Moo::_Utils::
547 | 1 | 1 | 1.58ms | 3.68ms | _name_coderef | Moo::_Utils::
1 | 1 | 1 | 950µs | 1.23ms | BEGIN@14 | Moo::_Utils::
1 | 1 | 1 | 297µs | 427µs | BEGIN@16 | Moo::_Utils::
1 | 1 | 1 | 44µs | 76µs | BEGIN@15 | Moo::_Utils::
1 | 1 | 1 | 40µs | 88µs | BEGIN@12 | Moo::_Utils::
1 | 1 | 1 | 28µs | 61µs | BEGIN@82 | Moo::_Utils::
1 | 1 | 1 | 24µs | 87µs | _maybe_load_module | Moo::_Utils::
1 | 1 | 1 | 22µs | 44µs | BEGIN@3 | Moo::_Utils::
1 | 1 | 1 | 22µs | 115µs | BEGIN@11 | Moo::_Utils::
1 | 1 | 1 | 21µs | 39µs | BEGIN@112 | Moo::_Utils::
1 | 1 | 1 | 18µs | 76µs | BEGIN@8 | Moo::_Utils::
1 | 1 | 1 | 17µs | 39µs | BEGIN@17 | Moo::_Utils::
1 | 1 | 1 | 14µs | 40µs | BEGIN@9 | Moo::_Utils::
1 | 1 | 1 | 13µs | 24µs | BEGIN@89 | Moo::_Utils::
2 | 1 | 1 | 11µs | 43µs | _set_loaded | Moo::_Utils::
2 | 1 | 1 | 4µs | 4µs | _getstash | Moo::_Utils::
0 | 0 | 0 | 0s | 0s | _get_linear_isa | Moo::_Utils::
0 | 0 | 0 | 0s | 0s | _install_modifier | Moo::_Utils::
0 | 0 | 0 | 0s | 0s | _load_module | Moo::_Utils::
0 | 0 | 0 | 0s | 0s | _unimport_coderefs | Moo::_Utils::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Moo::_Utils; | ||||
2 | |||||
3 | 2 | 191µs | 2 | 65µs | # spent 44µs (22+21) within Moo::_Utils::BEGIN@3 which was called:
# once (22µs+21µs) by Sub::Defer::BEGIN@5 at line 3 # spent 44µs making 1 call to Moo::_Utils::BEGIN@3
# spent 21µs making 1 call to warnings::unimport |
4 | |||||
5 | 584 | 2.42ms | # spent 1.87ms within Moo::_Utils::_getglob which was called 584 times, avg 3µs/call:
# 547 times (1.80ms+0s) by Moo::_Utils::_install_coderef at line 81, avg 3µs/call
# 14 times (30µs+0s) by Sub::Defer::undefer_sub at line 25 of Sub/Defer.pm, avg 2µs/call
# 14 times (13µs+0s) by Sub::Defer::undefer_sub at line 30 of Sub/Defer.pm, avg 921ns/call
# 6 times (20µs+0s) by Method::Generate::Accessor::generate_method at line 109 of Method/Generate/Accessor.pm, avg 3µs/call
# once (5µs+0s) by Method::Generate::Accessor::generate_method at line 126 of Method/Generate/Accessor.pm
# once (3µs+0s) by Method::Generate::Accessor::generate_method at line 146 of Method/Generate/Accessor.pm
# once (2µs+0s) by Method::Generate::Accessor::generate_method at line 182 of Method/Generate/Accessor.pm | ||
6 | 2 | 7µs | # spent 4µs within Moo::_Utils::_getstash which was called 2 times, avg 2µs/call:
# 2 times (4µs+0s) by Moo::import at line 68 of Moo.pm, avg 2µs/call | ||
7 | |||||
8 | 2 | 119µs | 2 | 134µs | # spent 76µs (18+58) within Moo::_Utils::BEGIN@8 which was called:
# once (18µs+58µs) by Sub::Defer::BEGIN@5 at line 8 # spent 76µs making 1 call to Moo::_Utils::BEGIN@8
# spent 58µs making 1 call to constant::import |
9 | 3 | 80µs | 2 | 65µs | # spent 40µs (14+26) within Moo::_Utils::BEGIN@9 which was called:
# once (14µs+26µs) by Sub::Defer::BEGIN@5 at line 9 # spent 40µs making 1 call to Moo::_Utils::BEGIN@9
# spent 26µs making 1 call to constant::import |
10 | |||||
11 | 3 | 68µs | 3 | 208µs | # spent 115µs (22+93) within Moo::_Utils::BEGIN@11 which was called:
# once (22µs+93µs) by Sub::Defer::BEGIN@5 at line 11 # spent 115µs making 1 call to Moo::_Utils::BEGIN@11
# spent 60µs making 1 call to strictures::import
# spent 34µs making 1 call to strictures::VERSION |
12 | 2 | 125µs | 2 | 137µs | # spent 88µs (40+48) within Moo::_Utils::BEGIN@12 which was called:
# once (40µs+48µs) by Sub::Defer::BEGIN@5 at line 12 # spent 88µs making 1 call to Moo::_Utils::BEGIN@12
# spent 48µs making 1 call to Module::Runtime::import |
13 | |||||
14 | 2 | 470µs | 1 | 1.23ms | # spent 1.23ms (950µs+278µs) within Moo::_Utils::BEGIN@14 which was called:
# once (950µs+278µs) by Sub::Defer::BEGIN@5 at line 14 # spent 1.23ms making 1 call to Moo::_Utils::BEGIN@14 |
15 | 2 | 104µs | 2 | 109µs | # spent 76µs (44+33) within Moo::_Utils::BEGIN@15 which was called:
# once (44µs+33µs) by Sub::Defer::BEGIN@5 at line 15 # spent 76µs making 1 call to Moo::_Utils::BEGIN@15
# spent 33µs making 1 call to Exporter::import |
16 | 2 | 282µs | 1 | 427µs | # spent 427µs (297+130) within Moo::_Utils::BEGIN@16 which was called:
# once (297µs+130µs) by Sub::Defer::BEGIN@5 at line 16 # spent 427µs making 1 call to Moo::_Utils::BEGIN@16 |
17 | 2 | 919µs | 2 | 60µs | # spent 39µs (17+22) within Moo::_Utils::BEGIN@17 which was called:
# once (17µs+22µs) by Sub::Defer::BEGIN@5 at line 17 # spent 39µs making 1 call to Moo::_Utils::BEGIN@17
# spent 22µs making 1 call to Config::import |
18 | |||||
19 | 1 | 5µs | our @EXPORT = qw( | ||
20 | _getglob _install_modifier _load_module _maybe_load_module | ||||
21 | _get_linear_isa _getstash _install_coderef _name_coderef | ||||
22 | _unimport_coderefs _in_global_destruction _set_loaded | ||||
23 | ); | ||||
24 | |||||
25 | sub _in_global_destruction (); | ||||
26 | 1 | 9µs | *_in_global_destruction = \&Devel::GlobalDestruction::in_global_destruction; | ||
27 | |||||
28 | sub _install_modifier { | ||||
29 | my ($into, $type, $name, $code) = @_; | ||||
30 | |||||
31 | if (my $to_modify = $into->can($name)) { # CMM will throw for us if not | ||||
32 | require Sub::Defer; | ||||
33 | Sub::Defer::undefer_sub($to_modify); | ||||
34 | } | ||||
35 | |||||
36 | Class::Method::Modifiers::install_modifier(@_); | ||||
37 | } | ||||
38 | |||||
39 | 1 | 500ns | our %MAYBE_LOADED; | ||
40 | |||||
41 | sub _load_module { | ||||
42 | my $module = $_[0]; | ||||
43 | my $file = module_notional_filename($module); | ||||
44 | use_package_optimistically($module); | ||||
45 | return 1 | ||||
46 | if $INC{$file}; | ||||
47 | my $error = $@ || "Can't locate $file"; | ||||
48 | |||||
49 | # can't just ->can('can') because a sub-package Foo::Bar::Baz | ||||
50 | # creates a 'Baz::' key in Foo::Bar's symbol table | ||||
51 | my $stash = _getstash($module)||{}; | ||||
52 | return 1 if grep +(!ref($_) and *$_{CODE}), values %$stash; | ||||
53 | return 1 | ||||
54 | if $INC{"Moose.pm"} && Class::MOP::class_of($module) | ||||
55 | or Mouse::Util->can('find_meta') && Mouse::Util::find_meta($module); | ||||
56 | die $error; | ||||
57 | } | ||||
58 | |||||
59 | # spent 87µs (24+62) within Moo::_Utils::_maybe_load_module which was called:
# once (24µs+62µs) by Method::Generate::Accessor::BEGIN@11 at line 17 of Method/Generate/Accessor.pm | ||||
60 | 1 | 1µs | my $module = $_[0]; | ||
61 | 1 | 900ns | return $MAYBE_LOADED{$module} | ||
62 | if exists $MAYBE_LOADED{$module}; | ||||
63 | 2 | 88µs | 2 | 62µs | if(! eval { use_package_optimistically($module) }) { # spent 51µs making 1 call to Module::Runtime::use_package_optimistically
# spent 11µs making 1 call to Module::Runtime::module_notional_filename |
64 | warn "$module exists but failed to load with error: $@"; | ||||
65 | } | ||||
66 | elsif ( $INC{module_notional_filename($module)} ) { | ||||
67 | return $MAYBE_LOADED{$module} = 1; | ||||
68 | } | ||||
69 | return $MAYBE_LOADED{$module} = 0; | ||||
70 | } | ||||
71 | |||||
72 | # spent 43µs (11+32) within Moo::_Utils::_set_loaded which was called 2 times, avg 22µs/call:
# 2 times (11µs+32µs) by Moo::import at line 23 of Moo.pm, avg 22µs/call | ||||
73 | 2 | 45µs | 2 | 32µs | $INC{Module::Runtime::module_notional_filename($_[0])} ||= $_[1]; # spent 32µs making 2 calls to Module::Runtime::module_notional_filename, avg 16µs/call |
74 | } | ||||
75 | |||||
76 | sub _get_linear_isa { | ||||
77 | return mro::get_linear_isa($_[0]); | ||||
78 | } | ||||
79 | |||||
80 | # spent 8.50ms (3.02+5.48) within Moo::_Utils::_install_coderef which was called 547 times, avg 16µs/call:
# 535 times (2.96ms+5.38ms) by Sub::Defer::defer_sub at line 61 of Sub/Defer.pm, avg 16µs/call
# 12 times (61µs+96µs) by Moo::_install_tracked at line 17 of Moo.pm, avg 13µs/call | ||||
81 | 547 | 1.26ms | 1094 | 5.48ms | my ($glob, $code) = (_getglob($_[0]), _name_coderef(@_)); # spent 3.68ms making 547 calls to Moo::_Utils::_name_coderef, avg 7µs/call
# spent 1.80ms making 547 calls to Moo::_Utils::_getglob, avg 3µs/call |
82 | 2 | 124µs | 2 | 94µs | # spent 61µs (28+33) within Moo::_Utils::BEGIN@82 which was called:
# once (28µs+33µs) by Sub::Defer::BEGIN@5 at line 82 # spent 61µs making 1 call to Moo::_Utils::BEGIN@82
# spent 33µs making 1 call to warnings::unimport |
83 | 547 | 1.06ms | if (*{$glob}{CODE}) { | ||
84 | *{$glob} = $code; | ||||
85 | } | ||||
86 | # perl will sometimes warn about mismatched prototypes coming from the | ||||
87 | # inheritance cache, so disable them if we aren't redefining a sub | ||||
88 | else { | ||||
89 | 2 | 350µs | 2 | 34µs | # spent 24µs (13+11) within Moo::_Utils::BEGIN@89 which was called:
# once (13µs+11µs) by Sub::Defer::BEGIN@5 at line 89 # spent 24µs making 1 call to Moo::_Utils::BEGIN@89
# spent 11µs making 1 call to warnings::unimport |
90 | 527 | 282µs | *{$glob} = $code; | ||
91 | } | ||||
92 | } | ||||
93 | |||||
94 | # spent 3.68ms (1.58+2.10) within Moo::_Utils::_name_coderef which was called 547 times, avg 7µs/call:
# 547 times (1.58ms+2.10ms) by Moo::_Utils::_install_coderef at line 81, avg 7µs/call | ||||
95 | 547 | 168µs | shift if @_ > 2; # three args is (target, name, sub) | ||
96 | 547 | 3.71ms | 547 | 2.10ms | can_haz_subname ? Sub::Name::subname(@_) : $_[1]; # spent 2.10ms making 547 calls to Sub::Name::subname, avg 4µs/call |
97 | } | ||||
98 | |||||
99 | sub _unimport_coderefs { | ||||
100 | my ($target, $info) = @_; | ||||
101 | return unless $info and my $exports = $info->{exports}; | ||||
102 | my %rev = reverse %$exports; | ||||
103 | my $stash = _getstash($target); | ||||
104 | foreach my $name (keys %$exports) { | ||||
105 | if ($stash->{$name} and defined(&{$stash->{$name}})) { | ||||
106 | if ($rev{$target->can($name)}) { | ||||
107 | my $old = delete $stash->{$name}; | ||||
108 | my $full_name = join('::',$target,$name); | ||||
109 | # Copy everything except the code slot back into place (e.g. $has) | ||||
110 | foreach my $type (qw(SCALAR HASH ARRAY IO)) { | ||||
111 | next unless defined(*{$old}{$type}); | ||||
112 | 2 | 211µs | 2 | 57µs | # spent 39µs (21+18) within Moo::_Utils::BEGIN@112 which was called:
# once (21µs+18µs) by Sub::Defer::BEGIN@5 at line 112 # spent 39µs making 1 call to Moo::_Utils::BEGIN@112
# spent 18µs making 1 call to strict::unimport |
113 | *$full_name = *{$old}{$type}; | ||||
114 | } | ||||
115 | } | ||||
116 | } | ||||
117 | } | ||||
118 | } | ||||
119 | |||||
120 | 1 | 288µs | 1 | 9µs | if ($Config{useithreads}) { # spent 9µs making 1 call to Config::FETCH |
121 | require Moo::HandleMoose::_TypeMap; | ||||
122 | } | ||||
123 | |||||
124 | 1 | 11µs | 1; |