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