Filename | /Users/timbo/perl5/perlbrew/perls/perl-5.18.2/lib/site_perl/5.18.2/Carp.pm |
Statements | Executed 59 statements in 2.95ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 24µs | 36µs | BEGIN@6 | Carp::
1 | 1 | 1 | 24µs | 24µs | BEGIN@3 | Carp::
1 | 1 | 1 | 14µs | 21µs | BEGIN@61 | Carp::
2 | 2 | 1 | 12µs | 12µs | _fetch_sub | Carp::
1 | 1 | 1 | 8µs | 20µs | BEGIN@589 | Carp::
1 | 1 | 1 | 8µs | 16µs | BEGIN@602 | Carp::
1 | 1 | 1 | 8µs | 14µs | BEGIN@73 | Carp::
1 | 1 | 1 | 8µs | 18µs | BEGIN@131 | Carp::
1 | 1 | 1 | 6µs | 11µs | BEGIN@5 | Carp::
1 | 1 | 1 | 6µs | 16µs | BEGIN@609 | Carp::
1 | 1 | 1 | 6µs | 17µs | BEGIN@4 | Carp::
1 | 1 | 1 | 5µs | 5µs | BEGIN@49 | Carp::
1 | 1 | 1 | 5µs | 5µs | BEGIN@171 | Carp::
0 | 0 | 0 | 0s | 0s | __ANON__[:261] | Carp::
0 | 0 | 0 | 0s | 0s | __ANON__[:272] | Carp::
0 | 0 | 0 | 0s | 0s | __ANON__[:66] | Carp::
0 | 0 | 0 | 0s | 0s | __ANON__[:86] | Carp::
0 | 0 | 0 | 0s | 0s | _cgc | Carp::
0 | 0 | 0 | 0s | 0s | caller_info | Carp::
0 | 0 | 0 | 0s | 0s | carp | Carp::
0 | 0 | 0 | 0s | 0s | cluck | Carp::
0 | 0 | 0 | 0s | 0s | confess | Carp::
0 | 0 | 0 | 0s | 0s | croak | Carp::
0 | 0 | 0 | 0s | 0s | export_fail | Carp::
0 | 0 | 0 | 0s | 0s | format_arg | Carp::
0 | 0 | 0 | 0s | 0s | get_status | Carp::
0 | 0 | 0 | 0s | 0s | get_subname | Carp::
0 | 0 | 0 | 0s | 0s | long_error_loc | Carp::
0 | 0 | 0 | 0s | 0s | longmess | Carp::
0 | 0 | 0 | 0s | 0s | longmess_heavy | Carp::
0 | 0 | 0 | 0s | 0s | ret_backtrace | Carp::
0 | 0 | 0 | 0s | 0s | ret_summary | Carp::
0 | 0 | 0 | 0s | 0s | short_error_loc | Carp::
0 | 0 | 0 | 0s | 0s | shortmess | Carp::
0 | 0 | 0 | 0s | 0s | shortmess_heavy | Carp::
0 | 0 | 0 | 0s | 0s | str_len_trim | Carp::
0 | 0 | 0 | 0s | 0s | trusts | Carp::
0 | 0 | 0 | 0s | 0s | trusts_directly | Carp::
0 | 0 | 0 | 0s | 0s | CARP_TRACE | Regexp::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Carp; | ||||
2 | |||||
3 | 3 | 63µs | 1 | 24µs | # spent 24µs within Carp::BEGIN@3 which was called:
# once (24µs+0s) by Pod::Usage::BEGIN@18 at line 3 # spent 24µs making 1 call to Carp::BEGIN@3 |
4 | 2 | 27µs | 2 | 28µs | # spent 17µs (6+11) within Carp::BEGIN@4 which was called:
# once (6µs+11µs) by Pod::Usage::BEGIN@18 at line 4 # spent 17µs making 1 call to Carp::BEGIN@4
# spent 11µs making 1 call to strict::import |
5 | 2 | 46µs | 2 | 15µs | # spent 11µs (6+4) within Carp::BEGIN@5 which was called:
# once (6µs+4µs) by Pod::Usage::BEGIN@18 at line 5 # spent 11µs making 1 call to Carp::BEGIN@5
# spent 4µs making 1 call to warnings::import |
6 | # spent 36µs (24+12) within Carp::BEGIN@6 which was called:
# once (24µs+12µs) by Pod::Usage::BEGIN@18 at line 26 | ||||
7 | # Very old versions of warnings.pm load Carp. This can go wrong due | ||||
8 | # to the circular dependency. If warnings is invoked before Carp, | ||||
9 | # then warnings starts by loading Carp, then Carp (above) tries to | ||||
10 | # invoke warnings, and gets nothing because warnings is in the process | ||||
11 | # of loading and hasn't defined its import method yet. If we were | ||||
12 | # only turning on warnings ("use warnings" above) this wouldn't be too | ||||
13 | # bad, because Carp would just gets the state of the -w switch and so | ||||
14 | # might not get some warnings that it wanted. The real problem is | ||||
15 | # that we then want to turn off Unicode warnings, but "no warnings | ||||
16 | # 'utf8'" won't be effective if we're in this circular-dependency | ||||
17 | # situation. So, if warnings.pm is an affected version, we turn | ||||
18 | # off all warnings ourselves by directly setting ${^WARNING_BITS}. | ||||
19 | # On unaffected versions, we turn off just Unicode warnings, via | ||||
20 | # the proper API. | ||||
21 | 1 | 18µs | if(!defined($warnings::VERSION) || eval($warnings::VERSION) < 1.06) { # spent 2µs executing statements in string eval | ||
22 | ${^WARNING_BITS} = ""; | ||||
23 | } else { | ||||
24 | 1 | 2µs | 1 | 12µs | "warnings"->unimport("utf8"); # spent 12µs making 1 call to warnings::unimport |
25 | } | ||||
26 | 1 | 136µs | 1 | 36µs | } # spent 36µs making 1 call to Carp::BEGIN@6 |
27 | |||||
28 | sub _fetch_sub { # fetch sub without autovivifying | ||||
29 | 2 | 1µs | my($pack, $sub) = @_; | ||
30 | 2 | 400ns | $pack .= '::'; | ||
31 | # only works with top-level packages | ||||
32 | 2 | 900ns | return unless exists($::{$pack}); | ||
33 | 2 | 1µs | for ($::{$pack}) { | ||
34 | 2 | 3µs | return unless ref \$_ eq 'GLOB' && *$_{HASH} && exists $$_{$sub}; | ||
35 | 2 | 700ns | for ($$_{$sub}) { | ||
36 | 2 | 16µs | return ref \$_ eq 'GLOB' ? *$_{CODE} : undef | ||
37 | } | ||||
38 | } | ||||
39 | } | ||||
40 | |||||
41 | # UTF8_REGEXP_PROBLEM is a compile-time constant indicating whether Carp | ||||
42 | # must avoid applying a regular expression to an upgraded (is_utf8) | ||||
43 | # string. There are multiple problems, on different Perl versions, | ||||
44 | # that require this to be avoided. All versions prior to 5.13.8 will | ||||
45 | # load utf8_heavy.pl for the swash system, even if the regexp doesn't | ||||
46 | # use character classes. Perl 5.6 and Perls [5.11.2, 5.13.11) exhibit | ||||
47 | # specific problems when Carp is being invoked in the aftermath of a | ||||
48 | # syntax error. | ||||
49 | # spent 5µs within Carp::BEGIN@49 which was called:
# once (5µs+0s) by Pod::Usage::BEGIN@18 at line 55 | ||||
50 | 1 | 5µs | if("$]" < 5.013011) { | ||
51 | *UTF8_REGEXP_PROBLEM = sub () { 1 }; | ||||
52 | } else { | ||||
53 | 1 | 800ns | *UTF8_REGEXP_PROBLEM = sub () { 0 }; | ||
54 | } | ||||
55 | 1 | 63µs | 1 | 5µs | } # spent 5µs making 1 call to Carp::BEGIN@49 |
56 | |||||
57 | # is_utf8() is essentially the utf8::is_utf8() function, which indicates | ||||
58 | # whether a string is represented in the upgraded form (using UTF-8 | ||||
59 | # internally). As utf8::is_utf8() is only available from Perl 5.8 | ||||
60 | # onwards, extra effort is required here to make it work on Perl 5.6. | ||||
61 | # spent 21µs (14+7) within Carp::BEGIN@61 which was called:
# once (14µs+7µs) by Pod::Usage::BEGIN@18 at line 68 | ||||
62 | 1 | 4µs | 1 | 7µs | if(defined(my $sub = _fetch_sub utf8 => 'is_utf8')) { # spent 7µs making 1 call to Carp::_fetch_sub |
63 | *is_utf8 = $sub; | ||||
64 | } else { | ||||
65 | # black magic for perl 5.6 | ||||
66 | *is_utf8 = sub { unpack("C", "\xaa".$_[0]) != 170 }; | ||||
67 | } | ||||
68 | 1 | 101µs | 1 | 21µs | } # spent 21µs making 1 call to Carp::BEGIN@61 |
69 | |||||
70 | # The downgrade() function defined here is to be used for attempts to | ||||
71 | # downgrade where it is acceptable to fail. It must be called with a | ||||
72 | # second argument that is a true value. | ||||
73 | # spent 14µs (8+6) within Carp::BEGIN@73 which was called:
# once (8µs+6µs) by Pod::Usage::BEGIN@18 at line 88 | ||||
74 | 1 | 8µs | 1 | 6µs | if(defined(my $sub = _fetch_sub utf8 => 'downgrade')) { # spent 6µs making 1 call to Carp::_fetch_sub |
75 | *downgrade = \&{"utf8::downgrade"}; | ||||
76 | } else { | ||||
77 | *downgrade = sub { | ||||
78 | my $r = ""; | ||||
79 | my $l = length($_[0]); | ||||
80 | for(my $i = 0; $i != $l; $i++) { | ||||
81 | my $o = ord(substr($_[0], $i, 1)); | ||||
82 | return if $o > 255; | ||||
83 | $r .= chr($o); | ||||
84 | } | ||||
85 | $_[0] = $r; | ||||
86 | }; | ||||
87 | } | ||||
88 | 1 | 160µs | 1 | 14µs | } # spent 14µs making 1 call to Carp::BEGIN@73 |
89 | |||||
90 | 1 | 500ns | our $VERSION = '1.36'; | ||
91 | |||||
92 | 1 | 100ns | our $MaxEvalLen = 0; | ||
93 | 1 | 0s | our $Verbose = 0; | ||
94 | 1 | 100ns | our $CarpLevel = 0; | ||
95 | 1 | 0s | our $MaxArgLen = 64; # How much of each argument to print. 0 = all. | ||
96 | 1 | 0s | our $MaxArgNums = 8; # How many arguments to print. 0 = all. | ||
97 | 1 | 100ns | our $RefArgFormatter = undef; # allow caller to format reference arguments | ||
98 | |||||
99 | 1 | 300ns | require Exporter; | ||
100 | 1 | 5µs | our @ISA = ('Exporter'); | ||
101 | 1 | 800ns | our @EXPORT = qw(confess croak carp); | ||
102 | 1 | 700ns | our @EXPORT_OK = qw(cluck verbose longmess shortmess); | ||
103 | 1 | 200ns | our @EXPORT_FAIL = qw(verbose); # hook to enable verbose mode | ||
104 | |||||
105 | # The members of %Internal are packages that are internal to perl. | ||||
106 | # Carp will not report errors from within these packages if it | ||||
107 | # can. The members of %CarpInternal are internal to Perl's warning | ||||
108 | # system. Carp will not report errors from within these packages | ||||
109 | # either, and will not report calls *to* these packages for carp and | ||||
110 | # croak. They replace $CarpLevel, which is deprecated. The | ||||
111 | # $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval | ||||
112 | # text and function arguments should be formatted when printed. | ||||
113 | |||||
114 | 1 | 100ns | our %CarpInternal; | ||
115 | 1 | 0s | our %Internal; | ||
116 | |||||
117 | # disable these by default, so they can live w/o require Carp | ||||
118 | 1 | 600ns | $CarpInternal{Carp}++; | ||
119 | 1 | 200ns | $CarpInternal{warnings}++; | ||
120 | 1 | 200ns | $Internal{Exporter}++; | ||
121 | 1 | 100ns | $Internal{'Exporter::Heavy'}++; | ||
122 | |||||
123 | # if the caller specifies verbose usage ("perl -MCarp=verbose script.pl") | ||||
124 | # then the following method will be called by the Exporter which knows | ||||
125 | # to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word | ||||
126 | # 'verbose'. | ||||
127 | |||||
128 | sub export_fail { shift; $Verbose = shift if $_[0] eq 'verbose'; @_ } | ||||
129 | |||||
130 | sub _cgc { | ||||
131 | 2 | 276µs | 2 | 28µs | # spent 18µs (8+10) within Carp::BEGIN@131 which was called:
# once (8µs+10µs) by Pod::Usage::BEGIN@18 at line 131 # spent 18µs making 1 call to Carp::BEGIN@131
# spent 10µs making 1 call to strict::unimport |
132 | return \&{"CORE::GLOBAL::caller"} if defined &{"CORE::GLOBAL::caller"}; | ||||
133 | return; | ||||
134 | } | ||||
135 | |||||
136 | sub longmess { | ||||
137 | local($!, $^E); | ||||
138 | # Icky backwards compatibility wrapper. :-( | ||||
139 | # | ||||
140 | # The story is that the original implementation hard-coded the | ||||
141 | # number of call levels to go back, so calls to longmess were off | ||||
142 | # by one. Other code began calling longmess and expecting this | ||||
143 | # behaviour, so the replacement has to emulate that behaviour. | ||||
144 | my $cgc = _cgc(); | ||||
145 | my $call_pack = $cgc ? $cgc->() : caller(); | ||||
146 | if ( $Internal{$call_pack} or $CarpInternal{$call_pack} ) { | ||||
147 | return longmess_heavy(@_); | ||||
148 | } | ||||
149 | else { | ||||
150 | local $CarpLevel = $CarpLevel + 1; | ||||
151 | return longmess_heavy(@_); | ||||
152 | } | ||||
153 | } | ||||
154 | |||||
155 | 1 | 0s | our @CARP_NOT; | ||
156 | |||||
157 | sub shortmess { | ||||
158 | local($!, $^E); | ||||
159 | my $cgc = _cgc(); | ||||
160 | |||||
161 | # Icky backwards compatibility wrapper. :-( | ||||
162 | local @CARP_NOT = $cgc ? $cgc->() : caller(); | ||||
163 | shortmess_heavy(@_); | ||||
164 | } | ||||
165 | |||||
166 | sub croak { die shortmess @_ } | ||||
167 | sub confess { die longmess @_ } | ||||
168 | sub carp { warn shortmess @_ } | ||||
169 | sub cluck { warn longmess @_ } | ||||
170 | |||||
171 | # spent 5µs within Carp::BEGIN@171 which was called:
# once (5µs+0s) by Pod::Usage::BEGIN@18 at line 178 | ||||
172 | 1 | 6µs | if("$]" >= 5.015002 || ("$]" >= 5.014002 && "$]" < 5.015) || | ||
173 | ("$]" >= 5.012005 && "$]" < 5.013)) { | ||||
174 | *CALLER_OVERRIDE_CHECK_OK = sub () { 1 }; | ||||
175 | } else { | ||||
176 | *CALLER_OVERRIDE_CHECK_OK = sub () { 0 }; | ||||
177 | } | ||||
178 | 1 | 1.82ms | 1 | 5µs | } # spent 5µs making 1 call to Carp::BEGIN@171 |
179 | |||||
180 | sub caller_info { | ||||
181 | my $i = shift(@_) + 1; | ||||
182 | my %call_info; | ||||
183 | my $cgc = _cgc(); | ||||
184 | { | ||||
185 | # Some things override caller() but forget to implement the | ||||
186 | # @DB::args part of it, which we need. We check for this by | ||||
187 | # pre-populating @DB::args with a sentinel which no-one else | ||||
188 | # has the address of, so that we can detect whether @DB::args | ||||
189 | # has been properly populated. However, on earlier versions | ||||
190 | # of perl this check tickles a bug in CORE::caller() which | ||||
191 | # leaks memory. So we only check on fixed perls. | ||||
192 | @DB::args = \$i if CALLER_OVERRIDE_CHECK_OK; | ||||
193 | package DB; | ||||
194 | |||||
- - | |||||
199 | unless ( defined $call_info{file} ) { | ||||
200 | return (); | ||||
201 | } | ||||
202 | |||||
203 | my $sub_name = Carp::get_subname( \%call_info ); | ||||
204 | if ( $call_info{has_args} ) { | ||||
205 | my @args; | ||||
206 | if (CALLER_OVERRIDE_CHECK_OK && @DB::args == 1 | ||||
207 | && ref $DB::args[0] eq ref \$i | ||||
208 | && $DB::args[0] == \$i ) { | ||||
209 | @DB::args = (); # Don't let anyone see the address of $i | ||||
210 | local $@; | ||||
211 | my $where = eval { | ||||
212 | my $func = $cgc or return ''; | ||||
213 | my $gv = | ||||
214 | (_fetch_sub B => 'svref_2object' or return '') | ||||
215 | ->($func)->GV; | ||||
216 | my $package = $gv->STASH->NAME; | ||||
217 | my $subname = $gv->NAME; | ||||
218 | return unless defined $package && defined $subname; | ||||
219 | |||||
220 | # returning CORE::GLOBAL::caller isn't useful for tracing the cause: | ||||
221 | return if $package eq 'CORE::GLOBAL' && $subname eq 'caller'; | ||||
222 | " in &${package}::$subname"; | ||||
223 | } || ''; | ||||
224 | @args | ||||
225 | = "** Incomplete caller override detected$where; \@DB::args were not set **"; | ||||
226 | } | ||||
227 | else { | ||||
228 | @args = @DB::args; | ||||
229 | my $overflow; | ||||
230 | if ( $MaxArgNums and @args > $MaxArgNums ) | ||||
231 | { # More than we want to show? | ||||
232 | $#args = $MaxArgNums; | ||||
233 | $overflow = 1; | ||||
234 | } | ||||
235 | |||||
236 | @args = map { Carp::format_arg($_) } @args; | ||||
237 | |||||
238 | if ($overflow) { | ||||
239 | push @args, '...'; | ||||
240 | } | ||||
241 | } | ||||
242 | |||||
243 | # Push the args onto the subroutine | ||||
244 | $sub_name .= '(' . join( ', ', @args ) . ')'; | ||||
245 | } | ||||
246 | $call_info{sub_name} = $sub_name; | ||||
247 | return wantarray() ? %call_info : \%call_info; | ||||
248 | } | ||||
249 | |||||
250 | # Transform an argument to a function into a string. | ||||
251 | 1 | 0s | our $in_recurse; | ||
252 | sub format_arg { | ||||
253 | my $arg = shift; | ||||
254 | |||||
255 | if ( ref($arg) ) { | ||||
256 | # legitimate, let's not leak it. | ||||
257 | if (!$in_recurse && | ||||
258 | do { | ||||
259 | local $@; | ||||
260 | local $in_recurse = 1; | ||||
261 | local $SIG{__DIE__} = sub{}; | ||||
262 | eval {$arg->can('CARP_TRACE') } | ||||
263 | }) | ||||
264 | { | ||||
265 | return $arg->CARP_TRACE(); | ||||
266 | } | ||||
267 | elsif (!$in_recurse && | ||||
268 | defined($RefArgFormatter) && | ||||
269 | do { | ||||
270 | local $@; | ||||
271 | local $in_recurse = 1; | ||||
272 | local $SIG{__DIE__} = sub{}; | ||||
273 | eval {$arg = $RefArgFormatter->($arg); 1} | ||||
274 | }) | ||||
275 | { | ||||
276 | return $arg; | ||||
277 | } | ||||
278 | else | ||||
279 | { | ||||
280 | my $sub = _fetch_sub(overload => 'StrVal'); | ||||
281 | return $sub ? &$sub($arg) : "$arg"; | ||||
282 | } | ||||
283 | } | ||||
284 | return "undef" if !defined($arg); | ||||
285 | downgrade($arg, 1); | ||||
286 | return $arg if !(UTF8_REGEXP_PROBLEM && is_utf8($arg)) && | ||||
287 | $arg =~ /\A-?[0-9]+(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?\z/; | ||||
288 | my $suffix = ""; | ||||
289 | if ( 2 < $MaxArgLen and $MaxArgLen < length($arg) ) { | ||||
290 | substr ( $arg, $MaxArgLen - 3 ) = ""; | ||||
291 | $suffix = "..."; | ||||
292 | } | ||||
293 | if(UTF8_REGEXP_PROBLEM && is_utf8($arg)) { | ||||
294 | for(my $i = length($arg); $i--; ) { | ||||
295 | my $c = substr($arg, $i, 1); | ||||
296 | my $x = substr($arg, 0, 0); # work around bug on Perl 5.8.{1,2} | ||||
297 | if($c eq "\"" || $c eq "\\" || $c eq "\$" || $c eq "\@") { | ||||
298 | substr $arg, $i, 0, "\\"; | ||||
299 | next; | ||||
300 | } | ||||
301 | my $o = ord($c); | ||||
302 | |||||
303 | # This code is repeated in Regexp::CARP_TRACE() | ||||
304 | if ($] ge 5.007_003) { | ||||
305 | substr $arg, $i, 1, sprintf("\\x{%x}", $o) | ||||
306 | if utf8::native_to_unicode($o) < utf8::native_to_unicode(0x20) | ||||
307 | || utf8::native_to_unicode($o) > utf8::native_to_unicode(0x7e); | ||||
308 | } elsif (ord("A") == 65) { | ||||
309 | substr $arg, $i, 1, sprintf("\\x{%x}", $o) | ||||
310 | if $o < 0x20 || $o > 0x7e; | ||||
311 | } else { # Early EBCDIC | ||||
312 | |||||
313 | # 3 EBCDIC code pages supported then; all controls but one | ||||
314 | # are the code points below SPACE. The other one is 0x5F on | ||||
315 | # POSIX-BC; FF on the other two. | ||||
316 | substr $arg, $i, 1, sprintf("\\x{%x}", $o) | ||||
317 | if $o < ord(" ") || ((ord ("^") == 106) | ||||
318 | ? $o == 0x5f | ||||
319 | : $o == 0xff); | ||||
320 | } | ||||
321 | } | ||||
322 | } else { | ||||
323 | $arg =~ s/([\"\\\$\@])/\\$1/g; | ||||
324 | # This is all the ASCII printables spelled-out. It is portable to all | ||||
325 | # Perl versions and platforms (such as EBCDIC). There are other more | ||||
326 | # compact ways to do this, but may not work everywhere every version. | ||||
327 | $arg =~ s/([^ !"\$\%#'()*+,\-.\/0123456789:;<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz\{|}~])/sprintf("\\x{%x}",ord($1))/eg; | ||||
328 | } | ||||
329 | downgrade($arg, 1); | ||||
330 | return "\"".$arg."\"".$suffix; | ||||
331 | } | ||||
332 | |||||
333 | sub Regexp::CARP_TRACE { | ||||
334 | my $arg = "$_[0]"; | ||||
335 | downgrade($arg, 1); | ||||
336 | if(UTF8_REGEXP_PROBLEM && is_utf8($arg)) { | ||||
337 | for(my $i = length($arg); $i--; ) { | ||||
338 | my $o = ord(substr($arg, $i, 1)); | ||||
339 | my $x = substr($arg, 0, 0); # work around bug on Perl 5.8.{1,2} | ||||
340 | |||||
341 | # This code is repeated in format_arg() | ||||
342 | if ($] ge 5.007_003) { | ||||
343 | substr $arg, $i, 1, sprintf("\\x{%x}", $o) | ||||
344 | if utf8::native_to_unicode($o) < utf8::native_to_unicode(0x20) | ||||
345 | || utf8::native_to_unicode($o) > utf8::native_to_unicode(0x7e); | ||||
346 | } elsif (ord("A") == 65) { | ||||
347 | substr $arg, $i, 1, sprintf("\\x{%x}", $o) | ||||
348 | if $o < 0x20 || $o > 0x7e; | ||||
349 | } else { # Early EBCDIC | ||||
350 | substr $arg, $i, 1, sprintf("\\x{%x}", $o) | ||||
351 | if $o < ord(" ") || ((ord ("^") == 106) | ||||
352 | ? $o == 0x5f | ||||
353 | : $o == 0xff); | ||||
354 | } | ||||
355 | } | ||||
356 | } else { | ||||
357 | # See comment in format_arg() about this same regex. | ||||
358 | $arg =~ s/([^ !"\$\%#'()*+,\-.\/0123456789:;<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz\{|}~])/sprintf("\\x{%x}",ord($1))/eg; | ||||
359 | } | ||||
360 | downgrade($arg, 1); | ||||
361 | my $suffix = ""; | ||||
362 | if($arg =~ /\A\(\?\^?([a-z]*)(?:-[a-z]*)?:(.*)\)\z/s) { | ||||
363 | ($suffix, $arg) = ($1, $2); | ||||
364 | } | ||||
365 | if ( 2 < $MaxArgLen and $MaxArgLen < length($arg) ) { | ||||
366 | substr ( $arg, $MaxArgLen - 3 ) = ""; | ||||
367 | $suffix = "...".$suffix; | ||||
368 | } | ||||
369 | return "qr($arg)$suffix"; | ||||
370 | } | ||||
371 | |||||
372 | # Takes an inheritance cache and a package and returns | ||||
373 | # an anon hash of known inheritances and anon array of | ||||
374 | # inheritances which consequences have not been figured | ||||
375 | # for. | ||||
376 | sub get_status { | ||||
377 | my $cache = shift; | ||||
378 | my $pkg = shift; | ||||
379 | $cache->{$pkg} ||= [ { $pkg => $pkg }, [ trusts_directly($pkg) ] ]; | ||||
380 | return @{ $cache->{$pkg} }; | ||||
381 | } | ||||
382 | |||||
383 | # Takes the info from caller() and figures out the name of | ||||
384 | # the sub/require/eval | ||||
385 | sub get_subname { | ||||
386 | my $info = shift; | ||||
387 | if ( defined( $info->{evaltext} ) ) { | ||||
388 | my $eval = $info->{evaltext}; | ||||
389 | if ( $info->{is_require} ) { | ||||
390 | return "require $eval"; | ||||
391 | } | ||||
392 | else { | ||||
393 | $eval =~ s/([\\\'])/\\$1/g; | ||||
394 | return "eval '" . str_len_trim( $eval, $MaxEvalLen ) . "'"; | ||||
395 | } | ||||
396 | } | ||||
397 | |||||
398 | # this can happen on older perls when the sub (or the stash containing it) | ||||
399 | # has been deleted | ||||
400 | if ( !defined( $info->{sub} ) ) { | ||||
401 | return '__ANON__::__ANON__'; | ||||
402 | } | ||||
403 | |||||
404 | return ( $info->{sub} eq '(eval)' ) ? 'eval {...}' : $info->{sub}; | ||||
405 | } | ||||
406 | |||||
407 | # Figures out what call (from the point of view of the caller) | ||||
408 | # the long error backtrace should start at. | ||||
409 | sub long_error_loc { | ||||
410 | my $i; | ||||
411 | my $lvl = $CarpLevel; | ||||
412 | { | ||||
413 | ++$i; | ||||
414 | my $cgc = _cgc(); | ||||
415 | my @caller = $cgc ? $cgc->($i) : caller($i); | ||||
416 | my $pkg = $caller[0]; | ||||
417 | unless ( defined($pkg) ) { | ||||
418 | |||||
419 | # This *shouldn't* happen. | ||||
420 | if (%Internal) { | ||||
421 | local %Internal; | ||||
422 | $i = long_error_loc(); | ||||
423 | last; | ||||
424 | } | ||||
425 | elsif (defined $caller[2]) { | ||||
426 | # this can happen when the stash has been deleted | ||||
427 | # in that case, just assume that it's a reasonable place to | ||||
428 | # stop (the file and line data will still be intact in any | ||||
429 | # case) - the only issue is that we can't detect if the | ||||
430 | # deleted package was internal (so don't do that then) | ||||
431 | # -doy | ||||
432 | redo unless 0 > --$lvl; | ||||
433 | last; | ||||
434 | } | ||||
435 | else { | ||||
436 | return 2; | ||||
437 | } | ||||
438 | } | ||||
439 | redo if $CarpInternal{$pkg}; | ||||
440 | redo unless 0 > --$lvl; | ||||
441 | redo if $Internal{$pkg}; | ||||
442 | } | ||||
443 | return $i - 1; | ||||
444 | } | ||||
445 | |||||
446 | sub longmess_heavy { | ||||
447 | return @_ if ref( $_[0] ); # don't break references as exceptions | ||||
448 | my $i = long_error_loc(); | ||||
449 | return ret_backtrace( $i, @_ ); | ||||
450 | } | ||||
451 | |||||
452 | # Returns a full stack backtrace starting from where it is | ||||
453 | # told. | ||||
454 | sub ret_backtrace { | ||||
455 | my ( $i, @error ) = @_; | ||||
456 | my $mess; | ||||
457 | my $err = join '', @error; | ||||
458 | $i++; | ||||
459 | |||||
460 | my $tid_msg = ''; | ||||
461 | if ( defined &threads::tid ) { | ||||
462 | my $tid = threads->tid; | ||||
463 | $tid_msg = " thread $tid" if $tid; | ||||
464 | } | ||||
465 | |||||
466 | my %i = caller_info($i); | ||||
467 | $mess = "$err at $i{file} line $i{line}$tid_msg"; | ||||
468 | if( defined $. ) { | ||||
469 | local $@ = ''; | ||||
470 | local $SIG{__DIE__}; | ||||
471 | eval { | ||||
472 | CORE::die; | ||||
473 | }; | ||||
474 | if($@ =~ /^Died at .*(, <.*?> line \d+).$/ ) { | ||||
475 | $mess .= $1; | ||||
476 | } | ||||
477 | } | ||||
478 | $mess .= "\.\n"; | ||||
479 | |||||
480 | while ( my %i = caller_info( ++$i ) ) { | ||||
481 | $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n"; | ||||
482 | } | ||||
483 | |||||
484 | return $mess; | ||||
485 | } | ||||
486 | |||||
487 | sub ret_summary { | ||||
488 | my ( $i, @error ) = @_; | ||||
489 | my $err = join '', @error; | ||||
490 | $i++; | ||||
491 | |||||
492 | my $tid_msg = ''; | ||||
493 | if ( defined &threads::tid ) { | ||||
494 | my $tid = threads->tid; | ||||
495 | $tid_msg = " thread $tid" if $tid; | ||||
496 | } | ||||
497 | |||||
498 | my %i = caller_info($i); | ||||
499 | return "$err at $i{file} line $i{line}$tid_msg\.\n"; | ||||
500 | } | ||||
501 | |||||
502 | sub short_error_loc { | ||||
503 | # You have to create your (hash)ref out here, rather than defaulting it | ||||
504 | # inside trusts *on a lexical*, as you want it to persist across calls. | ||||
505 | # (You can default it on $_[2], but that gets messy) | ||||
506 | my $cache = {}; | ||||
507 | my $i = 1; | ||||
508 | my $lvl = $CarpLevel; | ||||
509 | { | ||||
510 | my $cgc = _cgc(); | ||||
511 | my $called = $cgc ? $cgc->($i) : caller($i); | ||||
512 | $i++; | ||||
513 | my $caller = $cgc ? $cgc->($i) : caller($i); | ||||
514 | |||||
515 | if (!defined($caller)) { | ||||
516 | my @caller = $cgc ? $cgc->($i) : caller($i); | ||||
517 | if (@caller) { | ||||
518 | # if there's no package but there is other caller info, then | ||||
519 | # the package has been deleted - treat this as a valid package | ||||
520 | # in this case | ||||
521 | redo if defined($called) && $CarpInternal{$called}; | ||||
522 | redo unless 0 > --$lvl; | ||||
523 | last; | ||||
524 | } | ||||
525 | else { | ||||
526 | return 0; | ||||
527 | } | ||||
528 | } | ||||
529 | redo if $Internal{$caller}; | ||||
530 | redo if $CarpInternal{$caller}; | ||||
531 | redo if $CarpInternal{$called}; | ||||
532 | redo if trusts( $called, $caller, $cache ); | ||||
533 | redo if trusts( $caller, $called, $cache ); | ||||
534 | redo unless 0 > --$lvl; | ||||
535 | } | ||||
536 | return $i - 1; | ||||
537 | } | ||||
538 | |||||
539 | sub shortmess_heavy { | ||||
540 | return longmess_heavy(@_) if $Verbose; | ||||
541 | return @_ if ref( $_[0] ); # don't break references as exceptions | ||||
542 | my $i = short_error_loc(); | ||||
543 | if ($i) { | ||||
544 | ret_summary( $i, @_ ); | ||||
545 | } | ||||
546 | else { | ||||
547 | longmess_heavy(@_); | ||||
548 | } | ||||
549 | } | ||||
550 | |||||
551 | # If a string is too long, trims it with ... | ||||
552 | sub str_len_trim { | ||||
553 | my $str = shift; | ||||
554 | my $max = shift || 0; | ||||
555 | if ( 2 < $max and $max < length($str) ) { | ||||
556 | substr( $str, $max - 3 ) = '...'; | ||||
557 | } | ||||
558 | return $str; | ||||
559 | } | ||||
560 | |||||
561 | # Takes two packages and an optional cache. Says whether the | ||||
562 | # first inherits from the second. | ||||
563 | # | ||||
564 | # Recursive versions of this have to work to avoid certain | ||||
565 | # possible endless loops, and when following long chains of | ||||
566 | # inheritance are less efficient. | ||||
567 | sub trusts { | ||||
568 | my $child = shift; | ||||
569 | my $parent = shift; | ||||
570 | my $cache = shift; | ||||
571 | my ( $known, $partial ) = get_status( $cache, $child ); | ||||
572 | |||||
573 | # Figure out consequences until we have an answer | ||||
574 | while ( @$partial and not exists $known->{$parent} ) { | ||||
575 | my $anc = shift @$partial; | ||||
576 | next if exists $known->{$anc}; | ||||
577 | $known->{$anc}++; | ||||
578 | my ( $anc_knows, $anc_partial ) = get_status( $cache, $anc ); | ||||
579 | my @found = keys %$anc_knows; | ||||
580 | @$known{@found} = (); | ||||
581 | push @$partial, @$anc_partial; | ||||
582 | } | ||||
583 | return exists $known->{$parent}; | ||||
584 | } | ||||
585 | |||||
586 | # Takes a package and gives a list of those trusted directly | ||||
587 | sub trusts_directly { | ||||
588 | my $class = shift; | ||||
589 | 2 | 84µs | 2 | 32µs | # spent 20µs (8+12) within Carp::BEGIN@589 which was called:
# once (8µs+12µs) by Pod::Usage::BEGIN@18 at line 589 # spent 20µs making 1 call to Carp::BEGIN@589
# spent 12µs making 1 call to strict::unimport |
590 | my $stash = \%{"$class\::"}; | ||||
591 | for my $var (qw/ CARP_NOT ISA /) { | ||||
592 | # Don't try using the variable until we know it exists, | ||||
593 | # to avoid polluting the caller's namespace. | ||||
594 | if ( $stash->{$var} && *{$stash->{$var}}{ARRAY} && @{$stash->{$var}} ) { | ||||
595 | return @{$stash->{$var}} | ||||
596 | } | ||||
597 | } | ||||
598 | return; | ||||
599 | } | ||||
600 | |||||
601 | 1 | 600ns | if(!defined($warnings::VERSION) || | ||
602 | 3 | 30µs | 2 | 25µs | # spent 16µs (8+8) within Carp::BEGIN@602 which was called:
# once (8µs+8µs) by Pod::Usage::BEGIN@18 at line 602 # spent 16µs making 1 call to Carp::BEGIN@602
# spent 8µs making 1 call to warnings::unimport |
603 | # Very old versions of warnings.pm import from Carp. This can go | ||||
604 | # wrong due to the circular dependency. If Carp is invoked before | ||||
605 | # warnings, then Carp starts by loading warnings, then warnings | ||||
606 | # tries to import from Carp, and gets nothing because Carp is in | ||||
607 | # the process of loading and hasn't defined its import method yet. | ||||
608 | # So we work around that by manually exporting to warnings here. | ||||
609 | 2 | 55µs | 2 | 26µs | # spent 16µs (6+10) within Carp::BEGIN@609 which was called:
# once (6µs+10µs) by Pod::Usage::BEGIN@18 at line 609 # spent 16µs making 1 call to Carp::BEGIN@609
# spent 10µs making 1 call to strict::unimport |
610 | *{"warnings::$_"} = \&$_ foreach @EXPORT; | ||||
611 | } | ||||
612 | |||||
613 | 1 | 9µs | 1; | ||
614 | |||||
615 | __END__ |