make miniperl -Wwrite-strings clean
[perl.git] / dump.c
1 /*    dump.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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
16 /* This file contains utility routines to dump the contents of SV and OP
17  * structures, as used by command-line options like -Dt and -Dx, and
18  * by Devel::Peek.
19  *
20  * It also holds the debugging version of the  runops function.
21  */
22
23 #include "EXTERN.h"
24 #define PERL_IN_DUMP_C
25 #include "perl.h"
26 #include "regcomp.h"
27 #include "proto.h"
28
29
30 static const char* const svtypenames[SVt_LAST] = {
31     "NULL",
32     "BIND",
33     "IV",
34     "NV",
35     "RV",
36     "PV",
37     "PVIV",
38     "PVNV",
39     "PVMG",
40     "PVGV",
41     "PVLV",
42     "PVAV",
43     "PVHV",
44     "PVCV",
45     "PVFM",
46     "PVIO"
47 };
48
49
50 static const char* const svshorttypenames[SVt_LAST] = {
51     "UNDEF",
52     "BIND",
53     "IV",
54     "NV",
55     "RV",
56     "PV",
57     "PVIV",
58     "PVNV",
59     "PVMG",
60     "GV",
61     "PVLV",
62     "AV",
63     "HV",
64     "CV",
65     "FM",
66     "IO"
67 };
68
69 #define Sequence PL_op_sequence
70
71 void
72 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
73 {
74     va_list args;
75     va_start(args, pat);
76     dump_vindent(level, file, pat, &args);
77     va_end(args);
78 }
79
80 void
81 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
82 {
83     dVAR;
84     PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
85     PerlIO_vprintf(file, pat, *args);
86 }
87
88 void
89 Perl_dump_all(pTHX)
90 {
91     dVAR;
92     PerlIO_setlinebuf(Perl_debug_log);
93     if (PL_main_root)
94         op_dump(PL_main_root);
95     dump_packsubs(PL_defstash);
96 }
97
98 void
99 Perl_dump_packsubs(pTHX_ const HV *stash)
100 {
101     dVAR;
102     I32 i;
103
104     if (!HvARRAY(stash))
105         return;
106     for (i = 0; i <= (I32) HvMAX(stash); i++) {
107         const HE *entry;
108         for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
109             const GV * const gv = (GV*)HeVAL(entry);
110             if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
111                 continue;
112             if (GvCVu(gv))
113                 dump_sub(gv);
114             if (GvFORM(gv))
115                 dump_form(gv);
116             if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
117                 const HV * const hv = GvHV(gv);
118                 if (hv && (hv != PL_defstash))
119                     dump_packsubs(hv);          /* nested package */
120             }
121         }
122     }
123 }
124
125 void
126 Perl_dump_sub(pTHX_ const GV *gv)
127 {
128     SV * const sv = sv_newmortal();
129
130     gv_fullname3(sv, gv, NULL);
131     Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
132     if (CvISXSUB(GvCV(gv)))
133         Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
134             PTR2UV(CvXSUB(GvCV(gv))),
135             (int)CvXSUBANY(GvCV(gv)).any_i32);
136     else if (CvROOT(GvCV(gv)))
137         op_dump(CvROOT(GvCV(gv)));
138     else
139         Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
140 }
141
142 void
143 Perl_dump_form(pTHX_ const GV *gv)
144 {
145     SV * const sv = sv_newmortal();
146
147     gv_fullname3(sv, gv, NULL);
148     Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
149     if (CvROOT(GvFORM(gv)))
150         op_dump(CvROOT(GvFORM(gv)));
151     else
152         Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
153 }
154
155 void
156 Perl_dump_eval(pTHX)
157 {
158     dVAR;
159     op_dump(PL_eval_root);
160 }
161
162
163 /*
164 =for apidoc Apd|char*|pv_escape|NN SV *dsv|NN const char const *str\
165                |const STRLEN count|const STRLEN max
166                |STRLEN const *escaped, const U32 flags
167
168 Escapes at most the first "count" chars of pv and puts the results into
169 dsv such that the size of the escaped string will not exceed "max" chars
170 and will not contain any incomplete escape sequences.
171
172 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
173 will also be escaped.
174
175 Normally the SV will be cleared before the escaped string is prepared,
176 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
177
178 If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
179 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
180 using C<is_utf8_string()> to determine if it is Unicode.
181
182 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
183 using C<\x01F1> style escapes, otherwise only chars above 255 will be
184 escaped using this style, other non printable chars will use octal or
185 common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
186 then all chars below 255 will be treated as printable and 
187 will be output as literals.
188
189 If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
190 string will be escaped, regardles of max. If the string is utf8 and 
191 the chars value is >255 then it will be returned as a plain hex 
192 sequence. Thus the output will either be a single char, 
193 an octal escape sequence, a special escape like C<\n> or a 3 or 
194 more digit hex value. 
195
196 If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
197 not a '\\'. This is because regexes very often contain backslashed
198 sequences, whereas '%' is not a particularly common character in patterns.
199
200 Returns a pointer to the escaped text as held by dsv.
201
202 =cut
203 */
204 #define PV_ESCAPE_OCTBUFSIZE 32
205
206 char *
207 Perl_pv_escape( pTHX_ SV *dsv, char const * const str, 
208                 const STRLEN count, const STRLEN max, 
209                 STRLEN * const escaped, const U32 flags ) 
210 {
211     const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
212     const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
213     char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
214     STRLEN wrote = 0;    /* chars written so far */
215     STRLEN chsize = 0;   /* size of data to be written */
216     STRLEN readsize = 1; /* size of data just read */
217     bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
218     const char *pv  = str;
219     const char * const end = pv + count; /* end of string */
220     octbuf[0] = esc;
221
222     if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
223             /* This won't alter the UTF-8 flag */
224             sv_setpvn(dsv, "", 0);
225     }
226     
227     if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
228         isuni = 1;
229     
230     for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
231         const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv;            
232         const U8 c = (U8)u & 0xFF;
233         
234         if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) {
235             if (flags & PERL_PV_ESCAPE_FIRSTCHAR) 
236                 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
237                                       "%"UVxf, u);
238             else
239                 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
240                                       "%cx{%"UVxf"}", esc, u);
241         } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
242             chsize = 1;            
243         } else {         
244             if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
245                 chsize = 2;
246                 switch (c) {
247                 
248                 case '\\' : /* fallthrough */
249                 case '%'  : if ( c == esc )  {
250                                 octbuf[1] = esc;  
251                             } else {
252                                 chsize = 1;
253                             }
254                             break;
255                 case '\v' : octbuf[1] = 'v';  break;
256                 case '\t' : octbuf[1] = 't';  break;
257                 case '\r' : octbuf[1] = 'r';  break;
258                 case '\n' : octbuf[1] = 'n';  break;
259                 case '\f' : octbuf[1] = 'f';  break;
260                 case '"'  : 
261                         if ( dq == '"' ) 
262                                 octbuf[1] = '"';
263                         else 
264                             chsize = 1;
265                         break;
266                 default:
267                         if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) )
268                             chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
269                                                   "%c%03o", esc, c);
270                         else
271                             chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
272                                                   "%c%o", esc, c);
273                 }
274             } else {
275                 chsize = 1;
276             }
277         }
278         if ( max && (wrote + chsize > max) ) {
279             break;
280         } else if (chsize > 1) {
281             sv_catpvn(dsv, octbuf, chsize);
282             wrote += chsize;
283         } else {
284             /* If PERL_PV_ESCAPE_NOBACKSLASH is set then bytes in the range
285                128-255 can be appended raw to the dsv. If dsv happens to be
286                UTF-8 then we need catpvf to upgrade them for us.
287                Or add a new API call sv_catpvc(). Think about that name, and
288                how to keep it clear that it's unlike the s of catpvs, which is
289                really an array octets, not a string.  */
290             Perl_sv_catpvf( aTHX_ dsv, "%c", c);
291             wrote++;
292         }
293         if ( flags & PERL_PV_ESCAPE_FIRSTCHAR ) 
294             break;
295     }
296     if (escaped != NULL)
297         *escaped= pv - str;
298     return SvPVX(dsv);
299 }
300 /*
301 =for apidoc Apd|char *|pv_pretty|NN SV *dsv|NN const char const *str\
302            |const STRLEN count|const STRLEN max\
303            |const char const *start_color| const char const *end_color\
304            |const U32 flags
305
306 Converts a string into something presentable, handling escaping via
307 pv_escape() and supporting quoting and ellipses.
308
309 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be 
310 double quoted with any double quotes in the string escaped. Otherwise
311 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
312 angle brackets. 
313            
314 If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
315 string were output then an ellipsis C<...> will be appended to the
316 string. Note that this happens AFTER it has been quoted.
317            
318 If start_color is non-null then it will be inserted after the opening
319 quote (if there is one) but before the escaped text. If end_color
320 is non-null then it will be inserted after the escaped text but before
321 any quotes or ellipses.
322
323 Returns a pointer to the prettified text as held by dsv.
324            
325 =cut           
326 */
327
328 char *
329 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count, 
330   const STRLEN max, char const * const start_color, char const * const end_color, 
331   const U32 flags ) 
332 {
333     const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
334     STRLEN escaped;
335     
336     if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
337             /* This won't alter the UTF-8 flag */
338             sv_setpvn(dsv, "", 0);
339     }
340
341     if ( dq == '"' )
342         sv_catpvn(dsv, "\"", 1);
343     else if ( flags & PERL_PV_PRETTY_LTGT )
344         sv_catpvn(dsv, "<", 1);
345         
346     if ( start_color != NULL ) 
347         Perl_sv_catpv( aTHX_ dsv, start_color);
348     
349     pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );    
350     
351     if ( end_color != NULL ) 
352         Perl_sv_catpv( aTHX_ dsv, end_color);
353
354     if ( dq == '"' ) 
355         sv_catpvn( dsv, "\"", 1 );
356     else if ( flags & PERL_PV_PRETTY_LTGT )
357         sv_catpvn( dsv, ">", 1);         
358     
359     if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
360             sv_catpvn( dsv, "...", 3 );
361  
362     return SvPVX(dsv);
363 }
364
365 /*
366 =for apidoc pv_display
367
368   char *pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len,
369                    STRLEN pvlim, U32 flags)
370
371 Similar to
372
373   pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
374
375 except that an additional "\0" will be appended to the string when
376 len > cur and pv[cur] is "\0".
377
378 Note that the final string may be up to 7 chars longer than pvlim.
379
380 =cut
381 */
382
383 char *
384 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
385 {
386     pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
387     if (len > cur && pv[cur] == '\0')
388             sv_catpvn( dsv, "\\0", 2 );
389     return SvPVX(dsv);
390 }
391
392 char *
393 Perl_sv_peek(pTHX_ SV *sv)
394 {
395     dVAR;
396     SV * const t = sv_newmortal();
397     int unref = 0;
398     U32 type;
399
400     sv_setpvn(t, "", 0);
401   retry:
402     if (!sv) {
403         sv_catpv(t, "VOID");
404         goto finish;
405     }
406     else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
407         sv_catpv(t, "WILD");
408         goto finish;
409     }
410     else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
411         if (sv == &PL_sv_undef) {
412             sv_catpv(t, "SV_UNDEF");
413             if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
414                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
415                 SvREADONLY(sv))
416                 goto finish;
417         }
418         else if (sv == &PL_sv_no) {
419             sv_catpv(t, "SV_NO");
420             if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
421                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
422                 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
423                                   SVp_POK|SVp_NOK)) &&
424                 SvCUR(sv) == 0 &&
425                 SvNVX(sv) == 0.0)
426                 goto finish;
427         }
428         else if (sv == &PL_sv_yes) {
429             sv_catpv(t, "SV_YES");
430             if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
431                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
432                 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
433                                   SVp_POK|SVp_NOK)) &&
434                 SvCUR(sv) == 1 &&
435                 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
436                 SvNVX(sv) == 1.0)
437                 goto finish;
438         }
439         else {
440             sv_catpv(t, "SV_PLACEHOLDER");
441             if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
442                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
443                 SvREADONLY(sv))
444                 goto finish;
445         }
446         sv_catpv(t, ":");
447     }
448     else if (SvREFCNT(sv) == 0) {
449         sv_catpv(t, "(");
450         unref++;
451     }
452     else if (DEBUG_R_TEST_) {
453         int is_tmp = 0;
454         I32 ix;
455         /* is this SV on the tmps stack? */
456         for (ix=PL_tmps_ix; ix>=0; ix--) {
457             if (PL_tmps_stack[ix] == sv) {
458                 is_tmp = 1;
459                 break;
460             }
461         }
462         if (SvREFCNT(sv) > 1)
463             Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
464                     is_tmp ? "T" : "");
465         else if (is_tmp)
466             sv_catpv(t, "<T>");
467     }
468
469     if (SvROK(sv)) {
470         sv_catpv(t, "\\");
471         if (SvCUR(t) + unref > 10) {
472             SvCUR_set(t, unref + 3);
473             *SvEND(t) = '\0';
474             sv_catpv(t, "...");
475             goto finish;
476         }
477         sv = (SV*)SvRV(sv);
478         goto retry;
479     }
480     type = SvTYPE(sv);
481     if (type == SVt_PVCV) {
482         Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
483         goto finish;
484     } else if (type < SVt_LAST) {
485         sv_catpv(t, svshorttypenames[type]);
486
487         if (type == SVt_NULL)
488             goto finish;
489     } else {
490         sv_catpv(t, "FREED");
491         goto finish;
492     }
493
494     if (SvPOKp(sv)) {
495         if (!SvPVX_const(sv))
496             sv_catpv(t, "(null)");
497         else {
498             SV * const tmp = newSVpvs("");
499             sv_catpv(t, "(");
500             if (SvOOK(sv))
501                 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, 127));
502             Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
503             if (SvUTF8(sv))
504                 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
505                                sv_uni_display(tmp, sv, 6 * SvCUR(sv),
506                                               UNI_DISPLAY_QQ));
507             SvREFCNT_dec(tmp);
508         }
509     }
510     else if (SvNOKp(sv)) {
511         STORE_NUMERIC_LOCAL_SET_STANDARD();
512         Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
513         RESTORE_NUMERIC_LOCAL();
514     }
515     else if (SvIOKp(sv)) {
516         if (SvIsUV(sv))
517             Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
518         else
519             Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
520     }
521     else
522         sv_catpv(t, "()");
523
524   finish:
525     while (unref--)
526         sv_catpv(t, ")");
527     return SvPV_nolen(t);
528 }
529
530 void
531 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
532 {
533     char ch;
534
535     if (!pm) {
536         Perl_dump_indent(aTHX_ level, file, "{}\n");
537         return;
538     }
539     Perl_dump_indent(aTHX_ level, file, "{\n");
540     level++;
541     if (pm->op_pmflags & PMf_ONCE)
542         ch = '?';
543     else
544         ch = '/';
545     if (PM_GETRE(pm))
546         Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
547              ch, PM_GETRE(pm)->precomp, ch,
548              (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
549     else
550         Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
551     if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
552         Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
553         op_dump(pm->op_pmreplrootu.op_pmreplroot);
554     }
555     if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) {
556         SV * const tmpsv = pm_description(pm);
557         Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
558         SvREFCNT_dec(tmpsv);
559     }
560
561     Perl_dump_indent(aTHX_ level-1, file, "}\n");
562 }
563
564 static SV *
565 S_pm_description(pTHX_ const PMOP *pm)
566 {
567     SV * const desc = newSVpvs("");
568     const REGEXP * const regex = PM_GETRE(pm);
569     const U32 pmflags = pm->op_pmflags;
570
571     if (pmflags & PMf_ONCE)
572         sv_catpv(desc, ",ONCE");
573 #ifdef USE_ITHREADS
574     if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
575         sv_catpv(desc, ":USED");
576 #else
577     if (pmflags & PMf_USED)
578         sv_catpv(desc, ":USED");
579 #endif
580
581     if (regex) {
582         if (regex->extflags & RXf_TAINTED)
583             sv_catpv(desc, ",TAINTED");
584         if (regex->check_substr) {
585             if (!(regex->extflags & RXf_NOSCAN))
586                 sv_catpv(desc, ",SCANFIRST");
587             if (regex->extflags & RXf_CHECK_ALL)
588                 sv_catpv(desc, ",ALL");
589         }
590         if (regex->extflags & RXf_SKIPWHITE)
591             sv_catpv(desc, ",SKIPWHITE");
592     }
593
594     if (pmflags & PMf_CONST)
595         sv_catpv(desc, ",CONST");
596     if (pmflags & PMf_KEEP)
597         sv_catpv(desc, ",KEEP");
598     if (pmflags & PMf_GLOBAL)
599         sv_catpv(desc, ",GLOBAL");
600     if (pmflags & PMf_CONTINUE)
601         sv_catpv(desc, ",CONTINUE");
602     if (pmflags & PMf_RETAINT)
603         sv_catpv(desc, ",RETAINT");
604     if (pmflags & PMf_EVAL)
605         sv_catpv(desc, ",EVAL");
606     return desc;
607 }
608
609 void
610 Perl_pmop_dump(pTHX_ PMOP *pm)
611 {
612     do_pmop_dump(0, Perl_debug_log, pm);
613 }
614
615 /* An op sequencer.  We visit the ops in the order they're to execute. */
616
617 STATIC void
618 S_sequence(pTHX_ register const OP *o)
619 {
620     dVAR;
621     const OP *oldop = NULL;
622
623     if (!o)
624         return;
625
626 #ifdef PERL_MAD
627     if (o->op_next == 0)
628         return;
629 #endif
630
631     if (!Sequence)
632         Sequence = newHV();
633
634     for (; o; o = o->op_next) {
635         STRLEN len;
636         SV * const op = newSVuv(PTR2UV(o));
637         const char * const key = SvPV_const(op, len);
638
639         if (hv_exists(Sequence, key, len))
640             break;
641
642         switch (o->op_type) {
643         case OP_STUB:
644             if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
645                 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
646                 break;
647             }
648             goto nothin;
649         case OP_NULL:
650 #ifdef PERL_MAD
651             if (o == o->op_next)
652                 return;
653 #endif
654             if (oldop && o->op_next)
655                 continue;
656             break;
657         case OP_SCALAR:
658         case OP_LINESEQ:
659         case OP_SCOPE:
660           nothin:
661             if (oldop && o->op_next)
662                 continue;
663             (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
664             break;
665
666         case OP_MAPWHILE:
667         case OP_GREPWHILE:
668         case OP_AND:
669         case OP_OR:
670         case OP_DOR:
671         case OP_ANDASSIGN:
672         case OP_ORASSIGN:
673         case OP_DORASSIGN:
674         case OP_COND_EXPR:
675         case OP_RANGE:
676             (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
677             sequence_tail(cLOGOPo->op_other);
678             break;
679
680         case OP_ENTERLOOP:
681         case OP_ENTERITER:
682             (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
683             sequence_tail(cLOOPo->op_redoop);
684             sequence_tail(cLOOPo->op_nextop);
685             sequence_tail(cLOOPo->op_lastop);
686             break;
687
688         case OP_SUBST:
689             (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
690             sequence_tail(cPMOPo->op_pmstashstartu.op_pmreplstart);
691             break;
692
693         case OP_QR:
694         case OP_MATCH:
695         case OP_HELEM:
696             break;
697
698         default:
699             (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
700             break;
701         }
702         oldop = o;
703     }
704 }
705
706 static void
707 S_sequence_tail(pTHX_ const OP *o)
708 {
709     while (o && (o->op_type == OP_NULL))
710         o = o->op_next;
711     sequence(o);
712 }
713
714 STATIC UV
715 S_sequence_num(pTHX_ const OP *o)
716 {
717     dVAR;
718     SV     *op,
719           **seq;
720     const char *key;
721     STRLEN  len;
722     if (!o) return 0;
723     op = newSVuv(PTR2UV(o));
724     key = SvPV_const(op, len);
725     seq = hv_fetch(Sequence, key, len, 0);
726     return seq ? SvUV(*seq): 0;
727 }
728
729 void
730 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
731 {
732     dVAR;
733     UV      seq;
734     const OPCODE optype = o->op_type;
735
736     sequence(o);
737     Perl_dump_indent(aTHX_ level, file, "{\n");
738     level++;
739     seq = sequence_num(o);
740     if (seq)
741         PerlIO_printf(file, "%-4"UVuf, seq);
742     else
743         PerlIO_printf(file, "    ");
744     PerlIO_printf(file,
745                   "%*sTYPE = %s  ===> ",
746                   (int)(PL_dumpindent*level-4), "", OP_NAME(o));
747     if (o->op_next)
748         PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n",
749                                 sequence_num(o->op_next));
750     else
751         PerlIO_printf(file, "DONE\n");
752     if (o->op_targ) {
753         if (optype == OP_NULL) {
754             Perl_dump_indent(aTHX_ level, file, "  (was %s)\n", PL_op_name[o->op_targ]);
755             if (o->op_targ == OP_NEXTSTATE) {
756                 if (CopLINE(cCOPo))
757                     Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
758                                      (UV)CopLINE(cCOPo));
759                 if (CopSTASHPV(cCOPo))
760                     Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
761                                      CopSTASHPV(cCOPo));
762                 if (cCOPo->cop_label)
763                     Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
764                                      cCOPo->cop_label);
765             }
766         }
767         else
768             Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
769     }
770 #ifdef DUMPADDR
771     Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
772 #endif
773     if (o->op_flags || o->op_latefree || o->op_latefreed || o->op_attached) {
774         SV * const tmpsv = newSVpvs("");
775         switch (o->op_flags & OPf_WANT) {
776         case OPf_WANT_VOID:
777             sv_catpv(tmpsv, ",VOID");
778             break;
779         case OPf_WANT_SCALAR:
780             sv_catpv(tmpsv, ",SCALAR");
781             break;
782         case OPf_WANT_LIST:
783             sv_catpv(tmpsv, ",LIST");
784             break;
785         default:
786             sv_catpv(tmpsv, ",UNKNOWN");
787             break;
788         }
789         if (o->op_flags & OPf_KIDS)
790             sv_catpv(tmpsv, ",KIDS");
791         if (o->op_flags & OPf_PARENS)
792             sv_catpv(tmpsv, ",PARENS");
793         if (o->op_flags & OPf_STACKED)
794             sv_catpv(tmpsv, ",STACKED");
795         if (o->op_flags & OPf_REF)
796             sv_catpv(tmpsv, ",REF");
797         if (o->op_flags & OPf_MOD)
798             sv_catpv(tmpsv, ",MOD");
799         if (o->op_flags & OPf_SPECIAL)
800             sv_catpv(tmpsv, ",SPECIAL");
801         if (o->op_latefree)
802             sv_catpv(tmpsv, ",LATEFREE");
803         if (o->op_latefreed)
804             sv_catpv(tmpsv, ",LATEFREED");
805         if (o->op_attached)
806             sv_catpv(tmpsv, ",ATTACHED");
807         Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
808         SvREFCNT_dec(tmpsv);
809     }
810     if (o->op_private) {
811         SV * const tmpsv = newSVpvs("");
812         if (PL_opargs[optype] & OA_TARGLEX) {
813             if (o->op_private & OPpTARGET_MY)
814                 sv_catpv(tmpsv, ",TARGET_MY");
815         }
816         else if (optype == OP_LEAVESUB ||
817                  optype == OP_LEAVE ||
818                  optype == OP_LEAVESUBLV ||
819                  optype == OP_LEAVEWRITE) {
820             if (o->op_private & OPpREFCOUNTED)
821                 sv_catpv(tmpsv, ",REFCOUNTED");
822         }
823         else if (optype == OP_AASSIGN) {
824             if (o->op_private & OPpASSIGN_COMMON)
825                 sv_catpv(tmpsv, ",COMMON");
826         }
827         else if (optype == OP_SASSIGN) {
828             if (o->op_private & OPpASSIGN_BACKWARDS)
829                 sv_catpv(tmpsv, ",BACKWARDS");
830         }
831         else if (optype == OP_TRANS) {
832             if (o->op_private & OPpTRANS_SQUASH)
833                 sv_catpv(tmpsv, ",SQUASH");
834             if (o->op_private & OPpTRANS_DELETE)
835                 sv_catpv(tmpsv, ",DELETE");
836             if (o->op_private & OPpTRANS_COMPLEMENT)
837                 sv_catpv(tmpsv, ",COMPLEMENT");
838             if (o->op_private & OPpTRANS_IDENTICAL)
839                 sv_catpv(tmpsv, ",IDENTICAL");
840             if (o->op_private & OPpTRANS_GROWS)
841                 sv_catpv(tmpsv, ",GROWS");
842         }
843         else if (optype == OP_REPEAT) {
844             if (o->op_private & OPpREPEAT_DOLIST)
845                 sv_catpv(tmpsv, ",DOLIST");
846         }
847         else if (optype == OP_ENTERSUB ||
848                  optype == OP_RV2SV ||
849                  optype == OP_GVSV ||
850                  optype == OP_RV2AV ||
851                  optype == OP_RV2HV ||
852                  optype == OP_RV2GV ||
853                  optype == OP_AELEM ||
854                  optype == OP_HELEM )
855         {
856             if (optype == OP_ENTERSUB) {
857                 if (o->op_private & OPpENTERSUB_AMPER)
858                     sv_catpv(tmpsv, ",AMPER");
859                 if (o->op_private & OPpENTERSUB_DB)
860                     sv_catpv(tmpsv, ",DB");
861                 if (o->op_private & OPpENTERSUB_HASTARG)
862                     sv_catpv(tmpsv, ",HASTARG");
863                 if (o->op_private & OPpENTERSUB_NOPAREN)
864                     sv_catpv(tmpsv, ",NOPAREN");
865                 if (o->op_private & OPpENTERSUB_INARGS)
866                     sv_catpv(tmpsv, ",INARGS");
867                 if (o->op_private & OPpENTERSUB_NOMOD)
868                     sv_catpv(tmpsv, ",NOMOD");
869             }
870             else {
871                 switch (o->op_private & OPpDEREF) {
872                 case OPpDEREF_SV:
873                     sv_catpv(tmpsv, ",SV");
874                     break;
875                 case OPpDEREF_AV:
876                     sv_catpv(tmpsv, ",AV");
877                     break;
878                 case OPpDEREF_HV:
879                     sv_catpv(tmpsv, ",HV");
880                     break;
881                 }
882                 if (o->op_private & OPpMAYBE_LVSUB)
883                     sv_catpv(tmpsv, ",MAYBE_LVSUB");
884             }
885             if (optype == OP_AELEM || optype == OP_HELEM) {
886                 if (o->op_private & OPpLVAL_DEFER)
887                     sv_catpv(tmpsv, ",LVAL_DEFER");
888             }
889             else {
890                 if (o->op_private & HINT_STRICT_REFS)
891                     sv_catpv(tmpsv, ",STRICT_REFS");
892                 if (o->op_private & OPpOUR_INTRO)
893                     sv_catpv(tmpsv, ",OUR_INTRO");
894             }
895         }
896         else if (optype == OP_CONST) {
897             if (o->op_private & OPpCONST_BARE)
898                 sv_catpv(tmpsv, ",BARE");
899             if (o->op_private & OPpCONST_STRICT)
900                 sv_catpv(tmpsv, ",STRICT");
901             if (o->op_private & OPpCONST_ARYBASE)
902                 sv_catpv(tmpsv, ",ARYBASE");
903             if (o->op_private & OPpCONST_WARNING)
904                 sv_catpv(tmpsv, ",WARNING");
905             if (o->op_private & OPpCONST_ENTERED)
906                 sv_catpv(tmpsv, ",ENTERED");
907         }
908         else if (optype == OP_FLIP) {
909             if (o->op_private & OPpFLIP_LINENUM)
910                 sv_catpv(tmpsv, ",LINENUM");
911         }
912         else if (optype == OP_FLOP) {
913             if (o->op_private & OPpFLIP_LINENUM)
914                 sv_catpv(tmpsv, ",LINENUM");
915         }
916         else if (optype == OP_RV2CV) {
917             if (o->op_private & OPpLVAL_INTRO)
918                 sv_catpv(tmpsv, ",INTRO");
919         }
920         else if (optype == OP_GV) {
921             if (o->op_private & OPpEARLY_CV)
922                 sv_catpv(tmpsv, ",EARLY_CV");
923         }
924         else if (optype == OP_LIST) {
925             if (o->op_private & OPpLIST_GUESSED)
926                 sv_catpv(tmpsv, ",GUESSED");
927         }
928         else if (optype == OP_DELETE) {
929             if (o->op_private & OPpSLICE)
930                 sv_catpv(tmpsv, ",SLICE");
931         }
932         else if (optype == OP_EXISTS) {
933             if (o->op_private & OPpEXISTS_SUB)
934                 sv_catpv(tmpsv, ",EXISTS_SUB");
935         }
936         else if (optype == OP_SORT) {
937             if (o->op_private & OPpSORT_NUMERIC)
938                 sv_catpv(tmpsv, ",NUMERIC");
939             if (o->op_private & OPpSORT_INTEGER)
940                 sv_catpv(tmpsv, ",INTEGER");
941             if (o->op_private & OPpSORT_REVERSE)
942                 sv_catpv(tmpsv, ",REVERSE");
943         }
944         else if (optype == OP_OPEN || optype == OP_BACKTICK) {
945             if (o->op_private & OPpOPEN_IN_RAW)
946                 sv_catpv(tmpsv, ",IN_RAW");
947             if (o->op_private & OPpOPEN_IN_CRLF)
948                 sv_catpv(tmpsv, ",IN_CRLF");
949             if (o->op_private & OPpOPEN_OUT_RAW)
950                 sv_catpv(tmpsv, ",OUT_RAW");
951             if (o->op_private & OPpOPEN_OUT_CRLF)
952                 sv_catpv(tmpsv, ",OUT_CRLF");
953         }
954         else if (optype == OP_EXIT) {
955             if (o->op_private & OPpEXIT_VMSISH)
956                 sv_catpv(tmpsv, ",EXIT_VMSISH");
957             if (o->op_private & OPpHUSH_VMSISH)
958                 sv_catpv(tmpsv, ",HUSH_VMSISH");
959         }
960         else if (optype == OP_DIE) {
961             if (o->op_private & OPpHUSH_VMSISH)
962                 sv_catpv(tmpsv, ",HUSH_VMSISH");
963         }
964         else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
965             if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS)
966                 sv_catpv(tmpsv, ",FT_ACCESS");
967             if (o->op_private & OPpFT_STACKED)
968                 sv_catpv(tmpsv, ",FT_STACKED");
969         }
970         if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
971             sv_catpv(tmpsv, ",INTRO");
972         if (SvCUR(tmpsv))
973             Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
974         SvREFCNT_dec(tmpsv);
975     }
976
977 #ifdef PERL_MAD
978     if (PL_madskills && o->op_madprop) {
979         SV * const tmpsv = newSVpvn("", 0);
980         MADPROP* mp = o->op_madprop;
981         Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
982         level++;
983         while (mp) {
984             const char tmp = mp->mad_key;
985             sv_setpvn(tmpsv,"'",1);
986             if (tmp)
987                 sv_catpvn(tmpsv, &tmp, 1);
988             sv_catpv(tmpsv, "'=");
989             switch (mp->mad_type) {
990             case MAD_NULL:
991                 sv_catpv(tmpsv, "NULL");
992                 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
993                 break;
994             case MAD_PV:
995                 sv_catpv(tmpsv, "<");
996                 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
997                 sv_catpv(tmpsv, ">");
998                 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
999                 break;
1000             case MAD_OP:
1001                 if ((OP*)mp->mad_val) {
1002                     Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1003                     do_op_dump(level, file, (OP*)mp->mad_val);
1004                 }
1005                 break;
1006             default:
1007                 sv_catpv(tmpsv, "(UNK)");
1008                 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1009                 break;
1010             }
1011             mp = mp->mad_next;
1012         }
1013         level--;
1014         Perl_dump_indent(aTHX_ level, file, "}\n");
1015
1016         SvREFCNT_dec(tmpsv);
1017     }
1018 #endif
1019
1020     switch (optype) {
1021     case OP_AELEMFAST:
1022     case OP_GVSV:
1023     case OP_GV:
1024 #ifdef USE_ITHREADS
1025         Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1026 #else
1027         if ( ! PL_op->op_flags & OPf_SPECIAL) { /* not lexical */
1028             if (cSVOPo->op_sv) {
1029                 SV * const tmpsv = newSV(0);
1030                 ENTER;
1031                 SAVEFREESV(tmpsv);
1032 #ifdef PERL_MAD
1033                 /* FIXME - is this making unwarranted assumptions about the
1034                    UTF-8 cleanliness of the dump file handle?  */
1035                 SvUTF8_on(tmpsv);
1036 #endif
1037                 gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, NULL);
1038                 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1039                                  SvPV_nolen_const(tmpsv));
1040                 LEAVE;
1041             }
1042             else
1043                 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1044         }
1045 #endif
1046         break;
1047     case OP_CONST:
1048     case OP_METHOD_NAMED:
1049 #ifndef USE_ITHREADS
1050         /* with ITHREADS, consts are stored in the pad, and the right pad
1051          * may not be active here, so skip */
1052         Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1053 #endif
1054         break;
1055     case OP_SETSTATE:
1056     case OP_NEXTSTATE:
1057     case OP_DBSTATE:
1058         if (CopLINE(cCOPo))
1059             Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1060                              (UV)CopLINE(cCOPo));
1061         if (CopSTASHPV(cCOPo))
1062             Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1063                              CopSTASHPV(cCOPo));
1064         if (cCOPo->cop_label)
1065             Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1066                              cCOPo->cop_label);
1067         break;
1068     case OP_ENTERLOOP:
1069         Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1070         if (cLOOPo->op_redoop)
1071             PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1072         else
1073             PerlIO_printf(file, "DONE\n");
1074         Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1075         if (cLOOPo->op_nextop)
1076             PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1077         else
1078             PerlIO_printf(file, "DONE\n");
1079         Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1080         if (cLOOPo->op_lastop)
1081             PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1082         else
1083             PerlIO_printf(file, "DONE\n");
1084         break;
1085     case OP_COND_EXPR:
1086     case OP_RANGE:
1087     case OP_MAPWHILE:
1088     case OP_GREPWHILE:
1089     case OP_OR:
1090     case OP_AND:
1091         Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1092         if (cLOGOPo->op_other)
1093             PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1094         else
1095             PerlIO_printf(file, "DONE\n");
1096         break;
1097     case OP_PUSHRE:
1098     case OP_MATCH:
1099     case OP_QR:
1100     case OP_SUBST:
1101         do_pmop_dump(level, file, cPMOPo);
1102         break;
1103     case OP_LEAVE:
1104     case OP_LEAVEEVAL:
1105     case OP_LEAVESUB:
1106     case OP_LEAVESUBLV:
1107     case OP_LEAVEWRITE:
1108     case OP_SCOPE:
1109         if (o->op_private & OPpREFCOUNTED)
1110             Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1111         break;
1112     default:
1113         break;
1114     }
1115     if (o->op_flags & OPf_KIDS) {
1116         OP *kid;
1117         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1118             do_op_dump(level, file, kid);
1119     }
1120     Perl_dump_indent(aTHX_ level-1, file, "}\n");
1121 }
1122
1123 void
1124 Perl_op_dump(pTHX_ const OP *o)
1125 {
1126     do_op_dump(0, Perl_debug_log, o);
1127 }
1128
1129 void
1130 Perl_gv_dump(pTHX_ GV *gv)
1131 {
1132     SV *sv;
1133
1134     if (!gv) {
1135         PerlIO_printf(Perl_debug_log, "{}\n");
1136         return;
1137     }
1138     sv = sv_newmortal();
1139     PerlIO_printf(Perl_debug_log, "{\n");
1140     gv_fullname3(sv, gv, NULL);
1141     Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1142     if (gv != GvEGV(gv)) {
1143         gv_efullname3(sv, GvEGV(gv), NULL);
1144         Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1145     }
1146     PerlIO_putc(Perl_debug_log, '\n');
1147     Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1148 }
1149
1150
1151 /* map magic types to the symbolic names
1152  * (with the PERL_MAGIC_ prefixed stripped)
1153  */
1154
1155 static const struct { const char type; const char *name; } magic_names[] = {
1156         { PERL_MAGIC_sv,             "sv(\\0)" },
1157         { PERL_MAGIC_arylen,         "arylen(#)" },
1158         { PERL_MAGIC_rhash,          "rhash(%)" },
1159         { PERL_MAGIC_pos,            "pos(.)" },
1160         { PERL_MAGIC_symtab,         "symtab(:)" },
1161         { PERL_MAGIC_backref,        "backref(<)" },
1162         { PERL_MAGIC_arylen_p,       "arylen_p(@)" },
1163         { PERL_MAGIC_overload,       "overload(A)" },
1164         { PERL_MAGIC_bm,             "bm(B)" },
1165         { PERL_MAGIC_regdata,        "regdata(D)" },
1166         { PERL_MAGIC_env,            "env(E)" },
1167         { PERL_MAGIC_hints,          "hints(H)" },
1168         { PERL_MAGIC_isa,            "isa(I)" },
1169         { PERL_MAGIC_dbfile,         "dbfile(L)" },
1170         { PERL_MAGIC_shared,         "shared(N)" },
1171         { PERL_MAGIC_tied,           "tied(P)" },
1172         { PERL_MAGIC_sig,            "sig(S)" },
1173         { PERL_MAGIC_uvar,           "uvar(U)" },
1174         { PERL_MAGIC_overload_elem,  "overload_elem(a)" },
1175         { PERL_MAGIC_overload_table, "overload_table(c)" },
1176         { PERL_MAGIC_regdatum,       "regdatum(d)" },
1177         { PERL_MAGIC_envelem,        "envelem(e)" },
1178         { PERL_MAGIC_fm,             "fm(f)" },
1179         { PERL_MAGIC_regex_global,   "regex_global(g)" },
1180         { PERL_MAGIC_hintselem,      "hintselem(h)" },
1181         { PERL_MAGIC_isaelem,        "isaelem(i)" },
1182         { PERL_MAGIC_nkeys,          "nkeys(k)" },
1183         { PERL_MAGIC_dbline,         "dbline(l)" },
1184         { PERL_MAGIC_shared_scalar,  "shared_scalar(n)" },
1185         { PERL_MAGIC_collxfrm,       "collxfrm(o)" },
1186         { PERL_MAGIC_tiedelem,       "tiedelem(p)" },
1187         { PERL_MAGIC_tiedscalar,     "tiedscalar(q)" },
1188         { PERL_MAGIC_qr,             "qr(r)" },
1189         { PERL_MAGIC_sigelem,        "sigelem(s)" },
1190         { PERL_MAGIC_taint,          "taint(t)" },
1191         { PERL_MAGIC_uvar_elem,      "uvar_elem(v)" },
1192         { PERL_MAGIC_vec,            "vec(v)" },
1193         { PERL_MAGIC_vstring,        "vstring(V)" },
1194         { PERL_MAGIC_utf8,           "utf8(w)" },
1195         { PERL_MAGIC_substr,         "substr(x)" },
1196         { PERL_MAGIC_defelem,        "defelem(y)" },
1197         { PERL_MAGIC_ext,            "ext(~)" },
1198         /* this null string terminates the list */
1199         { 0,                         NULL },
1200 };
1201
1202 void
1203 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1204 {
1205     for (; mg; mg = mg->mg_moremagic) {
1206         Perl_dump_indent(aTHX_ level, file,
1207                          "  MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1208         if (mg->mg_virtual) {
1209             const MGVTBL * const v = mg->mg_virtual;
1210             const char *s;
1211             if      (v == &PL_vtbl_sv)         s = "sv";
1212             else if (v == &PL_vtbl_env)        s = "env";
1213             else if (v == &PL_vtbl_envelem)    s = "envelem";
1214             else if (v == &PL_vtbl_sig)        s = "sig";
1215             else if (v == &PL_vtbl_sigelem)    s = "sigelem";
1216             else if (v == &PL_vtbl_pack)       s = "pack";
1217             else if (v == &PL_vtbl_packelem)   s = "packelem";
1218             else if (v == &PL_vtbl_dbline)     s = "dbline";
1219             else if (v == &PL_vtbl_isa)        s = "isa";
1220             else if (v == &PL_vtbl_arylen)     s = "arylen";
1221             else if (v == &PL_vtbl_mglob)      s = "mglob";
1222             else if (v == &PL_vtbl_nkeys)      s = "nkeys";
1223             else if (v == &PL_vtbl_taint)      s = "taint";
1224             else if (v == &PL_vtbl_substr)     s = "substr";
1225             else if (v == &PL_vtbl_vec)        s = "vec";
1226             else if (v == &PL_vtbl_pos)        s = "pos";
1227             else if (v == &PL_vtbl_bm)         s = "bm";
1228             else if (v == &PL_vtbl_fm)         s = "fm";
1229             else if (v == &PL_vtbl_uvar)       s = "uvar";
1230             else if (v == &PL_vtbl_defelem)    s = "defelem";
1231 #ifdef USE_LOCALE_COLLATE
1232             else if (v == &PL_vtbl_collxfrm)   s = "collxfrm";
1233 #endif
1234             else if (v == &PL_vtbl_amagic)     s = "amagic";
1235             else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
1236             else if (v == &PL_vtbl_backref)    s = "backref";
1237             else if (v == &PL_vtbl_utf8)       s = "utf8";
1238             else if (v == &PL_vtbl_arylen_p)   s = "arylen_p";
1239             else if (v == &PL_vtbl_hintselem)  s = "hintselem";
1240             else                               s = NULL;
1241             if (s)
1242                 Perl_dump_indent(aTHX_ level, file, "    MG_VIRTUAL = &PL_vtbl_%s\n", s);
1243             else
1244                 Perl_dump_indent(aTHX_ level, file, "    MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1245         }
1246         else
1247             Perl_dump_indent(aTHX_ level, file, "    MG_VIRTUAL = 0\n");
1248
1249         if (mg->mg_private)
1250             Perl_dump_indent(aTHX_ level, file, "    MG_PRIVATE = %d\n", mg->mg_private);
1251
1252         {
1253             int n;
1254             const char *name = NULL;
1255             for (n = 0; magic_names[n].name; n++) {
1256                 if (mg->mg_type == magic_names[n].type) {
1257                     name = magic_names[n].name;
1258                     break;
1259                 }
1260             }
1261             if (name)
1262                 Perl_dump_indent(aTHX_ level, file,
1263                                 "    MG_TYPE = PERL_MAGIC_%s\n", name);
1264             else
1265                 Perl_dump_indent(aTHX_ level, file,
1266                                 "    MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1267         }
1268
1269         if (mg->mg_flags) {
1270             Perl_dump_indent(aTHX_ level, file, "    MG_FLAGS = 0x%02X\n", mg->mg_flags);
1271             if (mg->mg_type == PERL_MAGIC_envelem &&
1272                 mg->mg_flags & MGf_TAINTEDDIR)
1273                 Perl_dump_indent(aTHX_ level, file, "      TAINTEDDIR\n");
1274             if (mg->mg_flags & MGf_REFCOUNTED)
1275                 Perl_dump_indent(aTHX_ level, file, "      REFCOUNTED\n");
1276             if (mg->mg_flags & MGf_GSKIP)
1277                 Perl_dump_indent(aTHX_ level, file, "      GSKIP\n");
1278             if (mg->mg_type == PERL_MAGIC_regex_global &&
1279                 mg->mg_flags & MGf_MINMATCH)
1280                 Perl_dump_indent(aTHX_ level, file, "      MINMATCH\n");
1281         }
1282         if (mg->mg_obj) {
1283             Perl_dump_indent(aTHX_ level, file, "    MG_OBJ = 0x%"UVxf"\n", 
1284                 PTR2UV(mg->mg_obj));
1285             if (mg->mg_type == PERL_MAGIC_qr) {
1286                 const regexp * const re = (regexp *)mg->mg_obj;
1287                 SV * const dsv = sv_newmortal();
1288                 const char * const s =  pv_pretty(dsv, re->wrapped, re->wraplen, 
1289                     60, NULL, NULL,
1290                     ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1291                     ((re->extflags & RXf_UTF8) ? PERL_PV_ESCAPE_UNI : 0))
1292                 );
1293                 Perl_dump_indent(aTHX_ level+1, file, "    PAT = %s\n", s);
1294                 Perl_dump_indent(aTHX_ level+1, file, "    REFCNT = %"IVdf"\n",
1295                         (IV)re->refcnt);
1296             }
1297             if (mg->mg_flags & MGf_REFCOUNTED)
1298                 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1299         }
1300         if (mg->mg_len)
1301             Perl_dump_indent(aTHX_ level, file, "    MG_LEN = %ld\n", (long)mg->mg_len);
1302         if (mg->mg_ptr) {
1303             Perl_dump_indent(aTHX_ level, file, "    MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1304             if (mg->mg_len >= 0) {
1305                 if (mg->mg_type != PERL_MAGIC_utf8) {
1306                     SV * const sv = newSVpvs("");
1307                     PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1308                     SvREFCNT_dec(sv);
1309                 }
1310             }
1311             else if (mg->mg_len == HEf_SVKEY) {
1312                 PerlIO_puts(file, " => HEf_SVKEY\n");
1313                 do_sv_dump(level+2, file, (SV*)((mg)->mg_ptr), nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1314                 continue;
1315             }
1316             else
1317                 PerlIO_puts(file, " ???? - please notify IZ");
1318             PerlIO_putc(file, '\n');
1319         }
1320         if (mg->mg_type == PERL_MAGIC_utf8) {
1321             const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1322             if (cache) {
1323                 IV i;
1324                 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1325                     Perl_dump_indent(aTHX_ level, file,
1326                                      "      %2"IVdf": %"UVuf" -> %"UVuf"\n",
1327                                      i,
1328                                      (UV)cache[i * 2],
1329                                      (UV)cache[i * 2 + 1]);
1330             }
1331         }
1332     }
1333 }
1334
1335 void
1336 Perl_magic_dump(pTHX_ const MAGIC *mg)
1337 {
1338     do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1339 }
1340
1341 void
1342 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1343 {
1344     const char *hvname;
1345     Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1346     if (sv && (hvname = HvNAME_get(sv)))
1347         PerlIO_printf(file, "\t\"%s\"\n", hvname);
1348     else
1349         PerlIO_putc(file, '\n');
1350 }
1351
1352 void
1353 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1354 {
1355     Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1356     if (sv && GvNAME(sv))
1357         PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1358     else
1359         PerlIO_putc(file, '\n');
1360 }
1361
1362 void
1363 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1364 {
1365     Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1366     if (sv && GvNAME(sv)) {
1367         const char *hvname;
1368         PerlIO_printf(file, "\t\"");
1369         if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1370             PerlIO_printf(file, "%s\" :: \"", hvname);
1371         PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1372     }
1373     else
1374         PerlIO_putc(file, '\n');
1375 }
1376
1377 void
1378 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1379 {
1380     dVAR;
1381     SV *d;
1382     const char *s;
1383     U32 flags;
1384     U32 type;
1385
1386     if (!sv) {
1387         Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1388         return;
1389     }
1390
1391     flags = SvFLAGS(sv);
1392     type = SvTYPE(sv);
1393
1394     d = Perl_newSVpvf(aTHX_
1395                    "(0x%"UVxf") at 0x%"UVxf"\n%*s  REFCNT = %"IVdf"\n%*s  FLAGS = (",
1396                    PTR2UV(SvANY(sv)), PTR2UV(sv),
1397                    (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1398                    (int)(PL_dumpindent*level), "");
1399
1400     if (!(flags & SVpad_NAME && (type == SVt_PVMG || type == SVt_PVNV))) {
1401         if (flags & SVs_PADSTALE)       sv_catpv(d, "PADSTALE,");
1402     }
1403     if (!(flags & SVpad_NAME && type == SVt_PVMG)) {
1404         if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
1405         if (flags & SVs_PADMY)  sv_catpv(d, "PADMY,");
1406     }
1407     if (flags & SVs_TEMP)       sv_catpv(d, "TEMP,");
1408     if (flags & SVs_OBJECT)     sv_catpv(d, "OBJECT,");
1409     if (flags & SVs_GMG)        sv_catpv(d, "GMG,");
1410     if (flags & SVs_SMG)        sv_catpv(d, "SMG,");
1411     if (flags & SVs_RMG)        sv_catpv(d, "RMG,");
1412
1413     if (flags & SVf_IOK)        sv_catpv(d, "IOK,");
1414     if (flags & SVf_NOK)        sv_catpv(d, "NOK,");
1415     if (flags & SVf_POK)        sv_catpv(d, "POK,");
1416     if (flags & SVf_ROK)  {     
1417                                 sv_catpv(d, "ROK,");
1418         if (SvWEAKREF(sv))      sv_catpv(d, "WEAKREF,");
1419     }
1420     if (flags & SVf_OOK)        sv_catpv(d, "OOK,");
1421     if (flags & SVf_FAKE)       sv_catpv(d, "FAKE,");
1422     if (flags & SVf_READONLY)   sv_catpv(d, "READONLY,");
1423     if (flags & SVf_BREAK)      sv_catpv(d, "BREAK,");
1424
1425     if (flags & SVf_AMAGIC)     sv_catpv(d, "OVERLOAD,");
1426     if (flags & SVp_IOK)        sv_catpv(d, "pIOK,");
1427     if (flags & SVp_NOK)        sv_catpv(d, "pNOK,");
1428     if (flags & SVp_POK)        sv_catpv(d, "pPOK,");
1429     if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1430         if (SvPCS_IMPORTED(sv))
1431                                 sv_catpv(d, "PCS_IMPORTED,");
1432         else
1433                                 sv_catpv(d, "SCREAM,");
1434     }
1435
1436     switch (type) {
1437     case SVt_PVCV:
1438     case SVt_PVFM:
1439         if (CvANON(sv))         sv_catpv(d, "ANON,");
1440         if (CvUNIQUE(sv))       sv_catpv(d, "UNIQUE,");
1441         if (CvCLONE(sv))        sv_catpv(d, "CLONE,");
1442         if (CvCLONED(sv))       sv_catpv(d, "CLONED,");
1443         if (CvCONST(sv))        sv_catpv(d, "CONST,");
1444         if (CvNODEBUG(sv))      sv_catpv(d, "NODEBUG,");
1445         if (SvCOMPILED(sv))     sv_catpv(d, "COMPILED,");
1446         if (CvLVALUE(sv))       sv_catpv(d, "LVALUE,");
1447         if (CvMETHOD(sv))       sv_catpv(d, "METHOD,");
1448         if (CvLOCKED(sv))       sv_catpv(d, "LOCKED,");
1449         if (CvWEAKOUTSIDE(sv))  sv_catpv(d, "WEAKOUTSIDE,");
1450         break;
1451     case SVt_PVHV:
1452         if (HvSHAREKEYS(sv))    sv_catpv(d, "SHAREKEYS,");
1453         if (HvLAZYDEL(sv))      sv_catpv(d, "LAZYDEL,");
1454         if (HvHASKFLAGS(sv))    sv_catpv(d, "HASKFLAGS,");
1455         if (HvREHASH(sv))       sv_catpv(d, "REHASH,");
1456         if (flags & SVphv_CLONEABLE) sv_catpv(d, "CLONEABLE,");
1457         break;
1458     case SVt_PVGV:
1459     case SVt_PVLV:
1460         if (isGV_with_GP(sv)) {
1461             if (GvINTRO(sv))    sv_catpv(d, "INTRO,");
1462             if (GvMULTI(sv))    sv_catpv(d, "MULTI,");
1463             if (GvUNIQUE(sv))   sv_catpv(d, "UNIQUE,");
1464             if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
1465             if (GvIN_PAD(sv))   sv_catpv(d, "IN_PAD,");
1466         }
1467         if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1468             sv_catpv(d, "IMPORT");
1469             if (GvIMPORTED(sv) == GVf_IMPORTED)
1470                 sv_catpv(d, "ALL,");
1471             else {
1472                 sv_catpv(d, "(");
1473                 if (GvIMPORTED_SV(sv))  sv_catpv(d, " SV");
1474                 if (GvIMPORTED_AV(sv))  sv_catpv(d, " AV");
1475                 if (GvIMPORTED_HV(sv))  sv_catpv(d, " HV");
1476                 if (GvIMPORTED_CV(sv))  sv_catpv(d, " CV");
1477                 sv_catpv(d, " ),");
1478             }
1479         }
1480         if (SvTAIL(sv))         sv_catpv(d, "TAIL,");
1481         if (SvVALID(sv))        sv_catpv(d, "VALID,");
1482         /* FALL THROUGH */
1483     default:
1484     evaled_or_uv:
1485         if (SvEVALED(sv))       sv_catpv(d, "EVALED,");
1486         if (SvIsUV(sv) && !(flags & SVf_ROK))   sv_catpv(d, "IsUV,");
1487         break;
1488     case SVt_PVMG:
1489         if (SvPAD_TYPED(sv))    sv_catpv(d, "TYPED,");
1490         if (SvPAD_OUR(sv))      sv_catpv(d, "OUR,");
1491         /* FALL THROUGH */
1492     case SVt_PVNV:
1493         if (SvPAD_STATE(sv))    sv_catpv(d, "STATE,");
1494         goto evaled_or_uv;
1495     case SVt_PVAV:
1496         break;
1497     }
1498     /* SVphv_SHAREKEYS is also 0x20000000 */
1499     if ((type != SVt_PVHV) && SvUTF8(sv))
1500         sv_catpv(d, "UTF8");
1501
1502     if (*(SvEND(d) - 1) == ',') {
1503         SvCUR_set(d, SvCUR(d) - 1);
1504         SvPVX(d)[SvCUR(d)] = '\0';
1505     }
1506     sv_catpv(d, ")");
1507     s = SvPVX_const(d);
1508
1509 #ifdef DEBUG_LEAKING_SCALARS
1510     Perl_dump_indent(aTHX_ level, file, "ALLOCATED at %s:%d %s %s%s\n",
1511         sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1512         sv->sv_debug_line,
1513         sv->sv_debug_inpad ? "for" : "by",
1514         sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1515         sv->sv_debug_cloned ? " (cloned)" : "");
1516 #endif
1517     Perl_dump_indent(aTHX_ level, file, "SV = ");
1518     if (type < SVt_LAST) {
1519         PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1520
1521         if (type ==  SVt_NULL) {
1522             SvREFCNT_dec(d);
1523             return;
1524         }
1525     } else {
1526         PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1527         SvREFCNT_dec(d);
1528         return;
1529     }
1530     if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1531          && type != SVt_PVCV && !isGV_with_GP(sv))
1532         || type == SVt_IV) {
1533         if (SvIsUV(sv)
1534 #ifdef PERL_OLD_COPY_ON_WRITE
1535                        || SvIsCOW(sv)
1536 #endif
1537                                      )
1538             Perl_dump_indent(aTHX_ level, file, "  UV = %"UVuf, (UV)SvUVX(sv));
1539         else
1540             Perl_dump_indent(aTHX_ level, file, "  IV = %"IVdf, (IV)SvIVX(sv));
1541         if (SvOOK(sv))
1542             PerlIO_printf(file, "  (OFFSET)");
1543 #ifdef PERL_OLD_COPY_ON_WRITE
1544         if (SvIsCOW_shared_hash(sv))
1545             PerlIO_printf(file, "  (HASH)");
1546         else if (SvIsCOW_normal(sv))
1547             PerlIO_printf(file, "  (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1548 #endif
1549         PerlIO_putc(file, '\n');
1550     }
1551     if ((type == SVt_PVNV || type == SVt_PVMG) && SvFLAGS(sv) & SVpad_NAME) {
1552         Perl_dump_indent(aTHX_ level, file, "  COP_LOW = %"UVuf"\n",
1553                          (UV) COP_SEQ_RANGE_LOW(sv));
1554         Perl_dump_indent(aTHX_ level, file, "  COP_HIGH = %"UVuf"\n",
1555                          (UV) COP_SEQ_RANGE_HIGH(sv));
1556     } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1557                 && type != SVt_PVCV && type != SVt_PVFM && !isGV_with_GP(sv)
1558                 && !SvVALID(sv))
1559                || type == SVt_NV) {
1560         STORE_NUMERIC_LOCAL_SET_STANDARD();
1561         /* %Vg doesn't work? --jhi */
1562 #ifdef USE_LONG_DOUBLE
1563         Perl_dump_indent(aTHX_ level, file, "  NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1564 #else
1565         Perl_dump_indent(aTHX_ level, file, "  NV = %.*g\n", DBL_DIG, SvNVX(sv));
1566 #endif
1567         RESTORE_NUMERIC_LOCAL();
1568     }
1569     if (SvROK(sv)) {
1570         Perl_dump_indent(aTHX_ level, file, "  RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1571         if (nest < maxnest)
1572             do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1573     }
1574     if (type < SVt_PV) {
1575         SvREFCNT_dec(d);
1576         return;
1577     }
1578     if (type <= SVt_PVLV && !isGV_with_GP(sv)) {
1579         if (SvPVX_const(sv)) {
1580             Perl_dump_indent(aTHX_ level, file,"  PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1581             if (SvOOK(sv))
1582                 PerlIO_printf(file, "( %s . ) ", pv_display(d, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, pvlim));
1583             PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1584             if (SvUTF8(sv)) /* the 6?  \x{....} */
1585                 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
1586             PerlIO_printf(file, "\n");
1587             Perl_dump_indent(aTHX_ level, file, "  CUR = %"IVdf"\n", (IV)SvCUR(sv));
1588             Perl_dump_indent(aTHX_ level, file, "  LEN = %"IVdf"\n", (IV)SvLEN(sv));
1589         }
1590         else
1591             Perl_dump_indent(aTHX_ level, file, "  PV = 0\n");
1592     }
1593     if (type >= SVt_PVMG) {
1594         if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1595             HV * const ost = SvOURSTASH(sv);
1596             if (ost)
1597                 do_hv_dump(level, file, "  OURSTASH", ost);
1598         } else {
1599             if (SvMAGIC(sv))
1600                 do_magic_dump(level, file, SvMAGIC(sv), nest, maxnest, dumpops, pvlim);
1601         }
1602         if (SvSTASH(sv))
1603             do_hv_dump(level, file, "  STASH", SvSTASH(sv));
1604     }
1605     switch (type) {
1606     case SVt_PVAV:
1607         Perl_dump_indent(aTHX_ level, file, "  ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1608         if (AvARRAY(sv) != AvALLOC(sv)) {
1609             PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1610             Perl_dump_indent(aTHX_ level, file, "  ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1611         }
1612         else
1613             PerlIO_putc(file, '\n');
1614         Perl_dump_indent(aTHX_ level, file, "  FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1615         Perl_dump_indent(aTHX_ level, file, "  MAX = %"IVdf"\n", (IV)AvMAX(sv));
1616         Perl_dump_indent(aTHX_ level, file, "  ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1617         sv_setpvn(d, "", 0);
1618         if (AvREAL(sv)) sv_catpv(d, ",REAL");
1619         if (AvREIFY(sv))        sv_catpv(d, ",REIFY");
1620         Perl_dump_indent(aTHX_ level, file, "  FLAGS = (%s)\n",
1621                          SvCUR(d) ? SvPVX_const(d) + 1 : "");
1622         if (nest < maxnest && av_len((AV*)sv) >= 0) {
1623             int count;
1624             for (count = 0; count <=  av_len((AV*)sv) && count < maxnest; count++) {
1625                 SV** const elt = av_fetch((AV*)sv,count,0);
1626
1627                 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1628                 if (elt)
1629                     do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1630             }
1631         }
1632         break;
1633     case SVt_PVHV:
1634         Perl_dump_indent(aTHX_ level, file, "  ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1635         if (HvARRAY(sv) && HvKEYS(sv)) {
1636             /* Show distribution of HEs in the ARRAY */
1637             int freq[200];
1638 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1639             int i;
1640             int max = 0;
1641             U32 pow2 = 2, keys = HvKEYS(sv);
1642             NV theoret, sum = 0;
1643
1644             PerlIO_printf(file, "  (");
1645             Zero(freq, FREQ_MAX + 1, int);
1646             for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1647                 HE* h;
1648                 int count = 0;
1649                 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1650                     count++;
1651                 if (count > FREQ_MAX)
1652                     count = FREQ_MAX;
1653                 freq[count]++;
1654                 if (max < count)
1655                     max = count;
1656             }
1657             for (i = 0; i <= max; i++) {
1658                 if (freq[i]) {
1659                     PerlIO_printf(file, "%d%s:%d", i,
1660                                   (i == FREQ_MAX) ? "+" : "",
1661                                   freq[i]);
1662                     if (i != max)
1663                         PerlIO_printf(file, ", ");
1664                 }
1665             }
1666             PerlIO_putc(file, ')');
1667             /* The "quality" of a hash is defined as the total number of
1668                comparisons needed to access every element once, relative
1669                to the expected number needed for a random hash.
1670
1671                The total number of comparisons is equal to the sum of
1672                the squares of the number of entries in each bucket.
1673                For a random hash of n keys into k buckets, the expected
1674                value is
1675                                 n + n(n-1)/2k
1676             */
1677
1678             for (i = max; i > 0; i--) { /* Precision: count down. */
1679                 sum += freq[i] * i * i;
1680             }
1681             while ((keys = keys >> 1))
1682                 pow2 = pow2 << 1;
1683             theoret = HvKEYS(sv);
1684             theoret += theoret * (theoret-1)/pow2;
1685             PerlIO_putc(file, '\n');
1686             Perl_dump_indent(aTHX_ level, file, "  hash quality = %.1"NVff"%%", theoret/sum*100);
1687         }
1688         PerlIO_putc(file, '\n');
1689         Perl_dump_indent(aTHX_ level, file, "  KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
1690         Perl_dump_indent(aTHX_ level, file, "  FILL = %"IVdf"\n", (IV)HvFILL(sv));
1691         Perl_dump_indent(aTHX_ level, file, "  MAX = %"IVdf"\n", (IV)HvMAX(sv));
1692         Perl_dump_indent(aTHX_ level, file, "  RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1693         Perl_dump_indent(aTHX_ level, file, "  EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1694         {
1695             MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1696             if (mg && mg->mg_obj) {
1697                 Perl_dump_indent(aTHX_ level, file, "  PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1698             }
1699         }
1700         {
1701             const char * const hvname = HvNAME_get(sv);
1702             if (hvname)
1703                 Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n", hvname);
1704         }
1705         if (SvOOK(sv)) {
1706             const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv);
1707             if (backrefs) {
1708                 Perl_dump_indent(aTHX_ level, file, "  BACKREFS = 0x%"UVxf"\n",
1709                                  PTR2UV(backrefs));
1710                 do_sv_dump(level+1, file, (SV*)backrefs, nest+1, maxnest,
1711                            dumpops, pvlim);
1712             }
1713         }
1714         if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
1715             HE *he;
1716             HV * const hv = (HV*)sv;
1717             int count = maxnest - nest;
1718
1719             hv_iterinit(hv);
1720             while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
1721                    && count--) {
1722                 STRLEN len;
1723                 const U32 hash = HeHASH(he);
1724                 SV * const keysv = hv_iterkeysv(he);
1725                 const char * const keypv = SvPV_const(keysv, len);
1726                 SV * const elt = hv_iterval(hv, he);
1727
1728                 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1729                 if (SvUTF8(keysv))
1730                     PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1731                 if (HeKREHASH(he))
1732                     PerlIO_printf(file, "[REHASH] ");
1733                 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash);
1734                 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1735             }
1736             hv_iterinit(hv);            /* Return to status quo */
1737         }
1738         break;
1739     case SVt_PVCV:
1740         if (SvPOK(sv)) {
1741             STRLEN len;
1742             const char *const proto =  SvPV_const(sv, len);
1743             Perl_dump_indent(aTHX_ level, file, "  PROTOTYPE = \"%.*s\"\n",
1744                              (int) len, proto);
1745         }
1746         /* FALL THROUGH */
1747     case SVt_PVFM:
1748         do_hv_dump(level, file, "  COMP_STASH", CvSTASH(sv));
1749         if (!CvISXSUB(sv)) {
1750             if (CvSTART(sv)) {
1751                 Perl_dump_indent(aTHX_ level, file,
1752                                  "  START = 0x%"UVxf" ===> %"IVdf"\n",
1753                                  PTR2UV(CvSTART(sv)),
1754                                  (IV)sequence_num(CvSTART(sv)));
1755             }
1756             Perl_dump_indent(aTHX_ level, file, "  ROOT = 0x%"UVxf"\n",
1757                              PTR2UV(CvROOT(sv)));
1758             if (CvROOT(sv) && dumpops) {
1759                 do_op_dump(level+1, file, CvROOT(sv));
1760             }
1761         } else {
1762             SV * const constant = cv_const_sv((CV *)sv);
1763
1764             Perl_dump_indent(aTHX_ level, file, "  XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1765
1766             if (constant) {
1767                 Perl_dump_indent(aTHX_ level, file, "  XSUBANY = 0x%"UVxf
1768                                  " (CONST SV)\n",
1769                                  PTR2UV(CvXSUBANY(sv).any_ptr));
1770                 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1771                            pvlim);
1772             } else {
1773                 Perl_dump_indent(aTHX_ level, file, "  XSUBANY = %"IVdf"\n",
1774                                  (IV)CvXSUBANY(sv).any_i32);
1775             }
1776         }
1777         do_gvgv_dump(level, file, "  GVGV::GV", CvGV(sv));
1778         Perl_dump_indent(aTHX_ level, file, "  FILE = \"%s\"\n", CvFILE(sv));
1779         Perl_dump_indent(aTHX_ level, file, "  DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1780         Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1781         Perl_dump_indent(aTHX_ level, file, "  OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1782         if (type == SVt_PVFM)
1783             Perl_dump_indent(aTHX_ level, file, "  LINES = %"IVdf"\n", (IV)FmLINES(sv));
1784         Perl_dump_indent(aTHX_ level, file, "  PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1785         if (nest < maxnest) {
1786             do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1787         }
1788         {
1789             const CV * const outside = CvOUTSIDE(sv);
1790             Perl_dump_indent(aTHX_ level, file, "  OUTSIDE = 0x%"UVxf" (%s)\n",
1791                         PTR2UV(outside),
1792                         (!outside ? "null"
1793                          : CvANON(outside) ? "ANON"
1794                          : (outside == PL_main_cv) ? "MAIN"
1795                          : CvUNIQUE(outside) ? "UNIQUE"
1796                          : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1797         }
1798         if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1799             do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim);
1800         break;
1801     case SVt_PVGV:
1802     case SVt_PVLV:
1803         if (type == SVt_PVLV) {
1804             Perl_dump_indent(aTHX_ level, file, "  TYPE = %c\n", LvTYPE(sv));
1805             Perl_dump_indent(aTHX_ level, file, "  TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1806             Perl_dump_indent(aTHX_ level, file, "  TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1807             Perl_dump_indent(aTHX_ level, file, "  TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1808             if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1809                 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1810                     dumpops, pvlim);
1811         }
1812         if (SvVALID(sv)) {
1813             Perl_dump_indent(aTHX_ level, file, "  FLAGS = %u\n", (U8)BmFLAGS(sv));
1814             Perl_dump_indent(aTHX_ level, file, "  RARE = %u\n", (U8)BmRARE(sv));
1815             Perl_dump_indent(aTHX_ level, file, "  PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1816             Perl_dump_indent(aTHX_ level, file, "  USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1817         }
1818         if (!isGV_with_GP(sv))
1819             break;
1820         Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n", GvNAME(sv));
1821         Perl_dump_indent(aTHX_ level, file, "  NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1822         do_hv_dump (level, file, "  GvSTASH", GvSTASH(sv));
1823         Perl_dump_indent(aTHX_ level, file, "  GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1824         if (!GvGP(sv))
1825             break;
1826         Perl_dump_indent(aTHX_ level, file, "    SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1827         Perl_dump_indent(aTHX_ level, file, "    REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1828         Perl_dump_indent(aTHX_ level, file, "    IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1829         Perl_dump_indent(aTHX_ level, file, "    FORM = 0x%"UVxf"  \n", PTR2UV(GvFORM(sv)));
1830         Perl_dump_indent(aTHX_ level, file, "    AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1831         Perl_dump_indent(aTHX_ level, file, "    HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1832         Perl_dump_indent(aTHX_ level, file, "    CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1833         Perl_dump_indent(aTHX_ level, file, "    CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1834         Perl_dump_indent(aTHX_ level, file, "    LINE = %"IVdf"\n", (IV)GvLINE(sv));
1835         Perl_dump_indent(aTHX_ level, file, "    FILE = \"%s\"\n", GvFILE(sv));
1836         Perl_dump_indent(aTHX_ level, file, "    FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1837         do_gv_dump (level, file, "    EGV", GvEGV(sv));
1838         break;
1839     case SVt_PVIO:
1840         Perl_dump_indent(aTHX_ level, file, "  IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1841         Perl_dump_indent(aTHX_ level, file, "  OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1842         Perl_dump_indent(aTHX_ level, file, "  DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1843         Perl_dump_indent(aTHX_ level, file, "  LINES = %"IVdf"\n", (IV)IoLINES(sv));
1844         Perl_dump_indent(aTHX_ level, file, "  PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1845         Perl_dump_indent(aTHX_ level, file, "  PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1846         Perl_dump_indent(aTHX_ level, file, "  LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1847         if (IoTOP_NAME(sv))
1848             Perl_dump_indent(aTHX_ level, file, "  TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1849         if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1850             do_gv_dump (level, file, "  TOP_GV", IoTOP_GV(sv));
1851         else {
1852             Perl_dump_indent(aTHX_ level, file, "  TOP_GV = 0x%"UVxf"\n",
1853                              PTR2UV(IoTOP_GV(sv)));
1854             do_sv_dump (level+1, file, (SV *) IoTOP_GV(sv), nest+1, maxnest,
1855                         dumpops, pvlim);
1856         }
1857         /* Source filters hide things that are not GVs in these three, so let's
1858            be careful out there.  */
1859         if (IoFMT_NAME(sv))
1860             Perl_dump_indent(aTHX_ level, file, "  FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
1861         if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
1862             do_gv_dump (level, file, "  FMT_GV", IoFMT_GV(sv));
1863         else {
1864             Perl_dump_indent(aTHX_ level, file, "  FMT_GV = 0x%"UVxf"\n",
1865                              PTR2UV(IoFMT_GV(sv)));
1866             do_sv_dump (level+1, file, (SV *) IoFMT_GV(sv), nest+1, maxnest,
1867                         dumpops, pvlim);
1868         }
1869         if (IoBOTTOM_NAME(sv))
1870             Perl_dump_indent(aTHX_ level, file, "  BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
1871         if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
1872             do_gv_dump (level, file, "  BOTTOM_GV", IoBOTTOM_GV(sv));
1873         else {
1874             Perl_dump_indent(aTHX_ level, file, "  BOTTOM_GV = 0x%"UVxf"\n",
1875                              PTR2UV(IoBOTTOM_GV(sv)));
1876             do_sv_dump (level+1, file, (SV *) IoBOTTOM_GV(sv), nest+1, maxnest,
1877                         dumpops, pvlim);
1878         }
1879         if (isPRINT(IoTYPE(sv)))
1880             Perl_dump_indent(aTHX_ level, file, "  TYPE = '%c'\n", IoTYPE(sv));
1881         else
1882             Perl_dump_indent(aTHX_ level, file, "  TYPE = '\\%o'\n", IoTYPE(sv));
1883         Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
1884         break;
1885     }
1886     SvREFCNT_dec(d);
1887 }
1888
1889 void
1890 Perl_sv_dump(pTHX_ SV *sv)
1891 {
1892     dVAR;
1893     if (SvROK(sv))
1894         do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
1895     else
1896         do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
1897 }
1898
1899 int
1900 Perl_runops_debug(pTHX)
1901 {
1902     dVAR;
1903     if (!PL_op) {
1904         if (ckWARN_d(WARN_DEBUGGING))
1905             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
1906         return 0;
1907     }
1908
1909     DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
1910     do {
1911         PERL_ASYNC_CHECK();
1912         if (PL_debug) {
1913             if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
1914                 PerlIO_printf(Perl_debug_log,
1915                               "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
1916                               PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
1917                               PTR2UV(*PL_watchaddr));
1918             if (DEBUG_s_TEST_) {
1919                 if (DEBUG_v_TEST_) {
1920                     PerlIO_printf(Perl_debug_log, "\n");
1921                     deb_stack_all();
1922                 }
1923                 else
1924                     debstack();
1925             }
1926
1927
1928             if (DEBUG_t_TEST_) debop(PL_op);
1929             if (DEBUG_P_TEST_) debprof(PL_op);
1930         }
1931     } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX)));
1932     DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
1933
1934     TAINT_NOT;
1935     return 0;
1936 }
1937
1938 I32
1939 Perl_debop(pTHX_ const OP *o)
1940 {
1941     dVAR;
1942     if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
1943         return 0;
1944
1945     Perl_deb(aTHX_ "%s", OP_NAME(o));
1946     switch (o->op_type) {
1947     case OP_CONST:
1948         PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
1949         break;
1950     case OP_GVSV:
1951     case OP_GV:
1952         if (cGVOPo_gv) {
1953             SV * const sv = newSV(0);
1954 #ifdef PERL_MAD
1955             /* FIXME - is this making unwarranted assumptions about the
1956                UTF-8 cleanliness of the dump file handle?  */
1957             SvUTF8_on(sv);
1958 #endif
1959             gv_fullname3(sv, cGVOPo_gv, NULL);
1960             PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
1961             SvREFCNT_dec(sv);
1962         }
1963         else
1964             PerlIO_printf(Perl_debug_log, "(NULL)");
1965         break;
1966     case OP_PADSV:
1967     case OP_PADAV:
1968     case OP_PADHV:
1969         {
1970         /* print the lexical's name */
1971         CV * const cv = deb_curcv(cxstack_ix);
1972         SV *sv;
1973         if (cv) {
1974             AV * const padlist = CvPADLIST(cv);
1975             AV * const comppad = (AV*)(*av_fetch(padlist, 0, FALSE));
1976             sv = *av_fetch(comppad, o->op_targ, FALSE);
1977         } else
1978             sv = NULL;
1979         if (sv)
1980             PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
1981         else
1982             PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
1983         }
1984         break;
1985     default:
1986         break;
1987     }
1988     PerlIO_printf(Perl_debug_log, "\n");
1989     return 0;
1990 }
1991
1992 STATIC CV*
1993 S_deb_curcv(pTHX_ const I32 ix)
1994 {
1995     dVAR;
1996     const PERL_CONTEXT * const cx = &cxstack[ix];
1997     if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
1998         return cx->blk_sub.cv;
1999     else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2000         return PL_compcv;
2001     else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2002         return PL_main_cv;
2003     else if (ix <= 0)
2004         return NULL;
2005     else
2006         return deb_curcv(ix - 1);
2007 }
2008
2009 void
2010 Perl_watch(pTHX_ char **addr)
2011 {
2012     dVAR;
2013     PL_watchaddr = addr;
2014     PL_watchok = *addr;
2015     PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2016         PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2017 }
2018
2019 STATIC void
2020 S_debprof(pTHX_ const OP *o)
2021 {
2022     dVAR;
2023     if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2024         return;
2025     if (!PL_profiledata)
2026         Newxz(PL_profiledata, MAXO, U32);
2027     ++PL_profiledata[o->op_type];
2028 }
2029
2030 void
2031 Perl_debprofdump(pTHX)
2032 {
2033     dVAR;
2034     unsigned i;
2035     if (!PL_profiledata)
2036         return;
2037     for (i = 0; i < MAXO; i++) {
2038         if (PL_profiledata[i])
2039             PerlIO_printf(Perl_debug_log,
2040                           "%5lu %s\n", (unsigned long)PL_profiledata[i],
2041                                        PL_op_name[i]);
2042     }
2043 }
2044
2045 #ifdef PERL_MAD
2046 /*
2047  *    XML variants of most of the above routines
2048  */
2049
2050 STATIC void
2051 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2052 {
2053     va_list args;
2054     PerlIO_printf(file, "\n    ");
2055     va_start(args, pat);
2056     xmldump_vindent(level, file, pat, &args);
2057     va_end(args);
2058 }
2059
2060
2061 void
2062 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2063 {
2064     va_list args;
2065     va_start(args, pat);
2066     xmldump_vindent(level, file, pat, &args);
2067     va_end(args);
2068 }
2069
2070 void
2071 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2072 {
2073     PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2074     PerlIO_vprintf(file, pat, *args);
2075 }
2076
2077 void
2078 Perl_xmldump_all(pTHX)
2079 {
2080     PerlIO_setlinebuf(PL_xmlfp);
2081     if (PL_main_root)
2082         op_xmldump(PL_main_root);
2083     if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2084         PerlIO_close(PL_xmlfp);
2085     PL_xmlfp = 0;
2086 }
2087
2088 void
2089 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2090 {
2091     I32 i;
2092     HE  *entry;
2093
2094     if (!HvARRAY(stash))
2095         return;
2096     for (i = 0; i <= (I32) HvMAX(stash); i++) {
2097         for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2098             GV *gv = (GV*)HeVAL(entry);
2099             HV *hv;
2100             if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2101                 continue;
2102             if (GvCVu(gv))
2103                 xmldump_sub(gv);
2104             if (GvFORM(gv))
2105                 xmldump_form(gv);
2106             if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2107                 && (hv = GvHV(gv)) && hv != PL_defstash)
2108                 xmldump_packsubs(hv);           /* nested package */
2109         }
2110     }
2111 }
2112
2113 void
2114 Perl_xmldump_sub(pTHX_ const GV *gv)
2115 {
2116     SV * const sv = sv_newmortal();
2117
2118     gv_fullname3(sv, gv, NULL);
2119     Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2120     if (CvXSUB(GvCV(gv)))
2121         Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2122             PTR2UV(CvXSUB(GvCV(gv))),
2123             (int)CvXSUBANY(GvCV(gv)).any_i32);
2124     else if (CvROOT(GvCV(gv)))
2125         op_xmldump(CvROOT(GvCV(gv)));
2126     else
2127         Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2128 }
2129
2130 void
2131 Perl_xmldump_form(pTHX_ const GV *gv)
2132 {
2133     SV * const sv = sv_newmortal();
2134
2135     gv_fullname3(sv, gv, NULL);
2136     Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2137     if (CvROOT(GvFORM(gv)))
2138         op_xmldump(CvROOT(GvFORM(gv)));
2139     else
2140         Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2141 }
2142
2143 void
2144 Perl_xmldump_eval(pTHX)
2145 {
2146     op_xmldump(PL_eval_root);
2147 }
2148
2149 char *
2150 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2151 {
2152     return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2153 }
2154
2155 char *
2156 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2157 {
2158     unsigned int c;
2159     const char * const e = pv + len;
2160     const char * const start = pv;
2161     STRLEN dsvcur;
2162     STRLEN cl;
2163
2164     sv_catpvn(dsv,"",0);
2165     dsvcur = SvCUR(dsv);        /* in case we have to restart */
2166
2167   retry:
2168     while (pv < e) {
2169         if (utf8) {
2170             c = utf8_to_uvchr((U8*)pv, &cl);
2171             if (cl == 0) {
2172                 SvCUR(dsv) = dsvcur;
2173                 pv = start;
2174                 utf8 = 0;
2175                 goto retry;
2176             }
2177         }
2178         else
2179             c = (*pv & 255);
2180
2181         switch (c) {
2182         case 0x00:
2183         case 0x01:
2184         case 0x02:
2185         case 0x03:
2186         case 0x04:
2187         case 0x05:
2188         case 0x06:
2189         case 0x07:
2190         case 0x08:
2191         case 0x0b:
2192         case 0x0c:
2193         case 0x0e:
2194         case 0x0f:
2195         case 0x10:
2196         case 0x11:
2197         case 0x12:
2198         case 0x13:
2199         case 0x14:
2200         case 0x15:
2201         case 0x16:
2202         case 0x17:
2203         case 0x18:
2204         case 0x19:
2205         case 0x1a:
2206         case 0x1b:
2207         case 0x1c:
2208         case 0x1d:
2209         case 0x1e:
2210         case 0x1f:
2211         case 0x7f:
2212         case 0x80:
2213         case 0x81:
2214         case 0x82:
2215         case 0x83:
2216         case 0x84:
2217         case 0x86:
2218         case 0x87:
2219         case 0x88:
2220         case 0x89:
2221         case 0x90:
2222         case 0x91:
2223         case 0x92:
2224         case 0x93:
2225         case 0x94:
2226         case 0x95:
2227         case 0x96:
2228         case 0x97:
2229         case 0x98:
2230         case 0x99:
2231         case 0x9a:
2232         case 0x9b:
2233         case 0x9c:
2234         case 0x9d:
2235         case 0x9e:
2236         case 0x9f:
2237             Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2238             break;
2239         case '<':
2240             sv_catpvs(dsv, "&lt;");
2241             break;
2242         case '>':
2243             sv_catpvs(dsv, "&gt;");
2244             break;
2245         case '&':
2246             sv_catpvs(dsv, "&amp;");
2247             break;
2248         case '"':
2249             sv_catpvs(dsv, "&#34;");
2250             break;
2251         default:
2252             if (c < 0xD800) {
2253                 if (c < 32 || c > 127) {
2254                     Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2255                 }
2256                 else {
2257                     const char string = (char) c;
2258                     sv_catpvn(dsv, &string, 1);
2259                 }
2260                 break;
2261             }
2262             if ((c >= 0xD800 && c <= 0xDB7F) ||
2263                 (c >= 0xDC00 && c <= 0xDFFF) ||
2264                 (c >= 0xFFF0 && c <= 0xFFFF) ||
2265                  c > 0x10ffff)
2266                 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2267             else
2268                 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2269         }
2270
2271         if (utf8)
2272             pv += UTF8SKIP(pv);
2273         else
2274             pv++;
2275     }
2276
2277     return SvPVX(dsv);
2278 }
2279
2280 char *
2281 Perl_sv_xmlpeek(pTHX_ SV *sv)
2282 {
2283     SV * const t = sv_newmortal();
2284     STRLEN n_a;
2285     int unref = 0;
2286
2287     sv_utf8_upgrade(t);
2288     sv_setpvn(t, "", 0);
2289     /* retry: */
2290     if (!sv) {
2291         sv_catpv(t, "VOID=\"\"");
2292         goto finish;
2293     }
2294     else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
2295         sv_catpv(t, "WILD=\"\"");
2296         goto finish;
2297     }
2298     else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2299         if (sv == &PL_sv_undef) {
2300             sv_catpv(t, "SV_UNDEF=\"1\"");
2301             if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2302                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
2303                 SvREADONLY(sv))
2304                 goto finish;
2305         }
2306         else if (sv == &PL_sv_no) {
2307             sv_catpv(t, "SV_NO=\"1\"");
2308             if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2309                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
2310                 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2311                                   SVp_POK|SVp_NOK)) &&
2312                 SvCUR(sv) == 0 &&
2313                 SvNVX(sv) == 0.0)
2314                 goto finish;
2315         }
2316         else if (sv == &PL_sv_yes) {
2317             sv_catpv(t, "SV_YES=\"1\"");
2318             if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2319                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
2320                 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2321                                   SVp_POK|SVp_NOK)) &&
2322                 SvCUR(sv) == 1 &&
2323                 SvPVX(sv) && *SvPVX(sv) == '1' &&
2324                 SvNVX(sv) == 1.0)
2325                 goto finish;
2326         }
2327         else {
2328             sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2329             if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2330                                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
2331                 SvREADONLY(sv))
2332                 goto finish;
2333         }
2334         sv_catpv(t, " XXX=\"\" ");
2335     }
2336     else if (SvREFCNT(sv) == 0) {
2337         sv_catpv(t, " refcnt=\"0\"");
2338         unref++;
2339     }
2340     else if (DEBUG_R_TEST_) {
2341         int is_tmp = 0;
2342         I32 ix;
2343         /* is this SV on the tmps stack? */
2344         for (ix=PL_tmps_ix; ix>=0; ix--) {
2345             if (PL_tmps_stack[ix] == sv) {
2346                 is_tmp = 1;
2347                 break;
2348             }
2349         }
2350         if (SvREFCNT(sv) > 1)
2351             Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2352                     is_tmp ? "T" : "");
2353         else if (is_tmp)
2354             sv_catpv(t, " DRT=\"<T>\"");
2355     }
2356
2357     if (SvROK(sv)) {
2358         sv_catpv(t, " ROK=\"\"");
2359     }
2360     switch (SvTYPE(sv)) {
2361     default:
2362         sv_catpv(t, " FREED=\"1\"");
2363         goto finish;
2364
2365     case SVt_NULL:
2366         sv_catpv(t, " UNDEF=\"1\"");
2367         goto finish;
2368     case SVt_IV:
2369         sv_catpv(t, " IV=\"");
2370         break;
2371     case SVt_NV:
2372         sv_catpv(t, " NV=\"");
2373         break;
2374     case SVt_RV:
2375         sv_catpv(t, " RV=\"");
2376         break;
2377     case SVt_PV:
2378         sv_catpv(t, " PV=\"");
2379         break;
2380     case SVt_PVIV:
2381         sv_catpv(t, " PVIV=\"");
2382         break;
2383     case SVt_PVNV:
2384         sv_catpv(t, " PVNV=\"");
2385         break;
2386     case SVt_PVMG:
2387         sv_catpv(t, " PVMG=\"");
2388         break;
2389     case SVt_PVLV:
2390         sv_catpv(t, " PVLV=\"");
2391         break;
2392     case SVt_PVAV:
2393         sv_catpv(t, " AV=\"");
2394         break;
2395     case SVt_PVHV:
2396         sv_catpv(t, " HV=\"");
2397         break;
2398     case SVt_PVCV:
2399         if (CvGV(sv))
2400             Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2401         else
2402             sv_catpv(t, " CV=\"()\"");
2403         goto finish;
2404     case SVt_PVGV:
2405         sv_catpv(t, " GV=\"");
2406         break;
2407     case SVt_BIND:
2408         sv_catpv(t, " BIND=\"");
2409         break;
2410     case SVt_PVFM:
2411         sv_catpv(t, " FM=\"");
2412         break;
2413     case SVt_PVIO:
2414         sv_catpv(t, " IO=\"");
2415         break;
2416     }
2417
2418     if (SvPOKp(sv)) {
2419         if (SvPVX(sv)) {
2420             sv_catxmlsv(t, sv);
2421         }
2422     }
2423     else if (SvNOKp(sv)) {
2424         STORE_NUMERIC_LOCAL_SET_STANDARD();
2425         Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2426         RESTORE_NUMERIC_LOCAL();
2427     }
2428     else if (SvIOKp(sv)) {
2429         if (SvIsUV(sv))
2430             Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2431         else
2432             Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2433     }
2434     else
2435         sv_catpv(t, "");
2436     sv_catpv(t, "\"");
2437
2438   finish:
2439     while (unref--)
2440         sv_catpv(t, ")");
2441     return SvPV(t, n_a);
2442 }
2443
2444 void
2445 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2446 {
2447     if (!pm) {
2448         Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2449         return;
2450     }
2451     Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2452     level++;
2453     if (PM_GETRE(pm)) {
2454         const regexp *const r = PM_GETRE(pm);
2455         SV * const tmpsv = newSVpvn(r->precomp,r->prelen);
2456         SvUTF8_on(tmpsv);
2457         Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2458              SvPVX(tmpsv));
2459         SvREFCNT_dec(tmpsv);
2460         Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2461              (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2462     }
2463     else
2464         Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2465     if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) {
2466         SV * const tmpsv = pm_description(pm);
2467         Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2468         SvREFCNT_dec(tmpsv);
2469     }
2470
2471     level--;
2472     if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2473         Perl_xmldump_indent(aTHX_ level, file, ">\n");
2474         Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2475         do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2476         Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2477         Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2478     }
2479     else
2480         Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2481 }
2482
2483 void
2484 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2485 {
2486     do_pmop_xmldump(0, PL_xmlfp, pm);
2487 }
2488
2489 void
2490 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2491 {
2492     UV      seq;
2493     int     contents = 0;
2494     if (!o)
2495         return;
2496     sequence(o);
2497     seq = sequence_num(o);
2498     Perl_xmldump_indent(aTHX_ level, file,
2499         "<op_%s seq=\"%"UVuf" -> ",
2500              OP_NAME(o),
2501                       seq);
2502     level++;
2503     if (o->op_next)
2504         PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2505                       sequence_num(o->op_next));
2506     else
2507         PerlIO_printf(file, "DONE\"");
2508
2509     if (o->op_targ) {
2510         if (o->op_type == OP_NULL)
2511         {
2512             PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2513             if (o->op_targ == OP_NEXTSTATE)
2514             {
2515                 if (CopLINE(cCOPo))
2516                     PerlIO_printf(file, " line=\"%"UVuf"\"",
2517                                      (UV)CopLINE(cCOPo));
2518                 if (CopSTASHPV(cCOPo))
2519                     PerlIO_printf(file, " package=\"%s\"",
2520                                      CopSTASHPV(cCOPo));
2521                 if (cCOPo->cop_label)
2522                     PerlIO_printf(file, " label=\"%s\"",
2523                                      cCOPo->cop_label);
2524             }
2525         }
2526         else
2527             PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2528     }
2529 #ifdef DUMPADDR
2530     PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2531 #endif
2532     if (o->op_flags) {
2533         SV * const tmpsv = newSVpvn("", 0);
2534         switch (o->op_flags & OPf_WANT) {
2535         case OPf_WANT_VOID:
2536             sv_catpv(tmpsv, ",VOID");
2537             break;
2538         case OPf_WANT_SCALAR:
2539             sv_catpv(tmpsv, ",SCALAR");
2540             break;
2541         case OPf_WANT_LIST:
2542             sv_catpv(tmpsv, ",LIST");
2543             break;
2544         default:
2545             sv_catpv(tmpsv, ",UNKNOWN");
2546             break;
2547         }
2548         if (o->op_flags & OPf_KIDS)
2549             sv_catpv(tmpsv, ",KIDS");
2550         if (o->op_flags & OPf_PARENS)
2551             sv_catpv(tmpsv, ",PARENS");
2552         if (o->op_flags & OPf_STACKED)
2553             sv_catpv(tmpsv, ",STACKED");
2554         if (o->op_flags & OPf_REF)
2555             sv_catpv(tmpsv, ",REF");
2556         if (o->op_flags & OPf_MOD)
2557             sv_catpv(tmpsv, ",MOD");
2558         if (o->op_flags & OPf_SPECIAL)
2559             sv_catpv(tmpsv, ",SPECIAL");
2560         PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2561         SvREFCNT_dec(tmpsv);
2562     }
2563     if (o->op_private) {
2564         SV * const tmpsv = newSVpvn("", 0);
2565         if (PL_opargs[o->op_type] & OA_TARGLEX) {
2566             if (o->op_private & OPpTARGET_MY)
2567                 sv_catpv(tmpsv, ",TARGET_MY");
2568         }
2569         else if (o->op_type == OP_LEAVESUB ||
2570                  o->op_type == OP_LEAVE ||
2571                  o->op_type == OP_LEAVESUBLV ||
2572                  o->op_type == OP_LEAVEWRITE) {
2573             if (o->op_private & OPpREFCOUNTED)
2574                 sv_catpv(tmpsv, ",REFCOUNTED");
2575         }
2576         else if (o->op_type == OP_AASSIGN) {
2577             if (o->op_private & OPpASSIGN_COMMON)
2578                 sv_catpv(tmpsv, ",COMMON");
2579         }
2580         else if (o->op_type == OP_SASSIGN) {
2581             if (o->op_private & OPpASSIGN_BACKWARDS)
2582                 sv_catpv(tmpsv, ",BACKWARDS");
2583         }
2584         else if (o->op_type == OP_TRANS) {
2585             if (o->op_private & OPpTRANS_SQUASH)
2586                 sv_catpv(tmpsv, ",SQUASH");
2587             if (o->op_private & OPpTRANS_DELETE)
2588                 sv_catpv(tmpsv, ",DELETE");
2589             if (o->op_private & OPpTRANS_COMPLEMENT)
2590                 sv_catpv(tmpsv, ",COMPLEMENT");
2591             if (o->op_private & OPpTRANS_IDENTICAL)
2592                 sv_catpv(tmpsv, ",IDENTICAL");
2593             if (o->op_private & OPpTRANS_GROWS)
2594                 sv_catpv(tmpsv, ",GROWS");
2595         }
2596         else if (o->op_type == OP_REPEAT) {
2597             if (o->op_private & OPpREPEAT_DOLIST)
2598                 sv_catpv(tmpsv, ",DOLIST");
2599         }
2600         else if (o->op_type == OP_ENTERSUB ||
2601                  o->op_type == OP_RV2SV ||
2602                  o->op_type == OP_GVSV ||
2603                  o->op_type == OP_RV2AV ||
2604                  o->op_type == OP_RV2HV ||
2605                  o->op_type == OP_RV2GV ||
2606                  o->op_type == OP_AELEM ||
2607                  o->op_type == OP_HELEM )
2608         {
2609             if (o->op_type == OP_ENTERSUB) {
2610                 if (o->op_private & OPpENTERSUB_AMPER)
2611                     sv_catpv(tmpsv, ",AMPER");
2612                 if (o->op_private & OPpENTERSUB_DB)
2613                     sv_catpv(tmpsv, ",DB");
2614                 if (o->op_private & OPpENTERSUB_HASTARG)
2615                     sv_catpv(tmpsv, ",HASTARG");
2616                 if (o->op_private & OPpENTERSUB_NOPAREN)
2617                     sv_catpv(tmpsv, ",NOPAREN");
2618                 if (o->op_private & OPpENTERSUB_INARGS)
2619                     sv_catpv(tmpsv, ",INARGS");
2620                 if (o->op_private & OPpENTERSUB_NOMOD)
2621                     sv_catpv(tmpsv, ",NOMOD");
2622             }
2623             else {
2624                 switch (o->op_private & OPpDEREF) {
2625             case OPpDEREF_SV:
2626                 sv_catpv(tmpsv, ",SV");
2627                 break;
2628             case OPpDEREF_AV:
2629                 sv_catpv(tmpsv, ",AV");
2630                 break;
2631             case OPpDEREF_HV:
2632                 sv_catpv(tmpsv, ",HV");
2633                 break;
2634             }
2635                 if (o->op_private & OPpMAYBE_LVSUB)
2636                     sv_catpv(tmpsv, ",MAYBE_LVSUB");
2637             }
2638             if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2639                 if (o->op_private & OPpLVAL_DEFER)
2640                     sv_catpv(tmpsv, ",LVAL_DEFER");
2641             }
2642             else {
2643                 if (o->op_private & HINT_STRICT_REFS)
2644                     sv_catpv(tmpsv, ",STRICT_REFS");
2645                 if (o->op_private & OPpOUR_INTRO)
2646                     sv_catpv(tmpsv, ",OUR_INTRO");
2647             }
2648         }
2649         else if (o->op_type == OP_CONST) {
2650             if (o->op_private & OPpCONST_BARE)
2651                 sv_catpv(tmpsv, ",BARE");
2652             if (o->op_private & OPpCONST_STRICT)
2653                 sv_catpv(tmpsv, ",STRICT");
2654             if (o->op_private & OPpCONST_ARYBASE)
2655                 sv_catpv(tmpsv, ",ARYBASE");
2656             if (o->op_private & OPpCONST_WARNING)
2657                 sv_catpv(tmpsv, ",WARNING");
2658             if (o->op_private & OPpCONST_ENTERED)
2659                 sv_catpv(tmpsv, ",ENTERED");
2660         }
2661         else if (o->op_type == OP_FLIP) {
2662             if (o->op_private & OPpFLIP_LINENUM)
2663                 sv_catpv(tmpsv, ",LINENUM");
2664         }
2665         else if (o->op_type == OP_FLOP) {
2666             if (o->op_private & OPpFLIP_LINENUM)
2667                 sv_catpv(tmpsv, ",LINENUM");
2668         }
2669         else if (o->op_type == OP_RV2CV) {
2670             if (o->op_private & OPpLVAL_INTRO)
2671                 sv_catpv(tmpsv, ",INTRO");
2672         }
2673         else if (o->op_type == OP_GV) {
2674             if (o->op_private & OPpEARLY_CV)
2675                 sv_catpv(tmpsv, ",EARLY_CV");
2676         }
2677         else if (o->op_type == OP_LIST) {
2678             if (o->op_private & OPpLIST_GUESSED)
2679                 sv_catpv(tmpsv, ",GUESSED");
2680         }
2681         else if (o->op_type == OP_DELETE) {
2682             if (o->op_private & OPpSLICE)
2683                 sv_catpv(tmpsv, ",SLICE");
2684         }
2685         else if (o->op_type == OP_EXISTS) {
2686             if (o->op_private & OPpEXISTS_SUB)
2687                 sv_catpv(tmpsv, ",EXISTS_SUB");
2688         }
2689         else if (o->op_type == OP_SORT) {
2690             if (o->op_private & OPpSORT_NUMERIC)
2691                 sv_catpv(tmpsv, ",NUMERIC");
2692             if (o->op_private & OPpSORT_INTEGER)
2693                 sv_catpv(tmpsv, ",INTEGER");
2694             if (o->op_private & OPpSORT_REVERSE)
2695                 sv_catpv(tmpsv, ",REVERSE");
2696         }
2697         else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2698             if (o->op_private & OPpOPEN_IN_RAW)
2699                 sv_catpv(tmpsv, ",IN_RAW");
2700             if (o->op_private & OPpOPEN_IN_CRLF)
2701                 sv_catpv(tmpsv, ",IN_CRLF");
2702             if (o->op_private & OPpOPEN_OUT_RAW)
2703                 sv_catpv(tmpsv, ",OUT_RAW");
2704             if (o->op_private & OPpOPEN_OUT_CRLF)
2705                 sv_catpv(tmpsv, ",OUT_CRLF");
2706         }
2707         else if (o->op_type == OP_EXIT) {
2708             if (o->op_private & OPpEXIT_VMSISH)
2709                 sv_catpv(tmpsv, ",EXIT_VMSISH");
2710             if (o->op_private & OPpHUSH_VMSISH)
2711                 sv_catpv(tmpsv, ",HUSH_VMSISH");
2712         }
2713         else if (o->op_type == OP_DIE) {
2714             if (o->op_private & OPpHUSH_VMSISH)
2715                 sv_catpv(tmpsv, ",HUSH_VMSISH");
2716         }
2717         else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
2718             if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS)
2719                 sv_catpv(tmpsv, ",FT_ACCESS");
2720             if (o->op_private & OPpFT_STACKED)
2721                 sv_catpv(tmpsv, ",FT_STACKED");
2722         }
2723         if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2724             sv_catpv(tmpsv, ",INTRO");
2725         if (SvCUR(tmpsv))
2726             S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
2727         SvREFCNT_dec(tmpsv);
2728     }
2729
2730     switch (o->op_type) {
2731     case OP_AELEMFAST:
2732         if (o->op_flags & OPf_SPECIAL) {
2733             break;
2734         }
2735     case OP_GVSV:
2736     case OP_GV:
2737 #ifdef USE_ITHREADS
2738         S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
2739 #else
2740         if (cSVOPo->op_sv) {
2741             SV * const tmpsv1 = newSV(0);
2742             SV * const tmpsv2 = newSVpvn("",0);
2743             char *s;
2744             STRLEN len;
2745             SvUTF8_on(tmpsv1);
2746             SvUTF8_on(tmpsv2);
2747             ENTER;
2748             SAVEFREESV(tmpsv1);
2749             SAVEFREESV(tmpsv2);
2750             gv_fullname3(tmpsv1, (GV*)cSVOPo->op_sv, NULL);
2751             s = SvPV(tmpsv1,len);
2752             sv_catxmlpvn(tmpsv2, s, len, 1);
2753             S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
2754             LEAVE;
2755         }
2756         else
2757             S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
2758 #endif
2759         break;
2760     case OP_CONST:
2761     case OP_METHOD_NAMED:
2762 #ifndef USE_ITHREADS
2763         /* with ITHREADS, consts are stored in the pad, and the right pad
2764          * may not be active here, so skip */
2765         S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
2766 #endif
2767         break;
2768     case OP_ANONCODE:
2769         if (!contents) {
2770             contents = 1;
2771             PerlIO_printf(file, ">\n");
2772         }
2773         do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
2774         break;
2775     case OP_SETSTATE:
2776     case OP_NEXTSTATE:
2777     case OP_DBSTATE:
2778         if (CopLINE(cCOPo))
2779             S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
2780                              (UV)CopLINE(cCOPo));
2781         if (CopSTASHPV(cCOPo))
2782             S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
2783                              CopSTASHPV(cCOPo));
2784         if (cCOPo->cop_label)
2785             S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
2786                              cCOPo->cop_label);
2787         break;
2788     case OP_ENTERLOOP:
2789         S_xmldump_attr(aTHX_ level, file, "redo=\"");
2790         if (cLOOPo->op_redoop)
2791             PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
2792         else
2793             PerlIO_printf(file, "DONE\"");
2794         S_xmldump_attr(aTHX_ level, file, "next=\"");
2795         if (cLOOPo->op_nextop)
2796             PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
2797         else
2798             PerlIO_printf(file, "DONE\"");
2799         S_xmldump_attr(aTHX_ level, file, "last=\"");
2800         if (cLOOPo->op_lastop)
2801             PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
2802         else
2803             PerlIO_printf(file, "DONE\"");
2804         break;
2805     case OP_COND_EXPR:
2806     case OP_RANGE:
2807     case OP_MAPWHILE:
2808     case OP_GREPWHILE:
2809     case OP_OR:
2810     case OP_AND:
2811         S_xmldump_attr(aTHX_ level, file, "other=\"");
2812         if (cLOGOPo->op_other)
2813             PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
2814         else
2815             PerlIO_printf(file, "DONE\"");
2816         break;
2817     case OP_LEAVE:
2818     case OP_LEAVEEVAL:
2819     case OP_LEAVESUB:
2820     case OP_LEAVESUBLV:
2821     case OP_LEAVEWRITE:
2822     case OP_SCOPE:
2823         if (o->op_private & OPpREFCOUNTED)
2824             S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
2825         break;
2826     default:
2827         break;
2828     }
2829
2830     if (PL_madskills && o->op_madprop) {
2831         char prevkey = '\0';
2832         SV * const tmpsv = newSVpvn("", 0);
2833         const MADPROP* mp = o->op_madprop;
2834
2835         sv_utf8_upgrade(tmpsv);
2836         if (!contents) {
2837             contents = 1;
2838             PerlIO_printf(file, ">\n");
2839         }
2840         Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
2841         level++;
2842         while (mp) {
2843             char tmp = mp->mad_key;
2844             sv_setpvn(tmpsv,"\"",1);
2845             if (tmp)
2846                 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
2847             if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
2848                 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
2849             else
2850                 prevkey = tmp;
2851             sv_catpv(tmpsv, "\"");
2852             switch (mp->mad_type) {
2853             case MAD_NULL:
2854                 sv_catpv(tmpsv, "NULL");
2855                 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
2856                 break;
2857             case MAD_PV:
2858                 sv_catpv(tmpsv, " val=\"");
2859                 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
2860                 sv_catpv(tmpsv, "\"");
2861                 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
2862                 break;
2863             case MAD_SV:
2864                 sv_catpv(tmpsv, " val=\"");
2865                 sv_catxmlsv(tmpsv, (SV*)mp->mad_val);
2866                 sv_catpv(tmpsv, "\"");
2867                 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
2868                 break;
2869             case MAD_OP:
2870                 if ((OP*)mp->mad_val) {
2871                     Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
2872                     do_op_xmldump(level+1, file, (OP*)mp->mad_val);
2873                     Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
2874                 }
2875                 break;
2876             default:
2877                 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
2878                 break;
2879             }
2880             mp = mp->mad_next;
2881         }
2882         level--;
2883         Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
2884
2885         SvREFCNT_dec(tmpsv);
2886     }
2887
2888     switch (o->op_type) {
2889     case OP_PUSHRE:
2890     case OP_MATCH:
2891     case OP_QR:
2892     case OP_SUBST:
2893         if (!contents) {
2894             contents = 1;
2895             PerlIO_printf(file, ">\n");
2896         }
2897         do_pmop_xmldump(level, file, cPMOPo);
2898         break;
2899     default:
2900         break;
2901     }
2902
2903     if (o->op_flags & OPf_KIDS) {
2904         OP *kid;
2905         if (!contents) {
2906             contents = 1;
2907             PerlIO_printf(file, ">\n");
2908         }
2909         for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
2910             do_op_xmldump(level, file, kid);
2911     }
2912
2913     if (contents)
2914         Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
2915     else
2916         PerlIO_printf(file, " />\n");
2917 }
2918
2919 void
2920 Perl_op_xmldump(pTHX_ const OP *o)
2921 {
2922     do_op_xmldump(0, PL_xmlfp, o);
2923 }
2924 #endif
2925
2926 /*
2927  * Local variables:
2928  * c-indentation-style: bsd
2929  * c-basic-offset: 4
2930  * indent-tabs-mode: t
2931  * End:
2932  *
2933  * ex: set ts=8 sts=4 sw=4 noet:
2934  */