← Index
NYTProf Performance Profile   « line view »
For /usr/local/libexec/sympa/task_manager-debug.pl
  Run on Tue Jun 1 22:32:51 2021
Reported on Tue Jun 1 22:35:05 2021

Filename/usr/local/lib/perl5/site_perl/Specio/Library/Builtins.pm
StatementsExecuted 0 statements in 0s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
0000s0sSpecio::Library::Builtins::::BEGIN@10Specio::Library::Builtins::BEGIN@10
0000s0sSpecio::Library::Builtins::::BEGIN@11Specio::Library::Builtins::BEGIN@11
0000s0sSpecio::Library::Builtins::::BEGIN@12Specio::Library::Builtins::BEGIN@12
0000s0sSpecio::Library::Builtins::::BEGIN@13Specio::Library::Builtins::BEGIN@13
0000s0sSpecio::Library::Builtins::::BEGIN@14Specio::Library::Builtins::BEGIN@14
0000s0sSpecio::Library::Builtins::::BEGIN@15Specio::Library::Builtins::BEGIN@15
0000s0sSpecio::Library::Builtins::::BEGIN@16Specio::Library::Builtins::BEGIN@16
0000s0sSpecio::Library::Builtins::::BEGIN@18Specio::Library::Builtins::BEGIN@18
0000s0sSpecio::Library::Builtins::::BEGIN@3Specio::Library::Builtins::BEGIN@3
0000s0sSpecio::Library::Builtins::::BEGIN@4Specio::Library::Builtins::BEGIN@4
0000s0sSpecio::Library::Builtins::::BEGIN@8Specio::Library::Builtins::BEGIN@8
0000s0sSpecio::Library::Builtins::::_HAS_REF_UTILSpecio::Library::Builtins::_HAS_REF_UTIL
0000s0sSpecio::Library::Builtins::::__ANON__Specio::Library::Builtins::__ANON__ (xsub)
0000s0sSpecio::Library::Builtins::::__ANON__[:108]Specio::Library::Builtins::__ANON__[:108]
0000s0sSpecio::Library::Builtins::::__ANON__[:137]Specio::Library::Builtins::__ANON__[:137]
0000s0sSpecio::Library::Builtins::::__ANON__[:161]Specio::Library::Builtins::__ANON__[:161]
0000s0sSpecio::Library::Builtins::::__ANON__[:184]Specio::Library::Builtins::__ANON__[:184]
0000s0sSpecio::Library::Builtins::::__ANON__[:196]Specio::Library::Builtins::__ANON__[:196]
0000s0sSpecio::Library::Builtins::::__ANON__[:218]Specio::Library::Builtins::__ANON__[:218]
0000s0sSpecio::Library::Builtins::::__ANON__[:242]Specio::Library::Builtins::__ANON__[:242]
0000s0sSpecio::Library::Builtins::::__ANON__[:279]Specio::Library::Builtins::__ANON__[:279]
0000s0sSpecio::Library::Builtins::::__ANON__[:27]Specio::Library::Builtins::__ANON__[:27]
0000s0sSpecio::Library::Builtins::::__ANON__[:292]Specio::Library::Builtins::__ANON__[:292]
0000s0sSpecio::Library::Builtins::::__ANON__[:309]Specio::Library::Builtins::__ANON__[:309]
0000s0sSpecio::Library::Builtins::::__ANON__[:331]Specio::Library::Builtins::__ANON__[:331]
0000s0sSpecio::Library::Builtins::::__ANON__[:337]Specio::Library::Builtins::__ANON__[:337]
0000s0sSpecio::Library::Builtins::::__ANON__[:348]Specio::Library::Builtins::__ANON__[:348]
0000s0sSpecio::Library::Builtins::::__ANON__[:35]Specio::Library::Builtins::__ANON__[:35]
0000s0sSpecio::Library::Builtins::::__ANON__[:369]Specio::Library::Builtins::__ANON__[:369]
0000s0sSpecio::Library::Builtins::::__ANON__[:375]Specio::Library::Builtins::__ANON__[:375]
0000s0sSpecio::Library::Builtins::::__ANON__[:387]Specio::Library::Builtins::__ANON__[:387]
0000s0sSpecio::Library::Builtins::::__ANON__[:408]Specio::Library::Builtins::__ANON__[:408]
0000s0sSpecio::Library::Builtins::::__ANON__[:414]Specio::Library::Builtins::__ANON__[:414]
0000s0sSpecio::Library::Builtins::::__ANON__[:426]Specio::Library::Builtins::__ANON__[:426]
0000s0sSpecio::Library::Builtins::::__ANON__[:434]Specio::Library::Builtins::__ANON__[:434]
0000s0sSpecio::Library::Builtins::::__ANON__[:43]Specio::Library::Builtins::__ANON__[:43]
0000s0sSpecio::Library::Builtins::::__ANON__[:443]Specio::Library::Builtins::__ANON__[:443]
0000s0sSpecio::Library::Builtins::::__ANON__[:68]Specio::Library::Builtins::__ANON__[:68]
0000s0sSpecio::Library::Builtins::::__ANON__[:76]Specio::Library::Builtins::__ANON__[:76]
0000s0sSpecio::Library::Builtins::::__ANON__[:84]Specio::Library::Builtins::__ANON__[:84]
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Specio::Library::Builtins;
2
3use strict;
4use warnings;
5
6our $VERSION = '0.47';
7
8use parent 'Specio::Exporter';
9
10use List::Util 1.33 ();
11use overload ();
12use re ();
13use Scalar::Util ();
14use Specio::Constraint::Parameterizable;
15use Specio::Declare;
16use Specio::Helpers ();
17
18BEGIN {
19 local $@ = undef;
20 my $has_ref_util
21 = eval { require Ref::Util; Ref::Util->VERSION('0.112'); 1 };
22 sub _HAS_REF_UTIL () {$has_ref_util}
23}
24
25declare(
26 'Item',
27 inline => sub {'1'}
28);
29
30declare(
31 'Undef',
32 parent => t('Item'),
33 inline => sub {
34 '!defined(' . $_[1] . ')';
35 }
36);
37
38declare(
39 'Defined',
40 parent => t('Item'),
41 inline => sub {
42 'defined(' . $_[1] . ')';
43 }
44);
45
46declare(
47 'Bool',
48 parent => t('Item'),
49 inline => sub {
50 return sprintf( <<'EOF', ( $_[1] ) x 7 );
51(
52 (
53 !ref( %s )
54 && (
55 !defined( %s )
56 || %s eq q{}
57 || %s eq '1'
58 || %s eq '0'
59 )
60 )
61 ||
62 (
63 Scalar::Util::blessed( %s )
64 && defined overload::Method( %s, 'bool' )
65 )
66)
67EOF
68 }
69);
70
71declare(
72 'Value',
73 parent => t('Defined'),
74 inline => sub {
75 $_[0]->parent->inline_check( $_[1] ) . ' && !ref(' . $_[1] . ')';
76 }
77);
78
79declare(
80 'Ref',
81 parent => t('Defined'),
82
83 # no need to call parent - ref also checks for definedness
84 inline => sub { 'ref(' . $_[1] . ')' }
85);
86
87declare(
88 'Str',
89 parent => t('Value'),
90 inline => sub {
91 return sprintf( <<'EOF', ( $_[1] ) x 6 );
92(
93 (
94 defined( %s )
95 && !ref( %s )
96 && (
97 ( ref( \%s ) eq 'SCALAR' )
98 || do { ( ref( \( my $val = %s ) ) eq 'SCALAR' ) }
99 )
100 )
101 ||
102 (
103 Scalar::Util::blessed( %s )
104 && defined overload::Method( %s, q{""} )
105 )
106)
107EOF
108 }
109);
110
111declare(
112 'Num',
113 parent => t('Str'),
114 inline => sub {
115 return sprintf( <<'EOF', ( $_[1] ) x 5 );
116(
117 (
118 defined( %s )
119 && !ref( %s )
120 && (
121 do {
122 ( my $val = %s ) =~
123 /\A
124 -?[0-9]+(?:\.[0-9]+)?
125 (?:[Ee][\-+]?[0-9]+)?
126 \z/x
127 }
128 )
129 )
130 ||
131 (
132 Scalar::Util::blessed( %s )
133 && defined overload::Method( %s, '0+' )
134 )
135)
136EOF
137 }
138);
139
140declare(
141 'Int',
142 parent => t('Num'),
143 inline => sub {
144 return sprintf( <<'EOF', ( $_[1] ) x 6 );
145(
146 (
147 defined( %s )
148 && !ref( %s )
149 && (
150 do { ( my $val1 = %s ) =~ /\A-?[0-9]+(?:[Ee]\+?[0-9]+)?\z/ }
151 )
152 )
153 ||
154 (
155 Scalar::Util::blessed( %s )
156 && defined overload::Method( %s, '0+' )
157 && do { ( my $val2 = %s + 0 ) =~ /\A-?[0-9]+(?:[Ee]\+?[0-9]+)?\z/ }
158 )
159)
160EOF
161 }
162);
163
164{
165 my $ref_check
166 = _HAS_REF_UTIL
167 ? 'Ref::Util::is_plain_coderef(%s)'
168 : q{ref(%s) eq 'CODE'};
169
170 declare(
171 'CodeRef',
172 parent => t('Ref'),
173 inline => sub {
174 return sprintf( <<"EOF", ( $_[1] ) x 3 );
175(
176 $ref_check
177 ||
178 (
179 Scalar::Util::blessed( %s )
180 && defined overload::Method( %s, '&{}' )
181 )
182)
183EOF
184 }
185 );
186}
187
188{
189 # This is a 5.8 back-compat shim stolen from Type::Tiny's Devel::Perl58Compat
190 # module.
191 unless ( exists &re::is_regexp || _HAS_REF_UTIL ) {
192 require B;
193 *re::is_regexp = sub {
194 ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
195 eval { B::svref_2object( $_[0] )->MAGIC->TYPE eq 'r' };
196 };
197 }
198
199 my $ref_check
200 = _HAS_REF_UTIL
201 ? 'Ref::Util::is_regexpref(%s)'
202 : 're::is_regexp(%s)';
203
204 declare(
205 'RegexpRef',
206 parent => t('Ref'),
207 inline => sub {
208 return sprintf( <<"EOF", ( $_[1] ) x 3 );
209(
210 $ref_check
211 ||
212 (
213 Scalar::Util::blessed( %s )
214 && defined overload::Method( %s, 'qr' )
215 )
216)
217EOF
218 },
219 );
220}
221
222{
223 my $ref_check
224 = _HAS_REF_UTIL
225 ? 'Ref::Util::is_plain_globref(%s)'
226 : q{ref( %s ) eq 'GLOB'};
227
228 declare(
229 'GlobRef',
230 parent => t('Ref'),
231 inline => sub {
232 return sprintf( <<"EOF", ( $_[1] ) x 3 );
233(
234 $ref_check
235 ||
236 (
237 Scalar::Util::blessed( %s )
238 && defined overload::Method( %s, '*{}' )
239 )
240)
241EOF
242 }
243 );
244}
245
246{
247 my $ref_check
248 = _HAS_REF_UTIL
249 ? 'Ref::Util::is_plain_globref(%s)'
250 : q{ref( %s ) eq 'GLOB'};
251
252 # NOTE: scalar filehandles are GLOB refs, but a GLOB ref is not always a
253 # filehandle
254 declare(
255 'FileHandle',
256 parent => t('Ref'),
257 inline => sub {
258 return sprintf( <<"EOF", ( $_[1] ) x 6 );
259(
260 (
261 $ref_check
262 && Scalar::Util::openhandle( %s )
263 )
264 ||
265 (
266 Scalar::Util::blessed( %s )
267 &&
268 (
269 %s->isa('IO::Handle')
270 ||
271 (
272 defined overload::Method( %s, '*{}' )
273 && Scalar::Util::openhandle( *{ %s } )
274 )
275 )
276 )
277)
278EOF
279 }
280 );
281}
282
283{
284 my $ref_check
285 = _HAS_REF_UTIL
286 ? 'Ref::Util::is_blessed_ref(%s)'
287 : 'Scalar::Util::blessed(%s)';
288
289 declare(
290 'Object',
291 parent => t('Ref'),
292 inline => sub { sprintf( $ref_check, $_[1] ) },
293 );
294}
295
296declare(
297 'ClassName',
298 parent => t('Str'),
299 inline => sub {
300 return
301 sprintf(
302 <<'EOF', $_[0]->parent->inline_check( $_[1] ), ( $_[1] ) x 2 );
303(
304 ( %s )
305 && length "%s"
306 && Specio::Helpers::is_class_loaded( "%s" )
307)
308EOF
309 },
310);
311
312{
313 my $ref_check
314 = _HAS_REF_UTIL
315 ? 'Ref::Util::is_plain_scalarref(%s) || Ref::Util::is_plain_refref(%s)'
316 : q{ref( %s ) eq 'SCALAR' || ref( %s ) eq 'REF'};
317
318 my $base_scalarref_check = sub {
319 return sprintf( <<"EOF", ( $_[0] ) x 4 );
320(
321 (
322 $ref_check
323 )
324 ||
325 (
326 Scalar::Util::blessed( %s )
327 && defined overload::Method( %s, '\${}' )
328 )
329)
330EOF
331 };
332
333 declare(
334 'ScalarRef',
335 type_class => 'Specio::Constraint::Parameterizable',
336 parent => t('Ref'),
337 inline => sub { $base_scalarref_check->( $_[1] ) },
338 parameterized_inline_generator => sub {
339 shift;
340 my $parameter = shift;
341 my $val = shift;
342
343 return sprintf(
344 '( ( %s ) && ( %s ) )',
345 $base_scalarref_check->($val),
346 $parameter->inline_check( '${' . $val . '}' ),
347 );
348 }
349 );
350}
351
352{
353 my $ref_check
354 = _HAS_REF_UTIL
355 ? 'Ref::Util::is_plain_arrayref(%s)'
356 : q{ref( %s ) eq 'ARRAY'};
357
358 my $base_arrayref_check = sub {
359 return sprintf( <<"EOF", ( $_[0] ) x 3 );
360(
361 $ref_check
362 ||
363 (
364 Scalar::Util::blessed( %s )
365 && defined overload::Method( %s, '\@{}' )
366 )
367)
368EOF
369 };
370
371 declare(
372 'ArrayRef',
373 type_class => 'Specio::Constraint::Parameterizable',
374 parent => t('Ref'),
375 inline => sub { $base_arrayref_check->( $_[1] ) },
376 parameterized_inline_generator => sub {
377 shift;
378 my $parameter = shift;
379 my $val = shift;
380
381 return sprintf(
382 '( ( %s ) && ( List::Util::all { %s } @{ %s } ) )',
383 $base_arrayref_check->($val),
384 $parameter->inline_check('$_'),
385 $val,
386 );
387 }
388 );
389}
390
391{
392 my $ref_check
393 = _HAS_REF_UTIL
394 ? 'Ref::Util::is_plain_hashref(%s)'
395 : q{ref( %s ) eq 'HASH'};
396
397 my $base_hashref_check = sub {
398 return sprintf( <<"EOF", ( $_[0] ) x 3 );
399(
400 $ref_check
401 ||
402 (
403 Scalar::Util::blessed( %s )
404 && defined overload::Method( %s, '%%{}' )
405 )
406)
407EOF
408 };
409
410 declare(
411 'HashRef',
412 type_class => 'Specio::Constraint::Parameterizable',
413 parent => t('Ref'),
414 inline => sub { $base_hashref_check->( $_[1] ) },
415 parameterized_inline_generator => sub {
416 shift;
417 my $parameter = shift;
418 my $val = shift;
419
420 return sprintf(
421 '( ( %s ) && ( List::Util::all { %s } values %%{ %s } ) )',
422 $base_hashref_check->($val),
423 $parameter->inline_check('$_'),
424 $val,
425 );
426 }
427 );
428}
429
430declare(
431 'Maybe',
432 type_class => 'Specio::Constraint::Parameterizable',
433 parent => t('Item'),
434 inline => sub {'1'},
435 parameterized_inline_generator => sub {
436 shift;
437 my $parameter = shift;
438 my $val = shift;
439
440 return sprintf( <<'EOF', $val, $parameter->inline_check($val) );
441( !defined( %s ) || ( %s ) )
442EOF
443 },
444);
445
4461;
447
448# ABSTRACT: Implements type constraint objects for Perl's built-in types
449
450__END__