xref: /openbsd-src/gnu/usr.bin/perl/dump.c (revision 99fd087599a8791921855f21bd7e36130f39aadc)
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             SvPVCLEAR(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         SvPVCLEAR(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     SvPVCLEAR(t);
362   retry:
363     if (!sv) {
364 	sv_catpvs(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_catpvs(t, "WILD");
370 	goto finish;
371     }
372     else if (  sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes
373             || sv == &PL_sv_zero || sv == &PL_sv_placeholder)
374     {
375 	if (sv == &PL_sv_undef) {
376 	    sv_catpvs(t, "SV_UNDEF");
377 	    if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
378 				 SVs_GMG|SVs_SMG|SVs_RMG)) &&
379 		SvREADONLY(sv))
380 		goto finish;
381 	}
382 	else if (sv == &PL_sv_no) {
383 	    sv_catpvs(t, "SV_NO");
384 	    if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
385 				 SVs_GMG|SVs_SMG|SVs_RMG)) &&
386 		!(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
387 				  SVp_POK|SVp_NOK)) &&
388 		SvCUR(sv) == 0 &&
389 		SvNVX(sv) == 0.0)
390 		goto finish;
391 	}
392 	else if (sv == &PL_sv_yes) {
393 	    sv_catpvs(t, "SV_YES");
394 	    if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
395 				 SVs_GMG|SVs_SMG|SVs_RMG)) &&
396 		!(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
397 				  SVp_POK|SVp_NOK)) &&
398 		SvCUR(sv) == 1 &&
399 		SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
400 		SvNVX(sv) == 1.0)
401 		goto finish;
402 	}
403 	else if (sv == &PL_sv_zero) {
404 	    sv_catpvs(t, "SV_ZERO");
405 	    if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
406 				 SVs_GMG|SVs_SMG|SVs_RMG)) &&
407 		!(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
408 				  SVp_POK|SVp_NOK)) &&
409 		SvCUR(sv) == 1 &&
410 		SvPVX_const(sv) && *SvPVX_const(sv) == '0' &&
411 		SvNVX(sv) == 0.0)
412 		goto finish;
413 	}
414 	else {
415 	    sv_catpvs(t, "SV_PLACEHOLDER");
416 	    if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
417 				 SVs_GMG|SVs_SMG|SVs_RMG)) &&
418 		SvREADONLY(sv))
419 		goto finish;
420 	}
421 	sv_catpvs(t, ":");
422     }
423     else if (SvREFCNT(sv) == 0) {
424 	sv_catpvs(t, "(");
425 	unref++;
426     }
427     else if (DEBUG_R_TEST_) {
428 	int is_tmp = 0;
429 	SSize_t ix;
430 	/* is this SV on the tmps stack? */
431 	for (ix=PL_tmps_ix; ix>=0; ix--) {
432 	    if (PL_tmps_stack[ix] == sv) {
433 		is_tmp = 1;
434 		break;
435 	    }
436 	}
437 	if (is_tmp || SvREFCNT(sv) > 1) {
438             Perl_sv_catpvf(aTHX_ t, "<");
439             if (SvREFCNT(sv) > 1)
440                 Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv));
441             if (is_tmp)
442                 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
443             Perl_sv_catpvf(aTHX_ t, ">");
444         }
445     }
446 
447     if (SvROK(sv)) {
448 	sv_catpvs(t, "\\");
449 	if (SvCUR(t) + unref > 10) {
450 	    SvCUR_set(t, unref + 3);
451 	    *SvEND(t) = '\0';
452 	    sv_catpvs(t, "...");
453 	    goto finish;
454 	}
455 	sv = SvRV(sv);
456 	goto retry;
457     }
458     type = SvTYPE(sv);
459     if (type == SVt_PVCV) {
460         SV * const tmp = newSVpvs_flags("", SVs_TEMP);
461         GV* gvcv = CvGV(sv);
462         Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
463                        ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
464                        : "");
465 	goto finish;
466     } else if (type < SVt_LAST) {
467 	sv_catpv(t, svshorttypenames[type]);
468 
469 	if (type == SVt_NULL)
470 	    goto finish;
471     } else {
472 	sv_catpvs(t, "FREED");
473 	goto finish;
474     }
475 
476     if (SvPOKp(sv)) {
477 	if (!SvPVX_const(sv))
478 	    sv_catpvs(t, "(null)");
479 	else {
480 	    SV * const tmp = newSVpvs("");
481 	    sv_catpvs(t, "(");
482 	    if (SvOOK(sv)) {
483 		STRLEN delta;
484 		SvOOK_offset(sv, delta);
485 		Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
486 	    }
487 	    Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
488 	    if (SvUTF8(sv))
489 		Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
490 			       sv_uni_display(tmp, sv, 6 * SvCUR(sv),
491 					      UNI_DISPLAY_QQ));
492 	    SvREFCNT_dec_NN(tmp);
493 	}
494     }
495     else if (SvNOKp(sv)) {
496         DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
497         STORE_LC_NUMERIC_SET_STANDARD();
498 	Perl_sv_catpvf(aTHX_ t, "(%" NVgf ")",SvNVX(sv));
499         RESTORE_LC_NUMERIC();
500     }
501     else if (SvIOKp(sv)) {
502 	if (SvIsUV(sv))
503 	    Perl_sv_catpvf(aTHX_ t, "(%" UVuf ")", (UV)SvUVX(sv));
504 	else
505             Perl_sv_catpvf(aTHX_ t, "(%" IVdf ")", (IV)SvIVX(sv));
506     }
507     else
508 	sv_catpvs(t, "()");
509 
510   finish:
511     while (unref--)
512 	sv_catpvs(t, ")");
513     if (TAINTING_get && sv && SvTAINTED(sv))
514 	sv_catpvs(t, " [tainted]");
515     return SvPV_nolen(t);
516 }
517 
518 /*
519 =head1 Debugging Utilities
520 */
521 
522 void
523 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
524 {
525     va_list args;
526     PERL_ARGS_ASSERT_DUMP_INDENT;
527     va_start(args, pat);
528     dump_vindent(level, file, pat, &args);
529     va_end(args);
530 }
531 
532 void
533 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
534 {
535     PERL_ARGS_ASSERT_DUMP_VINDENT;
536     PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
537     PerlIO_vprintf(file, pat, *args);
538 }
539 
540 
541 /* Like Perl_dump_indent(), but specifically for ops: adds a vertical bar
542  * for each indent level as appropriate.
543  *
544  * bar contains bits indicating which indent columns should have a
545  * vertical bar displayed. Bit 0 is the RH-most column. If there are more
546  * levels than bits in bar, then the first few indents are displayed
547  * without a bar.
548  *
549  * The start of a new op is signalled by passing a value for level which
550  * has been negated and offset by 1 (so that level 0 is passed as -1 and
551  * can thus be distinguished from -0); in this case, emit a suitably
552  * indented blank line, then on the next line, display the op's sequence
553  * number, and make the final indent an '+----'.
554  *
555  * e.g.
556  *
557  *      |   FOO       # level = 1,   bar = 0b1
558  *      |   |         # level =-2-1, bar = 0b11
559  * 1234 |   +---BAR
560  *      |       BAZ   # level = 2,   bar = 0b10
561  */
562 
563 static void
564 S_opdump_indent(pTHX_ const OP *o, I32 level, UV bar, PerlIO *file,
565                 const char* pat, ...)
566 {
567     va_list args;
568     I32 i;
569     bool newop = (level < 0);
570 
571     va_start(args, pat);
572 
573     /* start displaying a new op? */
574     if (newop) {
575         UV seq = sequence_num(o);
576 
577         level = -level - 1;
578 
579         /* output preceding blank line */
580         PerlIO_puts(file, "     ");
581         for (i = level-1; i >= 0; i--)
582             PerlIO_puts(file,  (   i == 0
583                                 || (i < UVSIZE*8 && (bar & ((UV)1 << i)))
584                                )
585                                     ?  "|   " : "    ");
586         PerlIO_puts(file, "\n");
587 
588         /* output sequence number */
589         if (seq)
590             PerlIO_printf(file, "%-4" UVuf " ", seq);
591         else
592             PerlIO_puts(file, "???? ");
593 
594     }
595     else
596 	PerlIO_printf(file, "     ");
597 
598     for (i = level-1; i >= 0; i--)
599             PerlIO_puts(file,
600                   (i == 0 && newop) ? "+--"
601                 : (bar & (1 << i))  ? "|   "
602                 :                     "    ");
603     PerlIO_vprintf(file, pat, args);
604     va_end(args);
605 }
606 
607 
608 /* display a link field (e.g. op_next) in the format
609  *     ====> sequence_number [opname 0x123456]
610  */
611 
612 static void
613 S_opdump_link(pTHX_ const OP *base, const OP *o, PerlIO *file)
614 {
615     PerlIO_puts(file, " ===> ");
616     if (o == base)
617         PerlIO_puts(file, "[SELF]\n");
618     else if (o)
619         PerlIO_printf(file, "%" UVuf " [%s 0x%" UVxf "]\n",
620             sequence_num(o), OP_NAME(o), PTR2UV(o));
621     else
622         PerlIO_puts(file, "[0x0]\n");
623 }
624 
625 /*
626 =for apidoc dump_all
627 
628 Dumps the entire optree of the current program starting at C<PL_main_root> to
629 C<STDERR>.  Also dumps the optrees for all visible subroutines in
630 C<PL_defstash>.
631 
632 =cut
633 */
634 
635 void
636 Perl_dump_all(pTHX)
637 {
638     dump_all_perl(FALSE);
639 }
640 
641 void
642 Perl_dump_all_perl(pTHX_ bool justperl)
643 {
644     PerlIO_setlinebuf(Perl_debug_log);
645     if (PL_main_root)
646 	op_dump(PL_main_root);
647     dump_packsubs_perl(PL_defstash, justperl);
648 }
649 
650 /*
651 =for apidoc dump_packsubs
652 
653 Dumps the optrees for all visible subroutines in C<stash>.
654 
655 =cut
656 */
657 
658 void
659 Perl_dump_packsubs(pTHX_ const HV *stash)
660 {
661     PERL_ARGS_ASSERT_DUMP_PACKSUBS;
662     dump_packsubs_perl(stash, FALSE);
663 }
664 
665 void
666 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
667 {
668     I32	i;
669 
670     PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
671 
672     if (!HvARRAY(stash))
673 	return;
674     for (i = 0; i <= (I32) HvMAX(stash); i++) {
675         const HE *entry;
676 	for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
677 	    GV * gv = (GV *)HeVAL(entry);
678             if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
679                 /* unfake a fake GV */
680                 (void)CvGV(SvRV(gv));
681 	    if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
682 		continue;
683 	    if (GvCVu(gv))
684 		dump_sub_perl(gv, justperl);
685 	    if (GvFORM(gv))
686 		dump_form(gv);
687 	    if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
688 		const HV * const hv = GvHV(gv);
689 		if (hv && (hv != PL_defstash))
690 		    dump_packsubs_perl(hv, justperl); /* nested package */
691 	    }
692 	}
693     }
694 }
695 
696 void
697 Perl_dump_sub(pTHX_ const GV *gv)
698 {
699     PERL_ARGS_ASSERT_DUMP_SUB;
700     dump_sub_perl(gv, FALSE);
701 }
702 
703 void
704 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
705 {
706     CV *cv;
707 
708     PERL_ARGS_ASSERT_DUMP_SUB_PERL;
709 
710     cv = isGV_with_GP(gv) ? GvCV(gv) :
711 	    (assert(SvROK((SV*)gv)), (CV*)SvRV((SV*)gv));
712     if (justperl && (CvISXSUB(cv) || !CvROOT(cv)))
713 	return;
714 
715     if (isGV_with_GP(gv)) {
716 	SV * const namesv = newSVpvs_flags("", SVs_TEMP);
717 	SV *escsv = newSVpvs_flags("", SVs_TEMP);
718 	const char *namepv;
719 	STRLEN namelen;
720 	gv_fullname3(namesv, gv, NULL);
721 	namepv = SvPV_const(namesv, namelen);
722 	Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
723 		     generic_pv_escape(escsv, namepv, namelen, SvUTF8(namesv)));
724     } else {
725 	Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB = ");
726     }
727     if (CvISXSUB(cv))
728 	Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%" UVxf " %d)\n",
729 	    PTR2UV(CvXSUB(cv)),
730 	    (int)CvXSUBANY(cv).any_i32);
731     else if (CvROOT(cv))
732 	op_dump(CvROOT(cv));
733     else
734 	Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
735 }
736 
737 void
738 Perl_dump_form(pTHX_ const GV *gv)
739 {
740     SV * const sv = sv_newmortal();
741 
742     PERL_ARGS_ASSERT_DUMP_FORM;
743 
744     gv_fullname3(sv, gv, NULL);
745     Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
746     if (CvROOT(GvFORM(gv)))
747 	op_dump(CvROOT(GvFORM(gv)));
748     else
749 	Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
750 }
751 
752 void
753 Perl_dump_eval(pTHX)
754 {
755     op_dump(PL_eval_root);
756 }
757 
758 
759 /* returns a temp SV displaying the name of a GV. Handles the case where
760  * a GV is in fact a ref to a CV */
761 
762 static SV *
763 S_gv_display(pTHX_ GV *gv)
764 {
765     SV * const name = newSVpvs_flags("", SVs_TEMP);
766     if (gv) {
767         SV * const raw = newSVpvs_flags("", SVs_TEMP);
768         STRLEN len;
769         const char * rawpv;
770 
771         if (isGV_with_GP(gv))
772             gv_fullname3(raw, gv, NULL);
773         else {
774             assert(SvROK(gv));
775             assert(SvTYPE(SvRV(gv)) == SVt_PVCV);
776             Perl_sv_catpvf(aTHX_ raw, "cv ref: %s",
777                     SvPV_nolen_const(cv_name((CV *)SvRV(gv), name, 0)));
778         }
779         rawpv = SvPV_const(raw, len);
780         generic_pv_escape(name, rawpv, len, SvUTF8(raw));
781     }
782     else
783         sv_catpvs(name, "(NULL)");
784 
785     return name;
786 }
787 
788 
789 
790 /* forward decl */
791 static void
792 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o);
793 
794 
795 static void
796 S_do_pmop_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const PMOP *pm)
797 {
798     UV kidbar;
799 
800     if (!pm)
801 	return;
802 
803     kidbar = ((bar << 1) | cBOOL(pm->op_flags & OPf_KIDS)) << 1;
804 
805     if (PM_GETRE(pm)) {
806         char ch = (pm->op_pmflags & PMf_ONCE) ? '?' : '/';
807 	S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE %c%.*s%c\n",
808 	     ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch);
809     }
810     else
811 	S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE (RUNTIME)\n");
812 
813     if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
814 	SV * const tmpsv = pm_description(pm);
815 	S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMFLAGS = (%s)\n",
816                         SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
817 	SvREFCNT_dec_NN(tmpsv);
818     }
819 
820     if (pm->op_type == OP_SPLIT)
821         S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
822                     "TARGOFF/GV = 0x%" UVxf "\n",
823                     PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
824     else {
825         if (pm->op_pmreplrootu.op_pmreplroot) {
826             S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_REPL =\n");
827 	    S_do_op_dump_bar(aTHX_ level + 2,
828                 (kidbar|cBOOL(OpHAS_SIBLING(pm->op_pmreplrootu.op_pmreplroot))),
829                 file, pm->op_pmreplrootu.op_pmreplroot);
830         }
831     }
832 
833     if (pm->op_code_list) {
834 	if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
835 	    S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "CODE_LIST =\n");
836 	    S_do_op_dump_bar(aTHX_ level + 2,
837                             (kidbar | cBOOL(OpHAS_SIBLING(pm->op_code_list))),
838                             file, pm->op_code_list);
839 	}
840 	else
841 	    S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
842                         "CODE_LIST = 0x%" UVxf "\n", PTR2UV(pm->op_code_list));
843     }
844 }
845 
846 
847 void
848 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
849 {
850     PERL_ARGS_ASSERT_DO_PMOP_DUMP;
851     S_do_pmop_dump_bar(aTHX_ level, 0, file, pm);
852 }
853 
854 
855 const struct flag_to_name pmflags_flags_names[] = {
856     {PMf_CONST, ",CONST"},
857     {PMf_KEEP, ",KEEP"},
858     {PMf_GLOBAL, ",GLOBAL"},
859     {PMf_CONTINUE, ",CONTINUE"},
860     {PMf_RETAINT, ",RETAINT"},
861     {PMf_EVAL, ",EVAL"},
862     {PMf_NONDESTRUCT, ",NONDESTRUCT"},
863     {PMf_HAS_CV, ",HAS_CV"},
864     {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
865     {PMf_IS_QR, ",IS_QR"}
866 };
867 
868 static SV *
869 S_pm_description(pTHX_ const PMOP *pm)
870 {
871     SV * const desc = newSVpvs("");
872     const REGEXP * const regex = PM_GETRE(pm);
873     const U32 pmflags = pm->op_pmflags;
874 
875     PERL_ARGS_ASSERT_PM_DESCRIPTION;
876 
877     if (pmflags & PMf_ONCE)
878 	sv_catpvs(desc, ",ONCE");
879 #ifdef USE_ITHREADS
880     if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
881         sv_catpvs(desc, ":USED");
882 #else
883     if (pmflags & PMf_USED)
884         sv_catpvs(desc, ":USED");
885 #endif
886 
887     if (regex) {
888         if (RX_ISTAINTED(regex))
889             sv_catpvs(desc, ",TAINTED");
890         if (RX_CHECK_SUBSTR(regex)) {
891             if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
892                 sv_catpvs(desc, ",SCANFIRST");
893             if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
894                 sv_catpvs(desc, ",ALL");
895         }
896         if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
897             sv_catpvs(desc, ",SKIPWHITE");
898     }
899 
900     append_flags(desc, pmflags, pmflags_flags_names);
901     return desc;
902 }
903 
904 void
905 Perl_pmop_dump(pTHX_ PMOP *pm)
906 {
907     do_pmop_dump(0, Perl_debug_log, pm);
908 }
909 
910 /* Return a unique integer to represent the address of op o.
911  * If it already exists in PL_op_sequence, just return it;
912  * otherwise add it.
913  *  *** Note that this isn't thread-safe */
914 
915 STATIC UV
916 S_sequence_num(pTHX_ const OP *o)
917 {
918     dVAR;
919     SV     *op,
920           **seq;
921     const char *key;
922     STRLEN  len;
923     if (!o)
924 	return 0;
925     op = newSVuv(PTR2UV(o));
926     sv_2mortal(op);
927     key = SvPV_const(op, len);
928     if (!PL_op_sequence)
929 	PL_op_sequence = newHV();
930     seq = hv_fetch(PL_op_sequence, key, len, 0);
931     if (seq)
932 	return SvUV(*seq);
933     (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
934     return PL_op_seq;
935 }
936 
937 
938 
939 
940 
941 const struct flag_to_name op_flags_names[] = {
942     {OPf_KIDS, ",KIDS"},
943     {OPf_PARENS, ",PARENS"},
944     {OPf_REF, ",REF"},
945     {OPf_MOD, ",MOD"},
946     {OPf_STACKED, ",STACKED"},
947     {OPf_SPECIAL, ",SPECIAL"}
948 };
949 
950 
951 /* indexed by enum OPclass */
952 const char * const op_class_names[] = {
953     "NULL",
954     "OP",
955     "UNOP",
956     "BINOP",
957     "LOGOP",
958     "LISTOP",
959     "PMOP",
960     "SVOP",
961     "PADOP",
962     "PVOP",
963     "LOOP",
964     "COP",
965     "METHOP",
966     "UNOP_AUX",
967 };
968 
969 
970 /* dump an op and any children. level indicates the initial indent.
971  * The bits of bar indicate which indents should receive a vertical bar.
972  * For example if level == 5 and bar == 0b01101, then the indent prefix
973  * emitted will be (not including the <>'s):
974  *
975  *   <    |   |       |   >
976  *    55554444333322221111
977  *
978  * For heavily nested output, the level may exceed the number of bits
979  * in bar; in this case the first few columns in the output will simply
980  * not have a bar, which is harmless.
981  */
982 
983 static void
984 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
985 {
986     const OPCODE optype = o->op_type;
987 
988     PERL_ARGS_ASSERT_DO_OP_DUMP;
989 
990     /* print op header line */
991 
992     S_opdump_indent(aTHX_ o, -level-1, bar, file, "%s", OP_NAME(o));
993 
994     if (optype == OP_NULL && o->op_targ)
995         PerlIO_printf(file, " (ex-%s)",PL_op_name[o->op_targ]);
996 
997     PerlIO_printf(file, " %s(0x%" UVxf ")",
998                     op_class_names[op_class(o)], PTR2UV(o));
999     S_opdump_link(aTHX_ o, o->op_next, file);
1000 
1001     /* print op common fields */
1002 
1003     if (level == 0) {
1004         S_opdump_indent(aTHX_ o, level, bar, file, "PARENT");
1005         S_opdump_link(aTHX_ o, op_parent((OP*)o), file);
1006     }
1007 
1008     if (o->op_targ && optype != OP_NULL)
1009 	    S_opdump_indent(aTHX_ o, level, bar, file, "TARG = %ld\n",
1010                 (long)o->op_targ);
1011 
1012     if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
1013         SV * const tmpsv = newSVpvs("");
1014         switch (o->op_flags & OPf_WANT) {
1015         case OPf_WANT_VOID:
1016             sv_catpvs(tmpsv, ",VOID");
1017             break;
1018         case OPf_WANT_SCALAR:
1019             sv_catpvs(tmpsv, ",SCALAR");
1020             break;
1021         case OPf_WANT_LIST:
1022             sv_catpvs(tmpsv, ",LIST");
1023             break;
1024         default:
1025             sv_catpvs(tmpsv, ",UNKNOWN");
1026             break;
1027         }
1028         append_flags(tmpsv, o->op_flags, op_flags_names);
1029         if (o->op_slabbed)  sv_catpvs(tmpsv, ",SLABBED");
1030         if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
1031         if (o->op_static)   sv_catpvs(tmpsv, ",STATIC");
1032         if (o->op_folded)   sv_catpvs(tmpsv, ",FOLDED");
1033         if (o->op_moresib)  sv_catpvs(tmpsv, ",MORESIB");
1034         S_opdump_indent(aTHX_ o, level, bar, file, "FLAGS = (%s)\n",
1035                          SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
1036     }
1037 
1038     if (o->op_private) {
1039         U16 oppriv = o->op_private;
1040         I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
1041         SV * tmpsv = NULL;
1042 
1043         if (op_ix != -1) {
1044             U16 stop = 0;
1045             tmpsv = newSVpvs("");
1046             for (; !stop; op_ix++) {
1047                 U16 entry = PL_op_private_bitdefs[op_ix];
1048                 U16 bit = (entry >> 2) & 7;
1049                 U16 ix = entry >> 5;
1050 
1051                 stop = (entry & 1);
1052 
1053                 if (entry & 2) {
1054                     /* bitfield */
1055                     I16 const *p = &PL_op_private_bitfields[ix];
1056                     U16 bitmin = (U16) *p++;
1057                     I16 label = *p++;
1058                     I16 enum_label;
1059                     U16 mask = 0;
1060                     U16 i;
1061                     U16 val;
1062 
1063                     for (i = bitmin; i<= bit; i++)
1064                         mask |= (1<<i);
1065                     bit = bitmin;
1066                     val = (oppriv & mask);
1067 
1068                     if (   label != -1
1069                         && PL_op_private_labels[label] == '-'
1070                         && PL_op_private_labels[label+1] == '\0'
1071                     )
1072                         /* display as raw number */
1073                         continue;
1074 
1075                     oppriv -= val;
1076                     val >>= bit;
1077                     enum_label = -1;
1078                     while (*p != -1) {
1079                         if (val == *p++) {
1080                             enum_label = *p;
1081                             break;
1082                         }
1083                         p++;
1084                     }
1085                     if (val == 0 && enum_label == -1)
1086                         /* don't display anonymous zero values */
1087                         continue;
1088 
1089                     sv_catpvs(tmpsv, ",");
1090                     if (label != -1) {
1091                         sv_catpv(tmpsv, &PL_op_private_labels[label]);
1092                         sv_catpvs(tmpsv, "=");
1093                     }
1094                     if (enum_label == -1)
1095                         Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)val);
1096                     else
1097                         sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
1098 
1099                 }
1100                 else {
1101                     /* bit flag */
1102                     if (   oppriv & (1<<bit)
1103                         && !(PL_op_private_labels[ix] == '-'
1104                              && PL_op_private_labels[ix+1] == '\0'))
1105                     {
1106                         oppriv -= (1<<bit);
1107                         sv_catpvs(tmpsv, ",");
1108                         sv_catpv(tmpsv, &PL_op_private_labels[ix]);
1109                     }
1110                 }
1111             }
1112             if (oppriv) {
1113                 sv_catpvs(tmpsv, ",");
1114                 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)oppriv);
1115             }
1116         }
1117 	if (tmpsv && SvCUR(tmpsv)) {
1118             S_opdump_indent(aTHX_ o, level, bar, file, "PRIVATE = (%s)\n",
1119                             SvPVX_const(tmpsv) + 1);
1120 	} else
1121             S_opdump_indent(aTHX_ o, level, bar, file,
1122                             "PRIVATE = (0x%" UVxf ")\n", (UV)oppriv);
1123     }
1124 
1125     switch (optype) {
1126     case OP_AELEMFAST:
1127     case OP_GVSV:
1128     case OP_GV:
1129 #ifdef USE_ITHREADS
1130 	S_opdump_indent(aTHX_ o, level, bar, file,
1131                         "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1132 #else
1133         S_opdump_indent(aTHX_ o, level, bar, file,
1134             "GV = %" SVf " (0x%" UVxf ")\n",
1135             SVfARG(S_gv_display(aTHX_ cGVOPo_gv)), PTR2UV(cGVOPo_gv));
1136 #endif
1137 	break;
1138 
1139     case OP_MULTIDEREF:
1140     {
1141         UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
1142         UV i, count = items[-1].uv;
1143 
1144 	S_opdump_indent(aTHX_ o, level, bar, file, "ARGS = \n");
1145         for (i=0; i < count;  i++)
1146             S_opdump_indent(aTHX_ o, level+1, (bar << 1), file,
1147                                     "%" UVuf " => 0x%" UVxf "\n",
1148                                     i, items[i].uv);
1149 	break;
1150     }
1151 
1152     case OP_MULTICONCAT:
1153 	S_opdump_indent(aTHX_ o, level, bar, file, "NARGS = %" IVdf "\n",
1154             (IV)cUNOP_AUXo->op_aux[PERL_MULTICONCAT_IX_NARGS].ssize);
1155         /* XXX really ought to dump each field individually,
1156          * but that's too much like hard work */
1157 	S_opdump_indent(aTHX_ o, level, bar, file, "CONSTS = (%" SVf ")\n",
1158             SVfARG(multiconcat_stringify(o)));
1159 	break;
1160 
1161     case OP_CONST:
1162     case OP_HINTSEVAL:
1163     case OP_METHOD_NAMED:
1164     case OP_METHOD_SUPER:
1165     case OP_METHOD_REDIR:
1166     case OP_METHOD_REDIR_SUPER:
1167 #ifndef USE_ITHREADS
1168 	/* with ITHREADS, consts are stored in the pad, and the right pad
1169 	 * may not be active here, so skip */
1170 	S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n",
1171                         SvPEEK(cMETHOPx_meth(o)));
1172 #endif
1173 	break;
1174     case OP_NULL:
1175 	if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1176 	    break;
1177 	/* FALLTHROUGH */
1178     case OP_NEXTSTATE:
1179     case OP_DBSTATE:
1180 	if (CopLINE(cCOPo))
1181 	    S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n",
1182 			     (UV)CopLINE(cCOPo));
1183 
1184         if (CopSTASHPV(cCOPo)) {
1185             SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1186             HV *stash = CopSTASH(cCOPo);
1187             const char * const hvname = HvNAME_get(stash);
1188 
1189             S_opdump_indent(aTHX_ o, level, bar, file, "PACKAGE = \"%s\"\n",
1190                                generic_pv_escape(tmpsv, hvname,
1191                                   HvNAMELEN(stash), HvNAMEUTF8(stash)));
1192         }
1193 
1194         if (CopLABEL(cCOPo)) {
1195             SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1196             STRLEN label_len;
1197             U32 label_flags;
1198             const char *label = CopLABEL_len_flags(cCOPo,
1199                                                      &label_len, &label_flags);
1200             S_opdump_indent(aTHX_ o, level, bar, file, "LABEL = \"%s\"\n",
1201                                 generic_pv_escape( tmpsv, label, label_len,
1202                                            (label_flags & SVf_UTF8)));
1203         }
1204 
1205         S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
1206                          (unsigned int)cCOPo->cop_seq);
1207 	break;
1208 
1209     case OP_ENTERITER:
1210     case OP_ENTERLOOP:
1211 	S_opdump_indent(aTHX_ o, level, bar, file, "REDO");
1212         S_opdump_link(aTHX_ o, cLOOPo->op_redoop, file);
1213 	S_opdump_indent(aTHX_ o, level, bar, file, "NEXT");
1214         S_opdump_link(aTHX_ o, cLOOPo->op_nextop, file);
1215 	S_opdump_indent(aTHX_ o, level, bar, file, "LAST");
1216         S_opdump_link(aTHX_ o, cLOOPo->op_lastop, file);
1217 	break;
1218 
1219     case OP_REGCOMP:
1220     case OP_SUBSTCONT:
1221     case OP_COND_EXPR:
1222     case OP_RANGE:
1223     case OP_MAPWHILE:
1224     case OP_GREPWHILE:
1225     case OP_OR:
1226     case OP_DOR:
1227     case OP_AND:
1228     case OP_ORASSIGN:
1229     case OP_DORASSIGN:
1230     case OP_ANDASSIGN:
1231     case OP_ARGDEFELEM:
1232     case OP_ENTERGIVEN:
1233     case OP_ENTERWHEN:
1234     case OP_ENTERTRY:
1235     case OP_ONCE:
1236 	S_opdump_indent(aTHX_ o, level, bar, file, "OTHER");
1237         S_opdump_link(aTHX_ o, cLOGOPo->op_other, file);
1238 	break;
1239     case OP_SPLIT:
1240     case OP_MATCH:
1241     case OP_QR:
1242     case OP_SUBST:
1243 	S_do_pmop_dump_bar(aTHX_ level, bar, file, cPMOPo);
1244 	break;
1245     case OP_LEAVE:
1246     case OP_LEAVEEVAL:
1247     case OP_LEAVESUB:
1248     case OP_LEAVESUBLV:
1249     case OP_LEAVEWRITE:
1250     case OP_SCOPE:
1251 	if (o->op_private & OPpREFCOUNTED)
1252 	    S_opdump_indent(aTHX_ o, level, bar, file,
1253                             "REFCNT = %" UVuf "\n", (UV)o->op_targ);
1254 	break;
1255 
1256     case OP_DUMP:
1257     case OP_GOTO:
1258     case OP_NEXT:
1259     case OP_LAST:
1260     case OP_REDO:
1261 	if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
1262 	    break;
1263         {
1264             SV * const label = newSVpvs_flags("", SVs_TEMP);
1265             generic_pv_escape(label, cPVOPo->op_pv, strlen(cPVOPo->op_pv), 0);
1266             S_opdump_indent(aTHX_ o, level, bar, file,
1267                             "PV = \"%" SVf "\" (0x%" UVxf ")\n",
1268                             SVfARG(label), PTR2UV(cPVOPo->op_pv));
1269             break;
1270         }
1271 
1272     case OP_TRANS:
1273     case OP_TRANSR:
1274         if (o->op_private & (OPpTRANS_FROM_UTF | OPpTRANS_TO_UTF)) {
1275             /* utf8: table stored as a swash */
1276 #ifndef USE_ITHREADS
1277 	/* with ITHREADS, swash is stored in the pad, and the right pad
1278 	 * may not be active here, so skip */
1279             S_opdump_indent(aTHX_ o, level, bar, file,
1280                             "SWASH = 0x%" UVxf "\n",
1281                             PTR2UV(MUTABLE_SV(cSVOPo->op_sv)));
1282 #endif
1283         }
1284         else {
1285             const OPtrans_map * const tbl = (OPtrans_map*)cPVOPo->op_pv;
1286             SSize_t i, size = tbl->size;
1287 
1288             S_opdump_indent(aTHX_ o, level, bar, file,
1289                             "TABLE = 0x%" UVxf "\n",
1290                             PTR2UV(tbl));
1291             S_opdump_indent(aTHX_ o, level, bar, file,
1292                 "  SIZE: 0x%" UVxf "\n", (UV)size);
1293 
1294             /* dump size+1 values, to include the extra slot at the end */
1295             for (i = 0; i <= size; i++) {
1296                 short val = tbl->map[i];
1297                 if ((i & 0xf) == 0)
1298                     S_opdump_indent(aTHX_ o, level, bar, file,
1299                         " %4" UVxf ":", (UV)i);
1300                 if (val < 0)
1301                     PerlIO_printf(file, " %2"  IVdf, (IV)val);
1302                 else
1303                     PerlIO_printf(file, " %02" UVxf, (UV)val);
1304 
1305                 if ( i == size || (i & 0xf) == 0xf)
1306                     PerlIO_printf(file, "\n");
1307             }
1308         }
1309         break;
1310 
1311 
1312     default:
1313 	break;
1314     }
1315     if (o->op_flags & OPf_KIDS) {
1316 	OP *kid;
1317         level++;
1318         bar <<= 1;
1319 	for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1320 	    S_do_op_dump_bar(aTHX_ level,
1321                             (bar | cBOOL(OpHAS_SIBLING(kid))),
1322                             file, kid);
1323     }
1324 }
1325 
1326 
1327 void
1328 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
1329 {
1330     S_do_op_dump_bar(aTHX_ level, 0, file, o);
1331 }
1332 
1333 
1334 /*
1335 =for apidoc op_dump
1336 
1337 Dumps the optree starting at OP C<o> to C<STDERR>.
1338 
1339 =cut
1340 */
1341 
1342 void
1343 Perl_op_dump(pTHX_ const OP *o)
1344 {
1345     PERL_ARGS_ASSERT_OP_DUMP;
1346     do_op_dump(0, Perl_debug_log, o);
1347 }
1348 
1349 void
1350 Perl_gv_dump(pTHX_ GV *gv)
1351 {
1352     STRLEN len;
1353     const char* name;
1354     SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1355 
1356     if (!gv) {
1357 	PerlIO_printf(Perl_debug_log, "{}\n");
1358 	return;
1359     }
1360     sv = sv_newmortal();
1361     PerlIO_printf(Perl_debug_log, "{\n");
1362     gv_fullname3(sv, gv, NULL);
1363     name = SvPV_const(sv, len);
1364     Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1365                      generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1366     if (gv != GvEGV(gv)) {
1367 	gv_efullname3(sv, GvEGV(gv), NULL);
1368         name = SvPV_const(sv, len);
1369         Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1370                      generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1371     }
1372     (void)PerlIO_putc(Perl_debug_log, '\n');
1373     Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1374 }
1375 
1376 
1377 /* map magic types to the symbolic names
1378  * (with the PERL_MAGIC_ prefixed stripped)
1379  */
1380 
1381 static const struct { const char type; const char *name; } magic_names[] = {
1382 #include "mg_names.inc"
1383 	/* this null string terminates the list */
1384 	{ 0,                         NULL },
1385 };
1386 
1387 void
1388 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1389 {
1390     PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1391 
1392     for (; mg; mg = mg->mg_moremagic) {
1393         Perl_dump_indent(aTHX_ level, file,
1394 			 "  MAGIC = 0x%" UVxf "\n", PTR2UV(mg));
1395         if (mg->mg_virtual) {
1396             const MGVTBL * const v = mg->mg_virtual;
1397 	    if (v >= PL_magic_vtables
1398 		&& v < PL_magic_vtables + magic_vtable_max) {
1399 		const U32 i = v - PL_magic_vtables;
1400 	        Perl_dump_indent(aTHX_ level, file, "    MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1401 	    }
1402 	    else
1403 	        Perl_dump_indent(aTHX_ level, file, "    MG_VIRTUAL = 0x%"
1404                                        UVxf "\n", PTR2UV(v));
1405         }
1406 	else
1407 	    Perl_dump_indent(aTHX_ level, file, "    MG_VIRTUAL = 0\n");
1408 
1409 	if (mg->mg_private)
1410 	    Perl_dump_indent(aTHX_ level, file, "    MG_PRIVATE = %d\n", mg->mg_private);
1411 
1412 	{
1413 	    int n;
1414 	    const char *name = NULL;
1415 	    for (n = 0; magic_names[n].name; n++) {
1416 		if (mg->mg_type == magic_names[n].type) {
1417 		    name = magic_names[n].name;
1418 		    break;
1419 		}
1420 	    }
1421 	    if (name)
1422 		Perl_dump_indent(aTHX_ level, file,
1423 				"    MG_TYPE = PERL_MAGIC_%s\n", name);
1424 	    else
1425 		Perl_dump_indent(aTHX_ level, file,
1426 				"    MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1427 	}
1428 
1429         if (mg->mg_flags) {
1430             Perl_dump_indent(aTHX_ level, file, "    MG_FLAGS = 0x%02X\n", mg->mg_flags);
1431 	    if (mg->mg_type == PERL_MAGIC_envelem &&
1432 		mg->mg_flags & MGf_TAINTEDDIR)
1433 	        Perl_dump_indent(aTHX_ level, file, "      TAINTEDDIR\n");
1434 	    if (mg->mg_type == PERL_MAGIC_regex_global &&
1435 		mg->mg_flags & MGf_MINMATCH)
1436 	        Perl_dump_indent(aTHX_ level, file, "      MINMATCH\n");
1437 	    if (mg->mg_flags & MGf_REFCOUNTED)
1438 	        Perl_dump_indent(aTHX_ level, file, "      REFCOUNTED\n");
1439             if (mg->mg_flags & MGf_GSKIP)
1440 	        Perl_dump_indent(aTHX_ level, file, "      GSKIP\n");
1441 	    if (mg->mg_flags & MGf_COPY)
1442 	        Perl_dump_indent(aTHX_ level, file, "      COPY\n");
1443 	    if (mg->mg_flags & MGf_DUP)
1444 	        Perl_dump_indent(aTHX_ level, file, "      DUP\n");
1445 	    if (mg->mg_flags & MGf_LOCAL)
1446 	        Perl_dump_indent(aTHX_ level, file, "      LOCAL\n");
1447 	    if (mg->mg_type == PERL_MAGIC_regex_global &&
1448 		mg->mg_flags & MGf_BYTES)
1449 	        Perl_dump_indent(aTHX_ level, file, "      BYTES\n");
1450         }
1451 	if (mg->mg_obj) {
1452 	    Perl_dump_indent(aTHX_ level, file, "    MG_OBJ = 0x%" UVxf "\n",
1453 	        PTR2UV(mg->mg_obj));
1454             if (mg->mg_type == PERL_MAGIC_qr) {
1455 		REGEXP* const re = (REGEXP *)mg->mg_obj;
1456 		SV * const dsv = sv_newmortal();
1457                 const char * const s
1458 		    = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1459                     60, NULL, NULL,
1460                     ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1461                     (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1462                 );
1463 		Perl_dump_indent(aTHX_ level+1, file, "    PAT = %s\n", s);
1464 		Perl_dump_indent(aTHX_ level+1, file, "    REFCNT = %" IVdf "\n",
1465 			(IV)RX_REFCNT(re));
1466             }
1467             if (mg->mg_flags & MGf_REFCOUNTED)
1468 		do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1469 	}
1470         if (mg->mg_len)
1471 	    Perl_dump_indent(aTHX_ level, file, "    MG_LEN = %ld\n", (long)mg->mg_len);
1472         if (mg->mg_ptr) {
1473 	    Perl_dump_indent(aTHX_ level, file, "    MG_PTR = 0x%" UVxf, PTR2UV(mg->mg_ptr));
1474 	    if (mg->mg_len >= 0) {
1475 		if (mg->mg_type != PERL_MAGIC_utf8) {
1476 		    SV * const sv = newSVpvs("");
1477 		    PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1478 		    SvREFCNT_dec_NN(sv);
1479 		}
1480             }
1481 	    else if (mg->mg_len == HEf_SVKEY) {
1482 		PerlIO_puts(file, " => HEf_SVKEY\n");
1483 		do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1484 			   maxnest, dumpops, pvlim); /* MG is already +1 */
1485 		continue;
1486 	    }
1487 	    else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1488 	    else
1489 		PerlIO_puts(
1490 		  file,
1491 		 " ???? - " __FILE__
1492 		 " does not know how to handle this MG_LEN"
1493 		);
1494             (void)PerlIO_putc(file, '\n');
1495         }
1496 	if (mg->mg_type == PERL_MAGIC_utf8) {
1497 	    const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1498 	    if (cache) {
1499 		IV i;
1500 		for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1501 		    Perl_dump_indent(aTHX_ level, file,
1502 				     "      %2" IVdf ": %" UVuf " -> %" UVuf "\n",
1503 				     i,
1504 				     (UV)cache[i * 2],
1505 				     (UV)cache[i * 2 + 1]);
1506 	    }
1507 	}
1508     }
1509 }
1510 
1511 void
1512 Perl_magic_dump(pTHX_ const MAGIC *mg)
1513 {
1514     do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1515 }
1516 
1517 void
1518 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1519 {
1520     const char *hvname;
1521 
1522     PERL_ARGS_ASSERT_DO_HV_DUMP;
1523 
1524     Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1525     if (sv && (hvname = HvNAME_get(sv)))
1526     {
1527 	/* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1528            name which quite legally could contain insane things like tabs, newlines, nulls or
1529            other scary crap - this should produce sane results - except maybe for unicode package
1530            names - but we will wait for someone to file a bug on that - demerphq */
1531         SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1532         PerlIO_printf(file, "\t\"%s\"\n",
1533                               generic_pv_escape( tmpsv, hvname,
1534                                    HvNAMELEN(sv), HvNAMEUTF8(sv)));
1535     }
1536     else
1537         (void)PerlIO_putc(file, '\n');
1538 }
1539 
1540 void
1541 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1542 {
1543     PERL_ARGS_ASSERT_DO_GV_DUMP;
1544 
1545     Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1546     if (sv && GvNAME(sv)) {
1547         SV * const tmpsv = newSVpvs("");
1548         PerlIO_printf(file, "\t\"%s\"\n",
1549                               generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1550     }
1551     else
1552         (void)PerlIO_putc(file, '\n');
1553 }
1554 
1555 void
1556 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1557 {
1558     PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1559 
1560     Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1561     if (sv && GvNAME(sv)) {
1562        SV *tmp = newSVpvs_flags("", SVs_TEMP);
1563 	const char *hvname;
1564         HV * const stash = GvSTASH(sv);
1565 	PerlIO_printf(file, "\t");
1566         /* TODO might have an extra \" here */
1567 	if (stash && (hvname = HvNAME_get(stash))) {
1568             PerlIO_printf(file, "\"%s\" :: \"",
1569                                   generic_pv_escape(tmp, hvname,
1570                                       HvNAMELEN(stash), HvNAMEUTF8(stash)));
1571         }
1572         PerlIO_printf(file, "%s\"\n",
1573                               generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1574     }
1575     else
1576         (void)PerlIO_putc(file, '\n');
1577 }
1578 
1579 const struct flag_to_name first_sv_flags_names[] = {
1580     {SVs_TEMP, "TEMP,"},
1581     {SVs_OBJECT, "OBJECT,"},
1582     {SVs_GMG, "GMG,"},
1583     {SVs_SMG, "SMG,"},
1584     {SVs_RMG, "RMG,"},
1585     {SVf_IOK, "IOK,"},
1586     {SVf_NOK, "NOK,"},
1587     {SVf_POK, "POK,"}
1588 };
1589 
1590 const struct flag_to_name second_sv_flags_names[] = {
1591     {SVf_OOK, "OOK,"},
1592     {SVf_FAKE, "FAKE,"},
1593     {SVf_READONLY, "READONLY,"},
1594     {SVf_PROTECT, "PROTECT,"},
1595     {SVf_BREAK, "BREAK,"},
1596     {SVp_IOK, "pIOK,"},
1597     {SVp_NOK, "pNOK,"},
1598     {SVp_POK, "pPOK,"}
1599 };
1600 
1601 const struct flag_to_name cv_flags_names[] = {
1602     {CVf_ANON, "ANON,"},
1603     {CVf_UNIQUE, "UNIQUE,"},
1604     {CVf_CLONE, "CLONE,"},
1605     {CVf_CLONED, "CLONED,"},
1606     {CVf_CONST, "CONST,"},
1607     {CVf_NODEBUG, "NODEBUG,"},
1608     {CVf_LVALUE, "LVALUE,"},
1609     {CVf_METHOD, "METHOD,"},
1610     {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1611     {CVf_CVGV_RC, "CVGV_RC,"},
1612     {CVf_DYNFILE, "DYNFILE,"},
1613     {CVf_AUTOLOAD, "AUTOLOAD,"},
1614     {CVf_HASEVAL, "HASEVAL,"},
1615     {CVf_SLABBED, "SLABBED,"},
1616     {CVf_NAMED, "NAMED,"},
1617     {CVf_LEXICAL, "LEXICAL,"},
1618     {CVf_ISXSUB, "ISXSUB,"}
1619 };
1620 
1621 const struct flag_to_name hv_flags_names[] = {
1622     {SVphv_SHAREKEYS, "SHAREKEYS,"},
1623     {SVphv_LAZYDEL, "LAZYDEL,"},
1624     {SVphv_HASKFLAGS, "HASKFLAGS,"},
1625     {SVf_AMAGIC, "OVERLOAD,"},
1626     {SVphv_CLONEABLE, "CLONEABLE,"}
1627 };
1628 
1629 const struct flag_to_name gp_flags_names[] = {
1630     {GVf_INTRO, "INTRO,"},
1631     {GVf_MULTI, "MULTI,"},
1632     {GVf_ASSUMECV, "ASSUMECV,"},
1633 };
1634 
1635 const struct flag_to_name gp_flags_imported_names[] = {
1636     {GVf_IMPORTED_SV, " SV"},
1637     {GVf_IMPORTED_AV, " AV"},
1638     {GVf_IMPORTED_HV, " HV"},
1639     {GVf_IMPORTED_CV, " CV"},
1640 };
1641 
1642 /* NOTE: this structure is mostly duplicative of one generated by
1643  * 'make regen' in regnodes.h - perhaps we should somehow integrate
1644  * the two. - Yves */
1645 const struct flag_to_name regexp_extflags_names[] = {
1646     {RXf_PMf_MULTILINE,   "PMf_MULTILINE,"},
1647     {RXf_PMf_SINGLELINE,  "PMf_SINGLELINE,"},
1648     {RXf_PMf_FOLD,        "PMf_FOLD,"},
1649     {RXf_PMf_EXTENDED,    "PMf_EXTENDED,"},
1650     {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1651     {RXf_PMf_KEEPCOPY,    "PMf_KEEPCOPY,"},
1652     {RXf_PMf_NOCAPTURE,   "PMf_NOCAPURE,"},
1653     {RXf_IS_ANCHORED,     "IS_ANCHORED,"},
1654     {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1655     {RXf_EVAL_SEEN,       "EVAL_SEEN,"},
1656     {RXf_CHECK_ALL,       "CHECK_ALL,"},
1657     {RXf_MATCH_UTF8,      "MATCH_UTF8,"},
1658     {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1659     {RXf_USE_INTUIT_ML,   "USE_INTUIT_ML,"},
1660     {RXf_INTUIT_TAIL,     "INTUIT_TAIL,"},
1661     {RXf_SPLIT,           "SPLIT,"},
1662     {RXf_COPY_DONE,       "COPY_DONE,"},
1663     {RXf_TAINTED_SEEN,    "TAINTED_SEEN,"},
1664     {RXf_TAINTED,         "TAINTED,"},
1665     {RXf_START_ONLY,      "START_ONLY,"},
1666     {RXf_SKIPWHITE,       "SKIPWHITE,"},
1667     {RXf_WHITE,           "WHITE,"},
1668     {RXf_NULL,            "NULL,"},
1669 };
1670 
1671 /* NOTE: this structure is mostly duplicative of one generated by
1672  * 'make regen' in regnodes.h - perhaps we should somehow integrate
1673  * the two. - Yves */
1674 const struct flag_to_name regexp_core_intflags_names[] = {
1675     {PREGf_SKIP,            "SKIP,"},
1676     {PREGf_IMPLICIT,        "IMPLICIT,"},
1677     {PREGf_NAUGHTY,         "NAUGHTY,"},
1678     {PREGf_VERBARG_SEEN,    "VERBARG_SEEN,"},
1679     {PREGf_CUTGROUP_SEEN,   "CUTGROUP_SEEN,"},
1680     {PREGf_USE_RE_EVAL,     "USE_RE_EVAL,"},
1681     {PREGf_NOSCAN,          "NOSCAN,"},
1682     {PREGf_GPOS_SEEN,       "GPOS_SEEN,"},
1683     {PREGf_GPOS_FLOAT,      "GPOS_FLOAT,"},
1684     {PREGf_ANCH_MBOL,       "ANCH_MBOL,"},
1685     {PREGf_ANCH_SBOL,       "ANCH_SBOL,"},
1686     {PREGf_ANCH_GPOS,       "ANCH_GPOS,"},
1687 };
1688 
1689 /* Perl_do_sv_dump():
1690  *
1691  * level:   amount to indent the output
1692  * sv:      the object to dump
1693  * nest:    the current level of recursion
1694  * maxnest: the maximum allowed level of recursion
1695  * dumpops: if true, also dump the ops associated with a CV
1696  * pvlim:   limit on the length of any strings that are output
1697  * */
1698 
1699 void
1700 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1701 {
1702     dVAR;
1703     SV *d;
1704     const char *s;
1705     U32 flags;
1706     U32 type;
1707 
1708     PERL_ARGS_ASSERT_DO_SV_DUMP;
1709 
1710     if (!sv) {
1711 	Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1712 	return;
1713     }
1714 
1715     flags = SvFLAGS(sv);
1716     type = SvTYPE(sv);
1717 
1718     /* process general SV flags */
1719 
1720     d = Perl_newSVpvf(aTHX_
1721 		   "(0x%" UVxf ") at 0x%" UVxf "\n%*s  REFCNT = %" IVdf "\n%*s  FLAGS = (",
1722 		   PTR2UV(SvANY(sv)), PTR2UV(sv),
1723 		   (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1724 		   (int)(PL_dumpindent*level), "");
1725 
1726     if ((flags & SVs_PADSTALE))
1727 	    sv_catpvs(d, "PADSTALE,");
1728     if ((flags & SVs_PADTMP))
1729 	    sv_catpvs(d, "PADTMP,");
1730     append_flags(d, flags, first_sv_flags_names);
1731     if (flags & SVf_ROK)  {
1732                                 sv_catpvs(d, "ROK,");
1733 	if (SvWEAKREF(sv))	sv_catpvs(d, "WEAKREF,");
1734     }
1735     if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1736     append_flags(d, flags, second_sv_flags_names);
1737     if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1738 			   && type != SVt_PVAV) {
1739 	if (SvPCS_IMPORTED(sv))
1740 				sv_catpvs(d, "PCS_IMPORTED,");
1741 	else
1742 				sv_catpvs(d, "SCREAM,");
1743     }
1744 
1745     /* process type-specific SV flags */
1746 
1747     switch (type) {
1748     case SVt_PVCV:
1749     case SVt_PVFM:
1750 	append_flags(d, CvFLAGS(sv), cv_flags_names);
1751 	break;
1752     case SVt_PVHV:
1753 	append_flags(d, flags, hv_flags_names);
1754 	break;
1755     case SVt_PVGV:
1756     case SVt_PVLV:
1757 	if (isGV_with_GP(sv)) {
1758 	    append_flags(d, GvFLAGS(sv), gp_flags_names);
1759 	}
1760 	if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1761 	    sv_catpvs(d, "IMPORT");
1762 	    if (GvIMPORTED(sv) == GVf_IMPORTED)
1763 		sv_catpvs(d, "ALL,");
1764 	    else {
1765 		sv_catpvs(d, "(");
1766 		append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1767 		sv_catpvs(d, " ),");
1768 	    }
1769 	}
1770 	/* FALLTHROUGH */
1771     case SVt_PVMG:
1772     default:
1773 	if (SvIsUV(sv) && !(flags & SVf_ROK))	sv_catpvs(d, "IsUV,");
1774 	break;
1775 
1776     case SVt_PVAV:
1777 	break;
1778     }
1779     /* SVphv_SHAREKEYS is also 0x20000000 */
1780     if ((type != SVt_PVHV) && SvUTF8(sv))
1781         sv_catpvs(d, "UTF8");
1782 
1783     if (*(SvEND(d) - 1) == ',') {
1784         SvCUR_set(d, SvCUR(d) - 1);
1785 	SvPVX(d)[SvCUR(d)] = '\0';
1786     }
1787     sv_catpvs(d, ")");
1788     s = SvPVX_const(d);
1789 
1790     /* dump initial SV details */
1791 
1792 #ifdef DEBUG_LEAKING_SCALARS
1793     Perl_dump_indent(aTHX_ level, file,
1794 	"ALLOCATED at %s:%d %s %s (parent 0x%" UVxf "); serial %" UVuf "\n",
1795 	sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1796 	sv->sv_debug_line,
1797 	sv->sv_debug_inpad ? "for" : "by",
1798 	sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1799 	PTR2UV(sv->sv_debug_parent),
1800 	sv->sv_debug_serial
1801     );
1802 #endif
1803     Perl_dump_indent(aTHX_ level, file, "SV = ");
1804 
1805     /* Dump SV type */
1806 
1807     if (type < SVt_LAST) {
1808 	PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1809 
1810 	if (type ==  SVt_NULL) {
1811 	    SvREFCNT_dec_NN(d);
1812 	    return;
1813 	}
1814     } else {
1815 	PerlIO_printf(file, "UNKNOWN(0x%" UVxf ") %s\n", (UV)type, s);
1816 	SvREFCNT_dec_NN(d);
1817 	return;
1818     }
1819 
1820     /* Dump general SV fields */
1821 
1822     if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1823 	 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1824 	 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1825 	|| (type == SVt_IV && !SvROK(sv))) {
1826 	if (SvIsUV(sv)
1827 	                             )
1828 	    Perl_dump_indent(aTHX_ level, file, "  UV = %" UVuf, (UV)SvUVX(sv));
1829 	else
1830 	    Perl_dump_indent(aTHX_ level, file, "  IV = %" IVdf, (IV)SvIVX(sv));
1831 	(void)PerlIO_putc(file, '\n');
1832     }
1833 
1834     if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1835 		&& type != SVt_PVCV && type != SVt_PVFM  && type != SVt_REGEXP
1836 		&& type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1837 	       || type == SVt_NV) {
1838         DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
1839         STORE_LC_NUMERIC_SET_STANDARD();
1840 	Perl_dump_indent(aTHX_ level, file, "  NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1841         RESTORE_LC_NUMERIC();
1842     }
1843 
1844     if (SvROK(sv)) {
1845 	Perl_dump_indent(aTHX_ level, file, "  RV = 0x%" UVxf "\n",
1846                                PTR2UV(SvRV(sv)));
1847 	if (nest < maxnest)
1848 	    do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1849     }
1850 
1851     if (type < SVt_PV) {
1852 	SvREFCNT_dec_NN(d);
1853 	return;
1854     }
1855 
1856     if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1857      || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1858 	const bool re = isREGEXP(sv);
1859 	const char * const ptr =
1860 	    re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1861 	if (ptr) {
1862 	    STRLEN delta;
1863 	    if (SvOOK(sv)) {
1864 		SvOOK_offset(sv, delta);
1865 		Perl_dump_indent(aTHX_ level, file,"  OFFSET = %" UVuf "\n",
1866 				 (UV) delta);
1867 	    } else {
1868 		delta = 0;
1869 	    }
1870 	    Perl_dump_indent(aTHX_ level, file,"  PV = 0x%" UVxf " ",
1871                                    PTR2UV(ptr));
1872 	    if (SvOOK(sv)) {
1873 		PerlIO_printf(file, "( %s . ) ",
1874 			      pv_display(d, ptr - delta, delta, 0,
1875 					 pvlim));
1876 	    }
1877             if (type == SVt_INVLIST) {
1878 		PerlIO_printf(file, "\n");
1879                 /* 4 blanks indents 2 beyond the PV, etc */
1880                 _invlist_dump(file, level, "    ", sv);
1881             }
1882             else {
1883                 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1884                                                      re ? 0 : SvLEN(sv),
1885                                                      pvlim));
1886                 if (SvUTF8(sv)) /* the 6?  \x{....} */
1887                     PerlIO_printf(file, " [UTF8 \"%s\"]",
1888                                          sv_uni_display(d, sv, 6 * SvCUR(sv),
1889                                                         UNI_DISPLAY_QQ));
1890                 PerlIO_printf(file, "\n");
1891             }
1892 	    Perl_dump_indent(aTHX_ level, file, "  CUR = %" IVdf "\n", (IV)SvCUR(sv));
1893 	    if (re && type == SVt_PVLV)
1894                 /* LV-as-REGEXP usurps len field to store pointer to
1895                  * regexp struct */
1896 		Perl_dump_indent(aTHX_ level, file, "  REGEXP = 0x%" UVxf "\n",
1897                    PTR2UV(((XPV*)SvANY(sv))->xpv_len_u.xpvlenu_rx));
1898             else
1899 		Perl_dump_indent(aTHX_ level, file, "  LEN = %" IVdf "\n",
1900 				       (IV)SvLEN(sv));
1901 #ifdef PERL_COPY_ON_WRITE
1902 	    if (SvIsCOW(sv) && SvLEN(sv))
1903 		Perl_dump_indent(aTHX_ level, file, "  COW_REFCNT = %d\n",
1904 				       CowREFCNT(sv));
1905 #endif
1906 	}
1907 	else
1908 	    Perl_dump_indent(aTHX_ level, file, "  PV = 0\n");
1909     }
1910 
1911     if (type >= SVt_PVMG) {
1912 	if (SvMAGIC(sv))
1913 		do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1914 	if (SvSTASH(sv))
1915 	    do_hv_dump(level, file, "  STASH", SvSTASH(sv));
1916 
1917 	if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1918 	    Perl_dump_indent(aTHX_ level, file, "  USEFUL = %" IVdf "\n",
1919                                    (IV)BmUSEFUL(sv));
1920 	}
1921     }
1922 
1923     /* Dump type-specific SV fields */
1924 
1925     switch (type) {
1926     case SVt_PVAV:
1927 	Perl_dump_indent(aTHX_ level, file, "  ARRAY = 0x%" UVxf,
1928                                PTR2UV(AvARRAY(sv)));
1929 	if (AvARRAY(sv) != AvALLOC(sv)) {
1930 	    PerlIO_printf(file, " (offset=%" IVdf ")\n",
1931                                 (IV)(AvARRAY(sv) - AvALLOC(sv)));
1932 	    Perl_dump_indent(aTHX_ level, file, "  ALLOC = 0x%" UVxf "\n",
1933                                    PTR2UV(AvALLOC(sv)));
1934 	}
1935 	else
1936             (void)PerlIO_putc(file, '\n');
1937 	Perl_dump_indent(aTHX_ level, file, "  FILL = %" IVdf "\n",
1938                                (IV)AvFILLp(sv));
1939 	Perl_dump_indent(aTHX_ level, file, "  MAX = %" IVdf "\n",
1940                                (IV)AvMAX(sv));
1941         SvPVCLEAR(d);
1942 	if (AvREAL(sv))	sv_catpvs(d, ",REAL");
1943 	if (AvREIFY(sv))	sv_catpvs(d, ",REIFY");
1944 	Perl_dump_indent(aTHX_ level, file, "  FLAGS = (%s)\n",
1945 			 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1946 	if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1947 	    SSize_t count;
1948             SV **svp = AvARRAY(MUTABLE_AV(sv));
1949 	    for (count = 0;
1950                  count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1951                  count++, svp++)
1952             {
1953 		SV* const elt = *svp;
1954 		Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %" IVdf "\n",
1955                                        (IV)count);
1956                 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1957 	    }
1958 	}
1959 	break;
1960     case SVt_PVHV: {
1961 	U32 usedkeys;
1962         if (SvOOK(sv)) {
1963             struct xpvhv_aux *const aux = HvAUX(sv);
1964             Perl_dump_indent(aTHX_ level, file, "  AUX_FLAGS = %" UVuf "\n",
1965                              (UV)aux->xhv_aux_flags);
1966         }
1967 	Perl_dump_indent(aTHX_ level, file, "  ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
1968 	usedkeys = HvUSEDKEYS(MUTABLE_HV(sv));
1969 	if (HvARRAY(sv) && usedkeys) {
1970 	    /* Show distribution of HEs in the ARRAY */
1971 	    int freq[200];
1972 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1973 	    int i;
1974 	    int max = 0;
1975 	    U32 pow2 = 2, keys = usedkeys;
1976 	    NV theoret, sum = 0;
1977 
1978 	    PerlIO_printf(file, "  (");
1979 	    Zero(freq, FREQ_MAX + 1, int);
1980 	    for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1981 		HE* h;
1982 		int count = 0;
1983                 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1984 		    count++;
1985 		if (count > FREQ_MAX)
1986 		    count = FREQ_MAX;
1987 	        freq[count]++;
1988 	        if (max < count)
1989 		    max = count;
1990 	    }
1991 	    for (i = 0; i <= max; i++) {
1992 		if (freq[i]) {
1993 		    PerlIO_printf(file, "%d%s:%d", i,
1994 				  (i == FREQ_MAX) ? "+" : "",
1995 				  freq[i]);
1996 		    if (i != max)
1997 			PerlIO_printf(file, ", ");
1998 		}
1999             }
2000 	    (void)PerlIO_putc(file, ')');
2001 	    /* The "quality" of a hash is defined as the total number of
2002 	       comparisons needed to access every element once, relative
2003 	       to the expected number needed for a random hash.
2004 
2005 	       The total number of comparisons is equal to the sum of
2006 	       the squares of the number of entries in each bucket.
2007 	       For a random hash of n keys into k buckets, the expected
2008 	       value is
2009 				n + n(n-1)/2k
2010 	    */
2011 
2012 	    for (i = max; i > 0; i--) { /* Precision: count down. */
2013 		sum += freq[i] * i * i;
2014             }
2015 	    while ((keys = keys >> 1))
2016 		pow2 = pow2 << 1;
2017 	    theoret = usedkeys;
2018 	    theoret += theoret * (theoret-1)/pow2;
2019 	    (void)PerlIO_putc(file, '\n');
2020 	    Perl_dump_indent(aTHX_ level, file, "  hash quality = %.1"
2021                                    NVff "%%", theoret/sum*100);
2022 	}
2023 	(void)PerlIO_putc(file, '\n');
2024 	Perl_dump_indent(aTHX_ level, file, "  KEYS = %" IVdf "\n",
2025                                (IV)usedkeys);
2026         {
2027             STRLEN count = 0;
2028             HE **ents = HvARRAY(sv);
2029 
2030             if (ents) {
2031                 HE *const *const last = ents + HvMAX(sv);
2032                 count = last + 1 - ents;
2033 
2034                 do {
2035                     if (!*ents)
2036                         --count;
2037                 } while (++ents <= last);
2038             }
2039 
2040             Perl_dump_indent(aTHX_ level, file, "  FILL = %" UVuf "\n",
2041                              (UV)count);
2042         }
2043 	Perl_dump_indent(aTHX_ level, file, "  MAX = %" IVdf "\n",
2044                                (IV)HvMAX(sv));
2045         if (SvOOK(sv)) {
2046 	    Perl_dump_indent(aTHX_ level, file, "  RITER = %" IVdf "\n",
2047                                    (IV)HvRITER_get(sv));
2048 	    Perl_dump_indent(aTHX_ level, file, "  EITER = 0x%" UVxf "\n",
2049                                    PTR2UV(HvEITER_get(sv)));
2050 #ifdef PERL_HASH_RANDOMIZE_KEYS
2051 	    Perl_dump_indent(aTHX_ level, file, "  RAND = 0x%" UVxf,
2052                                    (UV)HvRAND_get(sv));
2053             if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
2054                 PerlIO_printf(file, " (LAST = 0x%" UVxf ")",
2055                                     (UV)HvLASTRAND_get(sv));
2056             }
2057 #endif
2058             (void)PerlIO_putc(file, '\n');
2059         }
2060 	{
2061 	    MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
2062 	    if (mg && mg->mg_obj) {
2063 		Perl_dump_indent(aTHX_ level, file, "  PMROOT = 0x%" UVxf "\n", PTR2UV(mg->mg_obj));
2064 	    }
2065 	}
2066 	{
2067 	    const char * const hvname = HvNAME_get(sv);
2068 	    if (hvname) {
2069                 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2070                 Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n",
2071                                        generic_pv_escape( tmpsv, hvname,
2072                                            HvNAMELEN(sv), HvNAMEUTF8(sv)));
2073         }
2074 	}
2075 	if (SvOOK(sv)) {
2076 	    AV * const backrefs
2077 		= *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
2078 	    struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
2079 	    if (HvAUX(sv)->xhv_name_count)
2080 		Perl_dump_indent(aTHX_
2081 		 level, file, "  NAMECOUNT = %" IVdf "\n",
2082 		 (IV)HvAUX(sv)->xhv_name_count
2083 		);
2084 	    if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
2085 		const I32 count = HvAUX(sv)->xhv_name_count;
2086 		if (count) {
2087 		    SV * const names = newSVpvs_flags("", SVs_TEMP);
2088 		    /* The starting point is the first element if count is
2089 		       positive and the second element if count is negative. */
2090 		    HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2091 			+ (count < 0 ? 1 : 0);
2092 		    HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2093 			+ (count < 0 ? -count : count);
2094 		    while (hekp < endp) {
2095 			if (*hekp) {
2096                             SV *tmp = newSVpvs_flags("", SVs_TEMP);
2097 			    Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
2098                               generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
2099 			} else {
2100 			    /* This should never happen. */
2101 			    sv_catpvs(names, ", (null)");
2102 			}
2103 			++hekp;
2104 		    }
2105 		    Perl_dump_indent(aTHX_
2106 		     level, file, "  ENAME = %s\n", SvPV_nolen(names)+2
2107 		    );
2108 		}
2109 		else {
2110                     SV * const tmp = newSVpvs_flags("", SVs_TEMP);
2111                     const char *const hvename = HvENAME_get(sv);
2112 		    Perl_dump_indent(aTHX_
2113 		     level, file, "  ENAME = \"%s\"\n",
2114                      generic_pv_escape(tmp, hvename,
2115                                        HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
2116                 }
2117 	    }
2118 	    if (backrefs) {
2119 		Perl_dump_indent(aTHX_ level, file, "  BACKREFS = 0x%" UVxf "\n",
2120 				 PTR2UV(backrefs));
2121 		do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
2122 			   dumpops, pvlim);
2123 	    }
2124 	    if (meta) {
2125 		SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2126 		Perl_dump_indent(aTHX_ level, file, "  MRO_WHICH = \"%s\" (0x%"
2127                                  UVxf ")\n",
2128 				 generic_pv_escape( tmpsv, meta->mro_which->name,
2129                                 meta->mro_which->length,
2130                                 (meta->mro_which->kflags & HVhek_UTF8)),
2131 				 PTR2UV(meta->mro_which));
2132 		Perl_dump_indent(aTHX_ level, file, "  CACHE_GEN = 0x%"
2133                                  UVxf "\n",
2134 				 (UV)meta->cache_gen);
2135 		Perl_dump_indent(aTHX_ level, file, "  PKG_GEN = 0x%" UVxf "\n",
2136 				 (UV)meta->pkg_gen);
2137 		if (meta->mro_linear_all) {
2138 		    Perl_dump_indent(aTHX_ level, file, "  MRO_LINEAR_ALL = 0x%"
2139                                  UVxf "\n",
2140 				 PTR2UV(meta->mro_linear_all));
2141 		do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
2142 			   dumpops, pvlim);
2143 		}
2144 		if (meta->mro_linear_current) {
2145 		    Perl_dump_indent(aTHX_ level, file,
2146                                  "  MRO_LINEAR_CURRENT = 0x%" UVxf "\n",
2147 				 PTR2UV(meta->mro_linear_current));
2148 		do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
2149 			   dumpops, pvlim);
2150 		}
2151 		if (meta->mro_nextmethod) {
2152 		    Perl_dump_indent(aTHX_ level, file,
2153                                  "  MRO_NEXTMETHOD = 0x%" UVxf "\n",
2154 				 PTR2UV(meta->mro_nextmethod));
2155 		do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
2156 			   dumpops, pvlim);
2157 		}
2158 		if (meta->isa) {
2159 		    Perl_dump_indent(aTHX_ level, file, "  ISA = 0x%" UVxf "\n",
2160 				 PTR2UV(meta->isa));
2161 		do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
2162 			   dumpops, pvlim);
2163 		}
2164 	    }
2165 	}
2166 	if (nest < maxnest) {
2167 	    HV * const hv = MUTABLE_HV(sv);
2168 	    STRLEN i;
2169 	    HE *he;
2170 
2171 	    if (HvARRAY(hv)) {
2172 		int count = maxnest - nest;
2173 		for (i=0; i <= HvMAX(hv); i++) {
2174 		    for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2175 			U32 hash;
2176 			SV * keysv;
2177 			const char * keypv;
2178 			SV * elt;
2179                         STRLEN len;
2180 
2181 			if (count-- <= 0) goto DONEHV;
2182 
2183 			hash = HeHASH(he);
2184 			keysv = hv_iterkeysv(he);
2185 			keypv = SvPV_const(keysv, len);
2186 			elt = HeVAL(he);
2187 
2188                         Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
2189                         if (SvUTF8(keysv))
2190                             PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2191 			if (HvEITER_get(hv) == he)
2192 			    PerlIO_printf(file, "[CURRENT] ");
2193                         PerlIO_printf(file, "HASH = 0x%" UVxf "\n", (UV) hash);
2194                         do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2195                     }
2196 		}
2197 	      DONEHV:;
2198 	    }
2199 	}
2200 	break;
2201     } /* case SVt_PVHV */
2202 
2203     case SVt_PVCV:
2204 	if (CvAUTOLOAD(sv)) {
2205 	    SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2206             STRLEN len;
2207 	    const char *const name =  SvPV_const(sv, len);
2208 	    Perl_dump_indent(aTHX_ level, file, "  AUTOLOAD = \"%s\"\n",
2209 			     generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
2210 	}
2211 	if (SvPOK(sv)) {
2212             SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2213             const char *const proto = CvPROTO(sv);
2214 	    Perl_dump_indent(aTHX_ level, file, "  PROTOTYPE = \"%s\"\n",
2215 			     generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
2216                                 SvUTF8(sv)));
2217 	}
2218 	/* FALLTHROUGH */
2219     case SVt_PVFM:
2220 	do_hv_dump(level, file, "  COMP_STASH", CvSTASH(sv));
2221 	if (!CvISXSUB(sv)) {
2222 	    if (CvSTART(sv)) {
2223                 if (CvSLABBED(sv))
2224                     Perl_dump_indent(aTHX_ level, file,
2225 				 "  SLAB = 0x%" UVxf "\n",
2226 				 PTR2UV(CvSTART(sv)));
2227                 else
2228                     Perl_dump_indent(aTHX_ level, file,
2229 				 "  START = 0x%" UVxf " ===> %" IVdf "\n",
2230 				 PTR2UV(CvSTART(sv)),
2231 				 (IV)sequence_num(CvSTART(sv)));
2232 	    }
2233 	    Perl_dump_indent(aTHX_ level, file, "  ROOT = 0x%" UVxf "\n",
2234 			     PTR2UV(CvROOT(sv)));
2235 	    if (CvROOT(sv) && dumpops) {
2236 		do_op_dump(level+1, file, CvROOT(sv));
2237 	    }
2238 	} else {
2239 	    SV * const constant = cv_const_sv((const CV *)sv);
2240 
2241 	    Perl_dump_indent(aTHX_ level, file, "  XSUB = 0x%" UVxf "\n", PTR2UV(CvXSUB(sv)));
2242 
2243 	    if (constant) {
2244 		Perl_dump_indent(aTHX_ level, file, "  XSUBANY = 0x%" UVxf
2245 				 " (CONST SV)\n",
2246 				 PTR2UV(CvXSUBANY(sv).any_ptr));
2247 		do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2248 			   pvlim);
2249 	    } else {
2250 		Perl_dump_indent(aTHX_ level, file, "  XSUBANY = %" IVdf "\n",
2251 				 (IV)CvXSUBANY(sv).any_i32);
2252 	    }
2253 	}
2254 	if (CvNAMED(sv))
2255 	    Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n",
2256 				   HEK_KEY(CvNAME_HEK((CV *)sv)));
2257 	else do_gvgv_dump(level, file, "  GVGV::GV", CvGV(sv));
2258 	Perl_dump_indent(aTHX_ level, file, "  FILE = \"%s\"\n", CvFILE(sv));
2259 	Perl_dump_indent(aTHX_ level, file, "  DEPTH = %"
2260                                       IVdf "\n", (IV)CvDEPTH(sv));
2261 	Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%" UVxf "\n",
2262                                (UV)CvFLAGS(sv));
2263 	Perl_dump_indent(aTHX_ level, file, "  OUTSIDE_SEQ = %" UVuf "\n", (UV)CvOUTSIDE_SEQ(sv));
2264 	if (!CvISXSUB(sv)) {
2265 	    Perl_dump_indent(aTHX_ level, file, "  PADLIST = 0x%" UVxf "\n", PTR2UV(CvPADLIST(sv)));
2266 	    if (nest < maxnest) {
2267 		do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2268 	    }
2269 	}
2270 	else
2271 	    Perl_dump_indent(aTHX_ level, file, "  HSCXT = 0x%p\n", CvHSCXT(sv));
2272 	{
2273 	    const CV * const outside = CvOUTSIDE(sv);
2274 	    Perl_dump_indent(aTHX_ level, file, "  OUTSIDE = 0x%" UVxf " (%s)\n",
2275 			PTR2UV(outside),
2276 			(!outside ? "null"
2277 			 : CvANON(outside) ? "ANON"
2278 			 : (outside == PL_main_cv) ? "MAIN"
2279 			 : CvUNIQUE(outside) ? "UNIQUE"
2280 			 : CvGV(outside) ?
2281 			     generic_pv_escape(
2282 			         newSVpvs_flags("", SVs_TEMP),
2283 			         GvNAME(CvGV(outside)),
2284 			         GvNAMELEN(CvGV(outside)),
2285 			         GvNAMEUTF8(CvGV(outside)))
2286 			 : "UNDEFINED"));
2287 	}
2288 	if (CvOUTSIDE(sv)
2289 	 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2290 	    do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2291 	break;
2292 
2293     case SVt_PVGV:
2294     case SVt_PVLV:
2295 	if (type == SVt_PVLV) {
2296 	    Perl_dump_indent(aTHX_ level, file, "  TYPE = %c\n", LvTYPE(sv));
2297 	    Perl_dump_indent(aTHX_ level, file, "  TARGOFF = %" IVdf "\n", (IV)LvTARGOFF(sv));
2298 	    Perl_dump_indent(aTHX_ level, file, "  TARGLEN = %" IVdf "\n", (IV)LvTARGLEN(sv));
2299 	    Perl_dump_indent(aTHX_ level, file, "  TARG = 0x%" UVxf "\n", PTR2UV(LvTARG(sv)));
2300 	    Perl_dump_indent(aTHX_ level, file, "  FLAGS = %" IVdf "\n", (IV)LvFLAGS(sv));
2301 	    if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2302 		do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2303 		    dumpops, pvlim);
2304 	}
2305 	if (isREGEXP(sv)) goto dumpregexp;
2306 	if (!isGV_with_GP(sv))
2307 	    break;
2308         {
2309             SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2310             Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n",
2311                      generic_pv_escape(tmpsv, GvNAME(sv),
2312                                        GvNAMELEN(sv),
2313                                        GvNAMEUTF8(sv)));
2314         }
2315 	Perl_dump_indent(aTHX_ level, file, "  NAMELEN = %" IVdf "\n", (IV)GvNAMELEN(sv));
2316 	do_hv_dump (level, file, "  GvSTASH", GvSTASH(sv));
2317 	Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%" UVxf "\n", (UV)GvFLAGS(sv));
2318 	Perl_dump_indent(aTHX_ level, file, "  GP = 0x%" UVxf "\n", PTR2UV(GvGP(sv)));
2319 	if (!GvGP(sv))
2320 	    break;
2321 	Perl_dump_indent(aTHX_ level, file, "    SV = 0x%" UVxf "\n", PTR2UV(GvSV(sv)));
2322 	Perl_dump_indent(aTHX_ level, file, "    REFCNT = %" IVdf "\n", (IV)GvREFCNT(sv));
2323 	Perl_dump_indent(aTHX_ level, file, "    IO = 0x%" UVxf "\n", PTR2UV(GvIOp(sv)));
2324 	Perl_dump_indent(aTHX_ level, file, "    FORM = 0x%" UVxf "  \n", PTR2UV(GvFORM(sv)));
2325 	Perl_dump_indent(aTHX_ level, file, "    AV = 0x%" UVxf "\n", PTR2UV(GvAV(sv)));
2326 	Perl_dump_indent(aTHX_ level, file, "    HV = 0x%" UVxf "\n", PTR2UV(GvHV(sv)));
2327 	Perl_dump_indent(aTHX_ level, file, "    CV = 0x%" UVxf "\n", PTR2UV(GvCV(sv)));
2328 	Perl_dump_indent(aTHX_ level, file, "    CVGEN = 0x%" UVxf "\n", (UV)GvCVGEN(sv));
2329 	Perl_dump_indent(aTHX_ level, file, "    GPFLAGS = 0x%" UVxf
2330 					    " (%s)\n",
2331 			       (UV)GvGPFLAGS(sv),
2332 			       "");
2333 	Perl_dump_indent(aTHX_ level, file, "    LINE = %" IVdf "\n", (IV)GvLINE(sv));
2334 	Perl_dump_indent(aTHX_ level, file, "    FILE = \"%s\"\n", GvFILE(sv));
2335 	do_gv_dump (level, file, "    EGV", GvEGV(sv));
2336 	break;
2337     case SVt_PVIO:
2338 	Perl_dump_indent(aTHX_ level, file, "  IFP = 0x%" UVxf "\n", PTR2UV(IoIFP(sv)));
2339 	Perl_dump_indent(aTHX_ level, file, "  OFP = 0x%" UVxf "\n", PTR2UV(IoOFP(sv)));
2340 	Perl_dump_indent(aTHX_ level, file, "  DIRP = 0x%" UVxf "\n", PTR2UV(IoDIRP(sv)));
2341 	Perl_dump_indent(aTHX_ level, file, "  LINES = %" IVdf "\n", (IV)IoLINES(sv));
2342 	Perl_dump_indent(aTHX_ level, file, "  PAGE = %" IVdf "\n", (IV)IoPAGE(sv));
2343 	Perl_dump_indent(aTHX_ level, file, "  PAGE_LEN = %" IVdf "\n", (IV)IoPAGE_LEN(sv));
2344 	Perl_dump_indent(aTHX_ level, file, "  LINES_LEFT = %" IVdf "\n", (IV)IoLINES_LEFT(sv));
2345         if (IoTOP_NAME(sv))
2346             Perl_dump_indent(aTHX_ level, file, "  TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2347 	if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2348 	    do_gv_dump (level, file, "  TOP_GV", IoTOP_GV(sv));
2349 	else {
2350 	    Perl_dump_indent(aTHX_ level, file, "  TOP_GV = 0x%" UVxf "\n",
2351 			     PTR2UV(IoTOP_GV(sv)));
2352 	    do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2353 			maxnest, dumpops, pvlim);
2354 	}
2355 	/* Source filters hide things that are not GVs in these three, so let's
2356 	   be careful out there.  */
2357         if (IoFMT_NAME(sv))
2358             Perl_dump_indent(aTHX_ level, file, "  FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2359 	if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2360 	    do_gv_dump (level, file, "  FMT_GV", IoFMT_GV(sv));
2361 	else {
2362 	    Perl_dump_indent(aTHX_ level, file, "  FMT_GV = 0x%" UVxf "\n",
2363 			     PTR2UV(IoFMT_GV(sv)));
2364 	    do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2365 			maxnest, dumpops, pvlim);
2366 	}
2367         if (IoBOTTOM_NAME(sv))
2368             Perl_dump_indent(aTHX_ level, file, "  BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2369 	if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2370 	    do_gv_dump (level, file, "  BOTTOM_GV", IoBOTTOM_GV(sv));
2371 	else {
2372 	    Perl_dump_indent(aTHX_ level, file, "  BOTTOM_GV = 0x%" UVxf "\n",
2373 			     PTR2UV(IoBOTTOM_GV(sv)));
2374 	    do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2375 			maxnest, dumpops, pvlim);
2376 	}
2377 	if (isPRINT(IoTYPE(sv)))
2378             Perl_dump_indent(aTHX_ level, file, "  TYPE = '%c'\n", IoTYPE(sv));
2379 	else
2380             Perl_dump_indent(aTHX_ level, file, "  TYPE = '\\%o'\n", IoTYPE(sv));
2381 	Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%" UVxf "\n", (UV)IoFLAGS(sv));
2382 	break;
2383     case SVt_REGEXP:
2384       dumpregexp:
2385 	{
2386 	    struct regexp * const r = ReANY((REGEXP*)sv);
2387 
2388 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2389             sv_setpv(d,"");                                 \
2390             append_flags(d, flags, names);     \
2391             if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') {       \
2392                 SvCUR_set(d, SvCUR(d) - 1);                 \
2393                 SvPVX(d)[SvCUR(d)] = '\0';                  \
2394             }                                               \
2395 } STMT_END
2396             SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2397             Perl_dump_indent(aTHX_ level, file, "  COMPFLAGS = 0x%" UVxf " (%s)\n",
2398                                 (UV)(r->compflags), SvPVX_const(d));
2399 
2400             SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2401 	    Perl_dump_indent(aTHX_ level, file, "  EXTFLAGS = 0x%" UVxf " (%s)\n",
2402                                 (UV)(r->extflags), SvPVX_const(d));
2403 
2404             Perl_dump_indent(aTHX_ level, file, "  ENGINE = 0x%" UVxf " (%s)\n",
2405                                 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2406             if (r->engine == &PL_core_reg_engine) {
2407                 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2408                 Perl_dump_indent(aTHX_ level, file, "  INTFLAGS = 0x%" UVxf " (%s)\n",
2409                                 (UV)(r->intflags), SvPVX_const(d));
2410             } else {
2411                 Perl_dump_indent(aTHX_ level, file, "  INTFLAGS = 0x%" UVxf "\n",
2412 				(UV)(r->intflags));
2413             }
2414 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2415 	    Perl_dump_indent(aTHX_ level, file, "  NPARENS = %" UVuf "\n",
2416 				(UV)(r->nparens));
2417 	    Perl_dump_indent(aTHX_ level, file, "  LASTPAREN = %" UVuf "\n",
2418 				(UV)(r->lastparen));
2419 	    Perl_dump_indent(aTHX_ level, file, "  LASTCLOSEPAREN = %" UVuf "\n",
2420 				(UV)(r->lastcloseparen));
2421 	    Perl_dump_indent(aTHX_ level, file, "  MINLEN = %" IVdf "\n",
2422 				(IV)(r->minlen));
2423 	    Perl_dump_indent(aTHX_ level, file, "  MINLENRET = %" IVdf "\n",
2424 				(IV)(r->minlenret));
2425 	    Perl_dump_indent(aTHX_ level, file, "  GOFS = %" UVuf "\n",
2426 				(UV)(r->gofs));
2427 	    Perl_dump_indent(aTHX_ level, file, "  PRE_PREFIX = %" UVuf "\n",
2428 				(UV)(r->pre_prefix));
2429 	    Perl_dump_indent(aTHX_ level, file, "  SUBLEN = %" IVdf "\n",
2430 				(IV)(r->sublen));
2431 	    Perl_dump_indent(aTHX_ level, file, "  SUBOFFSET = %" IVdf "\n",
2432 				(IV)(r->suboffset));
2433 	    Perl_dump_indent(aTHX_ level, file, "  SUBCOFFSET = %" IVdf "\n",
2434 				(IV)(r->subcoffset));
2435 	    if (r->subbeg)
2436 		Perl_dump_indent(aTHX_ level, file, "  SUBBEG = 0x%" UVxf " %s\n",
2437 			    PTR2UV(r->subbeg),
2438 			    pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2439 	    else
2440 		Perl_dump_indent(aTHX_ level, file, "  SUBBEG = 0x0\n");
2441 	    Perl_dump_indent(aTHX_ level, file, "  MOTHER_RE = 0x%" UVxf "\n",
2442 				PTR2UV(r->mother_re));
2443 	    if (nest < maxnest && r->mother_re)
2444 		do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2445 			   maxnest, dumpops, pvlim);
2446 	    Perl_dump_indent(aTHX_ level, file, "  PAREN_NAMES = 0x%" UVxf "\n",
2447 				PTR2UV(r->paren_names));
2448 	    Perl_dump_indent(aTHX_ level, file, "  SUBSTRS = 0x%" UVxf "\n",
2449 				PTR2UV(r->substrs));
2450 	    Perl_dump_indent(aTHX_ level, file, "  PPRIVATE = 0x%" UVxf "\n",
2451 				PTR2UV(r->pprivate));
2452 	    Perl_dump_indent(aTHX_ level, file, "  OFFS = 0x%" UVxf "\n",
2453 				PTR2UV(r->offs));
2454 	    Perl_dump_indent(aTHX_ level, file, "  QR_ANONCV = 0x%" UVxf "\n",
2455 				PTR2UV(r->qr_anoncv));
2456 #ifdef PERL_ANY_COW
2457 	    Perl_dump_indent(aTHX_ level, file, "  SAVED_COPY = 0x%" UVxf "\n",
2458 				PTR2UV(r->saved_copy));
2459 #endif
2460 	}
2461 	break;
2462     }
2463     SvREFCNT_dec_NN(d);
2464 }
2465 
2466 /*
2467 =for apidoc sv_dump
2468 
2469 Dumps the contents of an SV to the C<STDERR> filehandle.
2470 
2471 For an example of its output, see L<Devel::Peek>.
2472 
2473 =cut
2474 */
2475 
2476 void
2477 Perl_sv_dump(pTHX_ SV *sv)
2478 {
2479     if (sv && SvROK(sv))
2480 	do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2481     else
2482 	do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2483 }
2484 
2485 int
2486 Perl_runops_debug(pTHX)
2487 {
2488 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2489     SSize_t orig_stack_hwm = PL_curstackinfo->si_stack_hwm;
2490 
2491     PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2492 #endif
2493 
2494     if (!PL_op) {
2495 	Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2496 	return 0;
2497     }
2498     DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2499     do {
2500 #ifdef PERL_TRACE_OPS
2501         ++PL_op_exec_cnt[PL_op->op_type];
2502 #endif
2503 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2504         if (PL_curstackinfo->si_stack_hwm < PL_stack_sp - PL_stack_base)
2505             Perl_croak_nocontext(
2506                 "panic: previous op failed to extend arg stack: "
2507                 "base=%p, sp=%p, hwm=%p\n",
2508                     PL_stack_base, PL_stack_sp,
2509                     PL_stack_base + PL_curstackinfo->si_stack_hwm);
2510         PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2511 #endif
2512 	if (PL_debug) {
2513             ENTER;
2514             SAVETMPS;
2515 	    if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2516 		PerlIO_printf(Perl_debug_log,
2517 			      "WARNING: %" UVxf " changed from %" UVxf " to %" UVxf "\n",
2518 			      PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2519 			      PTR2UV(*PL_watchaddr));
2520 	    if (DEBUG_s_TEST_) {
2521 		if (DEBUG_v_TEST_) {
2522 		    PerlIO_printf(Perl_debug_log, "\n");
2523 		    deb_stack_all();
2524 		}
2525 		else
2526 		    debstack();
2527 	    }
2528 
2529 
2530 	    if (DEBUG_t_TEST_) debop(PL_op);
2531 	    if (DEBUG_P_TEST_) debprof(PL_op);
2532             FREETMPS;
2533             LEAVE;
2534 	}
2535 
2536         PERL_DTRACE_PROBE_OP(PL_op);
2537     } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2538     DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2539     PERL_ASYNC_CHECK();
2540 
2541 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2542     if (PL_curstackinfo->si_stack_hwm < orig_stack_hwm)
2543         PL_curstackinfo->si_stack_hwm = orig_stack_hwm;
2544 #endif
2545     TAINT_NOT;
2546     return 0;
2547 }
2548 
2549 
2550 /* print the names of the n lexical vars starting at pad offset off */
2551 
2552 STATIC void
2553 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2554 {
2555     PADNAME *sv;
2556     CV * const cv = deb_curcv(cxstack_ix);
2557     PADNAMELIST *comppad = NULL;
2558     int i;
2559 
2560     if (cv) {
2561         PADLIST * const padlist = CvPADLIST(cv);
2562         comppad = PadlistNAMES(padlist);
2563     }
2564     if (paren)
2565         PerlIO_printf(Perl_debug_log, "(");
2566     for (i = 0; i < n; i++) {
2567         if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2568             PerlIO_printf(Perl_debug_log, "%" PNf, PNfARG(sv));
2569         else
2570             PerlIO_printf(Perl_debug_log, "[%" UVuf "]",
2571                     (UV)(off+i));
2572         if (i < n - 1)
2573             PerlIO_printf(Perl_debug_log, ",");
2574     }
2575     if (paren)
2576         PerlIO_printf(Perl_debug_log, ")");
2577 }
2578 
2579 
2580 /* append to the out SV, the name of the lexical at offset off in the CV
2581  * cv */
2582 
2583 static void
2584 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2585         bool paren, bool is_scalar)
2586 {
2587     PADNAME *sv;
2588     PADNAMELIST *namepad = NULL;
2589     int i;
2590 
2591     if (cv) {
2592         PADLIST * const padlist = CvPADLIST(cv);
2593         namepad = PadlistNAMES(padlist);
2594     }
2595 
2596     if (paren)
2597         sv_catpvs_nomg(out, "(");
2598     for (i = 0; i < n; i++) {
2599         if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2600         {
2601             STRLEN cur = SvCUR(out);
2602             Perl_sv_catpvf(aTHX_ out, "[%" UTF8f,
2603                                  UTF8fARG(1, PadnameLEN(sv) - 1,
2604                                           PadnamePV(sv) + 1));
2605             if (is_scalar)
2606                 SvPVX(out)[cur] = '$';
2607         }
2608         else
2609             Perl_sv_catpvf(aTHX_ out, "[%" UVuf "]", (UV)(off+i));
2610         if (i < n - 1)
2611             sv_catpvs_nomg(out, ",");
2612     }
2613     if (paren)
2614         sv_catpvs_nomg(out, "(");
2615 }
2616 
2617 
2618 static void
2619 S_append_gv_name(pTHX_ GV *gv, SV *out)
2620 {
2621     SV *sv;
2622     if (!gv) {
2623         sv_catpvs_nomg(out, "<NULLGV>");
2624         return;
2625     }
2626     sv = newSV(0);
2627     gv_fullname4(sv, gv, NULL, FALSE);
2628     Perl_sv_catpvf(aTHX_ out, "$%" SVf, SVfARG(sv));
2629     SvREFCNT_dec_NN(sv);
2630 }
2631 
2632 #ifdef USE_ITHREADS
2633 #  define ITEM_SV(item) (comppad ? \
2634     *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2635 #else
2636 #  define ITEM_SV(item) UNOP_AUX_item_sv(item)
2637 #endif
2638 
2639 
2640 /* return a temporary SV containing a stringified representation of
2641  * the op_aux field of a MULTIDEREF op, associated with CV cv
2642  */
2643 
2644 SV*
2645 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2646 {
2647     UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2648     UV actions = items->uv;
2649     SV *sv;
2650     bool last = 0;
2651     bool is_hash = FALSE;
2652     int derefs = 0;
2653     SV *out = newSVpvn_flags("",0,SVs_TEMP);
2654 #ifdef USE_ITHREADS
2655     PAD *comppad;
2656 
2657     if (cv) {
2658         PADLIST *padlist = CvPADLIST(cv);
2659         comppad = PadlistARRAY(padlist)[1];
2660     }
2661     else
2662         comppad = NULL;
2663 #endif
2664 
2665     PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2666 
2667     while (!last) {
2668         switch (actions & MDEREF_ACTION_MASK) {
2669 
2670         case MDEREF_reload:
2671             actions = (++items)->uv;
2672             continue;
2673             NOT_REACHED; /* NOTREACHED */
2674 
2675         case MDEREF_HV_padhv_helem:
2676             is_hash = TRUE;
2677             /* FALLTHROUGH */
2678         case MDEREF_AV_padav_aelem:
2679             derefs = 1;
2680             S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2681             goto do_elem;
2682             NOT_REACHED; /* NOTREACHED */
2683 
2684         case MDEREF_HV_gvhv_helem:
2685             is_hash = TRUE;
2686             /* FALLTHROUGH */
2687         case MDEREF_AV_gvav_aelem:
2688             derefs = 1;
2689             items++;
2690             sv = ITEM_SV(items);
2691             S_append_gv_name(aTHX_ (GV*)sv, out);
2692             goto do_elem;
2693             NOT_REACHED; /* NOTREACHED */
2694 
2695         case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2696             is_hash = TRUE;
2697             /* FALLTHROUGH */
2698         case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2699             items++;
2700             sv = ITEM_SV(items);
2701             S_append_gv_name(aTHX_ (GV*)sv, out);
2702             goto do_vivify_rv2xv_elem;
2703             NOT_REACHED; /* NOTREACHED */
2704 
2705         case MDEREF_HV_padsv_vivify_rv2hv_helem:
2706             is_hash = TRUE;
2707             /* FALLTHROUGH */
2708         case MDEREF_AV_padsv_vivify_rv2av_aelem:
2709             S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2710             goto do_vivify_rv2xv_elem;
2711             NOT_REACHED; /* NOTREACHED */
2712 
2713         case MDEREF_HV_pop_rv2hv_helem:
2714         case MDEREF_HV_vivify_rv2hv_helem:
2715             is_hash = TRUE;
2716             /* FALLTHROUGH */
2717         do_vivify_rv2xv_elem:
2718         case MDEREF_AV_pop_rv2av_aelem:
2719         case MDEREF_AV_vivify_rv2av_aelem:
2720             if (!derefs++)
2721                 sv_catpvs_nomg(out, "->");
2722         do_elem:
2723             if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2724                 sv_catpvs_nomg(out, "->");
2725                 last = 1;
2726                 break;
2727             }
2728 
2729             sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2730             switch (actions & MDEREF_INDEX_MASK) {
2731             case MDEREF_INDEX_const:
2732                 if (is_hash) {
2733                     items++;
2734                     sv = ITEM_SV(items);
2735                     if (!sv)
2736                         sv_catpvs_nomg(out, "???");
2737                     else {
2738                         STRLEN cur;
2739                         char *s;
2740                         s = SvPV(sv, cur);
2741                         pv_pretty(out, s, cur, 30,
2742                                     NULL, NULL,
2743                                     (PERL_PV_PRETTY_NOCLEAR
2744                                     |PERL_PV_PRETTY_QUOTE
2745                                     |PERL_PV_PRETTY_ELLIPSES));
2746                     }
2747                 }
2748                 else
2749                     Perl_sv_catpvf(aTHX_ out, "%" IVdf, (++items)->iv);
2750                 break;
2751             case MDEREF_INDEX_padsv:
2752                 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2753                 break;
2754             case MDEREF_INDEX_gvsv:
2755                 items++;
2756                 sv = ITEM_SV(items);
2757                 S_append_gv_name(aTHX_ (GV*)sv, out);
2758                 break;
2759             }
2760             sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2761 
2762             if (actions & MDEREF_FLAG_last)
2763                 last = 1;
2764             is_hash = FALSE;
2765 
2766             break;
2767 
2768         default:
2769             PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2770                 (int)(actions & MDEREF_ACTION_MASK));
2771             last = 1;
2772             break;
2773 
2774         } /* switch */
2775 
2776         actions >>= MDEREF_SHIFT;
2777     } /* while */
2778     return out;
2779 }
2780 
2781 
2782 /* Return a temporary SV containing a stringified representation of
2783  * the op_aux field of a MULTICONCAT op. Note that if the aux contains
2784  * both plain and utf8 versions of the const string and indices, only
2785  * the first is displayed.
2786  */
2787 
2788 SV*
2789 Perl_multiconcat_stringify(pTHX_ const OP *o)
2790 {
2791     UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
2792     UNOP_AUX_item *lens;
2793     STRLEN len;
2794     SSize_t nargs;
2795     char *s;
2796     SV *out = newSVpvn_flags("", 0, SVs_TEMP);
2797 
2798     PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY;
2799 
2800     nargs = aux[PERL_MULTICONCAT_IX_NARGS].ssize;
2801     s   = aux[PERL_MULTICONCAT_IX_PLAIN_PV].pv;
2802     len = aux[PERL_MULTICONCAT_IX_PLAIN_LEN].ssize;
2803     if (!s) {
2804         s   = aux[PERL_MULTICONCAT_IX_UTF8_PV].pv;
2805         len = aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize;
2806         sv_catpvs(out, "UTF8 ");
2807     }
2808     pv_pretty(out, s, len, 50,
2809                 NULL, NULL,
2810                 (PERL_PV_PRETTY_NOCLEAR
2811                 |PERL_PV_PRETTY_QUOTE
2812                 |PERL_PV_PRETTY_ELLIPSES));
2813 
2814     lens = aux + PERL_MULTICONCAT_IX_LENGTHS;
2815     while (nargs-- >= 0) {
2816         Perl_sv_catpvf(aTHX_ out, ",%" IVdf, (IV)lens->ssize);
2817         lens++;
2818     }
2819     return out;
2820 }
2821 
2822 
2823 I32
2824 Perl_debop(pTHX_ const OP *o)
2825 {
2826     PERL_ARGS_ASSERT_DEBOP;
2827 
2828     if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2829 	return 0;
2830 
2831     Perl_deb(aTHX_ "%s", OP_NAME(o));
2832     switch (o->op_type) {
2833     case OP_CONST:
2834     case OP_HINTSEVAL:
2835 	/* With ITHREADS, consts are stored in the pad, and the right pad
2836 	 * may not be active here, so check.
2837 	 * Looks like only during compiling the pads are illegal.
2838 	 */
2839 #ifdef USE_ITHREADS
2840 	if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2841 #endif
2842 	    PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2843 	break;
2844     case OP_GVSV:
2845     case OP_GV:
2846         PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2847                 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)));
2848 	break;
2849 
2850     case OP_PADSV:
2851     case OP_PADAV:
2852     case OP_PADHV:
2853     case OP_ARGELEM:
2854         S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2855         break;
2856 
2857     case OP_PADRANGE:
2858         S_deb_padvar(aTHX_ o->op_targ,
2859                         o->op_private & OPpPADRANGE_COUNTMASK, 1);
2860         break;
2861 
2862     case OP_MULTIDEREF:
2863         PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2864             SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2865         break;
2866 
2867     case OP_MULTICONCAT:
2868         PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2869             SVfARG(multiconcat_stringify(o)));
2870         break;
2871 
2872     default:
2873 	break;
2874     }
2875     PerlIO_printf(Perl_debug_log, "\n");
2876     return 0;
2877 }
2878 
2879 
2880 /*
2881 =for apidoc op_class
2882 
2883 Given an op, determine what type of struct it has been allocated as.
2884 Returns one of the OPclass enums, such as OPclass_LISTOP.
2885 
2886 =cut
2887 */
2888 
2889 
2890 OPclass
2891 Perl_op_class(pTHX_ const OP *o)
2892 {
2893     bool custom = 0;
2894 
2895     if (!o)
2896 	return OPclass_NULL;
2897 
2898     if (o->op_type == 0) {
2899 	if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
2900 	    return OPclass_COP;
2901 	return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2902     }
2903 
2904     if (o->op_type == OP_SASSIGN)
2905 	return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPclass_UNOP : OPclass_BINOP);
2906 
2907     if (o->op_type == OP_AELEMFAST) {
2908 #ifdef USE_ITHREADS
2909 	    return OPclass_PADOP;
2910 #else
2911 	    return OPclass_SVOP;
2912 #endif
2913     }
2914 
2915 #ifdef USE_ITHREADS
2916     if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
2917 	o->op_type == OP_RCATLINE)
2918 	return OPclass_PADOP;
2919 #endif
2920 
2921     if (o->op_type == OP_CUSTOM)
2922         custom = 1;
2923 
2924     switch (OP_CLASS(o)) {
2925     case OA_BASEOP:
2926 	return OPclass_BASEOP;
2927 
2928     case OA_UNOP:
2929 	return OPclass_UNOP;
2930 
2931     case OA_BINOP:
2932 	return OPclass_BINOP;
2933 
2934     case OA_LOGOP:
2935 	return OPclass_LOGOP;
2936 
2937     case OA_LISTOP:
2938 	return OPclass_LISTOP;
2939 
2940     case OA_PMOP:
2941 	return OPclass_PMOP;
2942 
2943     case OA_SVOP:
2944 	return OPclass_SVOP;
2945 
2946     case OA_PADOP:
2947 	return OPclass_PADOP;
2948 
2949     case OA_PVOP_OR_SVOP:
2950         /*
2951          * Character translations (tr///) are usually a PVOP, keeping a
2952          * pointer to a table of shorts used to look up translations.
2953          * Under utf8, however, a simple table isn't practical; instead,
2954          * the OP is an SVOP (or, under threads, a PADOP),
2955          * and the SV is a reference to a swash
2956          * (i.e., an RV pointing to an HV).
2957          */
2958 	return (!custom &&
2959 		   (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
2960 	       )
2961 #if  defined(USE_ITHREADS)
2962 		? OPclass_PADOP : OPclass_PVOP;
2963 #else
2964 		? OPclass_SVOP : OPclass_PVOP;
2965 #endif
2966 
2967     case OA_LOOP:
2968 	return OPclass_LOOP;
2969 
2970     case OA_COP:
2971 	return OPclass_COP;
2972 
2973     case OA_BASEOP_OR_UNOP:
2974 	/*
2975 	 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
2976 	 * whether parens were seen. perly.y uses OPf_SPECIAL to
2977 	 * signal whether a BASEOP had empty parens or none.
2978 	 * Some other UNOPs are created later, though, so the best
2979 	 * test is OPf_KIDS, which is set in newUNOP.
2980 	 */
2981 	return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2982 
2983     case OA_FILESTATOP:
2984 	/*
2985 	 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
2986 	 * the OPf_REF flag to distinguish between OP types instead of the
2987 	 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
2988 	 * return OPclass_UNOP so that walkoptree can find our children. If
2989 	 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
2990 	 * (no argument to the operator) it's an OP; with OPf_REF set it's
2991 	 * an SVOP (and op_sv is the GV for the filehandle argument).
2992 	 */
2993 	return ((o->op_flags & OPf_KIDS) ? OPclass_UNOP :
2994 #ifdef USE_ITHREADS
2995 		(o->op_flags & OPf_REF) ? OPclass_PADOP : OPclass_BASEOP);
2996 #else
2997 		(o->op_flags & OPf_REF) ? OPclass_SVOP : OPclass_BASEOP);
2998 #endif
2999     case OA_LOOPEXOP:
3000 	/*
3001 	 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
3002 	 * label was omitted (in which case it's a BASEOP) or else a term was
3003 	 * seen. In this last case, all except goto are definitely PVOP but
3004 	 * goto is either a PVOP (with an ordinary constant label), an UNOP
3005 	 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
3006 	 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
3007 	 * get set.
3008 	 */
3009 	if (o->op_flags & OPf_STACKED)
3010 	    return OPclass_UNOP;
3011 	else if (o->op_flags & OPf_SPECIAL)
3012 	    return OPclass_BASEOP;
3013 	else
3014 	    return OPclass_PVOP;
3015     case OA_METHOP:
3016 	return OPclass_METHOP;
3017     case OA_UNOP_AUX:
3018 	return OPclass_UNOP_AUX;
3019     }
3020     Perl_warn(aTHX_ "Can't determine class of operator %s, assuming BASEOP\n",
3021 	 OP_NAME(o));
3022     return OPclass_BASEOP;
3023 }
3024 
3025 
3026 
3027 STATIC CV*
3028 S_deb_curcv(pTHX_ I32 ix)
3029 {
3030     PERL_SI *si = PL_curstackinfo;
3031     for (; ix >=0; ix--) {
3032         const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
3033 
3034         if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
3035             return cx->blk_sub.cv;
3036         else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
3037             return cx->blk_eval.cv;
3038         else if (ix == 0 && si->si_type == PERLSI_MAIN)
3039             return PL_main_cv;
3040         else if (ix == 0 && CxTYPE(cx) == CXt_NULL
3041                && si->si_type == PERLSI_SORT)
3042         {
3043             /* fake sort sub; use CV of caller */
3044             si = si->si_prev;
3045             ix = si->si_cxix + 1;
3046         }
3047     }
3048     return NULL;
3049 }
3050 
3051 void
3052 Perl_watch(pTHX_ char **addr)
3053 {
3054     PERL_ARGS_ASSERT_WATCH;
3055 
3056     PL_watchaddr = addr;
3057     PL_watchok = *addr;
3058     PerlIO_printf(Perl_debug_log, "WATCHING, %" UVxf " is currently %" UVxf "\n",
3059 	PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
3060 }
3061 
3062 STATIC void
3063 S_debprof(pTHX_ const OP *o)
3064 {
3065     PERL_ARGS_ASSERT_DEBPROF;
3066 
3067     if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
3068 	return;
3069     if (!PL_profiledata)
3070 	Newxz(PL_profiledata, MAXO, U32);
3071     ++PL_profiledata[o->op_type];
3072 }
3073 
3074 void
3075 Perl_debprofdump(pTHX)
3076 {
3077     unsigned i;
3078     if (!PL_profiledata)
3079 	return;
3080     for (i = 0; i < MAXO; i++) {
3081 	if (PL_profiledata[i])
3082 	    PerlIO_printf(Perl_debug_log,
3083 			  "%5lu %s\n", (unsigned long)PL_profiledata[i],
3084                                        PL_op_name[i]);
3085     }
3086 }
3087 
3088 
3089 /*
3090  * ex: set ts=8 sts=4 sw=4 et:
3091  */
3092