Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/darwin-2level/Params/Util/PP.pm |
Statements | Executed 12 statements in 1.80ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 16µs | 19µs | BEGIN@3 | Params::Util::PP::
1 | 1 | 1 | 6µs | 29µs | BEGIN@4 | Params::Util::PP::
1 | 1 | 1 | 5µs | 5µs | BEGIN@17 | Params::Util::PP::
1 | 1 | 1 | 2µs | 2µs | BEGIN@16 | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _ARRAY | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _ARRAY0 | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _ARRAYLIKE | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _CLASS | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _CLASSDOES | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _CLASSISA | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _CODE | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _CODELIKE | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _DRIVER | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _HANDLE | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _HASH | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _HASH0 | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _HASHLIKE | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _IDENTIFIER | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _INSTANCE | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _INSTANCEDOES | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _INVOCANT | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _NONNEGINT | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _NUMBER | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _POSINT | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _REGEX | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _SCALAR | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _SCALAR0 | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _SET | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _SET0 | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _STRING | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _SUBCLASS | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | _XScompiled | Params::Util::PP::
0 | 0 | 0 | 0s | 0s | __ANON__[:37] | Params::Util::PP::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Params::Util::PP; | ||||
2 | |||||
3 | 2 | 31µs | 2 | 22µ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 # spent 19µs making 1 call to Params::Util::PP::BEGIN@3
# spent 3µs making 1 call to strict::import |
4 | 2 | 38µs | 2 | 52µ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 # spent 29µs making 1 call to Params::Util::PP::BEGIN@4
# spent 23µs making 1 call to warnings::import |
5 | |||||
6 | 1 | 0s | our $VERSION = '1.102'; | ||
7 | |||||
8 | =pod | ||||
9 | |||||
10 | =head1 NAME | ||||
11 | |||||
12 | Params::Util::PP - PurePerl Params::Util routines | ||||
13 | |||||
14 | =cut | ||||
15 | |||||
16 | 2 | 16µs | 1 | 2µ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 # spent 2µs making 1 call to Params::Util::PP::BEGIN@16 |
17 | 2 | 1.68ms | 1 | 5µ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 # spent 5µs making 1 call to Params::Util::PP::BEGIN@17 |
18 | |||||
19 | 1 | 16µs | 2 | 34µs | Scalar::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). | ||||
22 | Params::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; | ||||
37 | 1 | 6µs | 1 | 1µs | }; # spent 1µs making 1 call to UNIVERSAL::can |
38 | |||||
39 | ## no critic (Subroutines::ProhibitSubroutinePrototypes, Subroutines::RequireArgUnpacking) | ||||
40 | ## no critic (Subroutines::ProhibitUnusedPrivateSubroutines) | ||||
41 | |||||
42 | sub _XScompiled { return 0; } | ||||
43 | |||||
44 | sub _STRING ($) | ||||
45 | { | ||||
46 | my $arg = $_[0]; | ||||
47 | return (defined $arg and not ref $arg and length($arg)) ? $arg : undef; | ||||
48 | } | ||||
49 | |||||
50 | sub _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 | |||||
56 | sub _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 | |||||
62 | sub _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 | |||||
67 | sub _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 | |||||
72 | sub _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 | |||||
79 | sub _NUMBER ($) | ||||
80 | { | ||||
81 | my $arg = $_[0]; | ||||
82 | return (defined $arg and not ref $arg and looks_like_number($arg)) ? $arg : undef; | ||||
83 | } | ||||
84 | |||||
85 | sub _POSINT ($) | ||||
86 | { | ||||
87 | my $arg = $_[0]; | ||||
88 | return (defined $arg and not ref $arg and $arg =~ m/^[1-9]\d*$/) ? $arg : undef; | ||||
89 | } | ||||
90 | |||||
91 | sub _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 | |||||
97 | sub _SCALAR ($) | ||||
98 | { | ||||
99 | return (ref $_[0] eq 'SCALAR' and defined ${$_[0]} and ${$_[0]} ne '') ? $_[0] : undef; | ||||
100 | } | ||||
101 | |||||
102 | sub _SCALAR0 ($) | ||||
103 | { | ||||
104 | return ref $_[0] eq 'SCALAR' ? $_[0] : undef; | ||||
105 | } | ||||
106 | |||||
107 | sub _ARRAY ($) | ||||
108 | { | ||||
109 | return (ref $_[0] eq 'ARRAY' and @{$_[0]}) ? $_[0] : undef; | ||||
110 | } | ||||
111 | |||||
112 | sub _ARRAY0 ($) | ||||
113 | { | ||||
114 | return ref $_[0] eq 'ARRAY' ? $_[0] : undef; | ||||
115 | } | ||||
116 | |||||
117 | sub _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 | |||||
125 | sub _HASH ($) | ||||
126 | { | ||||
127 | return (ref $_[0] eq 'HASH' and scalar %{$_[0]}) ? $_[0] : undef; | ||||
128 | } | ||||
129 | |||||
130 | sub _HASH0 ($) | ||||
131 | { | ||||
132 | return ref $_[0] eq 'HASH' ? $_[0] : undef; | ||||
133 | } | ||||
134 | |||||
135 | sub _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 | |||||
143 | sub _CODE ($) | ||||
144 | { | ||||
145 | return ref $_[0] eq 'CODE' ? $_[0] : undef; | ||||
146 | } | ||||
147 | |||||
148 | sub _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 | |||||
156 | sub _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 | |||||
170 | sub _INSTANCE ($$) | ||||
171 | { | ||||
172 | return (Scalar::Util::blessed($_[0]) and $_[0]->isa($_[1])) ? $_[0] : undef; | ||||
173 | } | ||||
174 | |||||
175 | sub _INSTANCEDOES ($$) | ||||
176 | { | ||||
177 | return (Scalar::Util::blessed($_[0]) and $_[0]->DOES($_[1])) ? $_[0] : undef; | ||||
178 | } | ||||
179 | |||||
180 | sub _REGEX ($) | ||||
181 | { | ||||
182 | return (defined $_[0] and 'Regexp' eq ref($_[0])) ? $_[0] : undef; | ||||
183 | } | ||||
184 | |||||
185 | sub _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 | |||||
196 | sub _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. | ||||
211 | sub _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 | |||||
270 | sub _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 | |||||
276 | 1 | 10µs | 1; |