Filename | /Users/ether/perl5/perlbrew/perls/36.0/lib/5.36.0/darwin-2level/Sub/Util.pm |
Statements | Executed 12 statements in 665µs |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
411 | 6 | 5 | 1.75ms | 1.75ms | set_subname (xsub) | Sub::Util::
1 | 1 | 1 | 16µs | 18µs | BEGIN@7 | Sub::Util::
2 | 1 | 1 | 10µs | 10µs | set_prototype (xsub) | Sub::Util::
1 | 1 | 1 | 4µs | 22µs | BEGIN@8 | Sub::Util::
0 | 0 | 0 | 0s | 0s | prototype | Sub::Util::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # Copyright (c) 2014 Paul Evans <leonerd@leonerd.org.uk>. All rights reserved. | ||||
2 | # This program is free software; you can redistribute it and/or | ||||
3 | # modify it under the same terms as Perl itself. | ||||
4 | |||||
5 | package Sub::Util; | ||||
6 | |||||
7 | 2 | 21µs | 2 | 20µs | # spent 18µs (16+2) within Sub::Util::BEGIN@7 which was called:
# once (16µs+2µs) by Moo::_Utils::BEGIN@12 at line 7 # spent 18µs making 1 call to Sub::Util::BEGIN@7
# spent 2µs making 1 call to strict::import |
8 | 2 | 152µs | 2 | 40µs | # spent 22µs (4+18) within Sub::Util::BEGIN@8 which was called:
# once (4µs+18µs) by Moo::_Utils::BEGIN@12 at line 8 # spent 22µs making 1 call to Sub::Util::BEGIN@8
# spent 18µs making 1 call to warnings::import |
9 | |||||
10 | 1 | 281µs | require Exporter; | ||
11 | |||||
12 | 1 | 8µs | our @ISA = qw( Exporter ); | ||
13 | 1 | 1µs | our @EXPORT_OK = qw( | ||
14 | prototype set_prototype | ||||
15 | subname set_subname | ||||
16 | ); | ||||
17 | |||||
18 | 1 | 0s | our $VERSION = "1.62"; | ||
19 | 1 | 5µs | $VERSION =~ tr/_//d; | ||
20 | |||||
21 | 1 | 173µs | require List::Util; # as it has the XS | ||
22 | 1 | 20µs | 1 | 8µs | List::Util->VERSION( $VERSION ); # Ensure we got the right XS version (RT#100863) # spent 8µs making 1 call to UNIVERSAL::VERSION |
23 | |||||
24 | =head1 NAME | ||||
25 | |||||
26 | Sub::Util - A selection of utility subroutines for subs and CODE references | ||||
27 | |||||
28 | =head1 SYNOPSIS | ||||
29 | |||||
30 | use Sub::Util qw( prototype set_prototype subname set_subname ); | ||||
31 | |||||
32 | =head1 DESCRIPTION | ||||
33 | |||||
34 | C<Sub::Util> contains a selection of utility subroutines that are useful for | ||||
35 | operating on subs and CODE references. | ||||
36 | |||||
37 | The rationale for inclusion in this module is that the function performs some | ||||
38 | work for which an XS implementation is essential because it cannot be | ||||
39 | implemented in Pure Perl, and which is sufficiently-widely used across CPAN | ||||
40 | that its popularity warrants inclusion in a core module, which this is. | ||||
41 | |||||
42 | =cut | ||||
43 | |||||
44 | =head1 FUNCTIONS | ||||
45 | |||||
46 | =cut | ||||
47 | |||||
48 | =head2 prototype | ||||
49 | |||||
50 | my $proto = prototype( $code ) | ||||
51 | |||||
52 | I<Since version 1.40.> | ||||
53 | |||||
54 | Returns the prototype of the given C<$code> reference, if it has one, as a | ||||
55 | string. This is the same as the C<CORE::prototype> operator; it is included | ||||
56 | here simply for symmetry and completeness with the other functions. | ||||
57 | |||||
58 | =cut | ||||
59 | |||||
60 | sub prototype | ||||
61 | { | ||||
62 | my ( $code ) = @_; | ||||
63 | return CORE::prototype( $code ); | ||||
64 | } | ||||
65 | |||||
66 | =head2 set_prototype | ||||
67 | |||||
68 | my $code = set_prototype $prototype, $code; | ||||
69 | |||||
70 | I<Since version 1.40.> | ||||
71 | |||||
72 | Sets the prototype of the function given by the C<$code> reference, or deletes | ||||
73 | it if C<$prototype> is C<undef>. Returns the C<$code> reference itself. | ||||
74 | |||||
75 | I<Caution>: This function takes arguments in a different order to the previous | ||||
76 | copy of the code from C<Scalar::Util>. This is to match the order of | ||||
77 | C<set_subname>, and other potential additions in this file. This order has | ||||
78 | been chosen as it allows a neat and simple chaining of other | ||||
79 | C<Sub::Util::set_*> functions as might become available, such as: | ||||
80 | |||||
81 | my $code = | ||||
82 | set_subname name_here => | ||||
83 | set_prototype '&@' => | ||||
84 | set_attribute ':lvalue' => | ||||
85 | sub { ...... }; | ||||
86 | |||||
87 | =cut | ||||
88 | |||||
89 | =head2 subname | ||||
90 | |||||
91 | my $name = subname( $code ) | ||||
92 | |||||
93 | I<Since version 1.40.> | ||||
94 | |||||
95 | Returns the name of the given C<$code> reference, if it has one. Normal named | ||||
96 | subs will give a fully-qualified name consisting of the package and the | ||||
97 | localname separated by C<::>. Anonymous code references will give C<__ANON__> | ||||
98 | as the localname. If the package the code was compiled in has been deleted | ||||
99 | (e.g. using C<delete_package> from L<Symbol>), C<__ANON__> will be returned as | ||||
100 | the package name. If a name has been set using L</set_subname>, this name will be | ||||
101 | returned instead. | ||||
102 | |||||
103 | This function was inspired by C<sub_fullname> from L<Sub::Identify>. The | ||||
104 | remaining functions that C<Sub::Identify> implements can easily be emulated | ||||
105 | using regexp operations, such as | ||||
106 | |||||
107 | sub get_code_info { return (subname $_[0]) =~ m/^(.+)::(.*?)$/ } | ||||
108 | sub sub_name { return (get_code_info $_[0])[0] } | ||||
109 | sub stash_name { return (get_code_info $_[0])[1] } | ||||
110 | |||||
111 | I<Users of Sub::Name beware>: This function is B<not> the same as | ||||
112 | C<Sub::Name::subname>; it returns the existing name of the sub rather than | ||||
113 | changing it. To set or change a name, see instead L</set_subname>. | ||||
114 | |||||
115 | =cut | ||||
116 | |||||
117 | =head2 set_subname | ||||
118 | |||||
119 | my $code = set_subname $name, $code; | ||||
120 | |||||
121 | I<Since version 1.40.> | ||||
122 | |||||
123 | Sets the name of the function given by the C<$code> reference. Returns the | ||||
124 | C<$code> reference itself. If the C<$name> is unqualified, the package of the | ||||
125 | caller is used to qualify it. | ||||
126 | |||||
127 | This is useful for applying names to anonymous CODE references so that stack | ||||
128 | traces and similar situations, to give a useful name rather than having the | ||||
129 | default of C<__ANON__>. Note that this name is only used for this situation; | ||||
130 | the C<set_subname> will not install it into the symbol table; you will have to | ||||
131 | do that yourself if required. | ||||
132 | |||||
133 | However, since the name is not used by perl except as the return value of | ||||
134 | C<caller>, for stack traces or similar, there is no actual requirement that | ||||
135 | the name be syntactically valid as a perl function name. This could be used to | ||||
136 | attach extra information that could be useful in debugging stack traces. | ||||
137 | |||||
138 | This function was copied from C<Sub::Name::subname> and renamed to the naming | ||||
139 | convention of this module. | ||||
140 | |||||
141 | =cut | ||||
142 | |||||
143 | =head1 AUTHOR | ||||
144 | |||||
145 | The general structure of this module was written by Paul Evans | ||||
146 | <leonerd@leonerd.org.uk>. | ||||
147 | |||||
148 | The XS implementation of L</set_subname> was copied from L<Sub::Name> by | ||||
149 | Matthijs van Duin <xmath@cpan.org> | ||||
150 | |||||
151 | =cut | ||||
152 | |||||
153 | 1 | 4µs | 1; | ||
# spent 10µs within Sub::Util::set_prototype which was called 2 times, avg 5µs/call:
# 2 times (10µs+0s) by Scalar::Util::set_prototype at line 40 of Scalar/Util.pm, avg 5µs/call | |||||
# spent 1.75ms within Sub::Util::set_subname which was called 411 times, avg 4µs/call:
# 147 times (616µs+0s) by Eval::TypeTiny::set_subname at line 101 of Eval/TypeTiny.pm, avg 4µs/call
# 129 times (514µs+0s) by Moo::_Utils::_name_coderef at line 242 of Moo/_Utils.pm, avg 4µs/call
# 109 times (490µs+0s) by Sub::Defer::_name_coderef at line 29 of Sub/Defer.pm, avg 4µs/call
# 22 times (109µs+0s) by Mojo::Util::monkey_patch at line 205 of Mojo/Util.pm, avg 5µs/call
# 2 times (17µs+0s) by Try::Tiny::catch at line 142 of Try/Tiny.pm, avg 8µs/call
# 2 times (5µs+0s) by Try::Tiny::try at line 73 of Try/Tiny.pm, avg 2µs/call |