3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
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.
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.'"
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
20 * It also holds the debugging version of the runops function.
24 #define PERL_IN_DUMP_C
30 static const char* const svtypenames[SVt_LAST] = {
50 static const char* const svshorttypenames[SVt_LAST] = {
69 #define Sequence PL_op_sequence
72 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
76 dump_vindent(level, file, pat, &args);
81 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
84 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
85 PerlIO_vprintf(file, pat, *args);
92 PerlIO_setlinebuf(Perl_debug_log);
94 op_dump(PL_main_root);
95 dump_packsubs(PL_defstash);
99 Perl_dump_packsubs(pTHX_ const HV *stash)
106 for (i = 0; i <= (I32) HvMAX(stash); i++) {
108 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
109 const GV *gv = (GV*)HeVAL(entry);
111 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
117 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
118 && (hv = GvHV(gv)) && hv != PL_defstash)
119 dump_packsubs(hv); /* nested package */
125 Perl_dump_sub(pTHX_ const GV *gv)
127 SV * const sv = sv_newmortal();
129 gv_fullname3(sv, gv, NULL);
130 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
131 if (CvISXSUB(GvCV(gv)))
132 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
133 PTR2UV(CvXSUB(GvCV(gv))),
134 (int)CvXSUBANY(GvCV(gv)).any_i32);
135 else if (CvROOT(GvCV(gv)))
136 op_dump(CvROOT(GvCV(gv)));
138 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
142 Perl_dump_form(pTHX_ const GV *gv)
144 SV * const sv = sv_newmortal();
146 gv_fullname3(sv, gv, NULL);
147 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
148 if (CvROOT(GvFORM(gv)))
149 op_dump(CvROOT(GvFORM(gv)));
151 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
158 op_dump(PL_eval_root);
163 =for apidoc Apd|char*|pv_escape|NN SV *dsv|NN const char const *str\
164 |const STRLEN count|const STRLEN max
165 |STRLEN const *escaped, const U32 flags
167 Escapes at most the first "count" chars of pv and puts the results into
168 dsv such that the size of the escaped string will not exceed "max" chars
169 and will not contain any incomplete escape sequences.
171 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
172 will also be escaped.
174 Normally the SV will be cleared before the escaped string is prepared,
175 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
177 If PERL_PV_ESCAPE_UNI is set then the input string is treated as unicode,
178 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
179 using C<is_utf8_string()> to determine if it is unicode.
181 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
182 using C<\x01F1> style escapes, otherwise only chars above 255 will be
183 escaped using this style, other non printable chars will use octal or
184 common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
185 then all chars below 255 will be treated as printable and
186 will be output as literals.
188 If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
189 string will be escaped, regardles of max. If the string is utf8 and
190 the chars value is >255 then it will be returned as a plain hex
191 sequence. Thus the output will either be a single char,
192 an octal escape sequence, a special escape like C<\n> or a 3 or
193 more digit hex value.
195 Returns a pointer to the escaped text as held by dsv.
199 #define PV_ESCAPE_OCTBUFSIZE 32
202 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
203 const STRLEN count, const STRLEN max,
204 STRLEN * const escaped, const U32 flags )
206 char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : '\\';
207 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "\\123456789ABCDF";
208 STRLEN wrote = 0; /* chars written so far */
209 STRLEN chsize = 0; /* size of data to be written */
210 STRLEN readsize = 1; /* size of data just read */
211 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this unicode */
212 const char *pv = str;
213 const char *end = pv + count; /* end of string */
215 if (!flags & PERL_PV_ESCAPE_NOCLEAR)
216 sv_setpvn(dsv, "", 0);
218 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
221 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
222 const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv;
223 const U8 c = (U8)u & 0xFF;
225 if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) {
226 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
227 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
230 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
232 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
235 if ( (c == dq) || (c == '\\') || !isPRINT(c) ) {
238 case '\\' : octbuf[1] = '\\'; break;
239 case '\v' : octbuf[1] = 'v'; break;
240 case '\t' : octbuf[1] = 't'; break;
241 case '\r' : octbuf[1] = 'r'; break;
242 case '\n' : octbuf[1] = 'n'; break;
243 case '\f' : octbuf[1] = 'f'; break;
251 if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) )
252 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
255 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
262 if ( max && (wrote + chsize > max) ) {
264 } else if (chsize > 1) {
265 sv_catpvn(dsv, octbuf, chsize);
268 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
271 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
279 =for apidoc Apd|char *|pv_pretty|NN SV *dsv|NN const char const *str\
280 |const STRLEN count|const STRLEN max\
281 |const char const *start_color| const char const *end_color\
284 Converts a string into something presentable, handling escaping via
285 pv_escape() and supporting quoting and elipses.
287 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
288 double quoted with any double quotes in the string escaped. Otherwise
289 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
292 If the PERL_PV_PRETTY_ELIPSES flag is set and not all characters in
293 string were output then an elipses C<...> will be appended to the
294 string. Note that this happens AFTER it has been quoted.
296 If start_color is non-null then it will be inserted after the opening
297 quote (if there is one) but before the escaped text. If end_color
298 is non-null then it will be inserted after the escaped text but before
299 any quotes or elipses.
301 Returns a pointer to the prettified text as held by dsv.
307 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
308 const STRLEN max, char const * const start_color, char const * const end_color,
311 U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '\\';
315 sv_setpvn(dsv, "\"", 1);
316 else if ( flags & PERL_PV_PRETTY_LTGT )
317 sv_setpvn(dsv, "<", 1);
319 sv_setpvn(dsv, "", 0);
321 if ( start_color != NULL )
322 Perl_sv_catpv( aTHX_ dsv, start_color);
324 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
326 if ( end_color != NULL )
327 Perl_sv_catpv( aTHX_ dsv, end_color);
330 sv_catpvn( dsv, "\"", 1 );
331 else if ( flags & PERL_PV_PRETTY_LTGT )
332 sv_catpvn( dsv, ">", 1);
334 if ( (flags & PERL_PV_PRETTY_ELIPSES) && ( escaped < count ) )
335 sv_catpvn( dsv, "...", 3 );
341 =for apidoc pv_display
343 char *pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len,
344 STRLEN pvlim, U32 flags)
348 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
350 except that an additional "\0" will be appended to the string when
351 len > cur and pv[cur] is "\0".
353 Note that the final string may be up to 7 chars longer than pvlim.
359 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
361 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
362 if (len > cur && pv[cur] == '\0')
363 sv_catpvn( dsv, "\\0", 2 );
368 Perl_sv_peek(pTHX_ SV *sv)
371 SV * const t = sv_newmortal();
381 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
385 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
386 if (sv == &PL_sv_undef) {
387 sv_catpv(t, "SV_UNDEF");
388 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
389 SVs_GMG|SVs_SMG|SVs_RMG)) &&
393 else if (sv == &PL_sv_no) {
394 sv_catpv(t, "SV_NO");
395 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
396 SVs_GMG|SVs_SMG|SVs_RMG)) &&
397 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
403 else if (sv == &PL_sv_yes) {
404 sv_catpv(t, "SV_YES");
405 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
406 SVs_GMG|SVs_SMG|SVs_RMG)) &&
407 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
410 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
415 sv_catpv(t, "SV_PLACEHOLDER");
416 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
417 SVs_GMG|SVs_SMG|SVs_RMG)) &&
423 else if (SvREFCNT(sv) == 0) {
427 else if (DEBUG_R_TEST_) {
430 /* is this SV on the tmps stack? */
431 for (ix=PL_tmps_ix; ix>=0; ix--) {
432 if (PL_tmps_stack[ix] == sv) {
437 if (SvREFCNT(sv) > 1)
438 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
446 if (SvCUR(t) + unref > 10) {
447 SvCUR_set(t, unref + 3);
456 if (type == SVt_PVCV) {
457 Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
459 } else if (type < SVt_LAST) {
460 sv_catpv(t, svshorttypenames[type]);
462 if (type == SVt_NULL)
465 sv_catpv(t, "FREED");
470 if (!SvPVX_const(sv))
471 sv_catpv(t, "(null)");
473 SV * const tmp = newSVpvs("");
476 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, 127));
477 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
479 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
480 sv_uni_display(tmp, sv, 8 * sv_len_utf8(sv),
485 else if (SvNOKp(sv)) {
486 STORE_NUMERIC_LOCAL_SET_STANDARD();
487 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
488 RESTORE_NUMERIC_LOCAL();
490 else if (SvIOKp(sv)) {
492 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
494 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
504 return SvPV_nolen(t);
508 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
513 Perl_dump_indent(aTHX_ level, file, "{}\n");
516 Perl_dump_indent(aTHX_ level, file, "{\n");
518 if (pm->op_pmflags & PMf_ONCE)
523 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
524 ch, PM_GETRE(pm)->precomp, ch,
525 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
527 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
528 if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
529 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
530 op_dump(pm->op_pmreplroot);
532 if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) {
533 SV * const tmpsv = pm_description(pm);
534 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
538 Perl_dump_indent(aTHX_ level-1, file, "}\n");
542 S_pm_description(pTHX_ const PMOP *pm)
544 SV * const desc = newSVpvs("");
545 const REGEXP * regex = PM_GETRE(pm);
546 const U32 pmflags = pm->op_pmflags;
548 if (pm->op_pmdynflags & PMdf_USED)
549 sv_catpv(desc, ",USED");
550 if (pm->op_pmdynflags & PMdf_TAINTED)
551 sv_catpv(desc, ",TAINTED");
553 if (pmflags & PMf_ONCE)
554 sv_catpv(desc, ",ONCE");
555 if (regex && regex->check_substr) {
556 if (!(regex->extflags & RXf_NOSCAN))
557 sv_catpv(desc, ",SCANFIRST");
558 if (regex->extflags & RXf_CHECK_ALL)
559 sv_catpv(desc, ",ALL");
561 if (pmflags & PMf_SKIPWHITE)
562 sv_catpv(desc, ",SKIPWHITE");
563 if (pmflags & PMf_CONST)
564 sv_catpv(desc, ",CONST");
565 if (pmflags & PMf_KEEP)
566 sv_catpv(desc, ",KEEP");
567 if (pmflags & PMf_GLOBAL)
568 sv_catpv(desc, ",GLOBAL");
569 if (pmflags & PMf_CONTINUE)
570 sv_catpv(desc, ",CONTINUE");
571 if (pmflags & PMf_RETAINT)
572 sv_catpv(desc, ",RETAINT");
573 if (pmflags & PMf_EVAL)
574 sv_catpv(desc, ",EVAL");
579 Perl_pmop_dump(pTHX_ PMOP *pm)
581 do_pmop_dump(0, Perl_debug_log, pm);
584 /* An op sequencer. We visit the ops in the order they're to execute. */
587 S_sequence(pTHX_ register const OP *o)
590 const OP *oldop = NULL;
603 for (; o; o = o->op_next) {
605 SV * const op = newSVuv(PTR2UV(o));
606 const char * const key = SvPV_const(op, len);
608 if (hv_exists(Sequence, key, len))
611 switch (o->op_type) {
613 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
614 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
623 if (oldop && o->op_next)
630 if (oldop && o->op_next)
632 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
645 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
646 sequence_tail(cLOGOPo->op_other);
651 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
652 sequence_tail(cLOOPo->op_redoop);
653 sequence_tail(cLOOPo->op_nextop);
654 sequence_tail(cLOOPo->op_lastop);
660 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
661 sequence_tail(cPMOPo->op_pmreplstart);
668 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
676 S_sequence_tail(pTHX_ const OP *o)
678 while (o && (o->op_type == OP_NULL))
684 S_sequence_num(pTHX_ const OP *o)
692 op = newSVuv(PTR2UV(o));
693 key = SvPV_const(op, len);
694 seq = hv_fetch(Sequence, key, len, 0);
695 return seq ? SvUV(*seq): 0;
699 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
703 const OPCODE optype = o->op_type;
706 Perl_dump_indent(aTHX_ level, file, "{\n");
708 seq = sequence_num(o);
710 PerlIO_printf(file, "%-4"UVuf, seq);
712 PerlIO_printf(file, " ");
714 "%*sTYPE = %s ===> ",
715 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
717 PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n",
718 sequence_num(o->op_next));
720 PerlIO_printf(file, "DONE\n");
722 if (optype == OP_NULL) {
723 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
724 if (o->op_targ == OP_NEXTSTATE) {
726 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
728 if (CopSTASHPV(cCOPo))
729 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
731 if (cCOPo->cop_label)
732 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
737 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
740 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
743 SV * const tmpsv = newSVpvs("");
744 switch (o->op_flags & OPf_WANT) {
746 sv_catpv(tmpsv, ",VOID");
748 case OPf_WANT_SCALAR:
749 sv_catpv(tmpsv, ",SCALAR");
752 sv_catpv(tmpsv, ",LIST");
755 sv_catpv(tmpsv, ",UNKNOWN");
758 if (o->op_flags & OPf_KIDS)
759 sv_catpv(tmpsv, ",KIDS");
760 if (o->op_flags & OPf_PARENS)
761 sv_catpv(tmpsv, ",PARENS");
762 if (o->op_flags & OPf_STACKED)
763 sv_catpv(tmpsv, ",STACKED");
764 if (o->op_flags & OPf_REF)
765 sv_catpv(tmpsv, ",REF");
766 if (o->op_flags & OPf_MOD)
767 sv_catpv(tmpsv, ",MOD");
768 if (o->op_flags & OPf_SPECIAL)
769 sv_catpv(tmpsv, ",SPECIAL");
770 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
774 SV * const tmpsv = newSVpvs("");
775 if (PL_opargs[optype] & OA_TARGLEX) {
776 if (o->op_private & OPpTARGET_MY)
777 sv_catpv(tmpsv, ",TARGET_MY");
779 else if (optype == OP_LEAVESUB ||
780 optype == OP_LEAVE ||
781 optype == OP_LEAVESUBLV ||
782 optype == OP_LEAVEWRITE) {
783 if (o->op_private & OPpREFCOUNTED)
784 sv_catpv(tmpsv, ",REFCOUNTED");
786 else if (optype == OP_AASSIGN) {
787 if (o->op_private & OPpASSIGN_COMMON)
788 sv_catpv(tmpsv, ",COMMON");
790 else if (optype == OP_SASSIGN) {
791 if (o->op_private & OPpASSIGN_BACKWARDS)
792 sv_catpv(tmpsv, ",BACKWARDS");
794 else if (optype == OP_TRANS) {
795 if (o->op_private & OPpTRANS_SQUASH)
796 sv_catpv(tmpsv, ",SQUASH");
797 if (o->op_private & OPpTRANS_DELETE)
798 sv_catpv(tmpsv, ",DELETE");
799 if (o->op_private & OPpTRANS_COMPLEMENT)
800 sv_catpv(tmpsv, ",COMPLEMENT");
801 if (o->op_private & OPpTRANS_IDENTICAL)
802 sv_catpv(tmpsv, ",IDENTICAL");
803 if (o->op_private & OPpTRANS_GROWS)
804 sv_catpv(tmpsv, ",GROWS");
806 else if (optype == OP_REPEAT) {
807 if (o->op_private & OPpREPEAT_DOLIST)
808 sv_catpv(tmpsv, ",DOLIST");
810 else if (optype == OP_ENTERSUB ||
811 optype == OP_RV2SV ||
813 optype == OP_RV2AV ||
814 optype == OP_RV2HV ||
815 optype == OP_RV2GV ||
816 optype == OP_AELEM ||
819 if (optype == OP_ENTERSUB) {
820 if (o->op_private & OPpENTERSUB_AMPER)
821 sv_catpv(tmpsv, ",AMPER");
822 if (o->op_private & OPpENTERSUB_DB)
823 sv_catpv(tmpsv, ",DB");
824 if (o->op_private & OPpENTERSUB_HASTARG)
825 sv_catpv(tmpsv, ",HASTARG");
826 if (o->op_private & OPpENTERSUB_NOPAREN)
827 sv_catpv(tmpsv, ",NOPAREN");
828 if (o->op_private & OPpENTERSUB_INARGS)
829 sv_catpv(tmpsv, ",INARGS");
830 if (o->op_private & OPpENTERSUB_NOMOD)
831 sv_catpv(tmpsv, ",NOMOD");
834 switch (o->op_private & OPpDEREF) {
836 sv_catpv(tmpsv, ",SV");
839 sv_catpv(tmpsv, ",AV");
842 sv_catpv(tmpsv, ",HV");
845 if (o->op_private & OPpMAYBE_LVSUB)
846 sv_catpv(tmpsv, ",MAYBE_LVSUB");
848 if (optype == OP_AELEM || optype == OP_HELEM) {
849 if (o->op_private & OPpLVAL_DEFER)
850 sv_catpv(tmpsv, ",LVAL_DEFER");
853 if (o->op_private & HINT_STRICT_REFS)
854 sv_catpv(tmpsv, ",STRICT_REFS");
855 if (o->op_private & OPpOUR_INTRO)
856 sv_catpv(tmpsv, ",OUR_INTRO");
859 else if (optype == OP_CONST) {
860 if (o->op_private & OPpCONST_BARE)
861 sv_catpv(tmpsv, ",BARE");
862 if (o->op_private & OPpCONST_STRICT)
863 sv_catpv(tmpsv, ",STRICT");
864 if (o->op_private & OPpCONST_ARYBASE)
865 sv_catpv(tmpsv, ",ARYBASE");
866 if (o->op_private & OPpCONST_WARNING)
867 sv_catpv(tmpsv, ",WARNING");
868 if (o->op_private & OPpCONST_ENTERED)
869 sv_catpv(tmpsv, ",ENTERED");
871 else if (optype == OP_FLIP) {
872 if (o->op_private & OPpFLIP_LINENUM)
873 sv_catpv(tmpsv, ",LINENUM");
875 else if (optype == OP_FLOP) {
876 if (o->op_private & OPpFLIP_LINENUM)
877 sv_catpv(tmpsv, ",LINENUM");
879 else if (optype == OP_RV2CV) {
880 if (o->op_private & OPpLVAL_INTRO)
881 sv_catpv(tmpsv, ",INTRO");
883 else if (optype == OP_GV) {
884 if (o->op_private & OPpEARLY_CV)
885 sv_catpv(tmpsv, ",EARLY_CV");
887 else if (optype == OP_LIST) {
888 if (o->op_private & OPpLIST_GUESSED)
889 sv_catpv(tmpsv, ",GUESSED");
891 else if (optype == OP_DELETE) {
892 if (o->op_private & OPpSLICE)
893 sv_catpv(tmpsv, ",SLICE");
895 else if (optype == OP_EXISTS) {
896 if (o->op_private & OPpEXISTS_SUB)
897 sv_catpv(tmpsv, ",EXISTS_SUB");
899 else if (optype == OP_SORT) {
900 if (o->op_private & OPpSORT_NUMERIC)
901 sv_catpv(tmpsv, ",NUMERIC");
902 if (o->op_private & OPpSORT_INTEGER)
903 sv_catpv(tmpsv, ",INTEGER");
904 if (o->op_private & OPpSORT_REVERSE)
905 sv_catpv(tmpsv, ",REVERSE");
907 else if (optype == OP_THREADSV) {
908 if (o->op_private & OPpDONE_SVREF)
909 sv_catpv(tmpsv, ",SVREF");
911 else if (optype == OP_OPEN || optype == OP_BACKTICK) {
912 if (o->op_private & OPpOPEN_IN_RAW)
913 sv_catpv(tmpsv, ",IN_RAW");
914 if (o->op_private & OPpOPEN_IN_CRLF)
915 sv_catpv(tmpsv, ",IN_CRLF");
916 if (o->op_private & OPpOPEN_OUT_RAW)
917 sv_catpv(tmpsv, ",OUT_RAW");
918 if (o->op_private & OPpOPEN_OUT_CRLF)
919 sv_catpv(tmpsv, ",OUT_CRLF");
921 else if (optype == OP_EXIT) {
922 if (o->op_private & OPpEXIT_VMSISH)
923 sv_catpv(tmpsv, ",EXIT_VMSISH");
924 if (o->op_private & OPpHUSH_VMSISH)
925 sv_catpv(tmpsv, ",HUSH_VMSISH");
927 else if (optype == OP_DIE) {
928 if (o->op_private & OPpHUSH_VMSISH)
929 sv_catpv(tmpsv, ",HUSH_VMSISH");
931 else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
932 if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS)
933 sv_catpv(tmpsv, ",FT_ACCESS");
934 if (o->op_private & OPpFT_STACKED)
935 sv_catpv(tmpsv, ",FT_STACKED");
937 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
938 sv_catpv(tmpsv, ",INTRO");
940 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
945 if (PL_madskills && o->op_madprop) {
946 SV * const tmpsv = newSVpvn("", 0);
947 MADPROP* mp = o->op_madprop;
948 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
951 char tmp = mp->mad_key;
952 sv_setpvn(tmpsv,"'",1);
954 sv_catpvn(tmpsv, &tmp, 1);
955 sv_catpv(tmpsv, "'=");
956 switch (mp->mad_type) {
958 sv_catpv(tmpsv, "NULL");
959 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
962 sv_catpv(tmpsv, "<");
963 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
964 sv_catpv(tmpsv, ">");
965 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
968 if ((OP*)mp->mad_val) {
969 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
970 do_op_dump(level, file, (OP*)mp->mad_val);
974 sv_catpv(tmpsv, "(UNK)");
975 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
981 Perl_dump_indent(aTHX_ level, file, "}\n");
992 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
994 if ( ! PL_op->op_flags & OPf_SPECIAL) { /* not lexical */
996 SV * const tmpsv = newSV(0);
1000 /* FIXME - it this making unwarranted assumptions about the
1001 UTF-8 cleanliness of the dump file handle? */
1004 gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, NULL);
1005 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1006 SvPV_nolen_const(tmpsv));
1010 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1015 case OP_METHOD_NAMED:
1016 #ifndef USE_ITHREADS
1017 /* with ITHREADS, consts are stored in the pad, and the right pad
1018 * may not be active here, so skip */
1019 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1026 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1027 (UV)CopLINE(cCOPo));
1028 if (CopSTASHPV(cCOPo))
1029 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1031 if (cCOPo->cop_label)
1032 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1036 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1037 if (cLOOPo->op_redoop)
1038 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1040 PerlIO_printf(file, "DONE\n");
1041 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1042 if (cLOOPo->op_nextop)
1043 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1045 PerlIO_printf(file, "DONE\n");
1046 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1047 if (cLOOPo->op_lastop)
1048 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1050 PerlIO_printf(file, "DONE\n");
1058 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1059 if (cLOGOPo->op_other)
1060 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1062 PerlIO_printf(file, "DONE\n");
1068 do_pmop_dump(level, file, cPMOPo);
1076 if (o->op_private & OPpREFCOUNTED)
1077 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1082 if (o->op_flags & OPf_KIDS) {
1084 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1085 do_op_dump(level, file, kid);
1087 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1091 Perl_op_dump(pTHX_ const OP *o)
1093 do_op_dump(0, Perl_debug_log, o);
1097 Perl_gv_dump(pTHX_ GV *gv)
1102 PerlIO_printf(Perl_debug_log, "{}\n");
1105 sv = sv_newmortal();
1106 PerlIO_printf(Perl_debug_log, "{\n");
1107 gv_fullname3(sv, gv, NULL);
1108 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1109 if (gv != GvEGV(gv)) {
1110 gv_efullname3(sv, GvEGV(gv), NULL);
1111 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1113 PerlIO_putc(Perl_debug_log, '\n');
1114 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1118 /* map magic types to the symbolic names
1119 * (with the PERL_MAGIC_ prefixed stripped)
1122 static const struct { const char type; const char *name; } magic_names[] = {
1123 { PERL_MAGIC_sv, "sv(\\0)" },
1124 { PERL_MAGIC_arylen, "arylen(#)" },
1125 { PERL_MAGIC_rhash, "rhash(%)" },
1126 { PERL_MAGIC_regdata_names, "regdata_names(+)" },
1127 { PERL_MAGIC_pos, "pos(.)" },
1128 { PERL_MAGIC_symtab, "symtab(:)" },
1129 { PERL_MAGIC_backref, "backref(<)" },
1130 { PERL_MAGIC_arylen_p, "arylen_p(@)" },
1131 { PERL_MAGIC_overload, "overload(A)" },
1132 { PERL_MAGIC_bm, "bm(B)" },
1133 { PERL_MAGIC_regdata, "regdata(D)" },
1134 { PERL_MAGIC_env, "env(E)" },
1135 { PERL_MAGIC_hints, "hints(H)" },
1136 { PERL_MAGIC_isa, "isa(I)" },
1137 { PERL_MAGIC_dbfile, "dbfile(L)" },
1138 { PERL_MAGIC_shared, "shared(N)" },
1139 { PERL_MAGIC_tied, "tied(P)" },
1140 { PERL_MAGIC_sig, "sig(S)" },
1141 { PERL_MAGIC_uvar, "uvar(U)" },
1142 { PERL_MAGIC_overload_elem, "overload_elem(a)" },
1143 { PERL_MAGIC_overload_table, "overload_table(c)" },
1144 { PERL_MAGIC_regdatum, "regdatum(d)" },
1145 { PERL_MAGIC_envelem, "envelem(e)" },
1146 { PERL_MAGIC_fm, "fm(f)" },
1147 { PERL_MAGIC_regex_global, "regex_global(g)" },
1148 { PERL_MAGIC_hintselem, "hintselem(h)" },
1149 { PERL_MAGIC_isaelem, "isaelem(i)" },
1150 { PERL_MAGIC_nkeys, "nkeys(k)" },
1151 { PERL_MAGIC_dbline, "dbline(l)" },
1152 { PERL_MAGIC_mutex, "mutex(m)" },
1153 { PERL_MAGIC_shared_scalar, "shared_scalar(n)" },
1154 { PERL_MAGIC_collxfrm, "collxfrm(o)" },
1155 { PERL_MAGIC_tiedelem, "tiedelem(p)" },
1156 { PERL_MAGIC_tiedscalar, "tiedscalar(q)" },
1157 { PERL_MAGIC_qr, "qr(r)" },
1158 { PERL_MAGIC_sigelem, "sigelem(s)" },
1159 { PERL_MAGIC_taint, "taint(t)" },
1160 { PERL_MAGIC_uvar_elem, "uvar_elem(v)" },
1161 { PERL_MAGIC_vec, "vec(v)" },
1162 { PERL_MAGIC_vstring, "vstring(V)" },
1163 { PERL_MAGIC_utf8, "utf8(w)" },
1164 { PERL_MAGIC_substr, "substr(x)" },
1165 { PERL_MAGIC_defelem, "defelem(y)" },
1166 { PERL_MAGIC_ext, "ext(~)" },
1167 /* this null string terminates the list */
1172 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1174 for (; mg; mg = mg->mg_moremagic) {
1175 Perl_dump_indent(aTHX_ level, file,
1176 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1177 if (mg->mg_virtual) {
1178 const MGVTBL * const v = mg->mg_virtual;
1180 if (v == &PL_vtbl_sv) s = "sv";
1181 else if (v == &PL_vtbl_env) s = "env";
1182 else if (v == &PL_vtbl_envelem) s = "envelem";
1183 else if (v == &PL_vtbl_sig) s = "sig";
1184 else if (v == &PL_vtbl_sigelem) s = "sigelem";
1185 else if (v == &PL_vtbl_pack) s = "pack";
1186 else if (v == &PL_vtbl_packelem) s = "packelem";
1187 else if (v == &PL_vtbl_dbline) s = "dbline";
1188 else if (v == &PL_vtbl_isa) s = "isa";
1189 else if (v == &PL_vtbl_arylen) s = "arylen";
1190 else if (v == &PL_vtbl_mglob) s = "mglob";
1191 else if (v == &PL_vtbl_nkeys) s = "nkeys";
1192 else if (v == &PL_vtbl_taint) s = "taint";
1193 else if (v == &PL_vtbl_substr) s = "substr";
1194 else if (v == &PL_vtbl_vec) s = "vec";
1195 else if (v == &PL_vtbl_pos) s = "pos";
1196 else if (v == &PL_vtbl_bm) s = "bm";
1197 else if (v == &PL_vtbl_fm) s = "fm";
1198 else if (v == &PL_vtbl_uvar) s = "uvar";
1199 else if (v == &PL_vtbl_defelem) s = "defelem";
1200 #ifdef USE_LOCALE_COLLATE
1201 else if (v == &PL_vtbl_collxfrm) s = "collxfrm";
1203 else if (v == &PL_vtbl_amagic) s = "amagic";
1204 else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
1205 else if (v == &PL_vtbl_backref) s = "backref";
1206 else if (v == &PL_vtbl_utf8) s = "utf8";
1207 else if (v == &PL_vtbl_arylen_p) s = "arylen_p";
1208 else if (v == &PL_vtbl_hintselem) s = "hintselem";
1211 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s);
1213 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1216 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1219 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1223 const char *name = NULL;
1224 for (n = 0; magic_names[n].name; n++) {
1225 if (mg->mg_type == magic_names[n].type) {
1226 name = magic_names[n].name;
1231 Perl_dump_indent(aTHX_ level, file,
1232 " MG_TYPE = PERL_MAGIC_%s\n", name);
1234 Perl_dump_indent(aTHX_ level, file,
1235 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1239 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1240 if (mg->mg_type == PERL_MAGIC_envelem &&
1241 mg->mg_flags & MGf_TAINTEDDIR)
1242 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1243 if (mg->mg_flags & MGf_REFCOUNTED)
1244 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1245 if (mg->mg_flags & MGf_GSKIP)
1246 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1247 if (mg->mg_type == PERL_MAGIC_regex_global &&
1248 mg->mg_flags & MGf_MINMATCH)
1249 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1252 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1253 if (mg->mg_flags & MGf_REFCOUNTED)
1254 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1257 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1259 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1260 if (mg->mg_len >= 0) {
1261 if (mg->mg_type != PERL_MAGIC_utf8) {
1262 SV *sv = newSVpvs("");
1263 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1267 else if (mg->mg_len == HEf_SVKEY) {
1268 PerlIO_puts(file, " => HEf_SVKEY\n");
1269 do_sv_dump(level+2, file, (SV*)((mg)->mg_ptr), nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1273 PerlIO_puts(file, " ???? - please notify IZ");
1274 PerlIO_putc(file, '\n');
1276 if (mg->mg_type == PERL_MAGIC_utf8) {
1277 STRLEN *cache = (STRLEN *) mg->mg_ptr;
1280 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1281 Perl_dump_indent(aTHX_ level, file,
1282 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1285 (UV)cache[i * 2 + 1]);
1292 Perl_magic_dump(pTHX_ const MAGIC *mg)
1294 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1298 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1301 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1302 if (sv && (hvname = HvNAME_get(sv)))
1303 PerlIO_printf(file, "\t\"%s\"\n", hvname);
1305 PerlIO_putc(file, '\n');
1309 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1311 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1312 if (sv && GvNAME(sv))
1313 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1315 PerlIO_putc(file, '\n');
1319 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1321 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1322 if (sv && GvNAME(sv)) {
1324 PerlIO_printf(file, "\t\"");
1325 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1326 PerlIO_printf(file, "%s\" :: \"", hvname);
1327 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1330 PerlIO_putc(file, '\n');
1334 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1343 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1347 flags = SvFLAGS(sv);
1350 d = Perl_newSVpvf(aTHX_
1351 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1352 PTR2UV(SvANY(sv)), PTR2UV(sv),
1353 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1354 (int)(PL_dumpindent*level), "");
1356 if (!(flags & SVpad_NAME && (type == SVt_PVMG || type == SVt_PVNV))) {
1357 if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,");
1359 if (!(flags & SVpad_NAME && type == SVt_PVMG)) {
1360 if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
1361 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1363 if (flags & SVs_TEMP) sv_catpv(d, "TEMP,");
1364 if (flags & SVs_OBJECT) sv_catpv(d, "OBJECT,");
1365 if (flags & SVs_GMG) sv_catpv(d, "GMG,");
1366 if (flags & SVs_SMG) sv_catpv(d, "SMG,");
1367 if (flags & SVs_RMG) sv_catpv(d, "RMG,");
1369 if (flags & SVf_IOK) sv_catpv(d, "IOK,");
1370 if (flags & SVf_NOK) sv_catpv(d, "NOK,");
1371 if (flags & SVf_POK) sv_catpv(d, "POK,");
1372 if (flags & SVf_ROK) {
1373 sv_catpv(d, "ROK,");
1374 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1376 if (flags & SVf_OOK) sv_catpv(d, "OOK,");
1377 if (flags & SVf_FAKE) sv_catpv(d, "FAKE,");
1378 if (flags & SVf_READONLY) sv_catpv(d, "READONLY,");
1380 if (flags & SVf_AMAGIC) sv_catpv(d, "OVERLOAD,");
1381 if (flags & SVp_IOK) sv_catpv(d, "pIOK,");
1382 if (flags & SVp_NOK) sv_catpv(d, "pNOK,");
1383 if (flags & SVp_POK) sv_catpv(d, "pPOK,");
1384 if (flags & SVp_SCREAM && type != SVt_PVHV)
1385 sv_catpv(d, "SCREAM,");
1390 if (CvANON(sv)) sv_catpv(d, "ANON,");
1391 if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1392 if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
1393 if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
1394 if (CvCONST(sv)) sv_catpv(d, "CONST,");
1395 if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
1396 if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
1397 if (CvLVALUE(sv)) sv_catpv(d, "LVALUE,");
1398 if (CvMETHOD(sv)) sv_catpv(d, "METHOD,");
1399 if (CvLOCKED(sv)) sv_catpv(d, "LOCKED,");
1400 if (CvWEAKOUTSIDE(sv)) sv_catpv(d, "WEAKOUTSIDE,");
1401 if (CvASSERTION(sv)) sv_catpv(d, "ASSERTION,");
1404 if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
1405 if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
1406 if (HvHASKFLAGS(sv)) sv_catpv(d, "HASKFLAGS,");
1407 if (HvREHASH(sv)) sv_catpv(d, "REHASH,");
1408 if (flags & SVphv_CLONEABLE) sv_catpv(d, "CLONEABLE,");
1412 if (isGV_with_GP(sv)) {
1413 if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
1414 if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
1415 if (GvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1416 if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
1417 if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,");
1419 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1420 sv_catpv(d, "IMPORT");
1421 if (GvIMPORTED(sv) == GVf_IMPORTED)
1422 sv_catpv(d, "ALL,");
1425 if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
1426 if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
1427 if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
1428 if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
1432 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1433 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1437 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1438 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1441 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1442 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1443 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1446 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1451 /* SVphv_SHAREKEYS is also 0x20000000 */
1452 if ((type != SVt_PVHV) && SvUTF8(sv))
1453 sv_catpv(d, "UTF8");
1455 if (*(SvEND(d) - 1) == ',') {
1456 SvCUR_set(d, SvCUR(d) - 1);
1457 SvPVX(d)[SvCUR(d)] = '\0';
1462 #ifdef DEBUG_LEAKING_SCALARS
1463 Perl_dump_indent(aTHX_ level, file, "ALLOCATED at %s:%d %s %s%s\n",
1464 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1466 sv->sv_debug_inpad ? "for" : "by",
1467 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1468 sv->sv_debug_cloned ? " (cloned)" : "");
1470 Perl_dump_indent(aTHX_ level, file, "SV = ");
1471 if (type < SVt_LAST) {
1472 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1474 if (type == SVt_NULL) {
1479 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1483 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1484 && type != SVt_PVCV && !isGV_with_GP(sv))
1485 || type == SVt_IV) {
1487 #ifdef PERL_OLD_COPY_ON_WRITE
1491 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1493 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1495 PerlIO_printf(file, " (OFFSET)");
1496 #ifdef PERL_OLD_COPY_ON_WRITE
1497 if (SvIsCOW_shared_hash(sv))
1498 PerlIO_printf(file, " (HASH)");
1499 else if (SvIsCOW_normal(sv))
1500 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1502 PerlIO_putc(file, '\n');
1504 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1505 && type != SVt_PVCV && type != SVt_PVFM && !isGV_with_GP(sv))
1506 || type == SVt_NV) {
1507 STORE_NUMERIC_LOCAL_SET_STANDARD();
1508 /* %Vg doesn't work? --jhi */
1509 #ifdef USE_LONG_DOUBLE
1510 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1512 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1514 RESTORE_NUMERIC_LOCAL();
1517 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1519 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1521 if (type < SVt_PV) {
1525 if (type <= SVt_PVLV && !isGV_with_GP(sv)) {
1526 if (SvPVX_const(sv)) {
1527 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1529 PerlIO_printf(file, "( %s . ) ", pv_display(d, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, pvlim));
1530 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1531 if (SvUTF8(sv)) /* the 8? \x{....} */
1532 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 8 * sv_len_utf8(sv), UNI_DISPLAY_QQ));
1533 PerlIO_printf(file, "\n");
1534 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1535 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
1538 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1540 if (type >= SVt_PVMG) {
1542 do_magic_dump(level, file, SvMAGIC(sv), nest, maxnest, dumpops, pvlim);
1544 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1548 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1549 if (AvARRAY(sv) != AvALLOC(sv)) {
1550 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1551 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1554 PerlIO_putc(file, '\n');
1555 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1556 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1557 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1558 sv_setpvn(d, "", 0);
1559 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1560 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1561 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1562 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1563 if (nest < maxnest && av_len((AV*)sv) >= 0) {
1565 for (count = 0; count <= av_len((AV*)sv) && count < maxnest; count++) {
1566 SV** elt = av_fetch((AV*)sv,count,0);
1568 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1570 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1575 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1576 if (HvARRAY(sv) && HvKEYS(sv)) {
1577 /* Show distribution of HEs in the ARRAY */
1579 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1582 U32 pow2 = 2, keys = HvKEYS(sv);
1583 NV theoret, sum = 0;
1585 PerlIO_printf(file, " (");
1586 Zero(freq, FREQ_MAX + 1, int);
1587 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1590 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1592 if (count > FREQ_MAX)
1598 for (i = 0; i <= max; i++) {
1600 PerlIO_printf(file, "%d%s:%d", i,
1601 (i == FREQ_MAX) ? "+" : "",
1604 PerlIO_printf(file, ", ");
1607 PerlIO_putc(file, ')');
1608 /* The "quality" of a hash is defined as the total number of
1609 comparisons needed to access every element once, relative
1610 to the expected number needed for a random hash.
1612 The total number of comparisons is equal to the sum of
1613 the squares of the number of entries in each bucket.
1614 For a random hash of n keys into k buckets, the expected
1619 for (i = max; i > 0; i--) { /* Precision: count down. */
1620 sum += freq[i] * i * i;
1622 while ((keys = keys >> 1))
1624 theoret = HvKEYS(sv);
1625 theoret += theoret * (theoret-1)/pow2;
1626 PerlIO_putc(file, '\n');
1627 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1629 PerlIO_putc(file, '\n');
1630 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
1631 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1632 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1633 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1634 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1636 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1637 if (mg && mg->mg_obj) {
1638 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1642 const char * const hvname = HvNAME_get(sv);
1644 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1647 const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv);
1649 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1651 do_sv_dump(level+1, file, (SV*)backrefs, nest+1, maxnest,
1655 if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
1657 HV * const hv = (HV*)sv;
1658 int count = maxnest - nest;
1661 while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
1666 const U32 hash = HeHASH(he);
1668 keysv = hv_iterkeysv(he);
1669 keypv = SvPV_const(keysv, len);
1670 elt = hv_iterval(hv, he);
1671 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1673 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 8 * sv_len_utf8(keysv), UNI_DISPLAY_QQ));
1675 PerlIO_printf(file, "[REHASH] ");
1676 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash);
1677 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1679 hv_iterinit(hv); /* Return to status quo */
1685 const char *const proto = SvPV_const(sv, len);
1686 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1691 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1692 if (!CvISXSUB(sv)) {
1694 Perl_dump_indent(aTHX_ level, file,
1695 " START = 0x%"UVxf" ===> %"IVdf"\n",
1696 PTR2UV(CvSTART(sv)),
1697 (IV)sequence_num(CvSTART(sv)));
1699 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1700 PTR2UV(CvROOT(sv)));
1701 if (CvROOT(sv) && dumpops) {
1702 do_op_dump(level+1, file, CvROOT(sv));
1705 SV *constant = cv_const_sv((CV *)sv);
1707 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1710 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1712 PTR2UV(CvXSUBANY(sv).any_ptr));
1713 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1716 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1717 (IV)CvXSUBANY(sv).any_i32);
1720 do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1721 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1722 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1723 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1724 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1725 if (type == SVt_PVFM)
1726 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
1727 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1728 if (nest < maxnest) {
1729 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1732 const CV * const outside = CvOUTSIDE(sv);
1733 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1736 : CvANON(outside) ? "ANON"
1737 : (outside == PL_main_cv) ? "MAIN"
1738 : CvUNIQUE(outside) ? "UNIQUE"
1739 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1741 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1742 do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim);
1746 if (type == SVt_PVLV) {
1747 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1748 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1749 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1750 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1751 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1752 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1755 if (!isGV_with_GP(sv))
1757 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1758 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1759 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1760 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1763 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1764 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1765 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1766 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1767 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1768 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1769 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1770 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1771 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1772 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1773 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1774 do_gv_dump (level, file, " EGV", GvEGV(sv));
1777 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1778 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1779 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1780 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
1781 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1782 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1783 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1785 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1786 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1787 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
1789 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
1790 PTR2UV(IoTOP_GV(sv)));
1791 do_sv_dump (level+1, file, (SV *) IoTOP_GV(sv), nest+1, maxnest,
1794 /* Source filters hide things that are not GVs in these three, so let's
1795 be careful out there. */
1797 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
1798 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
1799 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
1801 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
1802 PTR2UV(IoFMT_GV(sv)));
1803 do_sv_dump (level+1, file, (SV *) IoFMT_GV(sv), nest+1, maxnest,
1806 if (IoBOTTOM_NAME(sv))
1807 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
1808 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
1809 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
1811 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
1812 PTR2UV(IoBOTTOM_GV(sv)));
1813 do_sv_dump (level+1, file, (SV *) IoBOTTOM_GV(sv), nest+1, maxnest,
1816 Perl_dump_indent(aTHX_ level, file, " SUBPROCESS = %"IVdf"\n", (IV)IoSUBPROCESS(sv));
1817 if (isPRINT(IoTYPE(sv)))
1818 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
1820 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
1821 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
1828 Perl_sv_dump(pTHX_ SV *sv)
1831 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
1835 Perl_runops_debug(pTHX)
1839 if (ckWARN_d(WARN_DEBUGGING))
1840 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
1844 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
1848 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
1849 PerlIO_printf(Perl_debug_log,
1850 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
1851 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
1852 PTR2UV(*PL_watchaddr));
1853 if (DEBUG_s_TEST_) {
1854 if (DEBUG_v_TEST_) {
1855 PerlIO_printf(Perl_debug_log, "\n");
1863 if (DEBUG_t_TEST_) debop(PL_op);
1864 if (DEBUG_P_TEST_) debprof(PL_op);
1866 } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX)));
1867 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
1874 Perl_debop(pTHX_ const OP *o)
1877 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
1880 Perl_deb(aTHX_ "%s", OP_NAME(o));
1881 switch (o->op_type) {
1883 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
1888 SV * const sv = newSV(0);
1890 /* FIXME - it this making unwarranted assumptions about the
1891 UTF-8 cleanliness of the dump file handle? */
1894 gv_fullname3(sv, cGVOPo_gv, NULL);
1895 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
1899 PerlIO_printf(Perl_debug_log, "(NULL)");
1905 /* print the lexical's name */
1906 CV * const cv = deb_curcv(cxstack_ix);
1909 AV * const padlist = CvPADLIST(cv);
1910 AV * const comppad = (AV*)(*av_fetch(padlist, 0, FALSE));
1911 sv = *av_fetch(comppad, o->op_targ, FALSE);
1915 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
1917 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
1923 PerlIO_printf(Perl_debug_log, "\n");
1928 S_deb_curcv(pTHX_ I32 ix)
1931 const PERL_CONTEXT * const cx = &cxstack[ix];
1932 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
1933 return cx->blk_sub.cv;
1934 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
1936 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
1941 return deb_curcv(ix - 1);
1945 Perl_watch(pTHX_ char **addr)
1948 PL_watchaddr = addr;
1950 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
1951 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
1955 S_debprof(pTHX_ const OP *o)
1958 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
1960 if (!PL_profiledata)
1961 Newxz(PL_profiledata, MAXO, U32);
1962 ++PL_profiledata[o->op_type];
1966 Perl_debprofdump(pTHX)
1970 if (!PL_profiledata)
1972 for (i = 0; i < MAXO; i++) {
1973 if (PL_profiledata[i])
1974 PerlIO_printf(Perl_debug_log,
1975 "%5lu %s\n", (unsigned long)PL_profiledata[i],
1982 * XML variants of most of the above routines
1987 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
1990 PerlIO_printf(file, "\n ");
1991 va_start(args, pat);
1992 xmldump_vindent(level, file, pat, &args);
1998 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2001 va_start(args, pat);
2002 xmldump_vindent(level, file, pat, &args);
2007 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2009 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2010 PerlIO_vprintf(file, pat, *args);
2014 Perl_xmldump_all(pTHX)
2016 PerlIO_setlinebuf(PL_xmlfp);
2018 op_xmldump(PL_main_root);
2019 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2020 PerlIO_close(PL_xmlfp);
2025 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2030 if (!HvARRAY(stash))
2032 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2033 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2034 GV *gv = (GV*)HeVAL(entry);
2036 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2042 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2043 && (hv = GvHV(gv)) && hv != PL_defstash)
2044 xmldump_packsubs(hv); /* nested package */
2050 Perl_xmldump_sub(pTHX_ const GV *gv)
2052 SV *sv = sv_newmortal();
2054 gv_fullname3(sv, gv, Nullch);
2055 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2056 if (CvXSUB(GvCV(gv)))
2057 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2058 PTR2UV(CvXSUB(GvCV(gv))),
2059 (int)CvXSUBANY(GvCV(gv)).any_i32);
2060 else if (CvROOT(GvCV(gv)))
2061 op_xmldump(CvROOT(GvCV(gv)));
2063 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2067 Perl_xmldump_form(pTHX_ const GV *gv)
2069 SV *sv = sv_newmortal();
2071 gv_fullname3(sv, gv, Nullch);
2072 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2073 if (CvROOT(GvFORM(gv)))
2074 op_xmldump(CvROOT(GvFORM(gv)));
2076 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2080 Perl_xmldump_eval(pTHX)
2082 op_xmldump(PL_eval_root);
2086 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2088 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2092 Perl_sv_catxmlpvn(pTHX_ SV *dsv, char* pv, STRLEN len, int utf8)
2100 sv_catpvn(dsv,"",0);
2101 dsvcur = SvCUR(dsv); /* in case we have to restart */
2106 c = utf8_to_uvchr((U8*)pv, &cl);
2108 SvCUR(dsv) = dsvcur;
2173 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2176 Perl_sv_catpvf(aTHX_ dsv, "<");
2179 Perl_sv_catpvf(aTHX_ dsv, ">");
2182 Perl_sv_catpvf(aTHX_ dsv, "&");
2185 Perl_sv_catpvf(aTHX_ dsv, """);
2189 if (c < 32 || c > 127) {
2190 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2193 Perl_sv_catpvf(aTHX_ dsv, "%c", c);
2197 if ((c >= 0xD800 && c <= 0xDB7F) ||
2198 (c >= 0xDC00 && c <= 0xDFFF) ||
2199 (c >= 0xFFF0 && c <= 0xFFFF) ||
2201 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2203 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2216 Perl_sv_xmlpeek(pTHX_ SV *sv)
2218 SV *t = sv_newmortal();
2223 sv_setpvn(t, "", 0);
2226 sv_catpv(t, "VOID=\"\"");
2229 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
2230 sv_catpv(t, "WILD=\"\"");
2233 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2234 if (sv == &PL_sv_undef) {
2235 sv_catpv(t, "SV_UNDEF=\"1\"");
2236 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2237 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2241 else if (sv == &PL_sv_no) {
2242 sv_catpv(t, "SV_NO=\"1\"");
2243 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2244 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2245 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2246 SVp_POK|SVp_NOK)) &&
2251 else if (sv == &PL_sv_yes) {
2252 sv_catpv(t, "SV_YES=\"1\"");
2253 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2254 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2255 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2256 SVp_POK|SVp_NOK)) &&
2258 SvPVX(sv) && *SvPVX(sv) == '1' &&
2263 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2264 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2265 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2269 sv_catpv(t, " XXX=\"\" ");
2271 else if (SvREFCNT(sv) == 0) {
2272 sv_catpv(t, " refcnt=\"0\"");
2275 else if (DEBUG_R_TEST_) {
2278 /* is this SV on the tmps stack? */
2279 for (ix=PL_tmps_ix; ix>=0; ix--) {
2280 if (PL_tmps_stack[ix] == sv) {
2285 if (SvREFCNT(sv) > 1)
2286 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2289 sv_catpv(t, " DRT=\"<T>\"");
2293 sv_catpv(t, " ROK=\"\"");
2295 switch (SvTYPE(sv)) {
2297 sv_catpv(t, " FREED=\"1\"");
2301 sv_catpv(t, " UNDEF=\"1\"");
2304 sv_catpv(t, " IV=\"");
2307 sv_catpv(t, " NV=\"");
2310 sv_catpv(t, " RV=\"");
2313 sv_catpv(t, " PV=\"");
2316 sv_catpv(t, " PVIV=\"");
2319 sv_catpv(t, " PVNV=\"");
2322 sv_catpv(t, " PVMG=\"");
2325 sv_catpv(t, " PVLV=\"");
2328 sv_catpv(t, " AV=\"");
2331 sv_catpv(t, " HV=\"");
2335 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2337 sv_catpv(t, " CV=\"()\"");
2340 sv_catpv(t, " GV=\"");
2343 sv_catpv(t, " BIND=\"");
2346 sv_catpv(t, " FM=\"");
2349 sv_catpv(t, " IO=\"");
2358 else if (SvNOKp(sv)) {
2359 STORE_NUMERIC_LOCAL_SET_STANDARD();
2360 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2361 RESTORE_NUMERIC_LOCAL();
2363 else if (SvIOKp(sv)) {
2365 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2367 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2378 return SvPV(t, n_a);
2382 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2385 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2388 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2391 char *s = PM_GETRE(pm)->precomp;
2392 SV *tmpsv = newSV(0);
2394 sv_catxmlpvn(tmpsv, s, strlen(s), 1);
2395 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2397 SvREFCNT_dec(tmpsv);
2398 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2399 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2402 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2403 if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) {
2404 SV * const tmpsv = pm_description(pm);
2405 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2406 SvREFCNT_dec(tmpsv);
2410 if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
2411 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2412 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2413 do_op_xmldump(level+2, file, pm->op_pmreplroot);
2414 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2415 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2418 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2422 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2424 do_pmop_xmldump(0, PL_xmlfp, pm);
2428 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2435 seq = sequence_num(o);
2436 Perl_xmldump_indent(aTHX_ level, file,
2437 "<op_%s seq=\"%"UVuf" -> ",
2442 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2443 sequence_num(o->op_next));
2445 PerlIO_printf(file, "DONE\"");
2448 if (o->op_type == OP_NULL)
2450 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2451 if (o->op_targ == OP_NEXTSTATE)
2454 PerlIO_printf(file, " line=\"%"UVuf"\"",
2455 (UV)CopLINE(cCOPo));
2456 if (CopSTASHPV(cCOPo))
2457 PerlIO_printf(file, " package=\"%s\"",
2459 if (cCOPo->cop_label)
2460 PerlIO_printf(file, " label=\"%s\"",
2465 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2468 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2471 SV *tmpsv = newSVpvn("", 0);
2472 switch (o->op_flags & OPf_WANT) {
2474 sv_catpv(tmpsv, ",VOID");
2476 case OPf_WANT_SCALAR:
2477 sv_catpv(tmpsv, ",SCALAR");
2480 sv_catpv(tmpsv, ",LIST");
2483 sv_catpv(tmpsv, ",UNKNOWN");
2486 if (o->op_flags & OPf_KIDS)
2487 sv_catpv(tmpsv, ",KIDS");
2488 if (o->op_flags & OPf_PARENS)
2489 sv_catpv(tmpsv, ",PARENS");
2490 if (o->op_flags & OPf_STACKED)
2491 sv_catpv(tmpsv, ",STACKED");
2492 if (o->op_flags & OPf_REF)
2493 sv_catpv(tmpsv, ",REF");
2494 if (o->op_flags & OPf_MOD)
2495 sv_catpv(tmpsv, ",MOD");
2496 if (o->op_flags & OPf_SPECIAL)
2497 sv_catpv(tmpsv, ",SPECIAL");
2498 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2499 SvREFCNT_dec(tmpsv);
2501 if (o->op_private) {
2502 SV *tmpsv = newSVpvn("", 0);
2503 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2504 if (o->op_private & OPpTARGET_MY)
2505 sv_catpv(tmpsv, ",TARGET_MY");
2507 else if (o->op_type == OP_LEAVESUB ||
2508 o->op_type == OP_LEAVE ||
2509 o->op_type == OP_LEAVESUBLV ||
2510 o->op_type == OP_LEAVEWRITE) {
2511 if (o->op_private & OPpREFCOUNTED)
2512 sv_catpv(tmpsv, ",REFCOUNTED");
2514 else if (o->op_type == OP_AASSIGN) {
2515 if (o->op_private & OPpASSIGN_COMMON)
2516 sv_catpv(tmpsv, ",COMMON");
2518 else if (o->op_type == OP_SASSIGN) {
2519 if (o->op_private & OPpASSIGN_BACKWARDS)
2520 sv_catpv(tmpsv, ",BACKWARDS");
2522 else if (o->op_type == OP_TRANS) {
2523 if (o->op_private & OPpTRANS_SQUASH)
2524 sv_catpv(tmpsv, ",SQUASH");
2525 if (o->op_private & OPpTRANS_DELETE)
2526 sv_catpv(tmpsv, ",DELETE");
2527 if (o->op_private & OPpTRANS_COMPLEMENT)
2528 sv_catpv(tmpsv, ",COMPLEMENT");
2529 if (o->op_private & OPpTRANS_IDENTICAL)
2530 sv_catpv(tmpsv, ",IDENTICAL");
2531 if (o->op_private & OPpTRANS_GROWS)
2532 sv_catpv(tmpsv, ",GROWS");
2534 else if (o->op_type == OP_REPEAT) {
2535 if (o->op_private & OPpREPEAT_DOLIST)
2536 sv_catpv(tmpsv, ",DOLIST");
2538 else if (o->op_type == OP_ENTERSUB ||
2539 o->op_type == OP_RV2SV ||
2540 o->op_type == OP_GVSV ||
2541 o->op_type == OP_RV2AV ||
2542 o->op_type == OP_RV2HV ||
2543 o->op_type == OP_RV2GV ||
2544 o->op_type == OP_AELEM ||
2545 o->op_type == OP_HELEM )
2547 if (o->op_type == OP_ENTERSUB) {
2548 if (o->op_private & OPpENTERSUB_AMPER)
2549 sv_catpv(tmpsv, ",AMPER");
2550 if (o->op_private & OPpENTERSUB_DB)
2551 sv_catpv(tmpsv, ",DB");
2552 if (o->op_private & OPpENTERSUB_HASTARG)
2553 sv_catpv(tmpsv, ",HASTARG");
2554 if (o->op_private & OPpENTERSUB_NOPAREN)
2555 sv_catpv(tmpsv, ",NOPAREN");
2556 if (o->op_private & OPpENTERSUB_INARGS)
2557 sv_catpv(tmpsv, ",INARGS");
2558 if (o->op_private & OPpENTERSUB_NOMOD)
2559 sv_catpv(tmpsv, ",NOMOD");
2562 switch (o->op_private & OPpDEREF) {
2564 sv_catpv(tmpsv, ",SV");
2567 sv_catpv(tmpsv, ",AV");
2570 sv_catpv(tmpsv, ",HV");
2573 if (o->op_private & OPpMAYBE_LVSUB)
2574 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2576 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2577 if (o->op_private & OPpLVAL_DEFER)
2578 sv_catpv(tmpsv, ",LVAL_DEFER");
2581 if (o->op_private & HINT_STRICT_REFS)
2582 sv_catpv(tmpsv, ",STRICT_REFS");
2583 if (o->op_private & OPpOUR_INTRO)
2584 sv_catpv(tmpsv, ",OUR_INTRO");
2587 else if (o->op_type == OP_CONST) {
2588 if (o->op_private & OPpCONST_BARE)
2589 sv_catpv(tmpsv, ",BARE");
2590 if (o->op_private & OPpCONST_STRICT)
2591 sv_catpv(tmpsv, ",STRICT");
2592 if (o->op_private & OPpCONST_ARYBASE)
2593 sv_catpv(tmpsv, ",ARYBASE");
2594 if (o->op_private & OPpCONST_WARNING)
2595 sv_catpv(tmpsv, ",WARNING");
2596 if (o->op_private & OPpCONST_ENTERED)
2597 sv_catpv(tmpsv, ",ENTERED");
2599 else if (o->op_type == OP_FLIP) {
2600 if (o->op_private & OPpFLIP_LINENUM)
2601 sv_catpv(tmpsv, ",LINENUM");
2603 else if (o->op_type == OP_FLOP) {
2604 if (o->op_private & OPpFLIP_LINENUM)
2605 sv_catpv(tmpsv, ",LINENUM");
2607 else if (o->op_type == OP_RV2CV) {
2608 if (o->op_private & OPpLVAL_INTRO)
2609 sv_catpv(tmpsv, ",INTRO");
2611 else if (o->op_type == OP_GV) {
2612 if (o->op_private & OPpEARLY_CV)
2613 sv_catpv(tmpsv, ",EARLY_CV");
2615 else if (o->op_type == OP_LIST) {
2616 if (o->op_private & OPpLIST_GUESSED)
2617 sv_catpv(tmpsv, ",GUESSED");
2619 else if (o->op_type == OP_DELETE) {
2620 if (o->op_private & OPpSLICE)
2621 sv_catpv(tmpsv, ",SLICE");
2623 else if (o->op_type == OP_EXISTS) {
2624 if (o->op_private & OPpEXISTS_SUB)
2625 sv_catpv(tmpsv, ",EXISTS_SUB");
2627 else if (o->op_type == OP_SORT) {
2628 if (o->op_private & OPpSORT_NUMERIC)
2629 sv_catpv(tmpsv, ",NUMERIC");
2630 if (o->op_private & OPpSORT_INTEGER)
2631 sv_catpv(tmpsv, ",INTEGER");
2632 if (o->op_private & OPpSORT_REVERSE)
2633 sv_catpv(tmpsv, ",REVERSE");
2635 else if (o->op_type == OP_THREADSV) {
2636 if (o->op_private & OPpDONE_SVREF)
2637 sv_catpv(tmpsv, ",SVREF");
2639 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2640 if (o->op_private & OPpOPEN_IN_RAW)
2641 sv_catpv(tmpsv, ",IN_RAW");
2642 if (o->op_private & OPpOPEN_IN_CRLF)
2643 sv_catpv(tmpsv, ",IN_CRLF");
2644 if (o->op_private & OPpOPEN_OUT_RAW)
2645 sv_catpv(tmpsv, ",OUT_RAW");
2646 if (o->op_private & OPpOPEN_OUT_CRLF)
2647 sv_catpv(tmpsv, ",OUT_CRLF");
2649 else if (o->op_type == OP_EXIT) {
2650 if (o->op_private & OPpEXIT_VMSISH)
2651 sv_catpv(tmpsv, ",EXIT_VMSISH");
2652 if (o->op_private & OPpHUSH_VMSISH)
2653 sv_catpv(tmpsv, ",HUSH_VMSISH");
2655 else if (o->op_type == OP_DIE) {
2656 if (o->op_private & OPpHUSH_VMSISH)
2657 sv_catpv(tmpsv, ",HUSH_VMSISH");
2659 else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
2660 if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS)
2661 sv_catpv(tmpsv, ",FT_ACCESS");
2662 if (o->op_private & OPpFT_STACKED)
2663 sv_catpv(tmpsv, ",FT_STACKED");
2665 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2666 sv_catpv(tmpsv, ",INTRO");
2668 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
2669 SvREFCNT_dec(tmpsv);
2672 switch (o->op_type) {
2674 if (o->op_flags & OPf_SPECIAL) {
2680 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
2682 if (cSVOPo->op_sv) {
2683 SV *tmpsv1 = newSV(0);
2684 SV *tmpsv2 = newSV(0);
2692 gv_fullname3(tmpsv1, (GV*)cSVOPo->op_sv, Nullch);
2693 s = SvPV(tmpsv1,len);
2694 sv_catxmlpvn(tmpsv2, s, len, 1);
2695 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
2699 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
2703 case OP_METHOD_NAMED:
2704 #ifndef USE_ITHREADS
2705 /* with ITHREADS, consts are stored in the pad, and the right pad
2706 * may not be active here, so skip */
2707 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
2713 PerlIO_printf(file, ">\n");
2715 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
2721 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
2722 (UV)CopLINE(cCOPo));
2723 if (CopSTASHPV(cCOPo))
2724 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
2726 if (cCOPo->cop_label)
2727 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
2731 S_xmldump_attr(aTHX_ level, file, "redo=\"");
2732 if (cLOOPo->op_redoop)
2733 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
2735 PerlIO_printf(file, "DONE\"");
2736 S_xmldump_attr(aTHX_ level, file, "next=\"");
2737 if (cLOOPo->op_nextop)
2738 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
2740 PerlIO_printf(file, "DONE\"");
2741 S_xmldump_attr(aTHX_ level, file, "last=\"");
2742 if (cLOOPo->op_lastop)
2743 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
2745 PerlIO_printf(file, "DONE\"");
2753 S_xmldump_attr(aTHX_ level, file, "other=\"");
2754 if (cLOGOPo->op_other)
2755 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
2757 PerlIO_printf(file, "DONE\"");
2765 if (o->op_private & OPpREFCOUNTED)
2766 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
2772 if (PL_madskills && o->op_madprop) {
2773 SV *tmpsv = newSVpvn("", 0);
2774 MADPROP* mp = o->op_madprop;
2775 sv_utf8_upgrade(tmpsv);
2778 PerlIO_printf(file, ">\n");
2780 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
2783 char tmp = mp->mad_key;
2784 sv_setpvn(tmpsv,"\"",1);
2786 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
2787 sv_catpv(tmpsv, "\"");
2788 switch (mp->mad_type) {
2790 sv_catpv(tmpsv, "NULL");
2791 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
2794 sv_catpv(tmpsv, " val=\"");
2795 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
2796 sv_catpv(tmpsv, "\"");
2797 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
2800 sv_catpv(tmpsv, " val=\"");
2801 sv_catxmlsv(tmpsv, (SV*)mp->mad_val);
2802 sv_catpv(tmpsv, "\"");
2803 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
2806 if ((OP*)mp->mad_val) {
2807 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
2808 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
2809 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
2813 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
2819 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
2821 SvREFCNT_dec(tmpsv);
2824 switch (o->op_type) {
2831 PerlIO_printf(file, ">\n");
2833 do_pmop_xmldump(level, file, cPMOPo);
2839 if (o->op_flags & OPf_KIDS) {
2843 PerlIO_printf(file, ">\n");
2845 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
2846 do_op_xmldump(level, file, kid);
2850 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
2852 PerlIO_printf(file, " />\n");
2856 Perl_op_xmldump(pTHX_ const OP *o)
2858 do_op_xmldump(0, PL_xmlfp, o);
2864 * c-indentation-style: bsd
2866 * indent-tabs-mode: t
2869 * ex: set ts=8 sts=4 sw=4 noet: