| 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 | Params::Util::PP::BEGIN@3 |
| 1 | 1 | 1 | 6µs | 29µs | Params::Util::PP::BEGIN@4 |
| 1 | 1 | 1 | 5µs | 5µs | Params::Util::PP::BEGIN@17 |
| 1 | 1 | 1 | 2µs | 2µs | Params::Util::PP::BEGIN@16 |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_ARRAY |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_ARRAY0 |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_ARRAYLIKE |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_CLASS |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_CLASSDOES |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_CLASSISA |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_CODE |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_CODELIKE |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_DRIVER |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_HANDLE |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_HASH |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_HASH0 |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_HASHLIKE |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_IDENTIFIER |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_INSTANCE |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_INSTANCEDOES |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_INVOCANT |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_NONNEGINT |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_NUMBER |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_POSINT |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_REGEX |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_SCALAR |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_SCALAR0 |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_SET |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_SET0 |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_STRING |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_SUBCLASS |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::_XScompiled |
| 0 | 0 | 0 | 0s | 0s | Params::Util::PP::__ANON__[:37] |
| 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; |