← Index
NYTProf Performance Profile   « line view »
For ../prof.pl
  Run on Wed Dec 14 16:10:05 2022
Reported on Wed Dec 14 16:12:58 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Class.pm
StatementsExecuted 791 statements in 2.95ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1111.00ms1.08msType::Tiny::Class::::BEGIN@19Type::Tiny::Class::BEGIN@19
8411241µs583µsType::Tiny::Class::::parentType::Tiny::Class::parent
5811206µs206µsType::Tiny::Class::::__ANON__[:89]Type::Tiny::Class::__ANON__[:89]
1022166µs732µsType::Tiny::Class::::newType::Tiny::Class::new
5811137µs197µsType::Tiny::Class::::inlinedType::Tiny::Class::inlined
51197µs284µsType::Tiny::Class::::_build_parentType::Tiny::Class::_build_parent
1613171µs71µsType::Tiny::Class::::_is_null_constraintType::Tiny::Class::_is_null_constraint
961156µs56µsType::Tiny::Class::::has_inlinedType::Tiny::Class::has_inlined
71154µs60µsType::Tiny::Class::::_build_inlinedType::Tiny::Class::_build_inlined
11134µs34µsType::Tiny::Class::::BEGIN@3Type::Tiny::Class::BEGIN@3
11115µs22µsType::Tiny::Class::::BEGIN@18Type::Tiny::Class::BEGIN@18
122112µs12µsType::Tiny::Class::::classType::Tiny::Class::class
11110µs13µsType::Tiny::Class::::BEGIN@185Type::Tiny::Class::BEGIN@185
1118µs45µsType::Tiny::Class::::BEGIN@14Type::Tiny::Class::BEGIN@14
1118µs11µsType::Tiny::Class::::BEGIN@4Type::Tiny::Class::BEGIN@4
1117µs41µsType::Tiny::Class::::BEGIN@5Type::Tiny::Class::BEGIN@5
1116µs23µsType::Tiny::Class::::BEGIN@93Type::Tiny::Class::BEGIN@93
1115µs11µsType::Tiny::Class::::BEGIN@164Type::Tiny::Class::BEGIN@164
1115µs12µsType::Tiny::Class::::BEGIN@164.74Type::Tiny::Class::BEGIN@164.74
1114µs4µsType::Tiny::Class::::BEGIN@7Type::Tiny::Class::BEGIN@7
0000s0sType::Tiny::Class::::__ANON__[:105]Type::Tiny::Class::__ANON__[:105]
0000s0sType::Tiny::Class::::__ANON__[:201]Type::Tiny::Class::__ANON__[:201]
0000s0sType::Tiny::Class::::__ANON__[:70]Type::Tiny::Class::__ANON__[:70]
0000s0sType::Tiny::Class::::__ANON__[:99]Type::Tiny::Class::__ANON__[:99]
0000s0sType::Tiny::Class::::_build_constraintType::Tiny::Class::_build_constraint
0000s0sType::Tiny::Class::::_build_default_messageType::Tiny::Class::_build_default_message
0000s0sType::Tiny::Class::::_croakType::Tiny::Class::_croak
0000s0sType::Tiny::Class::::_exporter_failType::Tiny::Class::_exporter_fail
0000s0sType::Tiny::Class::::_instantiate_moose_typeType::Tiny::Class::_instantiate_moose_type
0000s0sType::Tiny::Class::::_short_nameType::Tiny::Class::_short_name
0000s0sType::Tiny::Class::::plus_constructorsType::Tiny::Class::plus_constructors
0000s0sType::Tiny::Class::::validate_explainType::Tiny::Class::validate_explain
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Type::Tiny::Class;
2
3264µs134µs
# spent 34µs within Type::Tiny::Class::BEGIN@3 which was called: # once (34µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 3
use 5.008001;
# spent 34µs making 1 call to Type::Tiny::Class::BEGIN@3
4225µs214µs
# spent 11µs (8+3) within Type::Tiny::Class::BEGIN@4 which was called: # once (8µs+3µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 4
use strict;
# spent 11µs making 1 call to Type::Tiny::Class::BEGIN@4 # spent 3µs making 1 call to strict::import
5244µs275µs
# spent 41µs (7+34) within Type::Tiny::Class::BEGIN@5 which was called: # once (7µs+34µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 5
use warnings;
# spent 41µs making 1 call to Type::Tiny::Class::BEGIN@5 # spent 34µs making 1 call to warnings::import
6
7
# spent 4µs within Type::Tiny::Class::BEGIN@7 which was called: # once (4µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 10
BEGIN {
810s $Type::Tiny::Class::AUTHORITY = 'cpan:TOBYINK';
914µs $Type::Tiny::Class::VERSION = '2.000001';
10140µs14µs}
# spent 4µs making 1 call to Type::Tiny::Class::BEGIN@7
11
1210s$Type::Tiny::Class::VERSION =~ tr/_//d;
13
14265µs282µs
# spent 45µs (8+37) within Type::Tiny::Class::BEGIN@14 which was called: # once (8µs+37µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 14
use Scalar::Util qw< blessed >;
# spent 45µs making 1 call to Type::Tiny::Class::BEGIN@14 # spent 37µs making 1 call to Exporter::import
15
16sub _croak ($;@) { require Error::TypeTiny; goto \&Error::TypeTiny::croak }
17
18338µs229µs
# spent 22µs (15+7) within Type::Tiny::Class::BEGIN@18 which was called: # once (15µs+7µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 18
use Exporter::Tiny 1.004001 ();
# spent 22µs making 1 call to Type::Tiny::Class::BEGIN@18 # spent 7µs making 1 call to UNIVERSAL::VERSION
192871µs11.08ms
# spent 1.08ms (1.00+79µs) within Type::Tiny::Class::BEGIN@19 which was called: # once (1.00ms+79µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 19
use Type::Tiny::ConstrainedObject ();
# spent 1.08ms making 1 call to Type::Tiny::Class::BEGIN@19
2017µsour @ISA = qw( Type::Tiny::ConstrainedObject Exporter::Tiny );
21
22sub _short_name { 'Class' }
23
24sub _exporter_fail {
25 my ( $class, $name, $opts, $globals ) = @_;
26 my $caller = $globals->{into};
27
28 $opts->{name} = $name unless exists $opts->{name}; $opts->{name} =~ s/:://g;
29 $opts->{class} = $name unless exists $opts->{class};
30 my $type = $class->new($opts);
31
32 $INC{'Type/Registry.pm'}
33 ? 'Type::Registry'->for_class( $caller )->add_type( $type )
34 : ( $Type::Registry::DELAYED{$caller}{$type->name} = $type )
35 unless( ref($caller) or $caller eq '-lexical' or $globals->{'lexical'} );
36 return map +( $_->{name} => $_->{code} ), @{ $type->exportables };
37}
38
39
# spent 732µs (166+566) within Type::Tiny::Class::new which was called 10 times, avg 73µs/call: # 7 times (137µs+423µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 970 of Types/Standard.pm, avg 80µs/call # 3 times (29µs+143µs) by Type::Tiny::Class::_build_parent at line 171, avg 57µs/call
sub new {
40102µs my $proto = shift;
411026µs108µs return $proto->class->new( @_ ) if blessed $proto; # DWIM
# spent 8µs making 10 calls to Scalar::Util::blessed, avg 800ns/call
42
431054µs my %opts = ( @_ == 1 ) ? %{ $_[0] } : @_;
44103µs _croak "Need to supply class name" unless exists $opts{class};
45
461025µs1030µs if ( Type::Tiny::_USE_XS ) {
# spent 30µs making 10 calls to Type::Tiny::__ANON__[Type/Tiny.pm:55], avg 3µs/call
47 my $xsub =
48 Type::Tiny::XS::get_coderef_for( "InstanceOf[" . $opts{class} . "]" );
49 $opts{compiled_type_constraint} = $xsub if $xsub;
50 }
51 elsif ( Type::Tiny::_USE_MOUSE ) {
52 require Mouse::Util::TypeConstraints;
53 my $maker = "Mouse::Util::TypeConstraints"->can( "generate_isa_predicate_for" );
54 $opts{compiled_type_constraint} = $maker->( $opts{class} ) if $maker;
55 }
56
571046µs10528µs return $proto->SUPER::new( %opts );
# spent 528µs making 10 calls to Type::Tiny::ConstrainedObject::new, avg 53µs/call
58} #/ sub new
59
601222µs
# spent 12µs within Type::Tiny::Class::class which was called 12 times, avg 1µs/call: # 7 times (6µs+0s) by Type::Tiny::Class::_build_inlined at line 75, avg 857ns/call # 5 times (6µs+0s) by Type::Tiny::Class::_build_parent at line 154, avg 1µs/call
sub class { $_[0]{class} }
6158164µs760µs
# spent 197µs (137+60) within Type::Tiny::Class::inlined which was called 58 times, avg 3µs/call: # 58 times (137µs+60µs) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 3µs/call
sub inlined { $_[0]{inlined} ||= $_[0]->_build_inlined }
# spent 60µs making 7 calls to Type::Tiny::Class::_build_inlined, avg 9µs/call
62
6396115µs
# spent 56µs within Type::Tiny::Class::has_inlined which was called 96 times, avg 583ns/call: # 96 times (56µs+0s) by Type::Tiny::can_be_inlined at line 881 of Type/Tiny.pm, avg 583ns/call
sub has_inlined { !!1 }
64
65161181µs
# spent 71µs within Type::Tiny::Class::_is_null_constraint which was called 161 times, avg 441ns/call: # 96 times (55µs+0s) by Type::Tiny::can_be_inlined at line 877 of Type/Tiny.pm, avg 573ns/call # 58 times (12µs+0s) by Type::Tiny::inline_check at line 889 of Type/Tiny.pm, avg 207ns/call # 7 times (4µs+0s) by Type::Tiny::_build_compiled_check at line 532 of Type/Tiny.pm, avg 571ns/call
sub _is_null_constraint { 0 }
66
67sub _build_constraint {
68 my $self = shift;
69 my $class = $self->class;
70 return sub { blessed( $_ ) and $_->isa( $class ) };
71}
72
73
# spent 60µs (54+6) within Type::Tiny::Class::_build_inlined which was called 7 times, avg 9µs/call: # 7 times (54µs+6µs) by Type::Tiny::Class::inlined at line 61, avg 9µs/call
sub _build_inlined {
7473µs my $self = shift;
75714µs76µs my $class = $self->class;
# spent 6µs making 7 calls to Type::Tiny::Class::class, avg 857ns/call
76
7771µs my $xsub;
78 $xsub = Type::Tiny::XS::get_subname_for( "InstanceOf[$class]" )
79 if Type::Tiny::_USE_XS;
80
81
# spent 206µs within Type::Tiny::Class::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Class.pm:89] which was called 58 times, avg 4µs/call: # 58 times (206µs+0s) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 4µs/call
sub {
825853µs my $var = $_[1];
83 return
845825µs qq{do { use Scalar::Util (); Scalar::Util::blessed($var) and $var->isa(q[$class]) }}
85 if $Type::Tiny::AvoidCallbacks;
865811µs return "$xsub\($var\)"
87 if $xsub;
8858133µs qq{Scalar::Util::blessed($var) and $var->isa(q[$class])};
89737µs };
90} #/ sub _build_inlined
91
92sub _build_default_message {
932241µs240µs
# spent 23µs (6+17) within Type::Tiny::Class::BEGIN@93 which was called: # once (6µs+17µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 93
no warnings 'uninitialized';
# spent 23µs making 1 call to Type::Tiny::Class::BEGIN@93 # spent 17µs making 1 call to warnings::unimport
94 my $self = shift;
95 my $c = $self->class;
96 return sub {
97 sprintf '%s did not pass type constraint (not isa %s)',
98 Type::Tiny::_dd( $_[0] ), $c;
99 }
100 if $self->is_anon;
101 my $name = "$self";
102 return sub {
103 sprintf '%s did not pass type constraint "%s" (not isa %s)',
104 Type::Tiny::_dd( $_[0] ), $name, $c;
105 };
106} #/ sub _build_default_message
107
108sub _instantiate_moose_type {
109 my $self = shift;
110 my %opts = @_;
111 delete $opts{parent};
112 delete $opts{constraint};
113 delete $opts{inlined};
114 require Moose::Meta::TypeConstraint::Class;
115 return "Moose::Meta::TypeConstraint::Class"
116 ->new( %opts, class => $self->class );
117} #/ sub _instantiate_moose_type
118
119sub plus_constructors {
120 my $self = shift;
121
122 unless ( @_ ) {
123 require Types::Standard;
124 push @_, Types::Standard::HashRef(), "new";
125 }
126
127 require B;
128 require Types::TypeTiny;
129
130 my $class = B::perlstring( $self->class );
131
132 my @r;
133 while ( @_ ) {
134 my $source = shift;
135 Types::TypeTiny::is_TypeTiny( $source )
136 or _croak "Expected type constraint; got $source";
137
138 my $constructor = shift;
139 Types::TypeTiny::is_StringLike( $constructor )
140 or _croak "Expected string; got $constructor";
141
142 push @r, $source, sprintf( '%s->%s($_)', $class, $constructor );
143 } #/ while ( @_ )
144
145 return $self->plus_coercions( \@r );
146} #/ sub plus_constructors
147
148
# spent 583µs (241+342) within Type::Tiny::Class::parent which was called 84 times, avg 7µs/call: # 84 times (241µs+342µs) by Type::Tiny::is_strictly_subtype_of at line 698 of Type/Tiny.pm, avg 7µs/call
sub parent {
14984258µs84342µs $_[0]{parent} ||= $_[0]->_build_parent;
# spent 284µs making 5 calls to Type::Tiny::Class::_build_parent, avg 57µs/call # spent 58µs making 79 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 734ns/call
150}
151
152
# spent 284µs (97+187) within Type::Tiny::Class::_build_parent which was called 5 times, avg 57µs/call: # 5 times (97µs+187µs) by Type::Tiny::Class::parent at line 149, avg 57µs/call
sub _build_parent {
15350s my $self = shift;
15458µs56µs my $class = $self->class;
# spent 6µs making 5 calls to Type::Tiny::Class::class, avg 1µs/call
155
156 # Some classes (I'm looking at you, Math::BigFloat) include a class in
157 # their @ISA to inherit methods, but then override isa() to return false,
158 # so that they don't appear to be a subclass.
159 #
160 # In these cases, we don't want to list the parent class as a parent
161 # type constraint.
162 #
163 my @isa = grep $class->isa( $_ ),
16414152µs739µs
# spent 11µs (5+6) within Type::Tiny::Class::BEGIN@164 which was called: # once (5µs+6µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 164 # spent 12µs (5+7) within Type::Tiny::Class::BEGIN@164.74 which was called: # once (5µs+7µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 164
do { no strict "refs"; no warnings; @{"$class\::ISA"} };
# spent 12µs making 1 call to Type::Tiny::Class::BEGIN@164.74 # spent 11µs making 1 call to Type::Tiny::Class::BEGIN@164 # spent 7µs making 1 call to warnings::unimport # spent 6µs making 1 call to strict::unimport # spent 3µs making 3 calls to UNIVERSAL::isa, avg 1µs/call
165
16654µs if ( @isa == 0 ) {
16722µs require Types::Standard;
16828µs26µs return Types::Standard::Object();
# spent 6µs making 2 calls to Types::Standard::Object, avg 3µs/call
169 }
170
171317µs3172µs if ( @isa == 1 ) {
# spent 172µs making 3 calls to Type::Tiny::Class::new, avg 57µs/call
172 return ref( $self )->new( class => $isa[0] );
173 }
174
175 require Type::Tiny::Intersection;
176 "Type::Tiny::Intersection"->new(
177 type_constraints => [ map ref( $self )->new( class => $_ ), @isa ],
178 );
179} #/ sub _build_parent
180
181*__get_linear_isa_dfs =
18211µs eval { require mro }
183 ? \&mro::get_linear_isa
184 : sub {
1852184µs216µs
# spent 13µs (10+3) within Type::Tiny::Class::BEGIN@185 which was called: # once (10µs+3µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:987] at line 185
no strict 'refs';
# spent 13µs making 1 call to Type::Tiny::Class::BEGIN@185 # spent 3µs making 1 call to strict::unimport
186
187 my $classname = shift;
188 my @lin = ( $classname );
189 my %stored;
190
191 foreach my $parent ( @{"$classname\::ISA"} ) {
192 my $plin = __get_linear_isa_dfs( $parent );
193 foreach ( @$plin ) {
194 next if exists $stored{$_};
195 push( @lin, $_ );
196 $stored{$_} = 1;
197 }
198 }
199
200 return \@lin;
20111µs };
202
203sub validate_explain {
204 my $self = shift;
205 my ( $value, $varname ) = @_;
206 $varname = '$_' unless defined $varname;
207
208 return undef if $self->check( $value );
209 return ["Not a blessed reference"] unless blessed( $value );
210
211 my @isa = @{ __get_linear_isa_dfs( ref $value ) };
212
213 my $display_var = $varname eq q{$_} ? '' : sprintf( ' (in %s)', $varname );
214
215 require Type::Utils;
216 return [
217 sprintf( '"%s" requires that the reference isa %s', $self, $self->class ),
218 sprintf(
219 'The reference%s isa %s', $display_var, Type::Utils::english_list( @isa )
220 ),
221 ];
222} #/ sub validate_explain
223
22414µs1;
225
226__END__