← Index
NYTProf Performance Profile   « line view »
For flows_to_es.pl
  Run on Mon May 9 23:27:59 2016
Reported on Mon May 9 23:28:09 2016

Filename/usr/share/perl5/Class/Method/Modifiers.pm
StatementsExecuted 170 statements in 2.01ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
411427µs688µsClass::Method::Modifiers::::install_modifierClass::Method::Modifiers::install_modifier
621255µs255µsClass::Method::Modifiers::::_sub_attrsClass::Method::Modifiers::_sub_attrs
11113µs26µsClass::Method::Modifiers::::BEGIN@200Class::Method::Modifiers::BEGIN@200
11112µs19µsClass::Method::Modifiers::::BEGIN@151Class::Method::Modifiers::BEGIN@151
11112µs23µsClass::Method::Modifiers::::BEGIN@204Class::Method::Modifiers::BEGIN@204
1119µs19µsClass::Method::Modifiers::::BEGIN@150Class::Method::Modifiers::BEGIN@150
1119µs14µsClass::Method::Modifiers::::BEGIN@11Class::Method::Modifiers::BEGIN@11
1119µs9µsClass::Method::Modifiers::::BEGIN@7Class::Method::Modifiers::BEGIN@7
1119µs22µsClass::Method::Modifiers::::BEGIN@58Class::Method::Modifiers::BEGIN@58
1118µs86µsClass::Method::Modifiers::::BEGIN@14Class::Method::Modifiers::BEGIN@14
1118µs20µsClass::Method::Modifiers::::BEGIN@149Class::Method::Modifiers::BEGIN@149
1118µs21µsClass::Method::Modifiers::::BEGIN@10Class::Method::Modifiers::BEGIN@10
1116µs6µsClass::Method::Modifiers::::BEGIN@23Class::Method::Modifiers::BEGIN@23
0000s0sClass::Method::Modifiers::::_freshClass::Method::Modifiers::_fresh
0000s0sClass::Method::Modifiers::::_is_in_packageClass::Method::Modifiers::_is_in_package
0000s0sClass::Method::Modifiers::::afterClass::Method::Modifiers::after
0000s0sClass::Method::Modifiers::::aroundClass::Method::Modifiers::around
0000s0sClass::Method::Modifiers::::beforeClass::Method::Modifiers::before
0000s0sClass::Method::Modifiers::::freshClass::Method::Modifiers::fresh
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Class::Method::Modifiers;
2{
321µs $Class::Method::Modifiers::VERSION = '2.09';
4}
5# git description: v2.08-4-g82f0517
6
7
# spent 9µs within Class::Method::Modifiers::BEGIN@7 which was called: # once (9µs+0s) by Moo::Role::before at line 9
BEGIN {
816µs $Class::Method::Modifiers::AUTHORITY = 'cpan:SARTAK';
9125µs19µs}
# spent 9µs making 1 call to Class::Method::Modifiers::BEGIN@7
10227µs234µs
# spent 21µs (8+13) within Class::Method::Modifiers::BEGIN@10 which was called: # once (8µs+13µs) by Moo::Role::before at line 10
use strict;
# spent 21µs making 1 call to Class::Method::Modifiers::BEGIN@10 # spent 13µs making 1 call to strict::import
11233µs218µs
# spent 14µs (9+5) within Class::Method::Modifiers::BEGIN@11 which was called: # once (9µs+5µs) by Moo::Role::before at line 11
use warnings;
# spent 14µs making 1 call to Class::Method::Modifiers::BEGIN@11 # spent 5µs making 1 call to warnings::import
12
13# work around https://rt.cpan.org/Ticket/Display.html?id=89173
142118µs2163µs
# spent 86µs (8+77) within Class::Method::Modifiers::BEGIN@14 which was called: # once (8µs+77µs) by Moo::Role::before at line 14
use base ('Exp'.'orter');
# spent 86µs making 1 call to Class::Method::Modifiers::BEGIN@14 # spent 77µs making 1 call to base::import
15
1611µsour @EXPORT = qw(before after around);
1711µsour @EXPORT_OK = (@EXPORT, qw(fresh install_modifier));
1813µsour %EXPORT_TAGS = (
19 moose => [qw(before after around)],
20 all => \@EXPORT_OK,
21);
22
23
# spent 6µs within Class::Method::Modifiers::BEGIN@23 which was called: # once (6µs+0s) by Moo::Role::before at line 25
BEGIN {
24110µs *_HAS_READONLY = $] >= 5.008 ? sub(){1} : sub(){0};
251197µs16µs}
# spent 6µs making 1 call to Class::Method::Modifiers::BEGIN@23
26
271100nsour %MODIFIER_CACHE;
28
29# for backward compatibility
30sub _install_modifier; # -w
3112µs*_install_modifier = \&install_modifier;
32
33
# spent 688µs (427+261) within Class::Method::Modifiers::install_modifier which was called 4 times, avg 172µs/call: # 4 times (427µs+261µs) by Moo::_Utils::_install_modifier at line 36 of Moo/_Utils.pm, avg 172µs/call
sub install_modifier {
3442µs my $into = shift;
354900ns my $type = shift;
3641µs my $code = pop;
3743µs my @names = @_;
38
3942µs @names = @{ $names[0] } if ref($names[0]) eq 'ARRAY';
40
414900ns return _fresh($into, $code, @names) if $type eq 'fresh';
42
43419µs for my $name (@names) {
44417µs46µs my $hit = $into->can($name) or do {
# spent 6µs making 4 calls to UNIVERSAL::can, avg 2µs/call
45 require Carp;
46 Carp::confess("The method '$name' is not found in the inheritance hierarchy for class $into");
47 };
48
4943µs my $qualified = $into.'::'.$name;
50410µs my $cache = $MODIFIER_CACHE{$into}{$name} ||= {
51 before => [],
52 after => [],
53 around => [],
54 };
55
56 # this must be the first modifier we're installing
5742µs if (!exists($cache->{"orig"})) {
582266µs234µs
# spent 22µs (9+13) within Class::Method::Modifiers::BEGIN@58 which was called: # once (9µs+13µs) by Moo::Role::before at line 58
no strict 'refs';
# spent 22µs making 1 call to Class::Method::Modifiers::BEGIN@58 # spent 13µs making 1 call to strict::unimport
59
60 # grab the original method (or undef if the method is inherited)
6146µs $cache->{"orig"} = *{$qualified}{CODE};
62
63 # the "innermost" method, the one that "around" will ultimately wrap
6442µs $cache->{"wrapped"} = $cache->{"orig"} || $hit; #sub {
65 # # we can't cache this, because new methods or modifiers may be
66 # # added between now and when this method is called
67 # for my $package (@{ mro::get_linear_isa($into) }) {
68 # next if $package eq $into;
69 # my $code = *{$package.'::'.$name}{CODE};
70 # goto $code if $code;
71 # }
72 # require Carp;
73 # Carp::confess("$qualified\::$name disappeared?");
74 #};
75 }
76
77 # keep these lists in the order the modifiers are called
7841µs if ($type eq 'after') {
79 push @{ $cache->{$type} }, $code;
80 }
81 else {
8243µs unshift @{ $cache->{$type} }, $code;
83 }
84
85 # wrap the method with another layer of around. much simpler than
86 # the Moose equivalent. :)
8742µs if ($type eq 'around') {
882500ns my $method = $cache->{wrapped};
8927µs290µs my $attrs = _sub_attrs($code);
# spent 90µs making 2 calls to Class::Method::Modifiers::_sub_attrs, avg 45µs/call
90 # a bare "sub :lvalue {...}" will be parsed as a label and an
91 # indirect method call. force it to be treated as an expression
92 # using +
93288µs $cache->{wrapped} = eval "package $into; +sub $attrs { \$code->(\$method, \@_); };";
# spent 21µs executing statements in string eval
# includes 18µs spent executing 2 calls to 1 sub defined therein. # spent 8µs executing statements in string eval
# includes 5µs spent executing 1 call to 1 sub defined therein.
94 }
95
96 # install our new method which dispatches the modifiers, but only
97 # if a new type was added
9849µs if (@{ $cache->{$type} } == 1) {
99
100 # avoid these hash lookups every method invocation
10141µs my $before = $cache->{"before"};
1024900ns my $after = $cache->{"after"};
103
104 # this is a coderef that changes every new "around". so we need
105 # to take a reference to it. better a deref than a hash lookup
10641µs my $wrapped = \$cache->{"wrapped"};
107
108416µs4165µs my $attrs = _sub_attrs($cache->{wrapped});
# spent 165µs making 4 calls to Class::Method::Modifiers::_sub_attrs, avg 41µs/call
109
11044µs my $generated = "package $into;\n";
11143µs $generated .= "sub $name $attrs {";
112
113 # before is easy, it doesn't affect the return value(s)
11442µs if (@$before) {
115 $generated .= '
116 for my $method (@$before) {
117 $method->(@_);
118 }
119 ';
120 }
121
12241µs if (@$after) {
123 $generated .= '
124 my $ret;
125 if (wantarray) {
126 $ret = [$$wrapped->(@_)];
127 '.(_HAS_READONLY ? 'Internals::SvREADONLY(@$ret, 1);' : '').'
128 }
129 elsif (defined wantarray) {
130 $ret = \($$wrapped->(@_));
131 }
132 else {
133 $$wrapped->(@_);
134 }
135
136 for my $method (@$after) {
137 $method->(@_);
138 }
139
140 wantarray ? @$ret : $ret ? $$ret : ();
141 '
142 }
143 else {
14441µs $generated .= '$$wrapped->(@_);';
145 }
146
1474500ns $generated .= '}';
148
149230µs232µs
# spent 20µs (8+12) within Class::Method::Modifiers::BEGIN@149 which was called: # once (8µs+12µs) by Moo::Role::before at line 149
no strict 'refs';
# spent 20µs making 1 call to Class::Method::Modifiers::BEGIN@149 # spent 12µs making 1 call to strict::unimport
150230µs230µs
# spent 19µs (9+11) within Class::Method::Modifiers::BEGIN@150 which was called: # once (9µs+11µs) by Moo::Role::before at line 150
no warnings 'redefine';
# spent 19µs making 1 call to Class::Method::Modifiers::BEGIN@150 # spent 11µs making 1 call to warnings::unimport
1512323µs226µs
# spent 19µs (12+7) within Class::Method::Modifiers::BEGIN@151 which was called: # once (12µs+7µs) by Moo::Role::before at line 151
no warnings 'closure';
# spent 19µs making 1 call to Class::Method::Modifiers::BEGIN@151 # spent 7µs making 1 call to warnings::unimport
1524205µs eval $generated;
# spent 21µs executing statements in string eval
# includes 104µs spent executing 4 calls to 1 sub defined therein. # spent 18µs executing statements in string eval
# includes 29µs spent executing 2 calls to 1 sub defined therein. # spent 12µs executing statements in string eval
# includes 16µs spent executing 2 calls to 1 sub defined therein. # spent 4µs executing statements in string eval
# includes 4µs spent executing 1 call to 1 sub defined therein.
153 };
154 }
155}
156
157sub before {
158 _install_modifier(scalar(caller), 'before', @_);
159}
160
161sub after {
162 _install_modifier(scalar(caller), 'after', @_);
163}
164
165sub around {
166 _install_modifier(scalar(caller), 'around', @_);
167}
168
169sub fresh {
170 my $code = pop;
171 my @names = @_;
172
173 @names = @{ $names[0] } if ref($names[0]) eq 'ARRAY';
174
175 _fresh(scalar(caller), $code, @names);
176}
177
178sub _fresh {
179 my ($into, $code, @names) = @_;
180
181 for my $name (@names) {
182 if ($name !~ /\A [a-zA-Z_] [a-zA-Z0-9_]* \z/xms) {
183 require Carp;
184 Carp::confess("Invalid method name '$name'");
185 }
186 if ($into->can($name)) {
187 require Carp;
188 Carp::confess("Class $into already has a method named '$name'");
189 }
190
191 # We need to make sure that the installed method has its CvNAME in
192 # the appropriate package; otherwise, it would be subject to
193 # deletion if callers use namespace::autoclean. If $code was
194 # compiled in the target package, we can just install it directly;
195 # otherwise, we'll need a different approach. Using Sub::Name would
196 # be fine in all cases, at the cost of introducing a dependency on
197 # an XS-using, non-core module. So instead we'll use string-eval to
198 # create a new subroutine that wraps $code.
199 if (_is_in_package($code, $into)) {
200250µs238µs
# spent 26µs (13+13) within Class::Method::Modifiers::BEGIN@200 which was called: # once (13µs+13µs) by Moo::Role::before at line 200
no strict 'refs';
# spent 26µs making 1 call to Class::Method::Modifiers::BEGIN@200 # spent 13µs making 1 call to strict::unimport
201 *{"$into\::$name"} = $code;
202 }
203 else {
2042184µs233µs
# spent 23µs (12+11) within Class::Method::Modifiers::BEGIN@204 which was called: # once (12µs+11µs) by Moo::Role::before at line 204
no warnings 'closure'; # for 5.8.x
# spent 23µs making 1 call to Class::Method::Modifiers::BEGIN@204 # spent 11µs making 1 call to warnings::unimport
205 my $attrs = _sub_attrs($code);
206 eval "package $into; sub $name $attrs { \$code->(\@_) }";
207 }
208 }
209}
210
211
# spent 255µs within Class::Method::Modifiers::_sub_attrs which was called 6 times, avg 42µs/call: # 4 times (165µs+0s) by Class::Method::Modifiers::install_modifier at line 108, avg 41µs/call # 2 times (90µs+0s) by Class::Method::Modifiers::install_modifier at line 89, avg 45µs/call
sub _sub_attrs {
21262µs my ($coderef) = @_;
21364µs local *_sub = $coderef;
21461µs local $@;
2156268µs (eval 'sub { _sub = 1 }') ? ':lvalue' : '';
216}
217
218sub _is_in_package {
219 my ($coderef, $package) = @_;
220 require B;
221 my $cv = B::svref_2object($coderef);
222 return $cv->GV->STASH->NAME eq $package;
223}
224
22517µs1;
226
227__END__