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 #define Sequence PL_op_sequence
33 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
37 dump_vindent(level, file, pat, &args);
42 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
45 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
46 PerlIO_vprintf(file, pat, *args);
53 PerlIO_setlinebuf(Perl_debug_log);
55 op_dump(PL_main_root);
56 dump_packsubs(PL_defstash);
60 Perl_dump_packsubs(pTHX_ const HV *stash)
67 for (i = 0; i <= (I32) HvMAX(stash); i++) {
69 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
70 const GV *gv = (GV*)HeVAL(entry);
72 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
78 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
79 && (hv = GvHV(gv)) && hv != PL_defstash)
80 dump_packsubs(hv); /* nested package */
86 Perl_dump_sub(pTHX_ const GV *gv)
88 SV * const sv = sv_newmortal();
90 gv_fullname3(sv, gv, NULL);
91 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
92 if (CvISXSUB(GvCV(gv)))
93 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
94 PTR2UV(CvXSUB(GvCV(gv))),
95 (int)CvXSUBANY(GvCV(gv)).any_i32);
96 else if (CvROOT(GvCV(gv)))
97 op_dump(CvROOT(GvCV(gv)));
99 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
103 Perl_dump_form(pTHX_ const GV *gv)
105 SV * const sv = sv_newmortal();
107 gv_fullname3(sv, gv, NULL);
108 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
109 if (CvROOT(GvFORM(gv)))
110 op_dump(CvROOT(GvFORM(gv)));
112 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
119 op_dump(PL_eval_root);
124 =for apidoc Apd|char*|pv_escape|NN SV *dsv|NN const U8 const *str\
125 |const STRLEN count|const STRLEN max
126 |STRLEN const *escaped, const U32 flags
128 Escapes at most the first "count" chars of pv and puts the results into
129 dsv such that the size of the escaped string will not exceed "max" chars
130 and will not contain any incomplete escape sequences.
132 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
133 will also be escaped.
135 Normally the SV will be cleared before the escaped string is prepared,
136 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
138 If PERL_PV_ESCAPE_UNI is set then the input string is treated as unicode,
139 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
140 using C<is_utf8_string()> to determine if it is unicode.
142 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
143 using C<\x01F1> style escapes, otherwise only chars above 255 will be
144 escaped using this style, other non printable chars will use octal or
145 common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
146 then all chars below 255 will be treated as printable and
147 will be output as literals.
149 If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
150 string will be escaped, regardles of max. If the string is utf8 and
151 the chars value is >255 then it will be returned as a plain hex
152 sequence. Thus the output will either be a single char,
153 an octal escape sequence, a special escape like C<\n> or a 3 or
154 more digit hex value.
156 Returns a pointer to the escaped text as held by dsv.
160 #define PV_ESCAPE_OCTBUFSIZE 32
162 Perl_pv_escape( pTHX_ SV *dsv, U8 const * const str,
163 const STRLEN count, const STRLEN max,
164 STRLEN * const escaped, const U32 flags )
166 U8 dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : '\\';
167 U8 octbuf[PV_ESCAPE_OCTBUFSIZE] = "\\123456789ABCDF";
168 STRLEN wrote = 0; /* chars written so far */
169 STRLEN chsize = 0; /* size of data to be written */
170 STRLEN readsize = 1; /* size of data just read */
171 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this unicode */
173 const U8 *end = pv + count; /* end of string */
175 if (!flags & PERL_PV_ESCAPE_NOCLEAR)
176 sv_setpvn(dsv, "", 0);
178 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string(pv, count))
181 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
182 const UV u= (isuni) ? utf8_to_uvchr(pv, &readsize) : *pv;
183 const U8 c = (U8)u & 0xFF;
185 if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) {
186 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
187 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
190 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
192 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
195 if ( (c == dq) || (c == '\\') || !isPRINT(c) ) {
198 case '\\' : octbuf[1] = '\\'; break;
199 case '\v' : octbuf[1] = 'v'; break;
200 case '\t' : octbuf[1] = 't'; break;
201 case '\r' : octbuf[1] = 'r'; break;
202 case '\n' : octbuf[1] = 'n'; break;
203 case '\f' : octbuf[1] = 'f'; break;
211 if ( (pv < end) && isDIGIT(*(pv+readsize)) )
212 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
215 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
222 if ( max && (wrote + chsize > max) ) {
224 } else if (chsize > 1) {
225 sv_catpvn(dsv, octbuf, chsize);
228 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
231 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
239 =for apidoc Apd|char *|pv_pretty|NN SV *dsv|NN const U8 const *str\
240 |const STRLEN count|const STRLEN max\
241 |const U8 const *start_color| const U8 const *end_color\
244 Converts a string into something presentable, handling escaping via
245 pv_escape() and supporting quoting and elipses.
247 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
248 double quoted with any double quotes in the string escaped. Otherwise
249 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
252 If the PERL_PV_PRETTY_ELIPSES flag is set and not all characters in
253 string were output then an elipses C<...> will be appended to the
254 string. Note that this happens AFTER it has been quoted.
256 If start_color is non-null then it will be inserted after the opening
257 quote (if there is one) but before the escaped text. If end_color
258 is non-null then it will be inserted after the escaped text but before
259 any quotes or elipses.
261 Returns a pointer to the prettified text as held by dsv.
267 Perl_pv_pretty( pTHX_ SV *dsv, U8 const * const str, const STRLEN count,
268 const STRLEN max, U8 const * const start_color, U8 const * const end_color,
271 U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '\\';
275 sv_setpvn(dsv, "\"", 1);
276 else if ( flags & PERL_PV_PRETTY_LTGT )
277 sv_setpvn(dsv, "<", 1);
279 sv_setpvn(dsv, "", 0);
281 if ( start_color != NULL )
282 Perl_sv_catpvf( aTHX_ dsv, "%s", start_color);
284 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
286 if ( end_color != NULL )
287 Perl_sv_catpvf( aTHX_ dsv, "%s", end_color);
290 sv_catpvn( dsv, "\"", 1 );
291 else if ( flags & PERL_PV_PRETTY_LTGT )
292 sv_catpvn( dsv, ">", 1);
294 if ( (flags & PERL_PV_PRETTY_ELIPSES) && ( escaped < count ) )
295 sv_catpvn( dsv, "...", 3 );
301 =for apidoc pv_display
303 char *pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len,
304 STRLEN pvlim, U32 flags)
308 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
310 except that an additional "\0" will be appended to the string when
311 len > cur and pv[cur] is "\0".
313 Note that the final string may be up to 7 chars longer than pvlim.
319 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
321 pv_pretty( dsv, pv, cur, pvlim, 0, 0, PERL_PV_PRETTY_DUMP);
322 if (len > cur && pv[cur] == '\0')
323 sv_catpvn( dsv, "\\0", 2 );
328 Perl_sv_peek(pTHX_ SV *sv)
331 SV * const t = sv_newmortal();
340 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
344 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
345 if (sv == &PL_sv_undef) {
346 sv_catpv(t, "SV_UNDEF");
347 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
348 SVs_GMG|SVs_SMG|SVs_RMG)) &&
352 else if (sv == &PL_sv_no) {
353 sv_catpv(t, "SV_NO");
354 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
355 SVs_GMG|SVs_SMG|SVs_RMG)) &&
356 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
362 else if (sv == &PL_sv_yes) {
363 sv_catpv(t, "SV_YES");
364 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
365 SVs_GMG|SVs_SMG|SVs_RMG)) &&
366 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
369 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
374 sv_catpv(t, "SV_PLACEHOLDER");
375 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
376 SVs_GMG|SVs_SMG|SVs_RMG)) &&
382 else if (SvREFCNT(sv) == 0) {
386 else if (DEBUG_R_TEST_) {
389 /* is this SV on the tmps stack? */
390 for (ix=PL_tmps_ix; ix>=0; ix--) {
391 if (PL_tmps_stack[ix] == sv) {
396 if (SvREFCNT(sv) > 1)
397 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
405 if (SvCUR(t) + unref > 10) {
406 SvCUR_set(t, unref + 3);
414 switch (SvTYPE(sv)) {
416 sv_catpv(t, "FREED");
420 sv_catpv(t, "UNDEF");
454 Perl_sv_catpvf(aTHX_ t, "CV(%s)", GvNAME(CvGV(sv)));
473 if (!SvPVX_const(sv))
474 sv_catpv(t, "(null)");
476 SV * const tmp = newSVpvs("");
479 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, 127));
480 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
482 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
483 sv_uni_display(tmp, sv, 8 * sv_len_utf8(sv),
488 else if (SvNOKp(sv)) {
489 STORE_NUMERIC_LOCAL_SET_STANDARD();
490 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
491 RESTORE_NUMERIC_LOCAL();
493 else if (SvIOKp(sv)) {
495 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
497 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
507 return SvPV_nolen(t);
511 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
516 Perl_dump_indent(aTHX_ level, file, "{}\n");
519 Perl_dump_indent(aTHX_ level, file, "{\n");
521 if (pm->op_pmflags & PMf_ONCE)
526 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
527 ch, PM_GETRE(pm)->precomp, ch,
528 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
530 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
531 if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
532 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
533 op_dump(pm->op_pmreplroot);
535 if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) {
536 SV * const tmpsv = pm_description(pm);
537 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
541 Perl_dump_indent(aTHX_ level-1, file, "}\n");
545 S_pm_description(pTHX_ const PMOP *pm)
547 SV * const desc = newSVpvs("");
548 const REGEXP * regex = PM_GETRE(pm);
549 const U32 pmflags = pm->op_pmflags;
551 if (pm->op_pmdynflags & PMdf_USED)
552 sv_catpv(desc, ",USED");
553 if (pm->op_pmdynflags & PMdf_TAINTED)
554 sv_catpv(desc, ",TAINTED");
556 if (pmflags & PMf_ONCE)
557 sv_catpv(desc, ",ONCE");
558 if (regex && regex->check_substr) {
559 if (!(regex->reganch & ROPT_NOSCAN))
560 sv_catpv(desc, ",SCANFIRST");
561 if (regex->reganch & ROPT_CHECK_ALL)
562 sv_catpv(desc, ",ALL");
564 if (pmflags & PMf_SKIPWHITE)
565 sv_catpv(desc, ",SKIPWHITE");
566 if (pmflags & PMf_CONST)
567 sv_catpv(desc, ",CONST");
568 if (pmflags & PMf_KEEP)
569 sv_catpv(desc, ",KEEP");
570 if (pmflags & PMf_GLOBAL)
571 sv_catpv(desc, ",GLOBAL");
572 if (pmflags & PMf_CONTINUE)
573 sv_catpv(desc, ",CONTINUE");
574 if (pmflags & PMf_RETAINT)
575 sv_catpv(desc, ",RETAINT");
576 if (pmflags & PMf_EVAL)
577 sv_catpv(desc, ",EVAL");
582 Perl_pmop_dump(pTHX_ PMOP *pm)
584 do_pmop_dump(0, Perl_debug_log, pm);
587 /* An op sequencer. We visit the ops in the order they're to execute. */
590 S_sequence(pTHX_ register const OP *o)
593 const OP *oldop = NULL;
606 for (; o; o = o->op_next) {
608 SV * const op = newSVuv(PTR2UV(o));
609 const char * const key = SvPV_const(op, len);
611 if (hv_exists(Sequence, key, len))
614 switch (o->op_type) {
616 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
617 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
626 if (oldop && o->op_next)
633 if (oldop && o->op_next)
635 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
648 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
649 sequence_tail(cLOGOPo->op_other);
654 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
655 sequence_tail(cLOOPo->op_redoop);
656 sequence_tail(cLOOPo->op_nextop);
657 sequence_tail(cLOOPo->op_lastop);
663 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
664 sequence_tail(cPMOPo->op_pmreplstart);
671 hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
679 S_sequence_tail(pTHX_ const OP *o)
681 while (o && (o->op_type == OP_NULL))
687 S_sequence_num(pTHX_ const OP *o)
695 op = newSVuv(PTR2UV(o));
696 key = SvPV_const(op, len);
697 seq = hv_fetch(Sequence, key, len, 0);
698 return seq ? SvUV(*seq): 0;
702 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
706 const OPCODE optype = o->op_type;
709 Perl_dump_indent(aTHX_ level, file, "{\n");
711 seq = sequence_num(o);
713 PerlIO_printf(file, "%-4"UVf, seq);
715 PerlIO_printf(file, " ");
717 "%*sTYPE = %s ===> ",
718 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
720 PerlIO_printf(file, seq ? "%"UVf"\n" : "(%"UVf")\n",
721 sequence_num(o->op_next));
723 PerlIO_printf(file, "DONE\n");
725 if (optype == OP_NULL) {
726 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
727 if (o->op_targ == OP_NEXTSTATE) {
729 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVf"\n",
731 if (CopSTASHPV(cCOPo))
732 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
734 if (cCOPo->cop_label)
735 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
740 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
743 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
746 SV * const tmpsv = newSVpvs("");
747 switch (o->op_flags & OPf_WANT) {
749 sv_catpv(tmpsv, ",VOID");
751 case OPf_WANT_SCALAR:
752 sv_catpv(tmpsv, ",SCALAR");
755 sv_catpv(tmpsv, ",LIST");
758 sv_catpv(tmpsv, ",UNKNOWN");
761 if (o->op_flags & OPf_KIDS)
762 sv_catpv(tmpsv, ",KIDS");
763 if (o->op_flags & OPf_PARENS)
764 sv_catpv(tmpsv, ",PARENS");
765 if (o->op_flags & OPf_STACKED)
766 sv_catpv(tmpsv, ",STACKED");
767 if (o->op_flags & OPf_REF)
768 sv_catpv(tmpsv, ",REF");
769 if (o->op_flags & OPf_MOD)
770 sv_catpv(tmpsv, ",MOD");
771 if (o->op_flags & OPf_SPECIAL)
772 sv_catpv(tmpsv, ",SPECIAL");
773 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
777 SV * const tmpsv = newSVpvs("");
778 if (PL_opargs[optype] & OA_TARGLEX) {
779 if (o->op_private & OPpTARGET_MY)
780 sv_catpv(tmpsv, ",TARGET_MY");
782 else if (optype == OP_LEAVESUB ||
783 optype == OP_LEAVE ||
784 optype == OP_LEAVESUBLV ||
785 optype == OP_LEAVEWRITE) {
786 if (o->op_private & OPpREFCOUNTED)
787 sv_catpv(tmpsv, ",REFCOUNTED");
789 else if (optype == OP_AASSIGN) {
790 if (o->op_private & OPpASSIGN_COMMON)
791 sv_catpv(tmpsv, ",COMMON");
793 else if (optype == OP_SASSIGN) {
794 if (o->op_private & OPpASSIGN_BACKWARDS)
795 sv_catpv(tmpsv, ",BACKWARDS");
797 else if (optype == OP_TRANS) {
798 if (o->op_private & OPpTRANS_SQUASH)
799 sv_catpv(tmpsv, ",SQUASH");
800 if (o->op_private & OPpTRANS_DELETE)
801 sv_catpv(tmpsv, ",DELETE");
802 if (o->op_private & OPpTRANS_COMPLEMENT)
803 sv_catpv(tmpsv, ",COMPLEMENT");
804 if (o->op_private & OPpTRANS_IDENTICAL)
805 sv_catpv(tmpsv, ",IDENTICAL");
806 if (o->op_private & OPpTRANS_GROWS)
807 sv_catpv(tmpsv, ",GROWS");
809 else if (optype == OP_REPEAT) {
810 if (o->op_private & OPpREPEAT_DOLIST)
811 sv_catpv(tmpsv, ",DOLIST");
813 else if (optype == OP_ENTERSUB ||
814 optype == OP_RV2SV ||
816 optype == OP_RV2AV ||
817 optype == OP_RV2HV ||
818 optype == OP_RV2GV ||
819 optype == OP_AELEM ||
822 if (optype == OP_ENTERSUB) {
823 if (o->op_private & OPpENTERSUB_AMPER)
824 sv_catpv(tmpsv, ",AMPER");
825 if (o->op_private & OPpENTERSUB_DB)
826 sv_catpv(tmpsv, ",DB");
827 if (o->op_private & OPpENTERSUB_HASTARG)
828 sv_catpv(tmpsv, ",HASTARG");
829 if (o->op_private & OPpENTERSUB_NOPAREN)
830 sv_catpv(tmpsv, ",NOPAREN");
831 if (o->op_private & OPpENTERSUB_INARGS)
832 sv_catpv(tmpsv, ",INARGS");
833 if (o->op_private & OPpENTERSUB_NOMOD)
834 sv_catpv(tmpsv, ",NOMOD");
837 switch (o->op_private & OPpDEREF) {
839 sv_catpv(tmpsv, ",SV");
842 sv_catpv(tmpsv, ",AV");
845 sv_catpv(tmpsv, ",HV");
848 if (o->op_private & OPpMAYBE_LVSUB)
849 sv_catpv(tmpsv, ",MAYBE_LVSUB");
851 if (optype == OP_AELEM || optype == OP_HELEM) {
852 if (o->op_private & OPpLVAL_DEFER)
853 sv_catpv(tmpsv, ",LVAL_DEFER");
856 if (o->op_private & HINT_STRICT_REFS)
857 sv_catpv(tmpsv, ",STRICT_REFS");
858 if (o->op_private & OPpOUR_INTRO)
859 sv_catpv(tmpsv, ",OUR_INTRO");
862 else if (optype == OP_CONST) {
863 if (o->op_private & OPpCONST_BARE)
864 sv_catpv(tmpsv, ",BARE");
865 if (o->op_private & OPpCONST_STRICT)
866 sv_catpv(tmpsv, ",STRICT");
867 if (o->op_private & OPpCONST_ARYBASE)
868 sv_catpv(tmpsv, ",ARYBASE");
869 if (o->op_private & OPpCONST_WARNING)
870 sv_catpv(tmpsv, ",WARNING");
871 if (o->op_private & OPpCONST_ENTERED)
872 sv_catpv(tmpsv, ",ENTERED");
874 else if (optype == OP_FLIP) {
875 if (o->op_private & OPpFLIP_LINENUM)
876 sv_catpv(tmpsv, ",LINENUM");
878 else if (optype == OP_FLOP) {
879 if (o->op_private & OPpFLIP_LINENUM)
880 sv_catpv(tmpsv, ",LINENUM");
882 else if (optype == OP_RV2CV) {
883 if (o->op_private & OPpLVAL_INTRO)
884 sv_catpv(tmpsv, ",INTRO");
886 else if (optype == OP_GV) {
887 if (o->op_private & OPpEARLY_CV)
888 sv_catpv(tmpsv, ",EARLY_CV");
890 else if (optype == OP_LIST) {
891 if (o->op_private & OPpLIST_GUESSED)
892 sv_catpv(tmpsv, ",GUESSED");
894 else if (optype == OP_DELETE) {
895 if (o->op_private & OPpSLICE)
896 sv_catpv(tmpsv, ",SLICE");
898 else if (optype == OP_EXISTS) {
899 if (o->op_private & OPpEXISTS_SUB)
900 sv_catpv(tmpsv, ",EXISTS_SUB");
902 else if (optype == OP_SORT) {
903 if (o->op_private & OPpSORT_NUMERIC)
904 sv_catpv(tmpsv, ",NUMERIC");
905 if (o->op_private & OPpSORT_INTEGER)
906 sv_catpv(tmpsv, ",INTEGER");
907 if (o->op_private & OPpSORT_REVERSE)
908 sv_catpv(tmpsv, ",REVERSE");
910 else if (optype == OP_THREADSV) {
911 if (o->op_private & OPpDONE_SVREF)
912 sv_catpv(tmpsv, ",SVREF");
914 else if (optype == OP_OPEN || optype == OP_BACKTICK) {
915 if (o->op_private & OPpOPEN_IN_RAW)
916 sv_catpv(tmpsv, ",IN_RAW");
917 if (o->op_private & OPpOPEN_IN_CRLF)
918 sv_catpv(tmpsv, ",IN_CRLF");
919 if (o->op_private & OPpOPEN_OUT_RAW)
920 sv_catpv(tmpsv, ",OUT_RAW");
921 if (o->op_private & OPpOPEN_OUT_CRLF)
922 sv_catpv(tmpsv, ",OUT_CRLF");
924 else if (optype == OP_EXIT) {
925 if (o->op_private & OPpEXIT_VMSISH)
926 sv_catpv(tmpsv, ",EXIT_VMSISH");
927 if (o->op_private & OPpHUSH_VMSISH)
928 sv_catpv(tmpsv, ",HUSH_VMSISH");
930 else if (optype == OP_DIE) {
931 if (o->op_private & OPpHUSH_VMSISH)
932 sv_catpv(tmpsv, ",HUSH_VMSISH");
934 else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
935 if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS)
936 sv_catpv(tmpsv, ",FT_ACCESS");
937 if (o->op_private & OPpFT_STACKED)
938 sv_catpv(tmpsv, ",FT_STACKED");
940 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
941 sv_catpv(tmpsv, ",INTRO");
943 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
948 if (PL_madskills && o->op_madprop) {
949 SV * const tmpsv = newSVpvn("", 0);
950 MADPROP* mp = o->op_madprop;
951 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
954 char tmp = mp->mad_key;
955 sv_setpvn(tmpsv,"'",1);
957 sv_catpvn(tmpsv, &tmp, 1);
958 sv_catpv(tmpsv, "'=");
959 switch (mp->mad_type) {
961 sv_catpv(tmpsv, "NULL");
962 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
965 sv_catpv(tmpsv, "<");
966 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
967 sv_catpv(tmpsv, ">");
968 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
971 if ((OP*)mp->mad_val) {
972 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
973 do_op_dump(level, file, (OP*)mp->mad_val);
977 sv_catpv(tmpsv, "(UNK)");
978 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
984 Perl_dump_indent(aTHX_ level, file, "}\n");
995 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
997 if ( ! PL_op->op_flags & OPf_SPECIAL) { /* not lexical */
999 SV * const tmpsv = newSV(0);
1003 /* FIXME - it this making unwarranted assumptions about the
1004 UTF-8 cleanliness of the dump file handle? */
1007 gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, NULL);
1008 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1009 SvPV_nolen_const(tmpsv));
1013 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1018 case OP_METHOD_NAMED:
1019 #ifndef USE_ITHREADS
1020 /* with ITHREADS, consts are stored in the pad, and the right pad
1021 * may not be active here, so skip */
1022 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1029 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVf"\n",
1030 (UV)CopLINE(cCOPo));
1031 if (CopSTASHPV(cCOPo))
1032 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1034 if (cCOPo->cop_label)
1035 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1039 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1040 if (cLOOPo->op_redoop)
1041 PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_redoop));
1043 PerlIO_printf(file, "DONE\n");
1044 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1045 if (cLOOPo->op_nextop)
1046 PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_nextop));
1048 PerlIO_printf(file, "DONE\n");
1049 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1050 if (cLOOPo->op_lastop)
1051 PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_lastop));
1053 PerlIO_printf(file, "DONE\n");
1061 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1062 if (cLOGOPo->op_other)
1063 PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOGOPo->op_other));
1065 PerlIO_printf(file, "DONE\n");
1071 do_pmop_dump(level, file, cPMOPo);
1079 if (o->op_private & OPpREFCOUNTED)
1080 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1085 if (o->op_flags & OPf_KIDS) {
1087 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1088 do_op_dump(level, file, kid);
1090 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1094 Perl_op_dump(pTHX_ const OP *o)
1096 do_op_dump(0, Perl_debug_log, o);
1100 Perl_gv_dump(pTHX_ GV *gv)
1105 PerlIO_printf(Perl_debug_log, "{}\n");
1108 sv = sv_newmortal();
1109 PerlIO_printf(Perl_debug_log, "{\n");
1110 gv_fullname3(sv, gv, NULL);
1111 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1112 if (gv != GvEGV(gv)) {
1113 gv_efullname3(sv, GvEGV(gv), NULL);
1114 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1116 PerlIO_putc(Perl_debug_log, '\n');
1117 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1121 /* map magic types to the symbolic names
1122 * (with the PERL_MAGIC_ prefixed stripped)
1125 static const struct { const char type; const char *name; } magic_names[] = {
1126 { PERL_MAGIC_sv, "sv(\\0)" },
1127 { PERL_MAGIC_arylen, "arylen(#)" },
1128 { PERL_MAGIC_rhash, "rhash(%)" },
1129 { PERL_MAGIC_pos, "pos(.)" },
1130 { PERL_MAGIC_symtab, "symtab(:)" },
1131 { PERL_MAGIC_backref, "backref(<)" },
1132 { PERL_MAGIC_arylen_p, "arylen_p(@)" },
1133 { PERL_MAGIC_overload, "overload(A)" },
1134 { PERL_MAGIC_bm, "bm(B)" },
1135 { PERL_MAGIC_regdata, "regdata(D)" },
1136 { PERL_MAGIC_env, "env(E)" },
1137 { PERL_MAGIC_hints, "hints(H)" },
1138 { PERL_MAGIC_isa, "isa(I)" },
1139 { PERL_MAGIC_dbfile, "dbfile(L)" },
1140 { PERL_MAGIC_shared, "shared(N)" },
1141 { PERL_MAGIC_tied, "tied(P)" },
1142 { PERL_MAGIC_sig, "sig(S)" },
1143 { PERL_MAGIC_uvar, "uvar(U)" },
1144 { PERL_MAGIC_overload_elem, "overload_elem(a)" },
1145 { PERL_MAGIC_overload_table, "overload_table(c)" },
1146 { PERL_MAGIC_regdatum, "regdatum(d)" },
1147 { PERL_MAGIC_envelem, "envelem(e)" },
1148 { PERL_MAGIC_fm, "fm(f)" },
1149 { PERL_MAGIC_regex_global, "regex_global(g)" },
1150 { PERL_MAGIC_hintselem, "hintselem(h)" },
1151 { PERL_MAGIC_isaelem, "isaelem(i)" },
1152 { PERL_MAGIC_nkeys, "nkeys(k)" },
1153 { PERL_MAGIC_dbline, "dbline(l)" },
1154 { PERL_MAGIC_mutex, "mutex(m)" },
1155 { PERL_MAGIC_shared_scalar, "shared_scalar(n)" },
1156 { PERL_MAGIC_collxfrm, "collxfrm(o)" },
1157 { PERL_MAGIC_tiedelem, "tiedelem(p)" },
1158 { PERL_MAGIC_tiedscalar, "tiedscalar(q)" },
1159 { PERL_MAGIC_qr, "qr(r)" },
1160 { PERL_MAGIC_sigelem, "sigelem(s)" },
1161 { PERL_MAGIC_taint, "taint(t)" },
1162 { PERL_MAGIC_uvar_elem, "uvar_elem(v)" },
1163 { PERL_MAGIC_vec, "vec(v)" },
1164 { PERL_MAGIC_vstring, "vstring(V)" },
1165 { PERL_MAGIC_utf8, "utf8(w)" },
1166 { PERL_MAGIC_substr, "substr(x)" },
1167 { PERL_MAGIC_defelem, "defelem(y)" },
1168 { PERL_MAGIC_ext, "ext(~)" },
1169 /* this null string terminates the list */
1174 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1176 for (; mg; mg = mg->mg_moremagic) {
1177 Perl_dump_indent(aTHX_ level, file,
1178 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1179 if (mg->mg_virtual) {
1180 const MGVTBL * const v = mg->mg_virtual;
1182 if (v == &PL_vtbl_sv) s = "sv";
1183 else if (v == &PL_vtbl_env) s = "env";
1184 else if (v == &PL_vtbl_envelem) s = "envelem";
1185 else if (v == &PL_vtbl_sig) s = "sig";
1186 else if (v == &PL_vtbl_sigelem) s = "sigelem";
1187 else if (v == &PL_vtbl_pack) s = "pack";
1188 else if (v == &PL_vtbl_packelem) s = "packelem";
1189 else if (v == &PL_vtbl_dbline) s = "dbline";
1190 else if (v == &PL_vtbl_isa) s = "isa";
1191 else if (v == &PL_vtbl_arylen) s = "arylen";
1192 else if (v == &PL_vtbl_mglob) s = "mglob";
1193 else if (v == &PL_vtbl_nkeys) s = "nkeys";
1194 else if (v == &PL_vtbl_taint) s = "taint";
1195 else if (v == &PL_vtbl_substr) s = "substr";
1196 else if (v == &PL_vtbl_vec) s = "vec";
1197 else if (v == &PL_vtbl_pos) s = "pos";
1198 else if (v == &PL_vtbl_bm) s = "bm";
1199 else if (v == &PL_vtbl_fm) s = "fm";
1200 else if (v == &PL_vtbl_uvar) s = "uvar";
1201 else if (v == &PL_vtbl_defelem) s = "defelem";
1202 #ifdef USE_LOCALE_COLLATE
1203 else if (v == &PL_vtbl_collxfrm) s = "collxfrm";
1205 else if (v == &PL_vtbl_amagic) s = "amagic";
1206 else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
1207 else if (v == &PL_vtbl_backref) s = "backref";
1208 else if (v == &PL_vtbl_utf8) s = "utf8";
1209 else if (v == &PL_vtbl_arylen_p) s = "arylen_p";
1210 else if (v == &PL_vtbl_hintselem) s = "hintselem";
1213 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s);
1215 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1218 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1221 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1225 const char *name = NULL;
1226 for (n = 0; magic_names[n].name; n++) {
1227 if (mg->mg_type == magic_names[n].type) {
1228 name = magic_names[n].name;
1233 Perl_dump_indent(aTHX_ level, file,
1234 " MG_TYPE = PERL_MAGIC_%s\n", name);
1236 Perl_dump_indent(aTHX_ level, file,
1237 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1241 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1242 if (mg->mg_type == PERL_MAGIC_envelem &&
1243 mg->mg_flags & MGf_TAINTEDDIR)
1244 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1245 if (mg->mg_flags & MGf_REFCOUNTED)
1246 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1247 if (mg->mg_flags & MGf_GSKIP)
1248 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1249 if (mg->mg_type == PERL_MAGIC_regex_global &&
1250 mg->mg_flags & MGf_MINMATCH)
1251 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1254 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1255 if (mg->mg_flags & MGf_REFCOUNTED)
1256 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1259 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1261 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1262 if (mg->mg_len >= 0) {
1263 if (mg->mg_type != PERL_MAGIC_utf8) {
1264 SV *sv = newSVpvs("");
1265 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1269 else if (mg->mg_len == HEf_SVKEY) {
1270 PerlIO_puts(file, " => HEf_SVKEY\n");
1271 do_sv_dump(level+2, file, (SV*)((mg)->mg_ptr), nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1275 PerlIO_puts(file, " ???? - please notify IZ");
1276 PerlIO_putc(file, '\n');
1278 if (mg->mg_type == PERL_MAGIC_utf8) {
1279 STRLEN *cache = (STRLEN *) mg->mg_ptr;
1282 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1283 Perl_dump_indent(aTHX_ level, file,
1284 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1287 (UV)cache[i * 2 + 1]);
1294 Perl_magic_dump(pTHX_ const MAGIC *mg)
1296 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1300 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1303 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1304 if (sv && (hvname = HvNAME_get(sv)))
1305 PerlIO_printf(file, "\t\"%s\"\n", hvname);
1307 PerlIO_putc(file, '\n');
1311 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1313 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1314 if (sv && GvNAME(sv))
1315 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1317 PerlIO_putc(file, '\n');
1321 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1323 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1324 if (sv && GvNAME(sv)) {
1326 PerlIO_printf(file, "\t\"");
1327 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1328 PerlIO_printf(file, "%s\" :: \"", hvname);
1329 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1332 PerlIO_putc(file, '\n');
1336 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1345 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1349 flags = SvFLAGS(sv);
1352 d = Perl_newSVpvf(aTHX_
1353 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1354 PTR2UV(SvANY(sv)), PTR2UV(sv),
1355 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1356 (int)(PL_dumpindent*level), "");
1358 if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,");
1359 if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
1360 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1361 if (flags & SVs_TEMP) sv_catpv(d, "TEMP,");
1362 if (flags & SVs_OBJECT) sv_catpv(d, "OBJECT,");
1363 if (flags & SVs_GMG) sv_catpv(d, "GMG,");
1364 if (flags & SVs_SMG) sv_catpv(d, "SMG,");
1365 if (flags & SVs_RMG) sv_catpv(d, "RMG,");
1367 if (flags & SVf_IOK) sv_catpv(d, "IOK,");
1368 if (flags & SVf_NOK) sv_catpv(d, "NOK,");
1369 if (flags & SVf_POK) sv_catpv(d, "POK,");
1370 if (flags & SVf_ROK) {
1371 sv_catpv(d, "ROK,");
1372 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1374 if (flags & SVf_OOK) sv_catpv(d, "OOK,");
1375 if (flags & SVf_FAKE) sv_catpv(d, "FAKE,");
1376 if (flags & SVf_READONLY) sv_catpv(d, "READONLY,");
1378 if (flags & SVf_AMAGIC) sv_catpv(d, "OVERLOAD,");
1379 if (flags & SVp_IOK) sv_catpv(d, "pIOK,");
1380 if (flags & SVp_NOK) sv_catpv(d, "pNOK,");
1381 if (flags & SVp_POK) sv_catpv(d, "pPOK,");
1382 if (flags & SVp_SCREAM && type != SVt_PVHV)
1383 sv_catpv(d, "SCREAM,");
1388 if (CvANON(sv)) sv_catpv(d, "ANON,");
1389 if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1390 if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
1391 if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
1392 if (CvCONST(sv)) sv_catpv(d, "CONST,");
1393 if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
1394 if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
1395 if (CvLVALUE(sv)) sv_catpv(d, "LVALUE,");
1396 if (CvMETHOD(sv)) sv_catpv(d, "METHOD,");
1397 if (CvLOCKED(sv)) sv_catpv(d, "LOCKED,");
1398 if (CvWEAKOUTSIDE(sv)) sv_catpv(d, "WEAKOUTSIDE,");
1399 if (CvASSERTION(sv)) sv_catpv(d, "ASSERTION,");
1402 if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
1403 if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
1404 if (HvHASKFLAGS(sv)) sv_catpv(d, "HASKFLAGS,");
1405 if (HvREHASH(sv)) sv_catpv(d, "REHASH,");
1406 if (flags & SVphv_CLONEABLE) sv_catpv(d, "CLONEABLE,");
1410 if (isGV_with_GP(sv)) {
1411 if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
1412 if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
1413 if (GvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1414 if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
1415 if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,");
1417 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1418 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1419 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1420 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1421 sv_catpv(d, "IMPORT");
1422 if (GvIMPORTED(sv) == GVf_IMPORTED)
1423 sv_catpv(d, "ALL,");
1426 if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
1427 if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
1428 if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
1429 if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
1435 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1436 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1439 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1440 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1443 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1448 /* SVphv_SHAREKEYS is also 0x20000000 */
1449 if ((type != SVt_PVHV) && SvUTF8(sv))
1450 sv_catpv(d, "UTF8");
1452 if (*(SvEND(d) - 1) == ',') {
1453 SvCUR_set(d, SvCUR(d) - 1);
1454 SvPVX(d)[SvCUR(d)] = '\0';
1459 #ifdef DEBUG_LEAKING_SCALARS
1460 Perl_dump_indent(aTHX_ level, file, "ALLOCATED at %s:%d %s %s%s\n",
1461 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1463 sv->sv_debug_inpad ? "for" : "by",
1464 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1465 sv->sv_debug_cloned ? " (cloned)" : "");
1467 Perl_dump_indent(aTHX_ level, file, "SV = ");
1470 PerlIO_printf(file, "NULL%s\n", s);
1474 PerlIO_printf(file, "IV%s\n", s);
1477 PerlIO_printf(file, "NV%s\n", s);
1480 PerlIO_printf(file, "RV%s\n", s);
1483 PerlIO_printf(file, "PV%s\n", s);
1486 PerlIO_printf(file, "PVIV%s\n", s);
1489 PerlIO_printf(file, "PVNV%s\n", s);
1492 PerlIO_printf(file, "PVBM%s\n", s);
1495 PerlIO_printf(file, "PVMG%s\n", s);
1498 PerlIO_printf(file, "PVLV%s\n", s);
1501 PerlIO_printf(file, "PVAV%s\n", s);
1504 PerlIO_printf(file, "PVHV%s\n", s);
1507 PerlIO_printf(file, "PVCV%s\n", s);
1510 PerlIO_printf(file, "PVGV%s\n", s);
1513 PerlIO_printf(file, "PVFM%s\n", s);
1516 PerlIO_printf(file, "PVIO%s\n", s);
1519 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1523 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1524 && type != SVt_PVCV && !isGV_with_GP(sv))
1525 || type == SVt_IV) {
1527 #ifdef PERL_OLD_COPY_ON_WRITE
1531 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1533 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1535 PerlIO_printf(file, " (OFFSET)");
1536 #ifdef PERL_OLD_COPY_ON_WRITE
1537 if (SvIsCOW_shared_hash(sv))
1538 PerlIO_printf(file, " (HASH)");
1539 else if (SvIsCOW_normal(sv))
1540 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1542 PerlIO_putc(file, '\n');
1544 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1545 && type != SVt_PVCV && type != SVt_PVFM && !isGV_with_GP(sv))
1546 || type == SVt_NV) {
1547 STORE_NUMERIC_LOCAL_SET_STANDARD();
1548 /* %Vg doesn't work? --jhi */
1549 #ifdef USE_LONG_DOUBLE
1550 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1552 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1554 RESTORE_NUMERIC_LOCAL();
1557 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1559 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1561 if (type < SVt_PV) {
1565 if (type <= SVt_PVLV && !isGV_with_GP(sv)) {
1566 if (SvPVX_const(sv)) {
1567 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1569 PerlIO_printf(file, "( %s . ) ", pv_display(d, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, pvlim));
1570 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1571 if (SvUTF8(sv)) /* the 8? \x{....} */
1572 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 8 * sv_len_utf8(sv), UNI_DISPLAY_QQ));
1573 PerlIO_printf(file, "\n");
1574 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1575 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
1578 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1580 if (type >= SVt_PVMG) {
1582 do_magic_dump(level, file, SvMAGIC(sv), nest, maxnest, dumpops, pvlim);
1584 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1588 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1589 if (AvARRAY(sv) != AvALLOC(sv)) {
1590 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1591 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1594 PerlIO_putc(file, '\n');
1595 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1596 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1597 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1598 sv_setpvn(d, "", 0);
1599 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1600 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1601 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1602 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1603 if (nest < maxnest && av_len((AV*)sv) >= 0) {
1605 for (count = 0; count <= av_len((AV*)sv) && count < maxnest; count++) {
1606 SV** elt = av_fetch((AV*)sv,count,0);
1608 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1610 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1615 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1616 if (HvARRAY(sv) && HvKEYS(sv)) {
1617 /* Show distribution of HEs in the ARRAY */
1619 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1622 U32 pow2 = 2, keys = HvKEYS(sv);
1623 NV theoret, sum = 0;
1625 PerlIO_printf(file, " (");
1626 Zero(freq, FREQ_MAX + 1, int);
1627 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1630 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1632 if (count > FREQ_MAX)
1638 for (i = 0; i <= max; i++) {
1640 PerlIO_printf(file, "%d%s:%d", i,
1641 (i == FREQ_MAX) ? "+" : "",
1644 PerlIO_printf(file, ", ");
1647 PerlIO_putc(file, ')');
1648 /* The "quality" of a hash is defined as the total number of
1649 comparisons needed to access every element once, relative
1650 to the expected number needed for a random hash.
1652 The total number of comparisons is equal to the sum of
1653 the squares of the number of entries in each bucket.
1654 For a random hash of n keys into k buckets, the expected
1659 for (i = max; i > 0; i--) { /* Precision: count down. */
1660 sum += freq[i] * i * i;
1662 while ((keys = keys >> 1))
1664 theoret = HvKEYS(sv);
1665 theoret += theoret * (theoret-1)/pow2;
1666 PerlIO_putc(file, '\n');
1667 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1669 PerlIO_putc(file, '\n');
1670 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
1671 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1672 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1673 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1674 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1676 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1677 if (mg && mg->mg_obj) {
1678 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1682 const char * const hvname = HvNAME_get(sv);
1684 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1687 const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv);
1689 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1691 do_sv_dump(level+1, file, (SV*)backrefs, nest+1, maxnest,
1695 if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
1697 HV * const hv = (HV*)sv;
1698 int count = maxnest - nest;
1701 while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
1706 const U32 hash = HeHASH(he);
1708 keysv = hv_iterkeysv(he);
1709 keypv = SvPV_const(keysv, len);
1710 elt = hv_iterval(hv, he);
1711 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1713 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 8 * sv_len_utf8(keysv), UNI_DISPLAY_QQ));
1715 PerlIO_printf(file, "[REHASH] ");
1716 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash);
1717 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1719 hv_iterinit(hv); /* Return to status quo */
1725 const char *const proto = SvPV_const(sv, len);
1726 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1731 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1732 if (!CvISXSUB(sv)) {
1734 Perl_dump_indent(aTHX_ level, file,
1735 " START = 0x%"UVxf" ===> %"IVdf"\n",
1736 PTR2UV(CvSTART(sv)),
1737 (IV)sequence_num(CvSTART(sv)));
1739 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1740 PTR2UV(CvROOT(sv)));
1741 if (CvROOT(sv) && dumpops) {
1742 do_op_dump(level+1, file, CvROOT(sv));
1745 SV *constant = cv_const_sv((CV *)sv);
1747 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1750 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1752 PTR2UV(CvXSUBANY(sv).any_ptr));
1753 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1756 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1757 (IV)CvXSUBANY(sv).any_i32);
1760 do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1761 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1762 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1763 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1764 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1765 if (type == SVt_PVFM)
1766 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
1767 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1768 if (nest < maxnest) {
1769 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1772 const CV * const outside = CvOUTSIDE(sv);
1773 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1776 : CvANON(outside) ? "ANON"
1777 : (outside == PL_main_cv) ? "MAIN"
1778 : CvUNIQUE(outside) ? "UNIQUE"
1779 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1781 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1782 do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim);
1786 if (type == SVt_PVLV) {
1787 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1788 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1789 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1790 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1791 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1792 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1795 if (!isGV_with_GP(sv))
1797 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1798 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1799 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1800 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1803 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1804 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1805 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1806 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1807 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1808 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1809 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1810 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1811 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1812 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1813 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1814 do_gv_dump (level, file, " EGV", GvEGV(sv));
1817 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1818 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1819 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1820 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
1821 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1822 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1823 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1825 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1826 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1827 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
1829 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
1830 PTR2UV(IoTOP_GV(sv)));
1831 do_sv_dump (level+1, file, (SV *) IoTOP_GV(sv), nest+1, maxnest,
1834 /* Source filters hide things that are not GVs in these three, so let's
1835 be careful out there. */
1837 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
1838 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
1839 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
1841 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
1842 PTR2UV(IoFMT_GV(sv)));
1843 do_sv_dump (level+1, file, (SV *) IoFMT_GV(sv), nest+1, maxnest,
1846 if (IoBOTTOM_NAME(sv))
1847 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
1848 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
1849 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
1851 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
1852 PTR2UV(IoBOTTOM_GV(sv)));
1853 do_sv_dump (level+1, file, (SV *) IoBOTTOM_GV(sv), nest+1, maxnest,
1856 Perl_dump_indent(aTHX_ level, file, " SUBPROCESS = %"IVdf"\n", (IV)IoSUBPROCESS(sv));
1857 if (isPRINT(IoTYPE(sv)))
1858 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
1860 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
1861 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
1868 Perl_sv_dump(pTHX_ SV *sv)
1871 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
1875 Perl_runops_debug(pTHX)
1879 if (ckWARN_d(WARN_DEBUGGING))
1880 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
1884 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
1888 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
1889 PerlIO_printf(Perl_debug_log,
1890 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
1891 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
1892 PTR2UV(*PL_watchaddr));
1893 if (DEBUG_s_TEST_) {
1894 if (DEBUG_v_TEST_) {
1895 PerlIO_printf(Perl_debug_log, "\n");
1903 if (DEBUG_t_TEST_) debop(PL_op);
1904 if (DEBUG_P_TEST_) debprof(PL_op);
1906 } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX)));
1907 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
1914 Perl_debop(pTHX_ const OP *o)
1917 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
1920 Perl_deb(aTHX_ "%s", OP_NAME(o));
1921 switch (o->op_type) {
1923 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
1928 SV * const sv = newSV(0);
1930 /* FIXME - it this making unwarranted assumptions about the
1931 UTF-8 cleanliness of the dump file handle? */
1934 gv_fullname3(sv, cGVOPo_gv, NULL);
1935 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
1939 PerlIO_printf(Perl_debug_log, "(NULL)");
1945 /* print the lexical's name */
1946 CV * const cv = deb_curcv(cxstack_ix);
1949 AV * const padlist = CvPADLIST(cv);
1950 AV * const comppad = (AV*)(*av_fetch(padlist, 0, FALSE));
1951 sv = *av_fetch(comppad, o->op_targ, FALSE);
1955 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
1957 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
1963 PerlIO_printf(Perl_debug_log, "\n");
1968 S_deb_curcv(pTHX_ I32 ix)
1971 const PERL_CONTEXT * const cx = &cxstack[ix];
1972 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
1973 return cx->blk_sub.cv;
1974 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
1976 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
1981 return deb_curcv(ix - 1);
1985 Perl_watch(pTHX_ char **addr)
1988 PL_watchaddr = addr;
1990 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
1991 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
1995 S_debprof(pTHX_ const OP *o)
1998 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2000 if (!PL_profiledata)
2001 Newxz(PL_profiledata, MAXO, U32);
2002 ++PL_profiledata[o->op_type];
2006 Perl_debprofdump(pTHX)
2010 if (!PL_profiledata)
2012 for (i = 0; i < MAXO; i++) {
2013 if (PL_profiledata[i])
2014 PerlIO_printf(Perl_debug_log,
2015 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2022 * XML variants of most of the above routines
2027 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2030 PerlIO_printf(file, "\n ");
2031 va_start(args, pat);
2032 xmldump_vindent(level, file, pat, &args);
2038 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2041 va_start(args, pat);
2042 xmldump_vindent(level, file, pat, &args);
2047 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2049 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2050 PerlIO_vprintf(file, pat, *args);
2054 Perl_xmldump_all(pTHX)
2056 PerlIO_setlinebuf(PL_xmlfp);
2058 op_xmldump(PL_main_root);
2059 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2060 PerlIO_close(PL_xmlfp);
2065 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2070 if (!HvARRAY(stash))
2072 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2073 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2074 GV *gv = (GV*)HeVAL(entry);
2076 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2082 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2083 && (hv = GvHV(gv)) && hv != PL_defstash)
2084 xmldump_packsubs(hv); /* nested package */
2090 Perl_xmldump_sub(pTHX_ const GV *gv)
2092 SV *sv = sv_newmortal();
2094 gv_fullname3(sv, gv, Nullch);
2095 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2096 if (CvXSUB(GvCV(gv)))
2097 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2098 PTR2UV(CvXSUB(GvCV(gv))),
2099 (int)CvXSUBANY(GvCV(gv)).any_i32);
2100 else if (CvROOT(GvCV(gv)))
2101 op_xmldump(CvROOT(GvCV(gv)));
2103 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2107 Perl_xmldump_form(pTHX_ const GV *gv)
2109 SV *sv = sv_newmortal();
2111 gv_fullname3(sv, gv, Nullch);
2112 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2113 if (CvROOT(GvFORM(gv)))
2114 op_xmldump(CvROOT(GvFORM(gv)));
2116 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2120 Perl_xmldump_eval(pTHX)
2122 op_xmldump(PL_eval_root);
2126 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2128 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2132 Perl_sv_catxmlpvn(pTHX_ SV *dsv, char* pv, STRLEN len, int utf8)
2140 sv_catpvn(dsv,"",0);
2141 dsvcur = SvCUR(dsv); /* in case we have to restart */
2146 c = utf8_to_uvchr((U8*)pv, &cl);
2148 SvCUR(dsv) = dsvcur;
2213 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2216 Perl_sv_catpvf(aTHX_ dsv, "<");
2219 Perl_sv_catpvf(aTHX_ dsv, ">");
2222 Perl_sv_catpvf(aTHX_ dsv, "&");
2225 Perl_sv_catpvf(aTHX_ dsv, """);
2229 if (c < 32 || c > 127) {
2230 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2233 Perl_sv_catpvf(aTHX_ dsv, "%c", c);
2237 if ((c >= 0xD800 && c <= 0xDB7F) ||
2238 (c >= 0xDC00 && c <= 0xDFFF) ||
2239 (c >= 0xFFF0 && c <= 0xFFFF) ||
2241 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2243 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2256 Perl_sv_xmlpeek(pTHX_ SV *sv)
2258 SV *t = sv_newmortal();
2263 sv_setpvn(t, "", 0);
2266 sv_catpv(t, "VOID=\"\"");
2269 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
2270 sv_catpv(t, "WILD=\"\"");
2273 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2274 if (sv == &PL_sv_undef) {
2275 sv_catpv(t, "SV_UNDEF=\"1\"");
2276 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2277 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2281 else if (sv == &PL_sv_no) {
2282 sv_catpv(t, "SV_NO=\"1\"");
2283 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2284 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2285 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2286 SVp_POK|SVp_NOK)) &&
2291 else if (sv == &PL_sv_yes) {
2292 sv_catpv(t, "SV_YES=\"1\"");
2293 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2294 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2295 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2296 SVp_POK|SVp_NOK)) &&
2298 SvPVX(sv) && *SvPVX(sv) == '1' &&
2303 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2304 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2305 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2309 sv_catpv(t, " XXX=\"\" ");
2311 else if (SvREFCNT(sv) == 0) {
2312 sv_catpv(t, " refcnt=\"0\"");
2315 else if (DEBUG_R_TEST_) {
2318 /* is this SV on the tmps stack? */
2319 for (ix=PL_tmps_ix; ix>=0; ix--) {
2320 if (PL_tmps_stack[ix] == sv) {
2325 if (SvREFCNT(sv) > 1)
2326 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2329 sv_catpv(t, " DRT=\"<T>\"");
2333 sv_catpv(t, " ROK=\"\"");
2335 switch (SvTYPE(sv)) {
2337 sv_catpv(t, " FREED=\"1\"");
2341 sv_catpv(t, " UNDEF=\"1\"");
2344 sv_catpv(t, " IV=\"");
2347 sv_catpv(t, " NV=\"");
2350 sv_catpv(t, " RV=\"");
2353 sv_catpv(t, " PV=\"");
2356 sv_catpv(t, " PVIV=\"");
2359 sv_catpv(t, " PVNV=\"");
2362 sv_catpv(t, " PVMG=\"");
2365 sv_catpv(t, " PVLV=\"");
2368 sv_catpv(t, " AV=\"");
2371 sv_catpv(t, " HV=\"");
2375 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2377 sv_catpv(t, " CV=\"()\"");
2380 sv_catpv(t, " GV=\"");
2383 sv_catpv(t, " BM=\"");
2386 sv_catpv(t, " FM=\"");
2389 sv_catpv(t, " IO=\"");
2398 else if (SvNOKp(sv)) {
2399 STORE_NUMERIC_LOCAL_SET_STANDARD();
2400 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2401 RESTORE_NUMERIC_LOCAL();
2403 else if (SvIOKp(sv)) {
2405 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2407 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2418 return SvPV(t, n_a);
2422 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2425 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2428 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2431 char *s = PM_GETRE(pm)->precomp;
2432 SV *tmpsv = newSV(0);
2434 sv_catxmlpvn(tmpsv, s, strlen(s), 1);
2435 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2437 SvREFCNT_dec(tmpsv);
2438 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2439 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2442 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2443 if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) {
2444 SV * const tmpsv = pm_description(pm);
2445 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2446 SvREFCNT_dec(tmpsv);
2450 if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
2451 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2452 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2453 do_op_xmldump(level+2, file, pm->op_pmreplroot);
2454 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2455 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2458 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2462 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2464 do_pmop_xmldump(0, PL_xmlfp, pm);
2468 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2475 seq = sequence_num(o);
2476 Perl_xmldump_indent(aTHX_ level, file,
2477 "<op_%s seq=\"%"UVuf" -> ",
2482 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2483 sequence_num(o->op_next));
2485 PerlIO_printf(file, "DONE\"");
2488 if (o->op_type == OP_NULL)
2490 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2491 if (o->op_targ == OP_NEXTSTATE)
2494 PerlIO_printf(file, " line=\"%"UVf"\"",
2495 (UV)CopLINE(cCOPo));
2496 if (CopSTASHPV(cCOPo))
2497 PerlIO_printf(file, " package=\"%s\"",
2499 if (cCOPo->cop_label)
2500 PerlIO_printf(file, " label=\"%s\"",
2505 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2508 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2511 SV *tmpsv = newSVpvn("", 0);
2512 switch (o->op_flags & OPf_WANT) {
2514 sv_catpv(tmpsv, ",VOID");
2516 case OPf_WANT_SCALAR:
2517 sv_catpv(tmpsv, ",SCALAR");
2520 sv_catpv(tmpsv, ",LIST");
2523 sv_catpv(tmpsv, ",UNKNOWN");
2526 if (o->op_flags & OPf_KIDS)
2527 sv_catpv(tmpsv, ",KIDS");
2528 if (o->op_flags & OPf_PARENS)
2529 sv_catpv(tmpsv, ",PARENS");
2530 if (o->op_flags & OPf_STACKED)
2531 sv_catpv(tmpsv, ",STACKED");
2532 if (o->op_flags & OPf_REF)
2533 sv_catpv(tmpsv, ",REF");
2534 if (o->op_flags & OPf_MOD)
2535 sv_catpv(tmpsv, ",MOD");
2536 if (o->op_flags & OPf_SPECIAL)
2537 sv_catpv(tmpsv, ",SPECIAL");
2538 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2539 SvREFCNT_dec(tmpsv);
2541 if (o->op_private) {
2542 SV *tmpsv = newSVpvn("", 0);
2543 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2544 if (o->op_private & OPpTARGET_MY)
2545 sv_catpv(tmpsv, ",TARGET_MY");
2547 else if (o->op_type == OP_LEAVESUB ||
2548 o->op_type == OP_LEAVE ||
2549 o->op_type == OP_LEAVESUBLV ||
2550 o->op_type == OP_LEAVEWRITE) {
2551 if (o->op_private & OPpREFCOUNTED)
2552 sv_catpv(tmpsv, ",REFCOUNTED");
2554 else if (o->op_type == OP_AASSIGN) {
2555 if (o->op_private & OPpASSIGN_COMMON)
2556 sv_catpv(tmpsv, ",COMMON");
2558 else if (o->op_type == OP_SASSIGN) {
2559 if (o->op_private & OPpASSIGN_BACKWARDS)
2560 sv_catpv(tmpsv, ",BACKWARDS");
2562 else if (o->op_type == OP_TRANS) {
2563 if (o->op_private & OPpTRANS_SQUASH)
2564 sv_catpv(tmpsv, ",SQUASH");
2565 if (o->op_private & OPpTRANS_DELETE)
2566 sv_catpv(tmpsv, ",DELETE");
2567 if (o->op_private & OPpTRANS_COMPLEMENT)
2568 sv_catpv(tmpsv, ",COMPLEMENT");
2569 if (o->op_private & OPpTRANS_IDENTICAL)
2570 sv_catpv(tmpsv, ",IDENTICAL");
2571 if (o->op_private & OPpTRANS_GROWS)
2572 sv_catpv(tmpsv, ",GROWS");
2574 else if (o->op_type == OP_REPEAT) {
2575 if (o->op_private & OPpREPEAT_DOLIST)
2576 sv_catpv(tmpsv, ",DOLIST");
2578 else if (o->op_type == OP_ENTERSUB ||
2579 o->op_type == OP_RV2SV ||
2580 o->op_type == OP_GVSV ||
2581 o->op_type == OP_RV2AV ||
2582 o->op_type == OP_RV2HV ||
2583 o->op_type == OP_RV2GV ||
2584 o->op_type == OP_AELEM ||
2585 o->op_type == OP_HELEM )
2587 if (o->op_type == OP_ENTERSUB) {
2588 if (o->op_private & OPpENTERSUB_AMPER)
2589 sv_catpv(tmpsv, ",AMPER");
2590 if (o->op_private & OPpENTERSUB_DB)
2591 sv_catpv(tmpsv, ",DB");
2592 if (o->op_private & OPpENTERSUB_HASTARG)
2593 sv_catpv(tmpsv, ",HASTARG");
2594 if (o->op_private & OPpENTERSUB_NOPAREN)
2595 sv_catpv(tmpsv, ",NOPAREN");
2596 if (o->op_private & OPpENTERSUB_INARGS)
2597 sv_catpv(tmpsv, ",INARGS");
2598 if (o->op_private & OPpENTERSUB_NOMOD)
2599 sv_catpv(tmpsv, ",NOMOD");
2602 switch (o->op_private & OPpDEREF) {
2604 sv_catpv(tmpsv, ",SV");
2607 sv_catpv(tmpsv, ",AV");
2610 sv_catpv(tmpsv, ",HV");
2613 if (o->op_private & OPpMAYBE_LVSUB)
2614 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2616 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2617 if (o->op_private & OPpLVAL_DEFER)
2618 sv_catpv(tmpsv, ",LVAL_DEFER");
2621 if (o->op_private & HINT_STRICT_REFS)
2622 sv_catpv(tmpsv, ",STRICT_REFS");
2623 if (o->op_private & OPpOUR_INTRO)
2624 sv_catpv(tmpsv, ",OUR_INTRO");
2627 else if (o->op_type == OP_CONST) {
2628 if (o->op_private & OPpCONST_BARE)
2629 sv_catpv(tmpsv, ",BARE");
2630 if (o->op_private & OPpCONST_STRICT)
2631 sv_catpv(tmpsv, ",STRICT");
2632 if (o->op_private & OPpCONST_ARYBASE)
2633 sv_catpv(tmpsv, ",ARYBASE");
2634 if (o->op_private & OPpCONST_WARNING)
2635 sv_catpv(tmpsv, ",WARNING");
2636 if (o->op_private & OPpCONST_ENTERED)
2637 sv_catpv(tmpsv, ",ENTERED");
2639 else if (o->op_type == OP_FLIP) {
2640 if (o->op_private & OPpFLIP_LINENUM)
2641 sv_catpv(tmpsv, ",LINENUM");
2643 else if (o->op_type == OP_FLOP) {
2644 if (o->op_private & OPpFLIP_LINENUM)
2645 sv_catpv(tmpsv, ",LINENUM");
2647 else if (o->op_type == OP_RV2CV) {
2648 if (o->op_private & OPpLVAL_INTRO)
2649 sv_catpv(tmpsv, ",INTRO");
2651 else if (o->op_type == OP_GV) {
2652 if (o->op_private & OPpEARLY_CV)
2653 sv_catpv(tmpsv, ",EARLY_CV");
2655 else if (o->op_type == OP_LIST) {
2656 if (o->op_private & OPpLIST_GUESSED)
2657 sv_catpv(tmpsv, ",GUESSED");
2659 else if (o->op_type == OP_DELETE) {
2660 if (o->op_private & OPpSLICE)
2661 sv_catpv(tmpsv, ",SLICE");
2663 else if (o->op_type == OP_EXISTS) {
2664 if (o->op_private & OPpEXISTS_SUB)
2665 sv_catpv(tmpsv, ",EXISTS_SUB");
2667 else if (o->op_type == OP_SORT) {
2668 if (o->op_private & OPpSORT_NUMERIC)
2669 sv_catpv(tmpsv, ",NUMERIC");
2670 if (o->op_private & OPpSORT_INTEGER)
2671 sv_catpv(tmpsv, ",INTEGER");
2672 if (o->op_private & OPpSORT_REVERSE)
2673 sv_catpv(tmpsv, ",REVERSE");
2675 else if (o->op_type == OP_THREADSV) {
2676 if (o->op_private & OPpDONE_SVREF)
2677 sv_catpv(tmpsv, ",SVREF");
2679 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2680 if (o->op_private & OPpOPEN_IN_RAW)
2681 sv_catpv(tmpsv, ",IN_RAW");
2682 if (o->op_private & OPpOPEN_IN_CRLF)
2683 sv_catpv(tmpsv, ",IN_CRLF");
2684 if (o->op_private & OPpOPEN_OUT_RAW)
2685 sv_catpv(tmpsv, ",OUT_RAW");
2686 if (o->op_private & OPpOPEN_OUT_CRLF)
2687 sv_catpv(tmpsv, ",OUT_CRLF");
2689 else if (o->op_type == OP_EXIT) {
2690 if (o->op_private & OPpEXIT_VMSISH)
2691 sv_catpv(tmpsv, ",EXIT_VMSISH");
2692 if (o->op_private & OPpHUSH_VMSISH)
2693 sv_catpv(tmpsv, ",HUSH_VMSISH");
2695 else if (o->op_type == OP_DIE) {
2696 if (o->op_private & OPpHUSH_VMSISH)
2697 sv_catpv(tmpsv, ",HUSH_VMSISH");
2699 else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
2700 if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS)
2701 sv_catpv(tmpsv, ",FT_ACCESS");
2702 if (o->op_private & OPpFT_STACKED)
2703 sv_catpv(tmpsv, ",FT_STACKED");
2705 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2706 sv_catpv(tmpsv, ",INTRO");
2708 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
2709 SvREFCNT_dec(tmpsv);
2712 switch (o->op_type) {
2714 if (o->op_flags & OPf_SPECIAL) {
2720 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
2722 if (cSVOPo->op_sv) {
2723 SV *tmpsv1 = newSV(0);
2724 SV *tmpsv2 = newSV(0);
2732 gv_fullname3(tmpsv1, (GV*)cSVOPo->op_sv, Nullch);
2733 s = SvPV(tmpsv1,len);
2734 sv_catxmlpvn(tmpsv2, s, len, 1);
2735 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
2739 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
2743 case OP_METHOD_NAMED:
2744 #ifndef USE_ITHREADS
2745 /* with ITHREADS, consts are stored in the pad, and the right pad
2746 * may not be active here, so skip */
2747 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
2753 PerlIO_printf(file, ">\n");
2755 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
2761 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVf"\"",
2762 (UV)CopLINE(cCOPo));
2763 if (CopSTASHPV(cCOPo))
2764 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
2766 if (cCOPo->cop_label)
2767 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
2771 S_xmldump_attr(aTHX_ level, file, "redo=\"");
2772 if (cLOOPo->op_redoop)
2773 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
2775 PerlIO_printf(file, "DONE\"");
2776 S_xmldump_attr(aTHX_ level, file, "next=\"");
2777 if (cLOOPo->op_nextop)
2778 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
2780 PerlIO_printf(file, "DONE\"");
2781 S_xmldump_attr(aTHX_ level, file, "last=\"");
2782 if (cLOOPo->op_lastop)
2783 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
2785 PerlIO_printf(file, "DONE\"");
2793 S_xmldump_attr(aTHX_ level, file, "other=\"");
2794 if (cLOGOPo->op_other)
2795 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
2797 PerlIO_printf(file, "DONE\"");
2805 if (o->op_private & OPpREFCOUNTED)
2806 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
2812 if (PL_madskills && o->op_madprop) {
2813 SV *tmpsv = newSVpvn("", 0);
2814 MADPROP* mp = o->op_madprop;
2815 sv_utf8_upgrade(tmpsv);
2818 PerlIO_printf(file, ">\n");
2820 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
2823 char tmp = mp->mad_key;
2824 sv_setpvn(tmpsv,"\"",1);
2826 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
2827 sv_catpv(tmpsv, "\"");
2828 switch (mp->mad_type) {
2830 sv_catpv(tmpsv, "NULL");
2831 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
2834 sv_catpv(tmpsv, " val=\"");
2835 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
2836 sv_catpv(tmpsv, "\"");
2837 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
2840 sv_catpv(tmpsv, " val=\"");
2841 sv_catxmlsv(tmpsv, (SV*)mp->mad_val);
2842 sv_catpv(tmpsv, "\"");
2843 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
2846 if ((OP*)mp->mad_val) {
2847 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
2848 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
2849 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
2853 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
2859 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
2861 SvREFCNT_dec(tmpsv);
2864 switch (o->op_type) {
2871 PerlIO_printf(file, ">\n");
2873 do_pmop_xmldump(level, file, cPMOPo);
2879 if (o->op_flags & OPf_KIDS) {
2883 PerlIO_printf(file, ">\n");
2885 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
2886 do_op_xmldump(level, file, kid);
2890 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
2892 PerlIO_printf(file, " />\n");
2896 Perl_op_xmldump(pTHX_ const OP *o)
2898 do_op_xmldump(0, PL_xmlfp, o);
2904 * c-indentation-style: bsd
2906 * indent-tabs-mode: t
2909 * ex: set ts=8 sts=4 sw=4 noet: