← Index
NYTProf Performance Profile   « line view »
For /home/ss5/perl5/perlbrew/perls/perl-5.22.0/bin/benchmarkanything-storage
  Run on Mon Jan 29 16:55:34 2018
Reported on Mon Jan 29 16:57:06 2018

Filename/home/ss5/perl5/perlbrew/perls/perl-5.22.0/lib/site_perl/5.22.0/x86_64-linux/Class/MOP/Mixin/HasOverloads.pm
StatementsExecuted 21 statements in 639µs
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111585µs677µsClass::MOP::Mixin::HasOverloads::::BEGIN@7Class::MOP::Mixin::HasOverloads::BEGIN@7
111448µs1.13msClass::MOP::Mixin::HasOverloads::::BEGIN@9Class::MOP::Mixin::HasOverloads::BEGIN@9
11110µs12µsClass::MOP::Mixin::HasOverloads::::BEGIN@4Class::MOP::Mixin::HasOverloads::BEGIN@4
1117µs49µsClass::MOP::Mixin::HasOverloads::::BEGIN@50Class::MOP::Mixin::HasOverloads::BEGIN@50
1115µs10µsClass::MOP::Mixin::HasOverloads::::BEGIN@5Class::MOP::Mixin::HasOverloads::BEGIN@5
1115µs18µsClass::MOP::Mixin::HasOverloads::::BEGIN@10Class::MOP::Mixin::HasOverloads::BEGIN@10
1114µs20µsClass::MOP::Mixin::HasOverloads::::BEGIN@15Class::MOP::Mixin::HasOverloads::BEGIN@15
1114µs17µsClass::MOP::Mixin::HasOverloads::::BEGIN@11Class::MOP::Mixin::HasOverloads::BEGIN@11
1112µs2µsClass::MOP::Mixin::HasOverloads::::BEGIN@13Class::MOP::Mixin::HasOverloads::BEGIN@13
0000s0sClass::MOP::Mixin::HasOverloads::::_overload_forClass::MOP::Mixin::HasOverloads::_overload_for
0000s0sClass::MOP::Mixin::HasOverloads::::_overload_infoClass::MOP::Mixin::HasOverloads::_overload_info
0000s0sClass::MOP::Mixin::HasOverloads::::add_overloaded_operatorClass::MOP::Mixin::HasOverloads::add_overloaded_operator
0000s0sClass::MOP::Mixin::HasOverloads::::get_all_overloaded_operatorsClass::MOP::Mixin::HasOverloads::get_all_overloaded_operators
0000s0sClass::MOP::Mixin::HasOverloads::::get_overload_fallback_valueClass::MOP::Mixin::HasOverloads::get_overload_fallback_value
0000s0sClass::MOP::Mixin::HasOverloads::::get_overload_listClass::MOP::Mixin::HasOverloads::get_overload_list
0000s0sClass::MOP::Mixin::HasOverloads::::get_overloaded_operatorClass::MOP::Mixin::HasOverloads::get_overloaded_operator
0000s0sClass::MOP::Mixin::HasOverloads::::has_overloaded_operatorClass::MOP::Mixin::HasOverloads::has_overloaded_operator
0000s0sClass::MOP::Mixin::HasOverloads::::is_overloadedClass::MOP::Mixin::HasOverloads::is_overloaded
0000s0sClass::MOP::Mixin::HasOverloads::::remove_overloaded_operatorClass::MOP::Mixin::HasOverloads::remove_overloaded_operator
0000s0sClass::MOP::Mixin::HasOverloads::::set_overload_fallback_valueClass::MOP::Mixin::HasOverloads::set_overload_fallback_value
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Class::MOP::Mixin::HasOverloads;
21300nsour $VERSION = '2.1605';
3
4216µs214µs
# spent 12µs (10+2) within Class::MOP::Mixin::HasOverloads::BEGIN@4 which was called: # once (10µs+2µs) by Class::MOP::BEGIN@17 at line 4
use strict;
# spent 12µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@4 # spent 2µs making 1 call to strict::import
5216µs214µs
# spent 10µs (5+4) within Class::MOP::Mixin::HasOverloads::BEGIN@5 which was called: # once (5µs+4µs) by Class::MOP::BEGIN@17 at line 5
use warnings;
# spent 10µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@5 # spent 4µs making 1 call to warnings::import
6
7276µs1677µs
# spent 677µs (585+92) within Class::MOP::Mixin::HasOverloads::BEGIN@7 which was called: # once (585µs+92µs) by Class::MOP::BEGIN@17 at line 7
use Class::MOP::Overload;
# spent 677µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@7
8
9383µs31.16ms
# spent 1.13ms (448µs+680µs) within Class::MOP::Mixin::HasOverloads::BEGIN@9 which was called: # once (448µs+680µs) by Class::MOP::BEGIN@17 at line 9
use Devel::OverloadInfo 0.004 'overload_info';
# spent 1.13ms making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@9 # spent 22µs making 1 call to Exporter::import # spent 6µs making 1 call to UNIVERSAL::VERSION
10217µs232µs
# spent 18µs (5+13) within Class::MOP::Mixin::HasOverloads::BEGIN@10 which was called: # once (5µs+13µs) by Class::MOP::BEGIN@17 at line 10
use Scalar::Util 'blessed';
# spent 18µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@10 # spent 13µs making 1 call to Exporter::import
11217µs230µs
# spent 17µs (4+13) within Class::MOP::Mixin::HasOverloads::BEGIN@11 which was called: # once (4µs+13µs) by Class::MOP::BEGIN@17 at line 11
use Sub::Identify 'sub_name', 'stash_name';
# spent 17µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@11 # spent 13µs making 1 call to Exporter::import
12
13212µs12µs
# spent 2µs within Class::MOP::Mixin::HasOverloads::BEGIN@13 which was called: # once (2µs+0s) by Class::MOP::BEGIN@17 at line 13
use overload ();
# spent 2µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@13
14
152129µs235µs
# spent 20µs (4+16) within Class::MOP::Mixin::HasOverloads::BEGIN@15 which was called: # once (4µs+16µs) by Class::MOP::BEGIN@17 at line 15
use parent 'Class::MOP::Mixin';
# spent 20µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@15 # spent 16µs making 1 call to parent::import
16
17sub is_overloaded {
18 my $self = shift;
19 Devel::OverloadInfo::is_overloaded($self->name);
20}
21
22sub get_overload_list {
23 my $self = shift;
24
25 my $info = $self->_overload_info;
26 return grep { $_ ne 'fallback' } keys %{$info}
27}
28
29sub get_all_overloaded_operators {
30 my $self = shift;
31 return map { $self->_overload_for($_) } $self->get_overload_list;
32}
33
34sub has_overloaded_operator {
35 my $self = shift;
36 my ($op) = @_;
37 return defined $self->_overload_info->{$op};
38}
39
40sub _overload_map {
41 $_[0]->{_overload_map} ||= {};
42}
43
44sub get_overloaded_operator {
45 my $self = shift;
46 my ($op) = @_;
47 return $self->_overload_map->{$op} ||= $self->_overload_for($op);
48}
49
502270µs291µs
# spent 49µs (7+42) within Class::MOP::Mixin::HasOverloads::BEGIN@50 which was called: # once (7µs+42µs) by Class::MOP::BEGIN@17 at line 50
use constant _SET_FALLBACK_EACH_TIME => $] < 5.120;
# spent 49µs making 1 call to Class::MOP::Mixin::HasOverloads::BEGIN@50 # spent 42µs making 1 call to constant::import
51
52sub add_overloaded_operator {
53 my $self = shift;
54 my ( $op, $overload ) = @_;
55
56 my %p = ( associated_metaclass => $self );
57 if ( !ref $overload ) {
58 %p = (
59 %p,
60 operator => $op,
61 method_name => $overload,
62 associated_metaclass => $self,
63 );
64 $p{method} = $self->get_method($overload)
65 if $self->has_method($overload);
66 $overload = Class::MOP::Overload->new(%p);
67 }
68 elsif ( !blessed $overload) {
69 $overload = Class::MOP::Overload->new(
70 operator => $op,
71 coderef => $overload,
72 coderef_name => sub_name($overload),
73 coderef_package => stash_name($overload),
74 %p,
75 );
76 }
77
78 $overload->attach_to_class($self);
79 $self->_overload_map->{$op} = $overload;
80
81 my %overload = (
82 $op => $overload->has_coderef
83 ? $overload->coderef
84 : $overload->method_name
85 );
86
87 # Perl 5.10 and earlier appear to have a bug where setting a new
88 # overloading operator wipes out the fallback value unless we pass it each
89 # time.
90 if (_SET_FALLBACK_EACH_TIME) {
91 $overload{fallback} = $self->get_overload_fallback_value;
92 }
93
94 $self->name->overload::OVERLOAD(%overload);
95}
96
97sub remove_overloaded_operator {
98 my $self = shift;
99 my ($op) = @_;
100
101 delete $self->_overload_map->{$op};
102
103 # overload.pm provides no api for this - but the problem that makes this
104 # necessary has been fixed in 5.18
105 $self->get_or_add_package_symbol('%OVERLOAD')->{dummy}++
106 if $] < 5.017000;
107
108 $self->remove_package_symbol('&(' . $op);
109}
110
111sub get_overload_fallback_value {
112 my $self = shift;
113 return $self->_overload_info->{fallback}{value};
114}
115
116sub set_overload_fallback_value {
117 my $self = shift;
118 my $value = shift;
119
120 $self->name->overload::OVERLOAD( fallback => $value );
121}
122
123# We could cache this but we'd need some logic to clear it at all the right
124# times, which seems more tedious than it's worth.
125sub _overload_info {
126 my $self = shift;
127 return overload_info( $self->name ) || {};
128}
129
130sub _overload_for {
131 my $self = shift;
132 my $op = shift;
133
134 my $map = $self->_overload_map;
135 return $map->{$op} if $map->{$op};
136
137 my $info = $self->_overload_info->{$op};
138 return unless $info;
139
140 my %p = (
141 operator => $op,
142 associated_metaclass => $self,
143 );
144
145 if ( $info->{code} && !$info->{method_name} ) {
146 $p{coderef} = $info->{code};
147 @p{ 'coderef_package', 'coderef_name' }
148 = $info->{code_name} =~ /(.+)::([^:]+)/;
149 }
150 else {
151 $p{method_name} = $info->{method_name};
152 if ( $self->has_method( $p{method_name} ) ) {
153 $p{method} = $self->get_method( $p{method_name} );
154 }
155 }
156
157 return $map->{$op} = Class::MOP::Overload->new(%p);
158}
159
16013µs1;
161
162# ABSTRACT: Methods for metaclasses which have overloads
163
164__END__