← 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/Duck.pm
StatementsExecuted 81 statements in 1.27ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
11132µs32µsType::Tiny::Duck::::BEGIN@3Type::Tiny::Duck::BEGIN@3
41121µs27µsType::Tiny::Duck::::__ANON__[:104]Type::Tiny::Duck::__ANON__[:104]
11116µs110µsType::Tiny::Duck::::newType::Tiny::Duck::new
11112µs20µsType::Tiny::Duck::::BEGIN@19Type::Tiny::Duck::BEGIN@19
1119µs48µsType::Tiny::Duck::::BEGIN@5Type::Tiny::Duck::BEGIN@5
4118µs15µsType::Tiny::Duck::::inlinedType::Tiny::Duck::inlined
1116µs39µsType::Tiny::Duck::::BEGIN@14Type::Tiny::Duck::BEGIN@14
1116µs10µsType::Tiny::Duck::::BEGIN@4Type::Tiny::Duck::BEGIN@4
4116µs6µsType::Tiny::Duck::::CORE:matchType::Tiny::Duck::CORE:match (opcode)
1116µs7µsType::Tiny::Duck::::_build_inlinedType::Tiny::Duck::_build_inlined
9114µs4µsType::Tiny::Duck::::has_inlinedType::Tiny::Duck::has_inlined
14313µs3µsType::Tiny::Duck::::_is_null_constraintType::Tiny::Duck::_is_null_constraint
1112µs2µsType::Tiny::Duck::::BEGIN@20Type::Tiny::Duck::BEGIN@20
1112µs2µsType::Tiny::Duck::::BEGIN@7Type::Tiny::Duck::BEGIN@7
1111µs1µsType::Tiny::Duck::::methodsType::Tiny::Duck::methods
0000s0sType::Tiny::Duck::::__ANON__[:166]Type::Tiny::Duck::__ANON__[:166]
0000s0sType::Tiny::Duck::::__ANON__[:74]Type::Tiny::Duck::__ANON__[:74]
0000s0sType::Tiny::Duck::::_build_constraintType::Tiny::Duck::_build_constraint
0000s0sType::Tiny::Duck::::_croakType::Tiny::Duck::_croak
0000s0sType::Tiny::Duck::::_exporter_failType::Tiny::Duck::_exporter_fail
0000s0sType::Tiny::Duck::::_instantiate_moose_typeType::Tiny::Duck::_instantiate_moose_type
0000s0sType::Tiny::Duck::::_short_nameType::Tiny::Duck::_short_name
0000s0sType::Tiny::Duck::::validate_explainType::Tiny::Duck::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::Duck;
2
3239µs132µs
# spent 32µs within Type::Tiny::Duck::BEGIN@3 which was called: # once (32µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 3
use 5.008001;
# spent 32µs making 1 call to Type::Tiny::Duck::BEGIN@3
4224µs214µs
# spent 10µs (6+4) within Type::Tiny::Duck::BEGIN@4 which was called: # once (6µs+4µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 4
use strict;
# spent 10µs making 1 call to Type::Tiny::Duck::BEGIN@4 # spent 4µs making 1 call to strict::import
5235µs287µs
# spent 48µs (9+39) within Type::Tiny::Duck::BEGIN@5 which was called: # once (9µs+39µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 5
use warnings;
# spent 48µs making 1 call to Type::Tiny::Duck::BEGIN@5 # spent 39µs making 1 call to warnings::import
6
7
# spent 2µs within Type::Tiny::Duck::BEGIN@7 which was called: # once (2µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 10
BEGIN {
810s $Type::Tiny::Duck::AUTHORITY = 'cpan:TOBYINK';
912µs $Type::Tiny::Duck::VERSION = '2.000001';
10127µs12µs}
# spent 2µs making 1 call to Type::Tiny::Duck::BEGIN@7
11
1211µs$Type::Tiny::Duck::VERSION =~ tr/_//d;
13
14248µs272µs
# spent 39µs (6+33) within Type::Tiny::Duck::BEGIN@14 which was called: # once (6µs+33µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 14
use Scalar::Util qw< blessed >;
# spent 39µs making 1 call to Type::Tiny::Duck::BEGIN@14 # spent 33µs making 1 call to Exporter::import
15
16sub _croak ($;@) { require Error::TypeTiny; goto \&Error::TypeTiny::croak }
17
18
19336µs228µs
# spent 20µs (12+8) within Type::Tiny::Duck::BEGIN@19 which was called: # once (12µs+8µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 19
use Exporter::Tiny 1.004001 ();
# spent 20µs making 1 call to Type::Tiny::Duck::BEGIN@19 # spent 8µs making 1 call to UNIVERSAL::VERSION
202931µs12µs
# spent 2µs within Type::Tiny::Duck::BEGIN@20 which was called: # once (2µs+0s) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 20
use Type::Tiny::ConstrainedObject ();
# spent 2µs making 1 call to Type::Tiny::Duck::BEGIN@20
21113µsour @ISA = qw( Type::Tiny::ConstrainedObject Exporter::Tiny );
22
23sub _short_name { 'Duck' }
24
25sub _exporter_fail {
26 my ( $class, $type_name, $methods, $globals ) = @_;
27 my $caller = $globals->{into};
28 my $type = $class->new(
29 name => $type_name,
30 methods => [ @$methods ],
31 );
32 $INC{'Type/Registry.pm'}
33 ? 'Type::Registry'->for_class( $caller )->add_type( $type, $type_name )
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 110µs (16+94) within Type::Tiny::Duck::new which was called: # once (16µs+94µs) by Types::Standard::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Types/Standard.pm:1033] at line 1028 of Types/Standard.pm
sub new {
4011µs my $proto = shift;
41
4212µs my %opts = ( @_ == 1 ) ? %{ $_[0] } : @_;
4311µs _croak "Need to supply list of methods" unless exists $opts{methods};
44
4510s $opts{methods} = [ $opts{methods} ] unless ref $opts{methods};
46
4712µs13µs if ( Type::Tiny::_USE_XS ) {
# spent 3µs making 1 call to Type::Tiny::__ANON__[Type/Tiny.pm:55]
48 my $methods = join ",", sort( @{ $opts{methods} } );
49 my $xsub = Type::Tiny::XS::get_coderef_for( "HasMethods[$methods]" );
50 $opts{compiled_type_constraint} = $xsub if $xsub;
51 }
52 elsif ( Type::Tiny::_USE_MOUSE ) {
53 require Mouse::Util::TypeConstraints;
54 my $maker = "Mouse::Util::TypeConstraints"->can( "generate_can_predicate_for" );
55 $opts{compiled_type_constraint} = $maker->( $opts{methods} ) if $maker;
56 }
57
5819µs191µs return $proto->SUPER::new( %opts );
# spent 91µs making 1 call to Type::Tiny::ConstrainedObject::new
59} #/ sub new
60
6112µs
# spent 1µs within Type::Tiny::Duck::methods which was called: # once (1µs+0s) by Type::Tiny::Duck::_build_inlined at line 79
sub methods { $_[0]{methods} }
6249µs17µs
# spent 15µs (8+7) within Type::Tiny::Duck::inlined which was called 4 times, avg 4µs/call: # 4 times (8µs+7µs) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 4µs/call
sub inlined { $_[0]{inlined} ||= $_[0]->_build_inlined }
# spent 7µs making 1 call to Type::Tiny::Duck::_build_inlined
63
64915µs
# spent 4µs within Type::Tiny::Duck::has_inlined which was called 9 times, avg 444ns/call: # 9 times (4µs+0s) by Type::Tiny::can_be_inlined at line 881 of Type/Tiny.pm, avg 444ns/call
sub has_inlined { !!1 }
65
661430µs
# spent 3µs within Type::Tiny::Duck::_is_null_constraint which was called 14 times, avg 214ns/call: # 9 times (2µs+0s) by Type::Tiny::can_be_inlined at line 877 of Type/Tiny.pm, avg 222ns/call # 4 times (0s+0s) by Type::Tiny::inline_check at line 889 of Type/Tiny.pm, avg 0s/call # once (1µs+0s) by Type::Tiny::_build_compiled_check at line 532 of Type/Tiny.pm
sub _is_null_constraint { 0 }
67
68sub _build_constraint {
69 my $self = shift;
70 my @methods = @{ $self->methods };
71 return sub {
72 blessed( $_[0] )
73 and not grep( !$_[0]->can( $_ ), @methods );
74 };
75}
76
77
# spent 7µs (6+1000ns) within Type::Tiny::Duck::_build_inlined which was called: # once (6µs+1000ns) by Type::Tiny::Duck::inlined at line 62
sub _build_inlined {
7811µs my $self = shift;
7912µs11µs my @methods = @{ $self->methods };
# spent 1µs making 1 call to Type::Tiny::Duck::methods
80
8110s my $xsub;
82 if ( Type::Tiny::_USE_XS ) {
83 my $methods = join ",", sort( @{ $self->methods } );
84 $xsub = Type::Tiny::XS::get_subname_for( "HasMethods[$methods]" );
85 }
86
87
# spent 27µs (21+6) within Type::Tiny::Duck::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Duck.pm:104] which was called 4 times, avg 7µs/call: # 4 times (21µs+6µs) by Type::Tiny::inline_check at line 895 of Type/Tiny.pm, avg 7µs/call
sub {
8841µs my $var = $_[1];
8941µs local $" = q{ };
90
91 # If $var is $_ or $_->{foo} or $foo{$_} or somesuch, then we
92 # can't use it within the grep expression, so we need to save
93 # it into a temporary variable ($tmp).
94421µs46µs my $code =
# spent 6µs making 4 calls to Type::Tiny::Duck::CORE:match, avg 2µs/call
95 ( $var =~ /\$_/ )
96 ? qq{ Scalar::Util::blessed($var) and not do { my \$tmp = $var; grep(!\$tmp->can(\$_), qw/@methods/) } }
97 : qq{ Scalar::Util::blessed($var) and not grep(!$var->can(\$_), qw/@methods/) };
98
9940s return qq{do { $Type::Tiny::SafePackage use Scalar::Util (); $code }}
100 if $Type::Tiny::AvoidCallbacks;
10140s return "$xsub\($var\)"
102 if $xsub;
10347µs $code;
10414µs };
105} #/ sub _build_inlined
106
107sub _instantiate_moose_type {
108 my $self = shift;
109 my %opts = @_;
110 delete $opts{parent};
111 delete $opts{constraint};
112 delete $opts{inlined};
113
114 require Moose::Meta::TypeConstraint::DuckType;
115 return "Moose::Meta::TypeConstraint::DuckType"
116 ->new( %opts, methods => $self->methods );
117} #/ sub _instantiate_moose_type
118
119sub validate_explain {
120 my $self = shift;
121 my ( $value, $varname ) = @_;
122 $varname = '$_' unless defined $varname;
123
124 return undef if $self->check( $value );
125 return ["Not a blessed reference"] unless blessed( $value );
126
127 require Type::Utils;
128 return [
129 sprintf(
130 '"%s" requires that the reference can %s',
131 $self,
132 Type::Utils::english_list( map qq["$_"], @{ $self->methods } ),
133 ),
134 map sprintf( 'The reference cannot "%s"', $_ ),
135 grep !$value->can( $_ ),
136 @{ $self->methods }
137 ];
138} #/ sub validate_explain
139
140push @Type::Tiny::CMP, sub {
141 my $A = shift->find_constraining_type;
142 my $B = shift->find_constraining_type;
143 return Type::Tiny::CMP_UNKNOWN
144 unless $A->isa( __PACKAGE__ ) && $B->isa( __PACKAGE__ );
145
146 my %seen;
147 for my $word ( @{ $A->methods } ) {
148 $seen{$word} += 1;
149 }
150 for my $word ( @{ $B->methods } ) {
151 $seen{$word} += 2;
152 }
153
154 my $values = join( '', CORE::values %seen );
155 if ( $values =~ /^3*$/ ) {
156 return Type::Tiny::CMP_EQUIVALENT;
157 }
158 elsif ( $values !~ /2/ ) {
159 return Type::Tiny::CMP_SUBTYPE;
160 }
161 elsif ( $values !~ /1/ ) {
162 return Type::Tiny::CMP_SUPERTYPE;
163 }
164
165 return Type::Tiny::CMP_UNKNOWN;
16613µs};
167
16816µs1;
169
170__END__
 
# spent 6µs within Type::Tiny::Duck::CORE:match which was called 4 times, avg 2µs/call: # 4 times (6µs+0s) by Type::Tiny::Duck::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Type/Tiny/Duck.pm:104] at line 94, avg 2µs/call
sub Type::Tiny::Duck::CORE:match; # opcode