xref: /openbsd-src/gnu/usr.bin/perl/dump.c (revision ae3cb403620ab940fbaabb3055fac045a63d56b7)
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 
32 static 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 
52 static 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 
71 struct flag_to_name {
72     U32 flag;
73     const char *name;
74 };
75 
76 static void
77 S_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 
97 Escapes at most the first C<count> chars of C<pv> and puts the results into
98 C<dsv> such that the size of the escaped string will not exceed C<max> chars
99 and will not contain any incomplete escape sequences.  The number of bytes
100 escaped will be returned in the C<STRLEN *escaped> parameter if it is not null.
101 When the C<dsv> parameter is null no escaping actually occurs, but the number
102 of bytes that would be escaped were it not null will be calculated.
103 
104 If flags contains C<PERL_PV_ESCAPE_QUOTE> then any double quotes in the string
105 will also be escaped.
106 
107 Normally the SV will be cleared before the escaped string is prepared,
108 but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
109 
110 If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
111 if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
112 using C<is_utf8_string()> to determine if it is UTF-8.
113 
114 If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
115 using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> is set, only
116 non-ASCII chars will be escaped using this style; otherwise, only chars above
117 255 will be so escaped; other non printable chars will use octal or
118 common escaped patterns like C<\n>.
119 Otherwise, if C<PERL_PV_ESCAPE_NOBACKSLASH>
120 then all chars below 255 will be treated as printable and
121 will be output as literals.
122 
123 If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
124 string will be escaped, regardless of max.  If the output is to be in hex,
125 then it will be returned as a plain hex
126 sequence.  Thus the output will either be a single char,
127 an octal escape sequence, a special escape like C<\n> or a hex value.
128 
129 If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a C<"%"> and
130 not a C<"\\">.  This is because regexes very often contain backslashed
131 sequences, whereas C<"%"> is not a particularly common character in patterns.
132 
133 Returns a pointer to the escaped text as held by C<dsv>.
134 
135 =cut
136 */
137 #define PV_ESCAPE_OCTBUFSIZE 32
138 
139 char *
140 Perl_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 
251 Converts a string into something presentable, handling escaping via
252 C<pv_escape()> and supporting quoting and ellipses.
253 
254 If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
255 double quoted with any double quotes in the string escaped.  Otherwise
256 if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
257 angle brackets.
258 
259 If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
260 string were output then an ellipsis C<...> will be appended to the
261 string.  Note that this happens AFTER it has been quoted.
262 
263 If C<start_color> is non-null then it will be inserted after the opening
264 quote (if there is one) but before the escaped text.  If C<end_color>
265 is non-null then it will be inserted after the escaped text but before
266 any quotes or ellipses.
267 
268 Returns a pointer to the prettified text as held by C<dsv>.
269 
270 =cut
271 */
272 
273 char *
274 Perl_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 
330 Similar to
331 
332   pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
333 
334 except that an additional "\0" will be appended to the string when
335 len > cur and pv[cur] is "\0".
336 
337 Note that the final string may be up to 7 chars longer than pvlim.
338 
339 =cut
340 */
341 
342 char *
343 Perl_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 
353 char *
354 Perl_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 
505 void
506 Perl_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 
515 void
516 Perl_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 
526 Dumps the entire optree of the current program starting at C<PL_main_root> to
527 C<STDERR>.  Also dumps the optrees for all visible subroutines in
528 C<PL_defstash>.
529 
530 =cut
531 */
532 
533 void
534 Perl_dump_all(pTHX)
535 {
536     dump_all_perl(FALSE);
537 }
538 
539 void
540 Perl_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 
551 Dumps the optrees for all visible subroutines in C<stash>.
552 
553 =cut
554 */
555 
556 void
557 Perl_dump_packsubs(pTHX_ const HV *stash)
558 {
559     PERL_ARGS_ASSERT_DUMP_PACKSUBS;
560     dump_packsubs_perl(stash, FALSE);
561 }
562 
563 void
564 Perl_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 
594 void
595 Perl_dump_sub(pTHX_ const GV *gv)
596 {
597     PERL_ARGS_ASSERT_DUMP_SUB;
598     dump_sub_perl(gv, FALSE);
599 }
600 
601 void
602 Perl_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 
629 void
630 Perl_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 
644 void
645 Perl_dump_eval(pTHX)
646 {
647     op_dump(PL_eval_root);
648 }
649 
650 void
651 Perl_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 
695 const 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 
708 static SV *
709 S_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 
744 void
745 Perl_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 
755 STATIC UV
756 S_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 
781 const 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 
791 void
792 Perl_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 
1075 Dumps the optree starting at OP C<o> to C<STDERR>.
1076 
1077 =cut
1078 */
1079 
1080 void
1081 Perl_op_dump(pTHX_ const OP *o)
1082 {
1083     PERL_ARGS_ASSERT_OP_DUMP;
1084     do_op_dump(0, Perl_debug_log, o);
1085 }
1086 
1087 void
1088 Perl_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 
1119 static 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 
1125 void
1126 Perl_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 
1248 void
1249 Perl_magic_dump(pTHX_ const MAGIC *mg)
1250 {
1251     do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1252 }
1253 
1254 void
1255 Perl_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 
1277 void
1278 Perl_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 
1292 void
1293 Perl_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 
1316 const 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 
1327 const 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 
1338 const 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 
1358 const 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 
1366 const struct flag_to_name gp_flags_names[] = {
1367     {GVf_INTRO, "INTRO,"},
1368     {GVf_MULTI, "MULTI,"},
1369     {GVf_ASSUMECV, "ASSUMECV,"},
1370 };
1371 
1372 const 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 */
1382 const 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 */
1411 const 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 
1436 void
1437 Perl_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 
2183 Dumps the contents of an SV to the C<STDERR> filehandle.
2184 
2185 For an example of its output, see L<Devel::Peek>.
2186 
2187 =cut
2188 */
2189 
2190 void
2191 Perl_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 
2201 int
2202 Perl_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 
2250 STATIC void
2251 S_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 
2281 static void
2282 S_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 
2316 static void
2317 S_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 
2342 SV*
2343 Perl_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 
2480 I32
2481 Perl_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 
2544 STATIC CV*
2545 S_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 
2568 void
2569 Perl_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 
2579 STATIC void
2580 S_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 
2591 void
2592 Perl_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  */
2609