This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #127773: Assertion failure in perl built with Dusecbacktrace]
[perl5.git] / dump.c
... / ...
CommitLineData
1/* dump.c
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
9 */
10
11/*
12 * 'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and
13 * it has not been hard for me to read your mind and memory.'
14 *
15 * [p.220 of _The Lord of the Rings_, II/i: "Many Meetings"]
16 */
17
18/* This file contains utility routines to dump the contents of SV and OP
19 * structures, as used by command-line options like -Dt and -Dx, and
20 * by Devel::Peek.
21 *
22 * It also holds the debugging version of the runops function.
23
24=head1 Display and Dump functions
25 */
26
27#include "EXTERN.h"
28#define PERL_IN_DUMP_C
29#include "perl.h"
30#include "regcomp.h"
31
32static const char* const svtypenames[SVt_LAST] = {
33 "NULL",
34 "IV",
35 "NV",
36 "PV",
37 "INVLIST",
38 "PVIV",
39 "PVNV",
40 "PVMG",
41 "REGEXP",
42 "PVGV",
43 "PVLV",
44 "PVAV",
45 "PVHV",
46 "PVCV",
47 "PVFM",
48 "PVIO"
49};
50
51
52static const char* const svshorttypenames[SVt_LAST] = {
53 "UNDEF",
54 "IV",
55 "NV",
56 "PV",
57 "INVLST",
58 "PVIV",
59 "PVNV",
60 "PVMG",
61 "REGEXP",
62 "GV",
63 "PVLV",
64 "AV",
65 "HV",
66 "CV",
67 "FM",
68 "IO"
69};
70
71struct flag_to_name {
72 U32 flag;
73 const char *name;
74};
75
76static void
77S_append_flags(pTHX_ SV *sv, U32 flags, const struct flag_to_name *start,
78 const struct flag_to_name *const end)
79{
80 do {
81 if (flags & start->flag)
82 sv_catpv(sv, start->name);
83 } while (++start < end);
84}
85
86#define append_flags(sv, f, flags) \
87 S_append_flags(aTHX_ (sv), (f), (flags), C_ARRAY_END(flags))
88
89#define generic_pv_escape(sv,s,len,utf8) pv_escape( (sv), (s), (len), \
90 (len) * (4+UTF8_MAXBYTES) + 1, NULL, \
91 PERL_PV_ESCAPE_NONASCII | PERL_PV_ESCAPE_DWIM \
92 | ((utf8) ? PERL_PV_ESCAPE_UNI : 0) )
93
94/*
95=for apidoc pv_escape
96
97Escapes at most the first C<count> chars of C<pv> and puts the results into
98C<dsv> such that the size of the escaped string will not exceed C<max> chars
99and will not contain any incomplete escape sequences. The number of bytes
100escaped will be returned in the C<STRLEN *escaped> parameter if it is not null.
101When the C<dsv> parameter is null no escaping actually occurs, but the number
102of bytes that would be escaped were it not null will be calculated.
103
104If flags contains C<PERL_PV_ESCAPE_QUOTE> then any double quotes in the string
105will also be escaped.
106
107Normally the SV will be cleared before the escaped string is prepared,
108but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
109
110If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
111if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
112using C<is_utf8_string()> to determine if it is UTF-8.
113
114If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
115using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> is set, only
116non-ASCII chars will be escaped using this style; otherwise, only chars above
117255 will be so escaped; other non printable chars will use octal or
118common escaped patterns like C<\n>.
119Otherwise, if C<PERL_PV_ESCAPE_NOBACKSLASH>
120then all chars below 255 will be treated as printable and
121will be output as literals.
122
123If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
124string will be escaped, regardless of max. If the output is to be in hex,
125then it will be returned as a plain hex
126sequence. Thus the output will either be a single char,
127an octal escape sequence, a special escape like C<\n> or a hex value.
128
129If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a C<"%"> and
130not a C<"\\">. This is because regexes very often contain backslashed
131sequences, whereas C<"%"> is not a particularly common character in patterns.
132
133Returns a pointer to the escaped text as held by C<dsv>.
134
135=cut
136*/
137#define PV_ESCAPE_OCTBUFSIZE 32
138
139char *
140Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
141 const STRLEN count, const STRLEN max,
142 STRLEN * const escaped, const U32 flags )
143{
144 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
145 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
146 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
147 STRLEN wrote = 0; /* chars written so far */
148 STRLEN chsize = 0; /* size of data to be written */
149 STRLEN readsize = 1; /* size of data just read */
150 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
151 const char *pv = str;
152 const char * const end = pv + count; /* end of string */
153 octbuf[0] = esc;
154
155 PERL_ARGS_ASSERT_PV_ESCAPE;
156
157 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
158 /* This won't alter the UTF-8 flag */
159 sv_setpvs(dsv, "");
160 }
161
162 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
163 isuni = 1;
164
165 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
166 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
167 const U8 c = (U8)u & 0xFF;
168
169 if ( ( u > 255 )
170 || (flags & PERL_PV_ESCAPE_ALL)
171 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
172 {
173 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
174 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
175 "%"UVxf, u);
176 else
177 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
178 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
179 ? "%cx%02"UVxf
180 : "%cx{%02"UVxf"}", esc, u);
181
182 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
183 chsize = 1;
184 } else {
185 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
186 chsize = 2;
187 switch (c) {
188
189 case '\\' : /* FALLTHROUGH */
190 case '%' : if ( c == esc ) {
191 octbuf[1] = esc;
192 } else {
193 chsize = 1;
194 }
195 break;
196 case '\v' : octbuf[1] = 'v'; break;
197 case '\t' : octbuf[1] = 't'; break;
198 case '\r' : octbuf[1] = 'r'; break;
199 case '\n' : octbuf[1] = 'n'; break;
200 case '\f' : octbuf[1] = 'f'; break;
201 case '"' :
202 if ( dq == '"' )
203 octbuf[1] = '"';
204 else
205 chsize = 1;
206 break;
207 default:
208 if ( (flags & PERL_PV_ESCAPE_DWIM) && c != '\0' ) {
209 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
210 isuni ? "%cx{%02"UVxf"}" : "%cx%02"UVxf,
211 esc, u);
212 }
213 else if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
214 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
215 "%c%03o", esc, c);
216 else
217 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
218 "%c%o", esc, c);
219 }
220 } else {
221 chsize = 1;
222 }
223 }
224 if ( max && (wrote + chsize > max) ) {
225 break;
226 } else if (chsize > 1) {
227 if (dsv)
228 sv_catpvn(dsv, octbuf, chsize);
229 wrote += chsize;
230 } else {
231 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
232 can be appended raw to the dsv. If dsv happens to be
233 UTF-8 then we need catpvf to upgrade them for us.
234 Or add a new API call sv_catpvc(). Think about that name, and
235 how to keep it clear that it's unlike the s of catpvs, which is
236 really an array of octets, not a string. */
237 if (dsv)
238 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
239 wrote++;
240 }
241 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
242 break;
243 }
244 if (escaped != NULL)
245 *escaped= pv - str;
246 return dsv ? SvPVX(dsv) : NULL;
247}
248/*
249=for apidoc pv_pretty
250
251Converts a string into something presentable, handling escaping via
252C<pv_escape()> and supporting quoting and ellipses.
253
254If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
255double quoted with any double quotes in the string escaped. Otherwise
256if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
257angle brackets.
258
259If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
260string were output then an ellipsis C<...> will be appended to the
261string. Note that this happens AFTER it has been quoted.
262
263If C<start_color> is non-null then it will be inserted after the opening
264quote (if there is one) but before the escaped text. If C<end_color>
265is non-null then it will be inserted after the escaped text but before
266any quotes or ellipses.
267
268Returns a pointer to the prettified text as held by C<dsv>.
269
270=cut
271*/
272
273char *
274Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
275 const STRLEN max, char const * const start_color, char const * const end_color,
276 const U32 flags )
277{
278 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
279 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
280 STRLEN escaped;
281 STRLEN max_adjust= 0;
282 STRLEN orig_cur;
283
284 PERL_ARGS_ASSERT_PV_PRETTY;
285
286 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
287 /* This won't alter the UTF-8 flag */
288 sv_setpvs(dsv, "");
289 }
290 orig_cur= SvCUR(dsv);
291
292 if ( quotes )
293 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
294
295 if ( start_color != NULL )
296 sv_catpv(dsv, start_color);
297
298 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
299 if (quotes)
300 max_adjust += 2;
301 assert(max > max_adjust);
302 pv_escape( NULL, str, count, max - max_adjust, &escaped, flags );
303 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
304 max_adjust += 3;
305 assert(max > max_adjust);
306 }
307
308 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
309
310 if ( end_color != NULL )
311 sv_catpv(dsv, end_color);
312
313 if ( quotes )
314 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
315
316 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
317 sv_catpvs(dsv, "...");
318
319 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
320 while( SvCUR(dsv) - orig_cur < max )
321 sv_catpvs(dsv," ");
322 }
323
324 return SvPVX(dsv);
325}
326
327/*
328=for apidoc pv_display
329
330Similar to
331
332 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
333
334except that an additional "\0" will be appended to the string when
335len > cur and pv[cur] is "\0".
336
337Note that the final string may be up to 7 chars longer than pvlim.
338
339=cut
340*/
341
342char *
343Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
344{
345 PERL_ARGS_ASSERT_PV_DISPLAY;
346
347 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
348 if (len > cur && pv[cur] == '\0')
349 sv_catpvs( dsv, "\\0");
350 return SvPVX(dsv);
351}
352
353char *
354Perl_sv_peek(pTHX_ SV *sv)
355{
356 dVAR;
357 SV * const t = sv_newmortal();
358 int unref = 0;
359 U32 type;
360
361 sv_setpvs(t, "");
362 retry:
363 if (!sv) {
364 sv_catpv(t, "VOID");
365 goto finish;
366 }
367 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
368 /* detect data corruption under memory poisoning */
369 sv_catpv(t, "WILD");
370 goto finish;
371 }
372 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
373 if (sv == &PL_sv_undef) {
374 sv_catpv(t, "SV_UNDEF");
375 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
376 SVs_GMG|SVs_SMG|SVs_RMG)) &&
377 SvREADONLY(sv))
378 goto finish;
379 }
380 else if (sv == &PL_sv_no) {
381 sv_catpv(t, "SV_NO");
382 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
383 SVs_GMG|SVs_SMG|SVs_RMG)) &&
384 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
385 SVp_POK|SVp_NOK)) &&
386 SvCUR(sv) == 0 &&
387 SvNVX(sv) == 0.0)
388 goto finish;
389 }
390 else if (sv == &PL_sv_yes) {
391 sv_catpv(t, "SV_YES");
392 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
393 SVs_GMG|SVs_SMG|SVs_RMG)) &&
394 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
395 SVp_POK|SVp_NOK)) &&
396 SvCUR(sv) == 1 &&
397 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
398 SvNVX(sv) == 1.0)
399 goto finish;
400 }
401 else {
402 sv_catpv(t, "SV_PLACEHOLDER");
403 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
404 SVs_GMG|SVs_SMG|SVs_RMG)) &&
405 SvREADONLY(sv))
406 goto finish;
407 }
408 sv_catpv(t, ":");
409 }
410 else if (SvREFCNT(sv) == 0) {
411 sv_catpv(t, "(");
412 unref++;
413 }
414 else if (DEBUG_R_TEST_) {
415 int is_tmp = 0;
416 SSize_t ix;
417 /* is this SV on the tmps stack? */
418 for (ix=PL_tmps_ix; ix>=0; ix--) {
419 if (PL_tmps_stack[ix] == sv) {
420 is_tmp = 1;
421 break;
422 }
423 }
424 if (SvREFCNT(sv) > 1)
425 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
426 is_tmp ? "T" : "");
427 else if (is_tmp)
428 sv_catpv(t, "<T>");
429 }
430
431 if (SvROK(sv)) {
432 sv_catpv(t, "\\");
433 if (SvCUR(t) + unref > 10) {
434 SvCUR_set(t, unref + 3);
435 *SvEND(t) = '\0';
436 sv_catpv(t, "...");
437 goto finish;
438 }
439 sv = SvRV(sv);
440 goto retry;
441 }
442 type = SvTYPE(sv);
443 if (type == SVt_PVCV) {
444 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
445 GV* gvcv = CvGV(sv);
446 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
447 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
448 : "");
449 goto finish;
450 } else if (type < SVt_LAST) {
451 sv_catpv(t, svshorttypenames[type]);
452
453 if (type == SVt_NULL)
454 goto finish;
455 } else {
456 sv_catpv(t, "FREED");
457 goto finish;
458 }
459
460 if (SvPOKp(sv)) {
461 if (!SvPVX_const(sv))
462 sv_catpv(t, "(null)");
463 else {
464 SV * const tmp = newSVpvs("");
465 sv_catpv(t, "(");
466 if (SvOOK(sv)) {
467 STRLEN delta;
468 SvOOK_offset(sv, delta);
469 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
470 }
471 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
472 if (SvUTF8(sv))
473 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
474 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
475 UNI_DISPLAY_QQ));
476 SvREFCNT_dec_NN(tmp);
477 }
478 }
479 else if (SvNOKp(sv)) {
480 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
481 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
482 RESTORE_LC_NUMERIC_UNDERLYING();
483 }
484 else if (SvIOKp(sv)) {
485 if (SvIsUV(sv))
486 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
487 else
488 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
489 }
490 else
491 sv_catpv(t, "()");
492
493 finish:
494 while (unref--)
495 sv_catpv(t, ")");
496 if (TAINTING_get && sv && SvTAINTED(sv))
497 sv_catpv(t, " [tainted]");
498 return SvPV_nolen(t);
499}
500
501/*
502=head1 Debugging Utilities
503*/
504
505void
506Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
507{
508 va_list args;
509 PERL_ARGS_ASSERT_DUMP_INDENT;
510 va_start(args, pat);
511 dump_vindent(level, file, pat, &args);
512 va_end(args);
513}
514
515void
516Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
517{
518 PERL_ARGS_ASSERT_DUMP_VINDENT;
519 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
520 PerlIO_vprintf(file, pat, *args);
521}
522
523/*
524=for apidoc dump_all
525
526Dumps the entire optree of the current program starting at C<PL_main_root> to
527C<STDERR>. Also dumps the optrees for all visible subroutines in
528C<PL_defstash>.
529
530=cut
531*/
532
533void
534Perl_dump_all(pTHX)
535{
536 dump_all_perl(FALSE);
537}
538
539void
540Perl_dump_all_perl(pTHX_ bool justperl)
541{
542 PerlIO_setlinebuf(Perl_debug_log);
543 if (PL_main_root)
544 op_dump(PL_main_root);
545 dump_packsubs_perl(PL_defstash, justperl);
546}
547
548/*
549=for apidoc dump_packsubs
550
551Dumps the optrees for all visible subroutines in C<stash>.
552
553=cut
554*/
555
556void
557Perl_dump_packsubs(pTHX_ const HV *stash)
558{
559 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
560 dump_packsubs_perl(stash, FALSE);
561}
562
563void
564Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
565{
566 I32 i;
567
568 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
569
570 if (!HvARRAY(stash))
571 return;
572 for (i = 0; i <= (I32) HvMAX(stash); i++) {
573 const HE *entry;
574 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
575 GV * gv = (GV *)HeVAL(entry);
576 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
577 /* unfake a fake GV */
578 (void)CvGV(SvRV(gv));
579 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
580 continue;
581 if (GvCVu(gv))
582 dump_sub_perl(gv, justperl);
583 if (GvFORM(gv))
584 dump_form(gv);
585 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
586 const HV * const hv = GvHV(gv);
587 if (hv && (hv != PL_defstash))
588 dump_packsubs_perl(hv, justperl); /* nested package */
589 }
590 }
591 }
592}
593
594void
595Perl_dump_sub(pTHX_ const GV *gv)
596{
597 PERL_ARGS_ASSERT_DUMP_SUB;
598 dump_sub_perl(gv, FALSE);
599}
600
601void
602Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
603{
604 STRLEN len;
605 SV * const sv = newSVpvs_flags("", SVs_TEMP);
606 SV *tmpsv;
607 const char * name;
608
609 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
610
611 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
612 return;
613
614 tmpsv = newSVpvs_flags("", SVs_TEMP);
615 gv_fullname3(sv, gv, NULL);
616 name = SvPV_const(sv, len);
617 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
618 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
619 if (CvISXSUB(GvCV(gv)))
620 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
621 PTR2UV(CvXSUB(GvCV(gv))),
622 (int)CvXSUBANY(GvCV(gv)).any_i32);
623 else if (CvROOT(GvCV(gv)))
624 op_dump(CvROOT(GvCV(gv)));
625 else
626 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
627}
628
629void
630Perl_dump_form(pTHX_ const GV *gv)
631{
632 SV * const sv = sv_newmortal();
633
634 PERL_ARGS_ASSERT_DUMP_FORM;
635
636 gv_fullname3(sv, gv, NULL);
637 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
638 if (CvROOT(GvFORM(gv)))
639 op_dump(CvROOT(GvFORM(gv)));
640 else
641 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
642}
643
644void
645Perl_dump_eval(pTHX)
646{
647 op_dump(PL_eval_root);
648}
649
650void
651Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
652{
653 char ch;
654
655 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
656
657 if (!pm) {
658 Perl_dump_indent(aTHX_ level, file, "{}\n");
659 return;
660 }
661 Perl_dump_indent(aTHX_ level, file, "{\n");
662 level++;
663 if (pm->op_pmflags & PMf_ONCE)
664 ch = '?';
665 else
666 ch = '/';
667 if (PM_GETRE(pm))
668 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%.*s%c%s\n",
669 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch,
670 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
671 else
672 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
673 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
674 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
675 op_dump(pm->op_pmreplrootu.op_pmreplroot);
676 }
677 if (pm->op_code_list) {
678 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
679 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
680 do_op_dump(level, file, pm->op_code_list);
681 }
682 else
683 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
684 PTR2UV(pm->op_code_list));
685 }
686 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
687 SV * const tmpsv = pm_description(pm);
688 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
689 SvREFCNT_dec_NN(tmpsv);
690 }
691
692 Perl_dump_indent(aTHX_ level-1, file, "}\n");
693}
694
695const struct flag_to_name pmflags_flags_names[] = {
696 {PMf_CONST, ",CONST"},
697 {PMf_KEEP, ",KEEP"},
698 {PMf_GLOBAL, ",GLOBAL"},
699 {PMf_CONTINUE, ",CONTINUE"},
700 {PMf_RETAINT, ",RETAINT"},
701 {PMf_EVAL, ",EVAL"},
702 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
703 {PMf_HAS_CV, ",HAS_CV"},
704 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
705 {PMf_IS_QR, ",IS_QR"}
706};
707
708static SV *
709S_pm_description(pTHX_ const PMOP *pm)
710{
711 SV * const desc = newSVpvs("");
712 const REGEXP * const regex = PM_GETRE(pm);
713 const U32 pmflags = pm->op_pmflags;
714
715 PERL_ARGS_ASSERT_PM_DESCRIPTION;
716
717 if (pmflags & PMf_ONCE)
718 sv_catpv(desc, ",ONCE");
719#ifdef USE_ITHREADS
720 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
721 sv_catpv(desc, ":USED");
722#else
723 if (pmflags & PMf_USED)
724 sv_catpv(desc, ":USED");
725#endif
726
727 if (regex) {
728 if (RX_ISTAINTED(regex))
729 sv_catpv(desc, ",TAINTED");
730 if (RX_CHECK_SUBSTR(regex)) {
731 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
732 sv_catpv(desc, ",SCANFIRST");
733 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
734 sv_catpv(desc, ",ALL");
735 }
736 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
737 sv_catpv(desc, ",SKIPWHITE");
738 }
739
740 append_flags(desc, pmflags, pmflags_flags_names);
741 return desc;
742}
743
744void
745Perl_pmop_dump(pTHX_ PMOP *pm)
746{
747 do_pmop_dump(0, Perl_debug_log, pm);
748}
749
750/* Return a unique integer to represent the address of op o.
751 * If it already exists in PL_op_sequence, just return it;
752 * otherwise add it.
753 * *** Note that this isn't thread-safe */
754
755STATIC UV
756S_sequence_num(pTHX_ const OP *o)
757{
758 dVAR;
759 SV *op,
760 **seq;
761 const char *key;
762 STRLEN len;
763 if (!o)
764 return 0;
765 op = newSVuv(PTR2UV(o));
766 sv_2mortal(op);
767 key = SvPV_const(op, len);
768 if (!PL_op_sequence)
769 PL_op_sequence = newHV();
770 seq = hv_fetch(PL_op_sequence, key, len, 0);
771 if (seq)
772 return SvUV(*seq);
773 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
774 return PL_op_seq;
775}
776
777
778
779
780
781const struct flag_to_name op_flags_names[] = {
782 {OPf_KIDS, ",KIDS"},
783 {OPf_PARENS, ",PARENS"},
784 {OPf_REF, ",REF"},
785 {OPf_MOD, ",MOD"},
786 {OPf_STACKED, ",STACKED"},
787 {OPf_SPECIAL, ",SPECIAL"}
788};
789
790
791void
792Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
793{
794 UV seq;
795 const OPCODE optype = o->op_type;
796
797 PERL_ARGS_ASSERT_DO_OP_DUMP;
798
799 Perl_dump_indent(aTHX_ level, file, "{\n");
800 level++;
801 seq = sequence_num(o);
802 if (seq)
803 PerlIO_printf(file, "%-4"UVuf, seq);
804 else
805 PerlIO_printf(file, "????");
806 PerlIO_printf(file,
807 "%*sTYPE = %s ===> ",
808 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
809 if (o->op_next)
810 PerlIO_printf(file,
811 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
812 sequence_num(o->op_next));
813 else
814 PerlIO_printf(file, "NULL\n");
815 if (o->op_targ) {
816 if (optype == OP_NULL) {
817 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
818 }
819 else
820 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
821 }
822#ifdef DUMPADDR
823 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
824#endif
825
826 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
827 SV * const tmpsv = newSVpvs("");
828 switch (o->op_flags & OPf_WANT) {
829 case OPf_WANT_VOID:
830 sv_catpv(tmpsv, ",VOID");
831 break;
832 case OPf_WANT_SCALAR:
833 sv_catpv(tmpsv, ",SCALAR");
834 break;
835 case OPf_WANT_LIST:
836 sv_catpv(tmpsv, ",LIST");
837 break;
838 default:
839 sv_catpv(tmpsv, ",UNKNOWN");
840 break;
841 }
842 append_flags(tmpsv, o->op_flags, op_flags_names);
843 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
844 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
845 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
846 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
847 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
848 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
849 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
850 }
851
852 if (o->op_private) {
853 U16 oppriv = o->op_private;
854 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
855 SV * tmpsv = NULL;
856
857 if (op_ix != -1) {
858 U16 stop = 0;
859 tmpsv = newSVpvs("");
860 for (; !stop; op_ix++) {
861 U16 entry = PL_op_private_bitdefs[op_ix];
862 U16 bit = (entry >> 2) & 7;
863 U16 ix = entry >> 5;
864
865 stop = (entry & 1);
866
867 if (entry & 2) {
868 /* bitfield */
869 I16 const *p = &PL_op_private_bitfields[ix];
870 U16 bitmin = (U16) *p++;
871 I16 label = *p++;
872 I16 enum_label;
873 U16 mask = 0;
874 U16 i;
875 U16 val;
876
877 for (i = bitmin; i<= bit; i++)
878 mask |= (1<<i);
879 bit = bitmin;
880 val = (oppriv & mask);
881
882 if ( label != -1
883 && PL_op_private_labels[label] == '-'
884 && PL_op_private_labels[label+1] == '\0'
885 )
886 /* display as raw number */
887 continue;
888
889 oppriv -= val;
890 val >>= bit;
891 enum_label = -1;
892 while (*p != -1) {
893 if (val == *p++) {
894 enum_label = *p;
895 break;
896 }
897 p++;
898 }
899 if (val == 0 && enum_label == -1)
900 /* don't display anonymous zero values */
901 continue;
902
903 sv_catpv(tmpsv, ",");
904 if (label != -1) {
905 sv_catpv(tmpsv, &PL_op_private_labels[label]);
906 sv_catpv(tmpsv, "=");
907 }
908 if (enum_label == -1)
909 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)val);
910 else
911 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
912
913 }
914 else {
915 /* bit flag */
916 if ( oppriv & (1<<bit)
917 && !(PL_op_private_labels[ix] == '-'
918 && PL_op_private_labels[ix+1] == '\0'))
919 {
920 oppriv -= (1<<bit);
921 sv_catpv(tmpsv, ",");
922 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
923 }
924 }
925 }
926 if (oppriv) {
927 sv_catpv(tmpsv, ",");
928 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)oppriv);
929 }
930 }
931 if (tmpsv && SvCUR(tmpsv)) {
932 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
933 } else
934 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
935 (UV)oppriv);
936 }
937
938 switch (optype) {
939 case OP_AELEMFAST:
940 case OP_GVSV:
941 case OP_GV:
942#ifdef USE_ITHREADS
943 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
944#else
945 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
946 if (cSVOPo->op_sv) {
947 STRLEN len;
948 const char * name;
949 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
950 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
951 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
952 name = SvPV_const(tmpsv, len);
953 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
954 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
955 }
956 else
957 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
958 }
959#endif
960 break;
961
962 case OP_MULTIDEREF:
963 {
964 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
965 UV i, count = items[-1].uv;
966
967 Perl_dump_indent(aTHX_ level, file, "ARGS = \n");
968 for (i=0; i < count; i++)
969 Perl_dump_indent(aTHX_ level+1, file, "%"UVuf" => 0x%"UVxf"\n",
970 i, items[i].uv);
971 break;
972 }
973
974 case OP_CONST:
975 case OP_HINTSEVAL:
976 case OP_METHOD_NAMED:
977 case OP_METHOD_SUPER:
978 case OP_METHOD_REDIR:
979 case OP_METHOD_REDIR_SUPER:
980#ifndef USE_ITHREADS
981 /* with ITHREADS, consts are stored in the pad, and the right pad
982 * may not be active here, so skip */
983 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cMETHOPx_meth(o)));
984#endif
985 break;
986 case OP_NULL:
987 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
988 break;
989 /* FALLTHROUGH */
990 case OP_NEXTSTATE:
991 case OP_DBSTATE:
992 if (CopLINE(cCOPo))
993 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
994 (UV)CopLINE(cCOPo));
995 if (CopSTASHPV(cCOPo)) {
996 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
997 HV *stash = CopSTASH(cCOPo);
998 const char * const hvname = HvNAME_get(stash);
999
1000 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1001 generic_pv_escape(tmpsv, hvname,
1002 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1003 }
1004 if (CopLABEL(cCOPo)) {
1005 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1006 STRLEN label_len;
1007 U32 label_flags;
1008 const char *label = CopLABEL_len_flags(cCOPo,
1009 &label_len, &label_flags);
1010 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1011 generic_pv_escape( tmpsv, label, label_len,
1012 (label_flags & SVf_UTF8)));
1013 }
1014 Perl_dump_indent(aTHX_ level, file, "SEQ = %u\n",
1015 (unsigned int)cCOPo->cop_seq);
1016 break;
1017 case OP_ENTERLOOP:
1018 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1019 if (cLOOPo->op_redoop)
1020 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1021 else
1022 PerlIO_printf(file, "DONE\n");
1023 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1024 if (cLOOPo->op_nextop)
1025 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1026 else
1027 PerlIO_printf(file, "DONE\n");
1028 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1029 if (cLOOPo->op_lastop)
1030 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1031 else
1032 PerlIO_printf(file, "DONE\n");
1033 break;
1034 case OP_COND_EXPR:
1035 case OP_RANGE:
1036 case OP_MAPWHILE:
1037 case OP_GREPWHILE:
1038 case OP_OR:
1039 case OP_AND:
1040 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1041 if (cLOGOPo->op_other)
1042 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1043 else
1044 PerlIO_printf(file, "DONE\n");
1045 break;
1046 case OP_PUSHRE:
1047 case OP_MATCH:
1048 case OP_QR:
1049 case OP_SUBST:
1050 do_pmop_dump(level, file, cPMOPo);
1051 break;
1052 case OP_LEAVE:
1053 case OP_LEAVEEVAL:
1054 case OP_LEAVESUB:
1055 case OP_LEAVESUBLV:
1056 case OP_LEAVEWRITE:
1057 case OP_SCOPE:
1058 if (o->op_private & OPpREFCOUNTED)
1059 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1060 break;
1061 default:
1062 break;
1063 }
1064 if (o->op_flags & OPf_KIDS) {
1065 OP *kid;
1066 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1067 do_op_dump(level, file, kid);
1068 }
1069 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1070}
1071
1072/*
1073=for apidoc op_dump
1074
1075Dumps the optree starting at OP C<o> to C<STDERR>.
1076
1077=cut
1078*/
1079
1080void
1081Perl_op_dump(pTHX_ const OP *o)
1082{
1083 PERL_ARGS_ASSERT_OP_DUMP;
1084 do_op_dump(0, Perl_debug_log, o);
1085}
1086
1087void
1088Perl_gv_dump(pTHX_ GV *gv)
1089{
1090 STRLEN len;
1091 const char* name;
1092 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1093
1094 if (!gv) {
1095 PerlIO_printf(Perl_debug_log, "{}\n");
1096 return;
1097 }
1098 sv = sv_newmortal();
1099 PerlIO_printf(Perl_debug_log, "{\n");
1100 gv_fullname3(sv, gv, NULL);
1101 name = SvPV_const(sv, len);
1102 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1103 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1104 if (gv != GvEGV(gv)) {
1105 gv_efullname3(sv, GvEGV(gv), NULL);
1106 name = SvPV_const(sv, len);
1107 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1108 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1109 }
1110 (void)PerlIO_putc(Perl_debug_log, '\n');
1111 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1112}
1113
1114
1115/* map magic types to the symbolic names
1116 * (with the PERL_MAGIC_ prefixed stripped)
1117 */
1118
1119static const struct { const char type; const char *name; } magic_names[] = {
1120#include "mg_names.inc"
1121 /* this null string terminates the list */
1122 { 0, NULL },
1123};
1124
1125void
1126Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1127{
1128 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1129
1130 for (; mg; mg = mg->mg_moremagic) {
1131 Perl_dump_indent(aTHX_ level, file,
1132 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1133 if (mg->mg_virtual) {
1134 const MGVTBL * const v = mg->mg_virtual;
1135 if (v >= PL_magic_vtables
1136 && v < PL_magic_vtables + magic_vtable_max) {
1137 const U32 i = v - PL_magic_vtables;
1138 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1139 }
1140 else
1141 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1142 }
1143 else
1144 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1145
1146 if (mg->mg_private)
1147 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1148
1149 {
1150 int n;
1151 const char *name = NULL;
1152 for (n = 0; magic_names[n].name; n++) {
1153 if (mg->mg_type == magic_names[n].type) {
1154 name = magic_names[n].name;
1155 break;
1156 }
1157 }
1158 if (name)
1159 Perl_dump_indent(aTHX_ level, file,
1160 " MG_TYPE = PERL_MAGIC_%s\n", name);
1161 else
1162 Perl_dump_indent(aTHX_ level, file,
1163 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1164 }
1165
1166 if (mg->mg_flags) {
1167 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1168 if (mg->mg_type == PERL_MAGIC_envelem &&
1169 mg->mg_flags & MGf_TAINTEDDIR)
1170 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1171 if (mg->mg_type == PERL_MAGIC_regex_global &&
1172 mg->mg_flags & MGf_MINMATCH)
1173 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1174 if (mg->mg_flags & MGf_REFCOUNTED)
1175 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1176 if (mg->mg_flags & MGf_GSKIP)
1177 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1178 if (mg->mg_flags & MGf_COPY)
1179 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1180 if (mg->mg_flags & MGf_DUP)
1181 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1182 if (mg->mg_flags & MGf_LOCAL)
1183 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1184 if (mg->mg_type == PERL_MAGIC_regex_global &&
1185 mg->mg_flags & MGf_BYTES)
1186 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1187 }
1188 if (mg->mg_obj) {
1189 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1190 PTR2UV(mg->mg_obj));
1191 if (mg->mg_type == PERL_MAGIC_qr) {
1192 REGEXP* const re = (REGEXP *)mg->mg_obj;
1193 SV * const dsv = sv_newmortal();
1194 const char * const s
1195 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1196 60, NULL, NULL,
1197 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1198 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1199 );
1200 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1201 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1202 (IV)RX_REFCNT(re));
1203 }
1204 if (mg->mg_flags & MGf_REFCOUNTED)
1205 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1206 }
1207 if (mg->mg_len)
1208 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1209 if (mg->mg_ptr) {
1210 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1211 if (mg->mg_len >= 0) {
1212 if (mg->mg_type != PERL_MAGIC_utf8) {
1213 SV * const sv = newSVpvs("");
1214 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1215 SvREFCNT_dec_NN(sv);
1216 }
1217 }
1218 else if (mg->mg_len == HEf_SVKEY) {
1219 PerlIO_puts(file, " => HEf_SVKEY\n");
1220 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1221 maxnest, dumpops, pvlim); /* MG is already +1 */
1222 continue;
1223 }
1224 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1225 else
1226 PerlIO_puts(
1227 file,
1228 " ???? - " __FILE__
1229 " does not know how to handle this MG_LEN"
1230 );
1231 (void)PerlIO_putc(file, '\n');
1232 }
1233 if (mg->mg_type == PERL_MAGIC_utf8) {
1234 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1235 if (cache) {
1236 IV i;
1237 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1238 Perl_dump_indent(aTHX_ level, file,
1239 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1240 i,
1241 (UV)cache[i * 2],
1242 (UV)cache[i * 2 + 1]);
1243 }
1244 }
1245 }
1246}
1247
1248void
1249Perl_magic_dump(pTHX_ const MAGIC *mg)
1250{
1251 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1252}
1253
1254void
1255Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1256{
1257 const char *hvname;
1258
1259 PERL_ARGS_ASSERT_DO_HV_DUMP;
1260
1261 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1262 if (sv && (hvname = HvNAME_get(sv)))
1263 {
1264 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1265 name which quite legally could contain insane things like tabs, newlines, nulls or
1266 other scary crap - this should produce sane results - except maybe for unicode package
1267 names - but we will wait for someone to file a bug on that - demerphq */
1268 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1269 PerlIO_printf(file, "\t\"%s\"\n",
1270 generic_pv_escape( tmpsv, hvname,
1271 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1272 }
1273 else
1274 (void)PerlIO_putc(file, '\n');
1275}
1276
1277void
1278Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1279{
1280 PERL_ARGS_ASSERT_DO_GV_DUMP;
1281
1282 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1283 if (sv && GvNAME(sv)) {
1284 SV * const tmpsv = newSVpvs("");
1285 PerlIO_printf(file, "\t\"%s\"\n",
1286 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1287 }
1288 else
1289 (void)PerlIO_putc(file, '\n');
1290}
1291
1292void
1293Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1294{
1295 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1296
1297 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1298 if (sv && GvNAME(sv)) {
1299 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1300 const char *hvname;
1301 HV * const stash = GvSTASH(sv);
1302 PerlIO_printf(file, "\t");
1303 /* TODO might have an extra \" here */
1304 if (stash && (hvname = HvNAME_get(stash))) {
1305 PerlIO_printf(file, "\"%s\" :: \"",
1306 generic_pv_escape(tmp, hvname,
1307 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1308 }
1309 PerlIO_printf(file, "%s\"\n",
1310 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1311 }
1312 else
1313 (void)PerlIO_putc(file, '\n');
1314}
1315
1316const struct flag_to_name first_sv_flags_names[] = {
1317 {SVs_TEMP, "TEMP,"},
1318 {SVs_OBJECT, "OBJECT,"},
1319 {SVs_GMG, "GMG,"},
1320 {SVs_SMG, "SMG,"},
1321 {SVs_RMG, "RMG,"},
1322 {SVf_IOK, "IOK,"},
1323 {SVf_NOK, "NOK,"},
1324 {SVf_POK, "POK,"}
1325};
1326
1327const struct flag_to_name second_sv_flags_names[] = {
1328 {SVf_OOK, "OOK,"},
1329 {SVf_FAKE, "FAKE,"},
1330 {SVf_READONLY, "READONLY,"},
1331 {SVf_PROTECT, "PROTECT,"},
1332 {SVf_BREAK, "BREAK,"},
1333 {SVp_IOK, "pIOK,"},
1334 {SVp_NOK, "pNOK,"},
1335 {SVp_POK, "pPOK,"}
1336};
1337
1338const struct flag_to_name cv_flags_names[] = {
1339 {CVf_ANON, "ANON,"},
1340 {CVf_UNIQUE, "UNIQUE,"},
1341 {CVf_CLONE, "CLONE,"},
1342 {CVf_CLONED, "CLONED,"},
1343 {CVf_CONST, "CONST,"},
1344 {CVf_NODEBUG, "NODEBUG,"},
1345 {CVf_LVALUE, "LVALUE,"},
1346 {CVf_METHOD, "METHOD,"},
1347 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1348 {CVf_CVGV_RC, "CVGV_RC,"},
1349 {CVf_DYNFILE, "DYNFILE,"},
1350 {CVf_AUTOLOAD, "AUTOLOAD,"},
1351 {CVf_HASEVAL, "HASEVAL,"},
1352 {CVf_SLABBED, "SLABBED,"},
1353 {CVf_NAMED, "NAMED,"},
1354 {CVf_LEXICAL, "LEXICAL,"},
1355 {CVf_ISXSUB, "ISXSUB,"}
1356};
1357
1358const struct flag_to_name hv_flags_names[] = {
1359 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1360 {SVphv_LAZYDEL, "LAZYDEL,"},
1361 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1362 {SVf_AMAGIC, "OVERLOAD,"},
1363 {SVphv_CLONEABLE, "CLONEABLE,"}
1364};
1365
1366const struct flag_to_name gp_flags_names[] = {
1367 {GVf_INTRO, "INTRO,"},
1368 {GVf_MULTI, "MULTI,"},
1369 {GVf_ASSUMECV, "ASSUMECV,"},
1370};
1371
1372const struct flag_to_name gp_flags_imported_names[] = {
1373 {GVf_IMPORTED_SV, " SV"},
1374 {GVf_IMPORTED_AV, " AV"},
1375 {GVf_IMPORTED_HV, " HV"},
1376 {GVf_IMPORTED_CV, " CV"},
1377};
1378
1379/* NOTE: this structure is mostly duplicative of one generated by
1380 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1381 * the two. - Yves */
1382const struct flag_to_name regexp_extflags_names[] = {
1383 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1384 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1385 {RXf_PMf_FOLD, "PMf_FOLD,"},
1386 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1387 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1388 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1389 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1390 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1391 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1392 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1393 {RXf_CHECK_ALL, "CHECK_ALL,"},
1394 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1395 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1396 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1397 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1398 {RXf_SPLIT, "SPLIT,"},
1399 {RXf_COPY_DONE, "COPY_DONE,"},
1400 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1401 {RXf_TAINTED, "TAINTED,"},
1402 {RXf_START_ONLY, "START_ONLY,"},
1403 {RXf_SKIPWHITE, "SKIPWHITE,"},
1404 {RXf_WHITE, "WHITE,"},
1405 {RXf_NULL, "NULL,"},
1406};
1407
1408/* NOTE: this structure is mostly duplicative of one generated by
1409 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1410 * the two. - Yves */
1411const struct flag_to_name regexp_core_intflags_names[] = {
1412 {PREGf_SKIP, "SKIP,"},
1413 {PREGf_IMPLICIT, "IMPLICIT,"},
1414 {PREGf_NAUGHTY, "NAUGHTY,"},
1415 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1416 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1417 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1418 {PREGf_NOSCAN, "NOSCAN,"},
1419 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1420 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1421 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1422 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1423 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1424};
1425
1426/* Perl_do_sv_dump():
1427 *
1428 * level: amount to indent the output
1429 * sv: the object to dump
1430 * nest: the current level of recursion
1431 * maxnest: the maximum allowed level of recursion
1432 * dumpops: if true, also dump the ops associated with a CV
1433 * pvlim: limit on the length of any strings that are output
1434 * */
1435
1436void
1437Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1438{
1439 SV *d;
1440 const char *s;
1441 U32 flags;
1442 U32 type;
1443
1444 PERL_ARGS_ASSERT_DO_SV_DUMP;
1445
1446 if (!sv) {
1447 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1448 return;
1449 }
1450
1451 flags = SvFLAGS(sv);
1452 type = SvTYPE(sv);
1453
1454 /* process general SV flags */
1455
1456 d = Perl_newSVpvf(aTHX_
1457 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1458 PTR2UV(SvANY(sv)), PTR2UV(sv),
1459 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1460 (int)(PL_dumpindent*level), "");
1461
1462 if ((flags & SVs_PADSTALE))
1463 sv_catpv(d, "PADSTALE,");
1464 if ((flags & SVs_PADTMP))
1465 sv_catpv(d, "PADTMP,");
1466 append_flags(d, flags, first_sv_flags_names);
1467 if (flags & SVf_ROK) {
1468 sv_catpv(d, "ROK,");
1469 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1470 }
1471 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1472 append_flags(d, flags, second_sv_flags_names);
1473 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1474 && type != SVt_PVAV) {
1475 if (SvPCS_IMPORTED(sv))
1476 sv_catpv(d, "PCS_IMPORTED,");
1477 else
1478 sv_catpv(d, "SCREAM,");
1479 }
1480
1481 /* process type-specific SV flags */
1482
1483 switch (type) {
1484 case SVt_PVCV:
1485 case SVt_PVFM:
1486 append_flags(d, CvFLAGS(sv), cv_flags_names);
1487 break;
1488 case SVt_PVHV:
1489 append_flags(d, flags, hv_flags_names);
1490 break;
1491 case SVt_PVGV:
1492 case SVt_PVLV:
1493 if (isGV_with_GP(sv)) {
1494 append_flags(d, GvFLAGS(sv), gp_flags_names);
1495 }
1496 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1497 sv_catpv(d, "IMPORT");
1498 if (GvIMPORTED(sv) == GVf_IMPORTED)
1499 sv_catpv(d, "ALL,");
1500 else {
1501 sv_catpv(d, "(");
1502 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1503 sv_catpv(d, " ),");
1504 }
1505 }
1506 /* FALLTHROUGH */
1507 default:
1508 evaled_or_uv:
1509 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1510 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1511 break;
1512 case SVt_PVMG:
1513 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1514 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1515 /* FALLTHROUGH */
1516 goto evaled_or_uv;
1517 case SVt_PVAV:
1518 break;
1519 }
1520 /* SVphv_SHAREKEYS is also 0x20000000 */
1521 if ((type != SVt_PVHV) && SvUTF8(sv))
1522 sv_catpv(d, "UTF8");
1523
1524 if (*(SvEND(d) - 1) == ',') {
1525 SvCUR_set(d, SvCUR(d) - 1);
1526 SvPVX(d)[SvCUR(d)] = '\0';
1527 }
1528 sv_catpv(d, ")");
1529 s = SvPVX_const(d);
1530
1531 /* dump initial SV details */
1532
1533#ifdef DEBUG_LEAKING_SCALARS
1534 Perl_dump_indent(aTHX_ level, file,
1535 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1536 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1537 sv->sv_debug_line,
1538 sv->sv_debug_inpad ? "for" : "by",
1539 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1540 PTR2UV(sv->sv_debug_parent),
1541 sv->sv_debug_serial
1542 );
1543#endif
1544 Perl_dump_indent(aTHX_ level, file, "SV = ");
1545
1546 /* Dump SV type */
1547
1548 if (type < SVt_LAST) {
1549 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1550
1551 if (type == SVt_NULL) {
1552 SvREFCNT_dec_NN(d);
1553 return;
1554 }
1555 } else {
1556 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1557 SvREFCNT_dec_NN(d);
1558 return;
1559 }
1560
1561 /* Dump general SV fields */
1562
1563 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1564 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1565 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1566 || (type == SVt_IV && !SvROK(sv))) {
1567 if (SvIsUV(sv)
1568 )
1569 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1570 else
1571 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1572 (void)PerlIO_putc(file, '\n');
1573 }
1574
1575 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1576 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1577 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1578 || type == SVt_NV) {
1579 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1580 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1581 RESTORE_LC_NUMERIC_UNDERLYING();
1582 }
1583
1584 if (SvROK(sv)) {
1585 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1586 if (nest < maxnest)
1587 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1588 }
1589
1590 if (type < SVt_PV) {
1591 SvREFCNT_dec_NN(d);
1592 return;
1593 }
1594
1595 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1596 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1597 const bool re = isREGEXP(sv);
1598 const char * const ptr =
1599 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1600 if (ptr) {
1601 STRLEN delta;
1602 if (SvOOK(sv)) {
1603 SvOOK_offset(sv, delta);
1604 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1605 (UV) delta);
1606 } else {
1607 delta = 0;
1608 }
1609 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
1610 if (SvOOK(sv)) {
1611 PerlIO_printf(file, "( %s . ) ",
1612 pv_display(d, ptr - delta, delta, 0,
1613 pvlim));
1614 }
1615 if (type == SVt_INVLIST) {
1616 PerlIO_printf(file, "\n");
1617 /* 4 blanks indents 2 beyond the PV, etc */
1618 _invlist_dump(file, level, " ", sv);
1619 }
1620 else {
1621 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1622 re ? 0 : SvLEN(sv),
1623 pvlim));
1624 if (SvUTF8(sv)) /* the 6? \x{....} */
1625 PerlIO_printf(file, " [UTF8 \"%s\"]",
1626 sv_uni_display(d, sv, 6 * SvCUR(sv),
1627 UNI_DISPLAY_QQ));
1628 PerlIO_printf(file, "\n");
1629 }
1630 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1631 if (!re)
1632 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1633 (IV)SvLEN(sv));
1634#ifdef PERL_COPY_ON_WRITE
1635 if (SvIsCOW(sv) && SvLEN(sv))
1636 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1637 CowREFCNT(sv));
1638#endif
1639 }
1640 else
1641 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1642 }
1643
1644 if (type >= SVt_PVMG) {
1645 if (SvMAGIC(sv))
1646 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1647 if (SvSTASH(sv))
1648 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1649
1650 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1651 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1652 }
1653 }
1654
1655 /* Dump type-specific SV fields */
1656
1657 switch (type) {
1658 case SVt_PVAV:
1659 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1660 if (AvARRAY(sv) != AvALLOC(sv)) {
1661 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1662 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1663 }
1664 else
1665 (void)PerlIO_putc(file, '\n');
1666 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1667 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1668 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n",
1669 SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1670 sv_setpvs(d, "");
1671 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1672 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1673 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1674 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1675 if (nest < maxnest && av_tindex(MUTABLE_AV(sv)) >= 0) {
1676 SSize_t count;
1677 for (count = 0; count <= av_tindex(MUTABLE_AV(sv)) && count < maxnest; count++) {
1678 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
1679
1680 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1681 if (elt)
1682 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1683 }
1684 }
1685 break;
1686 case SVt_PVHV: {
1687 U32 usedkeys;
1688 if (SvOOK(sv)) {
1689 struct xpvhv_aux *const aux = HvAUX(sv);
1690 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %"UVuf"\n",
1691 (UV)aux->xhv_aux_flags);
1692 }
1693 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1694 usedkeys = HvUSEDKEYS(sv);
1695 if (HvARRAY(sv) && usedkeys) {
1696 /* Show distribution of HEs in the ARRAY */
1697 int freq[200];
1698#define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1699 int i;
1700 int max = 0;
1701 U32 pow2 = 2, keys = usedkeys;
1702 NV theoret, sum = 0;
1703
1704 PerlIO_printf(file, " (");
1705 Zero(freq, FREQ_MAX + 1, int);
1706 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1707 HE* h;
1708 int count = 0;
1709 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1710 count++;
1711 if (count > FREQ_MAX)
1712 count = FREQ_MAX;
1713 freq[count]++;
1714 if (max < count)
1715 max = count;
1716 }
1717 for (i = 0; i <= max; i++) {
1718 if (freq[i]) {
1719 PerlIO_printf(file, "%d%s:%d", i,
1720 (i == FREQ_MAX) ? "+" : "",
1721 freq[i]);
1722 if (i != max)
1723 PerlIO_printf(file, ", ");
1724 }
1725 }
1726 (void)PerlIO_putc(file, ')');
1727 /* The "quality" of a hash is defined as the total number of
1728 comparisons needed to access every element once, relative
1729 to the expected number needed for a random hash.
1730
1731 The total number of comparisons is equal to the sum of
1732 the squares of the number of entries in each bucket.
1733 For a random hash of n keys into k buckets, the expected
1734 value is
1735 n + n(n-1)/2k
1736 */
1737
1738 for (i = max; i > 0; i--) { /* Precision: count down. */
1739 sum += freq[i] * i * i;
1740 }
1741 while ((keys = keys >> 1))
1742 pow2 = pow2 << 1;
1743 theoret = usedkeys;
1744 theoret += theoret * (theoret-1)/pow2;
1745 (void)PerlIO_putc(file, '\n');
1746 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1747 }
1748 (void)PerlIO_putc(file, '\n');
1749 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)usedkeys);
1750 {
1751 STRLEN count = 0;
1752 HE **ents = HvARRAY(sv);
1753
1754 if (ents) {
1755 HE *const *const last = ents + HvMAX(sv);
1756 count = last + 1 - ents;
1757
1758 do {
1759 if (!*ents)
1760 --count;
1761 } while (++ents <= last);
1762 }
1763
1764 if (SvOOK(sv)) {
1765 struct xpvhv_aux *const aux = HvAUX(sv);
1766 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf
1767 " (cached = %"UVuf")\n",
1768 (UV)count, (UV)aux->xhv_fill_lazy);
1769 } else {
1770 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1771 (UV)count);
1772 }
1773 }
1774 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1775 if (SvOOK(sv)) {
1776 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1777 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1778#ifdef PERL_HASH_RANDOMIZE_KEYS
1779 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1780 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1781 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
1782 }
1783#endif
1784 (void)PerlIO_putc(file, '\n');
1785 }
1786 {
1787 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1788 if (mg && mg->mg_obj) {
1789 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1790 }
1791 }
1792 {
1793 const char * const hvname = HvNAME_get(sv);
1794 if (hvname) {
1795 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1796 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1797 generic_pv_escape( tmpsv, hvname,
1798 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1799 }
1800 }
1801 if (SvOOK(sv)) {
1802 AV * const backrefs
1803 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1804 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1805 if (HvAUX(sv)->xhv_name_count)
1806 Perl_dump_indent(aTHX_
1807 level, file, " NAMECOUNT = %"IVdf"\n",
1808 (IV)HvAUX(sv)->xhv_name_count
1809 );
1810 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1811 const I32 count = HvAUX(sv)->xhv_name_count;
1812 if (count) {
1813 SV * const names = newSVpvs_flags("", SVs_TEMP);
1814 /* The starting point is the first element if count is
1815 positive and the second element if count is negative. */
1816 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1817 + (count < 0 ? 1 : 0);
1818 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1819 + (count < 0 ? -count : count);
1820 while (hekp < endp) {
1821 if (HEK_LEN(*hekp)) {
1822 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1823 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1824 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
1825 } else {
1826 /* This should never happen. */
1827 sv_catpvs(names, ", (null)");
1828 }
1829 ++hekp;
1830 }
1831 Perl_dump_indent(aTHX_
1832 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1833 );
1834 }
1835 else {
1836 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1837 const char *const hvename = HvENAME_get(sv);
1838 Perl_dump_indent(aTHX_
1839 level, file, " ENAME = \"%s\"\n",
1840 generic_pv_escape(tmp, hvename,
1841 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1842 }
1843 }
1844 if (backrefs) {
1845 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1846 PTR2UV(backrefs));
1847 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1848 dumpops, pvlim);
1849 }
1850 if (meta) {
1851 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1852 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"UVxf")\n",
1853 generic_pv_escape( tmpsv, meta->mro_which->name,
1854 meta->mro_which->length,
1855 (meta->mro_which->kflags & HVhek_UTF8)),
1856 PTR2UV(meta->mro_which));
1857 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1858 (UV)meta->cache_gen);
1859 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1860 (UV)meta->pkg_gen);
1861 if (meta->mro_linear_all) {
1862 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1863 PTR2UV(meta->mro_linear_all));
1864 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1865 dumpops, pvlim);
1866 }
1867 if (meta->mro_linear_current) {
1868 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1869 PTR2UV(meta->mro_linear_current));
1870 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1871 dumpops, pvlim);
1872 }
1873 if (meta->mro_nextmethod) {
1874 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1875 PTR2UV(meta->mro_nextmethod));
1876 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1877 dumpops, pvlim);
1878 }
1879 if (meta->isa) {
1880 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1881 PTR2UV(meta->isa));
1882 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1883 dumpops, pvlim);
1884 }
1885 }
1886 }
1887 if (nest < maxnest) {
1888 HV * const hv = MUTABLE_HV(sv);
1889 STRLEN i;
1890 HE *he;
1891
1892 if (HvARRAY(hv)) {
1893 int count = maxnest - nest;
1894 for (i=0; i <= HvMAX(hv); i++) {
1895 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1896 U32 hash;
1897 SV * keysv;
1898 const char * keypv;
1899 SV * elt;
1900 STRLEN len;
1901
1902 if (count-- <= 0) goto DONEHV;
1903
1904 hash = HeHASH(he);
1905 keysv = hv_iterkeysv(he);
1906 keypv = SvPV_const(keysv, len);
1907 elt = HeVAL(he);
1908
1909 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1910 if (SvUTF8(keysv))
1911 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1912 if (HvEITER_get(hv) == he)
1913 PerlIO_printf(file, "[CURRENT] ");
1914 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1915 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1916 }
1917 }
1918 DONEHV:;
1919 }
1920 }
1921 break;
1922 } /* case SVt_PVHV */
1923
1924 case SVt_PVCV:
1925 if (CvAUTOLOAD(sv)) {
1926 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1927 STRLEN len;
1928 const char *const name = SvPV_const(sv, len);
1929 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
1930 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
1931 }
1932 if (SvPOK(sv)) {
1933 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1934 const char *const proto = CvPROTO(sv);
1935 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
1936 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
1937 SvUTF8(sv)));
1938 }
1939 /* FALLTHROUGH */
1940 case SVt_PVFM:
1941 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1942 if (!CvISXSUB(sv)) {
1943 if (CvSTART(sv)) {
1944 Perl_dump_indent(aTHX_ level, file,
1945 " START = 0x%"UVxf" ===> %"IVdf"\n",
1946 PTR2UV(CvSTART(sv)),
1947 (IV)sequence_num(CvSTART(sv)));
1948 }
1949 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1950 PTR2UV(CvROOT(sv)));
1951 if (CvROOT(sv) && dumpops) {
1952 do_op_dump(level+1, file, CvROOT(sv));
1953 }
1954 } else {
1955 SV * const constant = cv_const_sv((const CV *)sv);
1956
1957 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1958
1959 if (constant) {
1960 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1961 " (CONST SV)\n",
1962 PTR2UV(CvXSUBANY(sv).any_ptr));
1963 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1964 pvlim);
1965 } else {
1966 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1967 (IV)CvXSUBANY(sv).any_i32);
1968 }
1969 }
1970 if (CvNAMED(sv))
1971 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1972 HEK_KEY(CvNAME_HEK((CV *)sv)));
1973 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1974 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1975 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1976 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1977 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1978 if (!CvISXSUB(sv)) {
1979 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1980 if (nest < maxnest) {
1981 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1982 }
1983 }
1984 else
1985 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
1986 {
1987 const CV * const outside = CvOUTSIDE(sv);
1988 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1989 PTR2UV(outside),
1990 (!outside ? "null"
1991 : CvANON(outside) ? "ANON"
1992 : (outside == PL_main_cv) ? "MAIN"
1993 : CvUNIQUE(outside) ? "UNIQUE"
1994 : CvGV(outside) ?
1995 generic_pv_escape(
1996 newSVpvs_flags("", SVs_TEMP),
1997 GvNAME(CvGV(outside)),
1998 GvNAMELEN(CvGV(outside)),
1999 GvNAMEUTF8(CvGV(outside)))
2000 : "UNDEFINED"));
2001 }
2002 if (CvOUTSIDE(sv)
2003 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2004 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2005 break;
2006
2007 case SVt_PVGV:
2008 case SVt_PVLV:
2009 if (type == SVt_PVLV) {
2010 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2011 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2012 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2013 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
2014 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
2015 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2016 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2017 dumpops, pvlim);
2018 }
2019 if (isREGEXP(sv)) goto dumpregexp;
2020 if (!isGV_with_GP(sv))
2021 break;
2022 {
2023 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2024 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2025 generic_pv_escape(tmpsv, GvNAME(sv),
2026 GvNAMELEN(sv),
2027 GvNAMEUTF8(sv)));
2028 }
2029 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
2030 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2031 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
2032 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
2033 if (!GvGP(sv))
2034 break;
2035 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2036 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2037 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2038 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2039 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2040 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2041 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2042 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
2043 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf
2044 " (%s)\n",
2045 (UV)GvGPFLAGS(sv),
2046 "");
2047 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
2048 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2049 do_gv_dump (level, file, " EGV", GvEGV(sv));
2050 break;
2051 case SVt_PVIO:
2052 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2053 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2054 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2055 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2056 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2057 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2058 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
2059 if (IoTOP_NAME(sv))
2060 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2061 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2062 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2063 else {
2064 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2065 PTR2UV(IoTOP_GV(sv)));
2066 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2067 maxnest, dumpops, pvlim);
2068 }
2069 /* Source filters hide things that are not GVs in these three, so let's
2070 be careful out there. */
2071 if (IoFMT_NAME(sv))
2072 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2073 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2074 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2075 else {
2076 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2077 PTR2UV(IoFMT_GV(sv)));
2078 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2079 maxnest, dumpops, pvlim);
2080 }
2081 if (IoBOTTOM_NAME(sv))
2082 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2083 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2084 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2085 else {
2086 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2087 PTR2UV(IoBOTTOM_GV(sv)));
2088 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2089 maxnest, dumpops, pvlim);
2090 }
2091 if (isPRINT(IoTYPE(sv)))
2092 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2093 else
2094 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2095 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2096 break;
2097 case SVt_REGEXP:
2098 dumpregexp:
2099 {
2100 struct regexp * const r = ReANY((REGEXP*)sv);
2101
2102#define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2103 sv_setpv(d,""); \
2104 append_flags(d, flags, names); \
2105 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2106 SvCUR_set(d, SvCUR(d) - 1); \
2107 SvPVX(d)[SvCUR(d)] = '\0'; \
2108 } \
2109} STMT_END
2110 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2111 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2112 (UV)(r->compflags), SvPVX_const(d));
2113
2114 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2115 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2116 (UV)(r->extflags), SvPVX_const(d));
2117
2118 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf" (%s)\n",
2119 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2120 if (r->engine == &PL_core_reg_engine) {
2121 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2122 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf" (%s)\n",
2123 (UV)(r->intflags), SvPVX_const(d));
2124 } else {
2125 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2126 (UV)(r->intflags));
2127 }
2128#undef SV_SET_STRINGIFY_REGEXP_FLAGS
2129 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2130 (UV)(r->nparens));
2131 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2132 (UV)(r->lastparen));
2133 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2134 (UV)(r->lastcloseparen));
2135 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2136 (IV)(r->minlen));
2137 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2138 (IV)(r->minlenret));
2139 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2140 (UV)(r->gofs));
2141 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2142 (UV)(r->pre_prefix));
2143 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2144 (IV)(r->sublen));
2145 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2146 (IV)(r->suboffset));
2147 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2148 (IV)(r->subcoffset));
2149 if (r->subbeg)
2150 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2151 PTR2UV(r->subbeg),
2152 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2153 else
2154 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2155 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2156 PTR2UV(r->mother_re));
2157 if (nest < maxnest && r->mother_re)
2158 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2159 maxnest, dumpops, pvlim);
2160 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2161 PTR2UV(r->paren_names));
2162 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2163 PTR2UV(r->substrs));
2164 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2165 PTR2UV(r->pprivate));
2166 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2167 PTR2UV(r->offs));
2168 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2169 PTR2UV(r->qr_anoncv));
2170#ifdef PERL_ANY_COW
2171 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2172 PTR2UV(r->saved_copy));
2173#endif
2174 }
2175 break;
2176 }
2177 SvREFCNT_dec_NN(d);
2178}
2179
2180/*
2181=for apidoc sv_dump
2182
2183Dumps the contents of an SV to the C<STDERR> filehandle.
2184
2185For an example of its output, see L<Devel::Peek>.
2186
2187=cut
2188*/
2189
2190void
2191Perl_sv_dump(pTHX_ SV *sv)
2192{
2193 PERL_ARGS_ASSERT_SV_DUMP;
2194
2195 if (SvROK(sv))
2196 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2197 else
2198 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2199}
2200
2201int
2202Perl_runops_debug(pTHX)
2203{
2204 if (!PL_op) {
2205 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2206 return 0;
2207 }
2208
2209 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2210 do {
2211#ifdef PERL_TRACE_OPS
2212 ++PL_op_exec_cnt[PL_op->op_type];
2213#endif
2214 if (PL_debug) {
2215 ENTER;
2216 SAVETMPS;
2217 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2218 PerlIO_printf(Perl_debug_log,
2219 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2220 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2221 PTR2UV(*PL_watchaddr));
2222 if (DEBUG_s_TEST_) {
2223 if (DEBUG_v_TEST_) {
2224 PerlIO_printf(Perl_debug_log, "\n");
2225 deb_stack_all();
2226 }
2227 else
2228 debstack();
2229 }
2230
2231
2232 if (DEBUG_t_TEST_) debop(PL_op);
2233 if (DEBUG_P_TEST_) debprof(PL_op);
2234 FREETMPS;
2235 LEAVE;
2236 }
2237
2238 PERL_DTRACE_PROBE_OP(PL_op);
2239 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2240 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2241 PERL_ASYNC_CHECK();
2242
2243 TAINT_NOT;
2244 return 0;
2245}
2246
2247
2248/* print the names of the n lexical vars starting at pad offset off */
2249
2250STATIC void
2251S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2252{
2253 PADNAME *sv;
2254 CV * const cv = deb_curcv(cxstack_ix);
2255 PADNAMELIST *comppad = NULL;
2256 int i;
2257
2258 if (cv) {
2259 PADLIST * const padlist = CvPADLIST(cv);
2260 comppad = PadlistNAMES(padlist);
2261 }
2262 if (paren)
2263 PerlIO_printf(Perl_debug_log, "(");
2264 for (i = 0; i < n; i++) {
2265 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2266 PerlIO_printf(Perl_debug_log, "%"PNf, PNfARG(sv));
2267 else
2268 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2269 (UV)(off+i));
2270 if (i < n - 1)
2271 PerlIO_printf(Perl_debug_log, ",");
2272 }
2273 if (paren)
2274 PerlIO_printf(Perl_debug_log, ")");
2275}
2276
2277
2278/* append to the out SV, the name of the lexical at offset off in the CV
2279 * cv */
2280
2281static void
2282S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2283 bool paren, bool is_scalar)
2284{
2285 PADNAME *sv;
2286 PADNAMELIST *namepad = NULL;
2287 int i;
2288
2289 if (cv) {
2290 PADLIST * const padlist = CvPADLIST(cv);
2291 namepad = PadlistNAMES(padlist);
2292 }
2293
2294 if (paren)
2295 sv_catpvs_nomg(out, "(");
2296 for (i = 0; i < n; i++) {
2297 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2298 {
2299 STRLEN cur = SvCUR(out);
2300 Perl_sv_catpvf(aTHX_ out, "[%"UTF8f,
2301 UTF8fARG(1, PadnameLEN(sv) - 1,
2302 PadnamePV(sv) + 1));
2303 if (is_scalar)
2304 SvPVX(out)[cur] = '$';
2305 }
2306 else
2307 Perl_sv_catpvf(aTHX_ out, "[%"UVuf"]", (UV)(off+i));
2308 if (i < n - 1)
2309 sv_catpvs_nomg(out, ",");
2310 }
2311 if (paren)
2312 sv_catpvs_nomg(out, "(");
2313}
2314
2315
2316static void
2317S_append_gv_name(pTHX_ GV *gv, SV *out)
2318{
2319 SV *sv;
2320 if (!gv) {
2321 sv_catpvs_nomg(out, "<NULLGV>");
2322 return;
2323 }
2324 sv = newSV(0);
2325 gv_fullname4(sv, gv, NULL, FALSE);
2326 Perl_sv_catpvf(aTHX_ out, "$%"SVf, SVfARG(sv));
2327 SvREFCNT_dec_NN(sv);
2328}
2329
2330#ifdef USE_ITHREADS
2331# define ITEM_SV(item) (comppad ? \
2332 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2333#else
2334# define ITEM_SV(item) UNOP_AUX_item_sv(item)
2335#endif
2336
2337
2338/* return a temporary SV containing a stringified representation of
2339 * the op_aux field of a MULTIDEREF op, associated with CV cv
2340 */
2341
2342SV*
2343Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2344{
2345 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2346 UV actions = items->uv;
2347 SV *sv;
2348 bool last = 0;
2349 bool is_hash = FALSE;
2350 int derefs = 0;
2351 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2352#ifdef USE_ITHREADS
2353 PAD *comppad;
2354
2355 if (cv) {
2356 PADLIST *padlist = CvPADLIST(cv);
2357 comppad = PadlistARRAY(padlist)[1];
2358 }
2359 else
2360 comppad = NULL;
2361#endif
2362
2363 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2364
2365 while (!last) {
2366 switch (actions & MDEREF_ACTION_MASK) {
2367
2368 case MDEREF_reload:
2369 actions = (++items)->uv;
2370 continue;
2371 NOT_REACHED; /* NOTREACHED */
2372
2373 case MDEREF_HV_padhv_helem:
2374 is_hash = TRUE;
2375 /* FALLTHROUGH */
2376 case MDEREF_AV_padav_aelem:
2377 derefs = 1;
2378 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2379 goto do_elem;
2380 NOT_REACHED; /* NOTREACHED */
2381
2382 case MDEREF_HV_gvhv_helem:
2383 is_hash = TRUE;
2384 /* FALLTHROUGH */
2385 case MDEREF_AV_gvav_aelem:
2386 derefs = 1;
2387 items++;
2388 sv = ITEM_SV(items);
2389 S_append_gv_name(aTHX_ (GV*)sv, out);
2390 goto do_elem;
2391 NOT_REACHED; /* NOTREACHED */
2392
2393 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2394 is_hash = TRUE;
2395 /* FALLTHROUGH */
2396 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2397 items++;
2398 sv = ITEM_SV(items);
2399 S_append_gv_name(aTHX_ (GV*)sv, out);
2400 goto do_vivify_rv2xv_elem;
2401 NOT_REACHED; /* NOTREACHED */
2402
2403 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2404 is_hash = TRUE;
2405 /* FALLTHROUGH */
2406 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2407 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2408 goto do_vivify_rv2xv_elem;
2409 NOT_REACHED; /* NOTREACHED */
2410
2411 case MDEREF_HV_pop_rv2hv_helem:
2412 case MDEREF_HV_vivify_rv2hv_helem:
2413 is_hash = TRUE;
2414 /* FALLTHROUGH */
2415 do_vivify_rv2xv_elem:
2416 case MDEREF_AV_pop_rv2av_aelem:
2417 case MDEREF_AV_vivify_rv2av_aelem:
2418 if (!derefs++)
2419 sv_catpvs_nomg(out, "->");
2420 do_elem:
2421 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2422 sv_catpvs_nomg(out, "->");
2423 last = 1;
2424 break;
2425 }
2426
2427 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2428 switch (actions & MDEREF_INDEX_MASK) {
2429 case MDEREF_INDEX_const:
2430 if (is_hash) {
2431 items++;
2432 sv = ITEM_SV(items);
2433 if (!sv)
2434 sv_catpvs_nomg(out, "???");
2435 else {
2436 STRLEN cur;
2437 char *s;
2438 s = SvPV(sv, cur);
2439 pv_pretty(out, s, cur, 30,
2440 NULL, NULL,
2441 (PERL_PV_PRETTY_NOCLEAR
2442 |PERL_PV_PRETTY_QUOTE
2443 |PERL_PV_PRETTY_ELLIPSES));
2444 }
2445 }
2446 else
2447 Perl_sv_catpvf(aTHX_ out, "%"IVdf, (++items)->iv);
2448 break;
2449 case MDEREF_INDEX_padsv:
2450 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2451 break;
2452 case MDEREF_INDEX_gvsv:
2453 items++;
2454 sv = ITEM_SV(items);
2455 S_append_gv_name(aTHX_ (GV*)sv, out);
2456 break;
2457 }
2458 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2459
2460 if (actions & MDEREF_FLAG_last)
2461 last = 1;
2462 is_hash = FALSE;
2463
2464 break;
2465
2466 default:
2467 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2468 (int)(actions & MDEREF_ACTION_MASK));
2469 last = 1;
2470 break;
2471
2472 } /* switch */
2473
2474 actions >>= MDEREF_SHIFT;
2475 } /* while */
2476 return out;
2477}
2478
2479
2480I32
2481Perl_debop(pTHX_ const OP *o)
2482{
2483 PERL_ARGS_ASSERT_DEBOP;
2484
2485 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2486 return 0;
2487
2488 Perl_deb(aTHX_ "%s", OP_NAME(o));
2489 switch (o->op_type) {
2490 case OP_CONST:
2491 case OP_HINTSEVAL:
2492 /* With ITHREADS, consts are stored in the pad, and the right pad
2493 * may not be active here, so check.
2494 * Looks like only during compiling the pads are illegal.
2495 */
2496#ifdef USE_ITHREADS
2497 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2498#endif
2499 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2500 break;
2501 case OP_GVSV:
2502 case OP_GV:
2503 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
2504 SV * const sv = newSV(0);
2505 gv_fullname3(sv, cGVOPo_gv, NULL);
2506 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2507 SvREFCNT_dec_NN(sv);
2508 }
2509 else if (cGVOPo_gv) {
2510 SV * const sv = newSV(0);
2511 assert(SvROK(cGVOPo_gv));
2512 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2513 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
2514 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
2515 SvREFCNT_dec_NN(sv);
2516 }
2517 else
2518 PerlIO_printf(Perl_debug_log, "(NULL)");
2519 break;
2520
2521 case OP_PADSV:
2522 case OP_PADAV:
2523 case OP_PADHV:
2524 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2525 break;
2526
2527 case OP_PADRANGE:
2528 S_deb_padvar(aTHX_ o->op_targ,
2529 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2530 break;
2531
2532 case OP_MULTIDEREF:
2533 PerlIO_printf(Perl_debug_log, "(%"SVf")",
2534 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2535 break;
2536
2537 default:
2538 break;
2539 }
2540 PerlIO_printf(Perl_debug_log, "\n");
2541 return 0;
2542}
2543
2544STATIC CV*
2545S_deb_curcv(pTHX_ I32 ix)
2546{
2547 PERL_SI *si = PL_curstackinfo;
2548 for (; ix >=0; ix--) {
2549 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2550
2551 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2552 return cx->blk_sub.cv;
2553 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2554 return cx->blk_eval.cv;
2555 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2556 return PL_main_cv;
2557 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2558 && si->si_type == PERLSI_SORT)
2559 {
2560 /* fake sort sub; use CV of caller */
2561 si = si->si_prev;
2562 ix = si->si_cxix + 1;
2563 }
2564 }
2565 return NULL;
2566}
2567
2568void
2569Perl_watch(pTHX_ char **addr)
2570{
2571 PERL_ARGS_ASSERT_WATCH;
2572
2573 PL_watchaddr = addr;
2574 PL_watchok = *addr;
2575 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2576 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2577}
2578
2579STATIC void
2580S_debprof(pTHX_ const OP *o)
2581{
2582 PERL_ARGS_ASSERT_DEBPROF;
2583
2584 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2585 return;
2586 if (!PL_profiledata)
2587 Newxz(PL_profiledata, MAXO, U32);
2588 ++PL_profiledata[o->op_type];
2589}
2590
2591void
2592Perl_debprofdump(pTHX)
2593{
2594 unsigned i;
2595 if (!PL_profiledata)
2596 return;
2597 for (i = 0; i < MAXO; i++) {
2598 if (PL_profiledata[i])
2599 PerlIO_printf(Perl_debug_log,
2600 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2601 PL_op_name[i]);
2602 }
2603}
2604
2605
2606/*
2607 * ex: set ts=8 sts=4 sw=4 et:
2608 */