← 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:57 2022

Filename/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/darwin-2level/Params/Util/PP.pm
StatementsExecuted 12 statements in 1.80ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
11116µs19µsParams::Util::PP::::BEGIN@3Params::Util::PP::BEGIN@3
1116µs29µsParams::Util::PP::::BEGIN@4Params::Util::PP::BEGIN@4
1115µs5µsParams::Util::PP::::BEGIN@17Params::Util::PP::BEGIN@17
1112µs2µsParams::Util::PP::::BEGIN@16Params::Util::PP::BEGIN@16
0000s0sParams::Util::PP::::_ARRAYParams::Util::PP::_ARRAY
0000s0sParams::Util::PP::::_ARRAY0Params::Util::PP::_ARRAY0
0000s0sParams::Util::PP::::_ARRAYLIKEParams::Util::PP::_ARRAYLIKE
0000s0sParams::Util::PP::::_CLASSParams::Util::PP::_CLASS
0000s0sParams::Util::PP::::_CLASSDOESParams::Util::PP::_CLASSDOES
0000s0sParams::Util::PP::::_CLASSISAParams::Util::PP::_CLASSISA
0000s0sParams::Util::PP::::_CODEParams::Util::PP::_CODE
0000s0sParams::Util::PP::::_CODELIKEParams::Util::PP::_CODELIKE
0000s0sParams::Util::PP::::_DRIVERParams::Util::PP::_DRIVER
0000s0sParams::Util::PP::::_HANDLEParams::Util::PP::_HANDLE
0000s0sParams::Util::PP::::_HASHParams::Util::PP::_HASH
0000s0sParams::Util::PP::::_HASH0Params::Util::PP::_HASH0
0000s0sParams::Util::PP::::_HASHLIKEParams::Util::PP::_HASHLIKE
0000s0sParams::Util::PP::::_IDENTIFIERParams::Util::PP::_IDENTIFIER
0000s0sParams::Util::PP::::_INSTANCEParams::Util::PP::_INSTANCE
0000s0sParams::Util::PP::::_INSTANCEDOESParams::Util::PP::_INSTANCEDOES
0000s0sParams::Util::PP::::_INVOCANTParams::Util::PP::_INVOCANT
0000s0sParams::Util::PP::::_NONNEGINTParams::Util::PP::_NONNEGINT
0000s0sParams::Util::PP::::_NUMBERParams::Util::PP::_NUMBER
0000s0sParams::Util::PP::::_POSINTParams::Util::PP::_POSINT
0000s0sParams::Util::PP::::_REGEXParams::Util::PP::_REGEX
0000s0sParams::Util::PP::::_SCALARParams::Util::PP::_SCALAR
0000s0sParams::Util::PP::::_SCALAR0Params::Util::PP::_SCALAR0
0000s0sParams::Util::PP::::_SETParams::Util::PP::_SET
0000s0sParams::Util::PP::::_SET0Params::Util::PP::_SET0
0000s0sParams::Util::PP::::_STRINGParams::Util::PP::_STRING
0000s0sParams::Util::PP::::_SUBCLASSParams::Util::PP::_SUBCLASS
0000s0sParams::Util::PP::::_XScompiledParams::Util::PP::_XScompiled
0000s0sParams::Util::PP::::__ANON__[:37]Params::Util::PP::__ANON__[:37]
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Params::Util::PP;
2
3231µs222µs
# spent 19µs (16+3) within Params::Util::PP::BEGIN@3 which was called: # once (16µs+3µs) by Params::Util::BEGIN@63 at line 3
use strict;
# spent 19µs making 1 call to Params::Util::PP::BEGIN@3 # spent 3µs making 1 call to strict::import
4238µs252µs
# spent 29µs (6+23) within Params::Util::PP::BEGIN@4 which was called: # once (6µs+23µs) by Params::Util::BEGIN@63 at line 4
use warnings;
# spent 29µs making 1 call to Params::Util::PP::BEGIN@4 # spent 23µs making 1 call to warnings::import
5
610sour $VERSION = '1.102';
7
8=pod
9
10=head1 NAME
11
12Params::Util::PP - PurePerl Params::Util routines
13
14=cut
15
16216µs12µs
# spent 2µs within Params::Util::PP::BEGIN@16 which was called: # once (2µs+0s) by Params::Util::BEGIN@63 at line 16
use Scalar::Util ();
# spent 2µs making 1 call to Params::Util::PP::BEGIN@16
1721.68ms15µs
# spent 5µs within Params::Util::PP::BEGIN@17 which was called: # once (5µs+0s) by Params::Util::BEGIN@63 at line 17
use overload ();
# spent 5µs making 1 call to Params::Util::PP::BEGIN@17
18
19116µs234µsScalar::Util->can("looks_like_number") and Scalar::Util->import("looks_like_number");
# spent 31µs making 1 call to Exporter::import # spent 3µs making 1 call to UNIVERSAL::can
20# Use a private pure-perl copy of looks_like_number if the version of
21# Scalar::Util is old (for whatever reason).
22Params::Util::PP->can("looks_like_number") or *looks_like_number = sub {
23 local $_ = shift;
24
25 # checks from perlfaq4
26 return 0 if !defined($_);
27 if (ref($_))
28 {
29 return overload::Overloaded($_) ? defined(0 + $_) : 0;
30 }
31 return 1 if (/^[+-]?[0-9]+$/); # is a +/- integer
32 ## no critic (RegularExpressions::ProhibitComplexRegexes)
33 return 1 if (/^(?:[+-]?)(?=[0-9]|\.[0-9])[0-9]*(?:\.[0-9]*)?(?:[Ee](?:[+-]?[0-9]+))?$/); # a C float
34 return 1 if ($] >= 5.008 and /^(?:Inf(?:inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i);
35
36 0;
3716µs11µs};
# spent 1µs making 1 call to UNIVERSAL::can
38
39## no critic (Subroutines::ProhibitSubroutinePrototypes, Subroutines::RequireArgUnpacking)
40## no critic (Subroutines::ProhibitUnusedPrivateSubroutines)
41
42sub _XScompiled { return 0; }
43
44sub _STRING ($)
45{
46 my $arg = $_[0];
47 return (defined $arg and not ref $arg and length($arg)) ? $arg : undef;
48}
49
50sub _IDENTIFIER ($)
51{
52 my $arg = $_[0];
53 return (defined $arg and not ref $arg and $arg =~ m/^[^\W\d]\w*\z/s) ? $arg : undef;
54}
55
56sub _CLASS ($)
57{
58 my $arg = $_[0];
59 return (defined $arg and not ref $arg and $arg =~ m/^[^\W\d]\w*(?:::\w+)*\z/s) ? $arg : undef;
60}
61
62sub _CLASSISA ($$)
63{
64 return (defined $_[0] and not ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s and $_[0]->isa($_[1])) ? $_[0] : undef;
65}
66
67sub _CLASSDOES ($$)
68{
69 return (defined $_[0] and not ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s and $_[0]->DOES($_[1])) ? $_[0] : undef;
70}
71
72sub _SUBCLASS ($$)
73{
74 return (defined $_[0] and not ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s and $_[0] ne $_[1] and $_[0]->isa($_[1]))
75 ? $_[0]
76 : undef;
77}
78
79sub _NUMBER ($)
80{
81 my $arg = $_[0];
82 return (defined $arg and not ref $arg and looks_like_number($arg)) ? $arg : undef;
83}
84
85sub _POSINT ($)
86{
87 my $arg = $_[0];
88 return (defined $arg and not ref $arg and $arg =~ m/^[1-9]\d*$/) ? $arg : undef;
89}
90
91sub _NONNEGINT ($)
92{
93 my $arg = $_[0];
94 return (defined $arg and not ref $arg and $arg =~ m/^(?:0|[1-9]\d*)$/) ? $arg : undef;
95}
96
97sub _SCALAR ($)
98{
99 return (ref $_[0] eq 'SCALAR' and defined ${$_[0]} and ${$_[0]} ne '') ? $_[0] : undef;
100}
101
102sub _SCALAR0 ($)
103{
104 return ref $_[0] eq 'SCALAR' ? $_[0] : undef;
105}
106
107sub _ARRAY ($)
108{
109 return (ref $_[0] eq 'ARRAY' and @{$_[0]}) ? $_[0] : undef;
110}
111
112sub _ARRAY0 ($)
113{
114 return ref $_[0] eq 'ARRAY' ? $_[0] : undef;
115}
116
117sub _ARRAYLIKE
118{
119 return (
120 defined $_[0] and ref $_[0] and ((Scalar::Util::reftype($_[0]) eq 'ARRAY')
121 or overload::Method($_[0], '@{}'))
122 ) ? $_[0] : undef;
123}
124
125sub _HASH ($)
126{
127 return (ref $_[0] eq 'HASH' and scalar %{$_[0]}) ? $_[0] : undef;
128}
129
130sub _HASH0 ($)
131{
132 return ref $_[0] eq 'HASH' ? $_[0] : undef;
133}
134
135sub _HASHLIKE
136{
137 return (
138 defined $_[0] and ref $_[0] and ((Scalar::Util::reftype($_[0]) eq 'HASH')
139 or overload::Method($_[0], '%{}'))
140 ) ? $_[0] : undef;
141}
142
143sub _CODE ($)
144{
145 return ref $_[0] eq 'CODE' ? $_[0] : undef;
146}
147
148sub _CODELIKE($)
149{
150 return (
151 (Scalar::Util::reftype($_[0]) || '') eq 'CODE'
152 or Scalar::Util::blessed($_[0]) and overload::Method($_[0], '&{}')
153 ) ? $_[0] : undef;
154}
155
156sub _INVOCANT($)
157{
158 return (
159 defined $_[0]
160 and (
161 defined Scalar::Util::blessed($_[0])
162 or
163 _CLASS($_[0])
164
165
166 )
167 ) ? $_[0] : undef;
168}
169
170sub _INSTANCE ($$)
171{
172 return (Scalar::Util::blessed($_[0]) and $_[0]->isa($_[1])) ? $_[0] : undef;
173}
174
175sub _INSTANCEDOES ($$)
176{
177 return (Scalar::Util::blessed($_[0]) and $_[0]->DOES($_[1])) ? $_[0] : undef;
178}
179
180sub _REGEX ($)
181{
182 return (defined $_[0] and 'Regexp' eq ref($_[0])) ? $_[0] : undef;
183}
184
185sub _SET ($$)
186{
187 my $set_param = shift;
188 _ARRAY($set_param) or return undef;
189 foreach my $item (@$set_param)
190 {
191 _INSTANCE($item, $_[0]) or return undef;
192 }
193 return $set_param;
194}
195
196sub _SET0 ($$)
197{
198 my $set_param = shift;
199 _ARRAY0($set_param) or return undef;
200 foreach my $item (@$set_param)
201 {
202 _INSTANCE($item, $_[0]) or return undef;
203 }
204 return $set_param;
205}
206
207# We're doing this longhand for now. Once everything is perfect,
208# we'll compress this into something that compiles more efficiently.
209# Further, testing file handles is not something that is generally
210# done millions of times, so doing it slowly is not a big speed hit.
211sub _HANDLE
212{
213 my $it = shift;
214
215 # It has to be defined, of course
216 unless (defined $it)
217 {
218 return undef;
219 }
220
221 # Normal globs are considered to be file handles
222 if (ref $it eq 'GLOB')
223 {
224 return $it;
225 }
226
227 # Check for a normal tied filehandle
228 # Side Note: 5.5.4's tied() and can() doesn't like getting undef
229 if (tied($it) and tied($it)->can('TIEHANDLE'))
230 {
231 return $it;
232 }
233
234 # There are no other non-object handles that we support
235 unless (Scalar::Util::blessed($it))
236 {
237 return undef;
238 }
239
240 # Check for a common base classes for conventional IO::Handle object
241 if ($it->isa('IO::Handle'))
242 {
243 return $it;
244 }
245
246 # Check for tied file handles using Tie::Handle
247 if ($it->isa('Tie::Handle'))
248 {
249 return $it;
250 }
251
252 # IO::Scalar is not a proper seekable, but it is valid is a
253 # regular file handle
254 if ($it->isa('IO::Scalar'))
255 {
256 return $it;
257 }
258
259 # Yet another special case for IO::String, which refuses (for now
260 # anyway) to become a subclass of IO::Handle.
261 if ($it->isa('IO::String'))
262 {
263 return $it;
264 }
265
266 # This is not any sort of object we know about
267 return undef;
268}
269
270sub _DRIVER ($$)
271{
272 ## no critic (BuiltinFunctions::ProhibitStringyEval)
273 return (defined _CLASS($_[0]) and eval "require $_[0];" and not $@ and $_[0]->isa($_[1]) and $_[0] ne $_[1]) ? $_[0] : undef;
274}
275
276110µs1;