3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
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, ...)
75 PERL_ARGS_ASSERT_DUMP_INDENT;
77 dump_vindent(level, file, pat, &args);
82 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
85 PERL_ARGS_ASSERT_DUMP_VINDENT;
86 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
87 PerlIO_vprintf(file, pat, *args);
94 PerlIO_setlinebuf(Perl_debug_log);
96 op_dump(PL_main_root);
97 dump_packsubs(PL_defstash);
101 Perl_dump_packsubs(pTHX_ const HV *stash)
106 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
110 for (i = 0; i <= (I32) HvMAX(stash); i++) {
112 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
113 const GV * const gv = (GV*)HeVAL(entry);
114 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
120 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
121 const HV * const hv = GvHV(gv);
122 if (hv && (hv != PL_defstash))
123 dump_packsubs(hv); /* nested package */
130 Perl_dump_sub(pTHX_ const GV *gv)
132 SV * const sv = sv_newmortal();
134 PERL_ARGS_ASSERT_DUMP_SUB;
136 gv_fullname3(sv, gv, NULL);
137 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
138 if (CvISXSUB(GvCV(gv)))
139 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
140 PTR2UV(CvXSUB(GvCV(gv))),
141 (int)CvXSUBANY(GvCV(gv)).any_i32);
142 else if (CvROOT(GvCV(gv)))
143 op_dump(CvROOT(GvCV(gv)));
145 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
149 Perl_dump_form(pTHX_ const GV *gv)
151 SV * const sv = sv_newmortal();
153 PERL_ARGS_ASSERT_DUMP_FORM;
155 gv_fullname3(sv, gv, NULL);
156 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
157 if (CvROOT(GvFORM(gv)))
158 op_dump(CvROOT(GvFORM(gv)));
160 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
167 op_dump(PL_eval_root);
172 =for apidoc pv_escape
174 Escapes at most the first "count" chars of pv and puts the results into
175 dsv such that the size of the escaped string will not exceed "max" chars
176 and will not contain any incomplete escape sequences.
178 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
179 will also be escaped.
181 Normally the SV will be cleared before the escaped string is prepared,
182 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
184 If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
185 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
186 using C<is_utf8_string()> to determine if it is Unicode.
188 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
189 using C<\x01F1> style escapes, otherwise only chars above 255 will be
190 escaped using this style, other non printable chars will use octal or
191 common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
192 then all chars below 255 will be treated as printable and
193 will be output as literals.
195 If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
196 string will be escaped, regardles of max. If the string is utf8 and
197 the chars value is >255 then it will be returned as a plain hex
198 sequence. Thus the output will either be a single char,
199 an octal escape sequence, a special escape like C<\n> or a 3 or
200 more digit hex value.
202 If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
203 not a '\\'. This is because regexes very often contain backslashed
204 sequences, whereas '%' is not a particularly common character in patterns.
206 Returns a pointer to the escaped text as held by dsv.
210 #define PV_ESCAPE_OCTBUFSIZE 32
213 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
214 const STRLEN count, const STRLEN max,
215 STRLEN * const escaped, const U32 flags )
217 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
218 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
219 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
220 STRLEN wrote = 0; /* chars written so far */
221 STRLEN chsize = 0; /* size of data to be written */
222 STRLEN readsize = 1; /* size of data just read */
223 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
224 const char *pv = str;
225 const char * const end = pv + count; /* end of string */
228 PERL_ARGS_ASSERT_PV_ESCAPE;
230 if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
231 /* This won't alter the UTF-8 flag */
232 sv_setpvn(dsv, "", 0);
235 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
238 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
239 const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv;
240 const U8 c = (U8)u & 0xFF;
242 if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) {
243 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
244 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
247 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
248 "%cx{%"UVxf"}", esc, u);
249 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
252 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
256 case '\\' : /* fallthrough */
257 case '%' : if ( c == esc ) {
263 case '\v' : octbuf[1] = 'v'; break;
264 case '\t' : octbuf[1] = 't'; break;
265 case '\r' : octbuf[1] = 'r'; break;
266 case '\n' : octbuf[1] = 'n'; break;
267 case '\f' : octbuf[1] = 'f'; break;
275 if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) )
276 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
279 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
286 if ( max && (wrote + chsize > max) ) {
288 } else if (chsize > 1) {
289 sv_catpvn(dsv, octbuf, chsize);
292 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then bytes in the range
293 128-255 can be appended raw to the dsv. If dsv happens to be
294 UTF-8 then we need catpvf to upgrade them for us.
295 Or add a new API call sv_catpvc(). Think about that name, and
296 how to keep it clear that it's unlike the s of catpvs, which is
297 really an array octets, not a string. */
298 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
301 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
309 =for apidoc pv_pretty
311 Converts a string into something presentable, handling escaping via
312 pv_escape() and supporting quoting and ellipses.
314 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
315 double quoted with any double quotes in the string escaped. Otherwise
316 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
319 If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
320 string were output then an ellipsis C<...> will be appended to the
321 string. Note that this happens AFTER it has been quoted.
323 If start_color is non-null then it will be inserted after the opening
324 quote (if there is one) but before the escaped text. If end_color
325 is non-null then it will be inserted after the escaped text but before
326 any quotes or ellipses.
328 Returns a pointer to the prettified text as held by dsv.
334 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
335 const STRLEN max, char const * const start_color, char const * const end_color,
338 const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
341 PERL_ARGS_ASSERT_PV_PRETTY;
343 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
344 /* This won't alter the UTF-8 flag */
345 sv_setpvn(dsv, "", 0);
349 sv_catpvn(dsv, "\"", 1);
350 else if ( flags & PERL_PV_PRETTY_LTGT )
351 sv_catpvn(dsv, "<", 1);
353 if ( start_color != NULL )
354 Perl_sv_catpv( aTHX_ dsv, start_color);
356 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
358 if ( end_color != NULL )
359 Perl_sv_catpv( aTHX_ dsv, end_color);
362 sv_catpvn( dsv, "\"", 1 );
363 else if ( flags & PERL_PV_PRETTY_LTGT )
364 sv_catpvn( dsv, ">", 1);
366 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
367 sv_catpvn( dsv, "...", 3 );
373 =for apidoc pv_display
375 char *pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len,
376 STRLEN pvlim, U32 flags)
380 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
382 except that an additional "\0" will be appended to the string when
383 len > cur and pv[cur] is "\0".
385 Note that the final string may be up to 7 chars longer than pvlim.
391 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
393 PERL_ARGS_ASSERT_PV_DISPLAY;
395 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
396 if (len > cur && pv[cur] == '\0')
397 sv_catpvn( dsv, "\\0", 2 );
402 Perl_sv_peek(pTHX_ SV *sv)
405 SV * const t = sv_newmortal();
415 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
419 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
420 if (sv == &PL_sv_undef) {
421 sv_catpv(t, "SV_UNDEF");
422 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
423 SVs_GMG|SVs_SMG|SVs_RMG)) &&
427 else if (sv == &PL_sv_no) {
428 sv_catpv(t, "SV_NO");
429 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
430 SVs_GMG|SVs_SMG|SVs_RMG)) &&
431 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
437 else if (sv == &PL_sv_yes) {
438 sv_catpv(t, "SV_YES");
439 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
440 SVs_GMG|SVs_SMG|SVs_RMG)) &&
441 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
444 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
449 sv_catpv(t, "SV_PLACEHOLDER");
450 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
451 SVs_GMG|SVs_SMG|SVs_RMG)) &&
457 else if (SvREFCNT(sv) == 0) {
461 else if (DEBUG_R_TEST_) {
464 /* is this SV on the tmps stack? */
465 for (ix=PL_tmps_ix; ix>=0; ix--) {
466 if (PL_tmps_stack[ix] == sv) {
471 if (SvREFCNT(sv) > 1)
472 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
480 if (SvCUR(t) + unref > 10) {
481 SvCUR_set(t, unref + 3);
490 if (type == SVt_PVCV) {
491 Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
493 } else if (type < SVt_LAST) {
494 sv_catpv(t, svshorttypenames[type]);
496 if (type == SVt_NULL)
499 sv_catpv(t, "FREED");
504 if (!SvPVX_const(sv))
505 sv_catpv(t, "(null)");
507 SV * const tmp = newSVpvs("");
510 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, 127));
511 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
513 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
514 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
519 else if (SvNOKp(sv)) {
520 STORE_NUMERIC_LOCAL_SET_STANDARD();
521 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
522 RESTORE_NUMERIC_LOCAL();
524 else if (SvIOKp(sv)) {
526 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
528 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
536 return SvPV_nolen(t);
540 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
544 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
547 Perl_dump_indent(aTHX_ level, file, "{}\n");
550 Perl_dump_indent(aTHX_ level, file, "{\n");
552 if (pm->op_pmflags & PMf_ONCE)
557 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
558 ch, RX_PRECOMP(PM_GETRE(pm)), ch,
559 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
561 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
562 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
563 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
564 op_dump(pm->op_pmreplrootu.op_pmreplroot);
566 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
567 SV * const tmpsv = pm_description(pm);
568 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
572 Perl_dump_indent(aTHX_ level-1, file, "}\n");
576 S_pm_description(pTHX_ const PMOP *pm)
578 SV * const desc = newSVpvs("");
579 const REGEXP * const regex = PM_GETRE(pm);
580 const U32 pmflags = pm->op_pmflags;
582 PERL_ARGS_ASSERT_PM_DESCRIPTION;
584 if (pmflags & PMf_ONCE)
585 sv_catpv(desc, ",ONCE");
587 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
588 sv_catpv(desc, ":USED");
590 if (pmflags & PMf_USED)
591 sv_catpv(desc, ":USED");
595 if (RX_EXTFLAGS(regex) & RXf_TAINTED)
596 sv_catpv(desc, ",TAINTED");
597 if (RX_CHECK_SUBSTR(regex)) {
598 if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN))
599 sv_catpv(desc, ",SCANFIRST");
600 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
601 sv_catpv(desc, ",ALL");
603 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
604 sv_catpv(desc, ",SKIPWHITE");
607 if (pmflags & PMf_CONST)
608 sv_catpv(desc, ",CONST");
609 if (pmflags & PMf_KEEP)
610 sv_catpv(desc, ",KEEP");
611 if (pmflags & PMf_GLOBAL)
612 sv_catpv(desc, ",GLOBAL");
613 if (pmflags & PMf_CONTINUE)
614 sv_catpv(desc, ",CONTINUE");
615 if (pmflags & PMf_RETAINT)
616 sv_catpv(desc, ",RETAINT");
617 if (pmflags & PMf_EVAL)
618 sv_catpv(desc, ",EVAL");
623 Perl_pmop_dump(pTHX_ PMOP *pm)
625 do_pmop_dump(0, Perl_debug_log, pm);
628 /* An op sequencer. We visit the ops in the order they're to execute. */
631 S_sequence(pTHX_ register const OP *o)
634 const OP *oldop = NULL;
647 for (; o; o = o->op_next) {
649 SV * const op = newSVuv(PTR2UV(o));
650 const char * const key = SvPV_const(op, len);
652 if (hv_exists(Sequence, key, len))
655 switch (o->op_type) {
657 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
658 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
667 if (oldop && o->op_next)
674 if (oldop && o->op_next)
676 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
689 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
690 sequence_tail(cLOGOPo->op_other);
695 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
696 sequence_tail(cLOOPo->op_redoop);
697 sequence_tail(cLOOPo->op_nextop);
698 sequence_tail(cLOOPo->op_lastop);
702 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
703 sequence_tail(cPMOPo->op_pmstashstartu.op_pmreplstart);
712 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
720 S_sequence_tail(pTHX_ const OP *o)
722 while (o && (o->op_type == OP_NULL))
728 S_sequence_num(pTHX_ const OP *o)
736 op = newSVuv(PTR2UV(o));
737 key = SvPV_const(op, len);
738 seq = hv_fetch(Sequence, key, len, 0);
739 return seq ? SvUV(*seq): 0;
743 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
747 const OPCODE optype = o->op_type;
749 PERL_ARGS_ASSERT_DO_OP_DUMP;
752 Perl_dump_indent(aTHX_ level, file, "{\n");
754 seq = sequence_num(o);
756 PerlIO_printf(file, "%-4"UVuf, seq);
758 PerlIO_printf(file, " ");
760 "%*sTYPE = %s ===> ",
761 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
763 PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n",
764 sequence_num(o->op_next));
766 PerlIO_printf(file, "DONE\n");
768 if (optype == OP_NULL) {
769 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
770 if (o->op_targ == OP_NEXTSTATE) {
772 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
774 if (CopSTASHPV(cCOPo))
775 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
778 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
783 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
786 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
788 if (o->op_flags || o->op_latefree || o->op_latefreed || o->op_attached) {
789 SV * const tmpsv = newSVpvs("");
790 switch (o->op_flags & OPf_WANT) {
792 sv_catpv(tmpsv, ",VOID");
794 case OPf_WANT_SCALAR:
795 sv_catpv(tmpsv, ",SCALAR");
798 sv_catpv(tmpsv, ",LIST");
801 sv_catpv(tmpsv, ",UNKNOWN");
804 if (o->op_flags & OPf_KIDS)
805 sv_catpv(tmpsv, ",KIDS");
806 if (o->op_flags & OPf_PARENS)
807 sv_catpv(tmpsv, ",PARENS");
808 if (o->op_flags & OPf_STACKED)
809 sv_catpv(tmpsv, ",STACKED");
810 if (o->op_flags & OPf_REF)
811 sv_catpv(tmpsv, ",REF");
812 if (o->op_flags & OPf_MOD)
813 sv_catpv(tmpsv, ",MOD");
814 if (o->op_flags & OPf_SPECIAL)
815 sv_catpv(tmpsv, ",SPECIAL");
817 sv_catpv(tmpsv, ",LATEFREE");
819 sv_catpv(tmpsv, ",LATEFREED");
821 sv_catpv(tmpsv, ",ATTACHED");
822 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
826 SV * const tmpsv = newSVpvs("");
827 if (PL_opargs[optype] & OA_TARGLEX) {
828 if (o->op_private & OPpTARGET_MY)
829 sv_catpv(tmpsv, ",TARGET_MY");
831 else if (optype == OP_LEAVESUB ||
832 optype == OP_LEAVE ||
833 optype == OP_LEAVESUBLV ||
834 optype == OP_LEAVEWRITE) {
835 if (o->op_private & OPpREFCOUNTED)
836 sv_catpv(tmpsv, ",REFCOUNTED");
838 else if (optype == OP_AASSIGN) {
839 if (o->op_private & OPpASSIGN_COMMON)
840 sv_catpv(tmpsv, ",COMMON");
842 else if (optype == OP_SASSIGN) {
843 if (o->op_private & OPpASSIGN_BACKWARDS)
844 sv_catpv(tmpsv, ",BACKWARDS");
846 else if (optype == OP_TRANS) {
847 if (o->op_private & OPpTRANS_SQUASH)
848 sv_catpv(tmpsv, ",SQUASH");
849 if (o->op_private & OPpTRANS_DELETE)
850 sv_catpv(tmpsv, ",DELETE");
851 if (o->op_private & OPpTRANS_COMPLEMENT)
852 sv_catpv(tmpsv, ",COMPLEMENT");
853 if (o->op_private & OPpTRANS_IDENTICAL)
854 sv_catpv(tmpsv, ",IDENTICAL");
855 if (o->op_private & OPpTRANS_GROWS)
856 sv_catpv(tmpsv, ",GROWS");
858 else if (optype == OP_REPEAT) {
859 if (o->op_private & OPpREPEAT_DOLIST)
860 sv_catpv(tmpsv, ",DOLIST");
862 else if (optype == OP_ENTERSUB ||
863 optype == OP_RV2SV ||
865 optype == OP_RV2AV ||
866 optype == OP_RV2HV ||
867 optype == OP_RV2GV ||
868 optype == OP_AELEM ||
871 if (optype == OP_ENTERSUB) {
872 if (o->op_private & OPpENTERSUB_AMPER)
873 sv_catpv(tmpsv, ",AMPER");
874 if (o->op_private & OPpENTERSUB_DB)
875 sv_catpv(tmpsv, ",DB");
876 if (o->op_private & OPpENTERSUB_HASTARG)
877 sv_catpv(tmpsv, ",HASTARG");
878 if (o->op_private & OPpENTERSUB_NOPAREN)
879 sv_catpv(tmpsv, ",NOPAREN");
880 if (o->op_private & OPpENTERSUB_INARGS)
881 sv_catpv(tmpsv, ",INARGS");
882 if (o->op_private & OPpENTERSUB_NOMOD)
883 sv_catpv(tmpsv, ",NOMOD");
886 switch (o->op_private & OPpDEREF) {
888 sv_catpv(tmpsv, ",SV");
891 sv_catpv(tmpsv, ",AV");
894 sv_catpv(tmpsv, ",HV");
897 if (o->op_private & OPpMAYBE_LVSUB)
898 sv_catpv(tmpsv, ",MAYBE_LVSUB");
900 if (optype == OP_AELEM || optype == OP_HELEM) {
901 if (o->op_private & OPpLVAL_DEFER)
902 sv_catpv(tmpsv, ",LVAL_DEFER");
905 if (o->op_private & HINT_STRICT_REFS)
906 sv_catpv(tmpsv, ",STRICT_REFS");
907 if (o->op_private & OPpOUR_INTRO)
908 sv_catpv(tmpsv, ",OUR_INTRO");
911 else if (optype == OP_CONST) {
912 if (o->op_private & OPpCONST_BARE)
913 sv_catpv(tmpsv, ",BARE");
914 if (o->op_private & OPpCONST_STRICT)
915 sv_catpv(tmpsv, ",STRICT");
916 if (o->op_private & OPpCONST_ARYBASE)
917 sv_catpv(tmpsv, ",ARYBASE");
918 if (o->op_private & OPpCONST_WARNING)
919 sv_catpv(tmpsv, ",WARNING");
920 if (o->op_private & OPpCONST_ENTERED)
921 sv_catpv(tmpsv, ",ENTERED");
923 else if (optype == OP_FLIP) {
924 if (o->op_private & OPpFLIP_LINENUM)
925 sv_catpv(tmpsv, ",LINENUM");
927 else if (optype == OP_FLOP) {
928 if (o->op_private & OPpFLIP_LINENUM)
929 sv_catpv(tmpsv, ",LINENUM");
931 else if (optype == OP_RV2CV) {
932 if (o->op_private & OPpLVAL_INTRO)
933 sv_catpv(tmpsv, ",INTRO");
935 else if (optype == OP_GV) {
936 if (o->op_private & OPpEARLY_CV)
937 sv_catpv(tmpsv, ",EARLY_CV");
939 else if (optype == OP_LIST) {
940 if (o->op_private & OPpLIST_GUESSED)
941 sv_catpv(tmpsv, ",GUESSED");
943 else if (optype == OP_DELETE) {
944 if (o->op_private & OPpSLICE)
945 sv_catpv(tmpsv, ",SLICE");
947 else if (optype == OP_EXISTS) {
948 if (o->op_private & OPpEXISTS_SUB)
949 sv_catpv(tmpsv, ",EXISTS_SUB");
951 else if (optype == OP_SORT) {
952 if (o->op_private & OPpSORT_NUMERIC)
953 sv_catpv(tmpsv, ",NUMERIC");
954 if (o->op_private & OPpSORT_INTEGER)
955 sv_catpv(tmpsv, ",INTEGER");
956 if (o->op_private & OPpSORT_REVERSE)
957 sv_catpv(tmpsv, ",REVERSE");
959 else if (optype == OP_OPEN || optype == OP_BACKTICK) {
960 if (o->op_private & OPpOPEN_IN_RAW)
961 sv_catpv(tmpsv, ",IN_RAW");
962 if (o->op_private & OPpOPEN_IN_CRLF)
963 sv_catpv(tmpsv, ",IN_CRLF");
964 if (o->op_private & OPpOPEN_OUT_RAW)
965 sv_catpv(tmpsv, ",OUT_RAW");
966 if (o->op_private & OPpOPEN_OUT_CRLF)
967 sv_catpv(tmpsv, ",OUT_CRLF");
969 else if (optype == OP_EXIT) {
970 if (o->op_private & OPpEXIT_VMSISH)
971 sv_catpv(tmpsv, ",EXIT_VMSISH");
972 if (o->op_private & OPpHUSH_VMSISH)
973 sv_catpv(tmpsv, ",HUSH_VMSISH");
975 else if (optype == OP_DIE) {
976 if (o->op_private & OPpHUSH_VMSISH)
977 sv_catpv(tmpsv, ",HUSH_VMSISH");
979 else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
980 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
981 sv_catpv(tmpsv, ",FT_ACCESS");
982 if (o->op_private & OPpFT_STACKED)
983 sv_catpv(tmpsv, ",FT_STACKED");
985 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
986 sv_catpv(tmpsv, ",INTRO");
988 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
993 if (PL_madskills && o->op_madprop) {
994 SV * const tmpsv = newSVpvn("", 0);
995 MADPROP* mp = o->op_madprop;
996 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
999 const char tmp = mp->mad_key;
1000 sv_setpvn(tmpsv,"'",1);
1002 sv_catpvn(tmpsv, &tmp, 1);
1003 sv_catpv(tmpsv, "'=");
1004 switch (mp->mad_type) {
1006 sv_catpv(tmpsv, "NULL");
1007 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1010 sv_catpv(tmpsv, "<");
1011 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
1012 sv_catpv(tmpsv, ">");
1013 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1016 if ((OP*)mp->mad_val) {
1017 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1018 do_op_dump(level, file, (OP*)mp->mad_val);
1022 sv_catpv(tmpsv, "(UNK)");
1023 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1029 Perl_dump_indent(aTHX_ level, file, "}\n");
1031 SvREFCNT_dec(tmpsv);
1040 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1042 if ( ! PL_op->op_flags & OPf_SPECIAL) { /* not lexical */
1043 if (cSVOPo->op_sv) {
1044 SV * const tmpsv = newSV(0);
1048 /* FIXME - is this making unwarranted assumptions about the
1049 UTF-8 cleanliness of the dump file handle? */
1052 gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, NULL);
1053 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1054 SvPV_nolen_const(tmpsv));
1058 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1064 case OP_METHOD_NAMED:
1065 #ifndef USE_ITHREADS
1066 /* with ITHREADS, consts are stored in the pad, and the right pad
1067 * may not be active here, so skip */
1068 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1074 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1075 (UV)CopLINE(cCOPo));
1076 if (CopSTASHPV(cCOPo))
1077 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1079 if (CopLABEL(cCOPo))
1080 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1084 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1085 if (cLOOPo->op_redoop)
1086 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1088 PerlIO_printf(file, "DONE\n");
1089 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1090 if (cLOOPo->op_nextop)
1091 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1093 PerlIO_printf(file, "DONE\n");
1094 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1095 if (cLOOPo->op_lastop)
1096 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1098 PerlIO_printf(file, "DONE\n");
1106 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1107 if (cLOGOPo->op_other)
1108 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1110 PerlIO_printf(file, "DONE\n");
1116 do_pmop_dump(level, file, cPMOPo);
1124 if (o->op_private & OPpREFCOUNTED)
1125 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1130 if (o->op_flags & OPf_KIDS) {
1132 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1133 do_op_dump(level, file, kid);
1135 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1139 Perl_op_dump(pTHX_ const OP *o)
1141 PERL_ARGS_ASSERT_OP_DUMP;
1142 do_op_dump(0, Perl_debug_log, o);
1146 Perl_gv_dump(pTHX_ GV *gv)
1150 PERL_ARGS_ASSERT_GV_DUMP;
1153 PerlIO_printf(Perl_debug_log, "{}\n");
1156 sv = sv_newmortal();
1157 PerlIO_printf(Perl_debug_log, "{\n");
1158 gv_fullname3(sv, gv, NULL);
1159 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1160 if (gv != GvEGV(gv)) {
1161 gv_efullname3(sv, GvEGV(gv), NULL);
1162 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1164 PerlIO_putc(Perl_debug_log, '\n');
1165 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1169 /* map magic types to the symbolic names
1170 * (with the PERL_MAGIC_ prefixed stripped)
1173 static const struct { const char type; const char *name; } magic_names[] = {
1174 { PERL_MAGIC_sv, "sv(\\0)" },
1175 { PERL_MAGIC_arylen, "arylen(#)" },
1176 { PERL_MAGIC_rhash, "rhash(%)" },
1177 { PERL_MAGIC_pos, "pos(.)" },
1178 { PERL_MAGIC_symtab, "symtab(:)" },
1179 { PERL_MAGIC_backref, "backref(<)" },
1180 { PERL_MAGIC_arylen_p, "arylen_p(@)" },
1181 { PERL_MAGIC_overload, "overload(A)" },
1182 { PERL_MAGIC_bm, "bm(B)" },
1183 { PERL_MAGIC_regdata, "regdata(D)" },
1184 { PERL_MAGIC_env, "env(E)" },
1185 { PERL_MAGIC_hints, "hints(H)" },
1186 { PERL_MAGIC_isa, "isa(I)" },
1187 { PERL_MAGIC_dbfile, "dbfile(L)" },
1188 { PERL_MAGIC_shared, "shared(N)" },
1189 { PERL_MAGIC_tied, "tied(P)" },
1190 { PERL_MAGIC_sig, "sig(S)" },
1191 { PERL_MAGIC_uvar, "uvar(U)" },
1192 { PERL_MAGIC_overload_elem, "overload_elem(a)" },
1193 { PERL_MAGIC_overload_table, "overload_table(c)" },
1194 { PERL_MAGIC_regdatum, "regdatum(d)" },
1195 { PERL_MAGIC_envelem, "envelem(e)" },
1196 { PERL_MAGIC_fm, "fm(f)" },
1197 { PERL_MAGIC_regex_global, "regex_global(g)" },
1198 { PERL_MAGIC_hintselem, "hintselem(h)" },
1199 { PERL_MAGIC_isaelem, "isaelem(i)" },
1200 { PERL_MAGIC_nkeys, "nkeys(k)" },
1201 { PERL_MAGIC_dbline, "dbline(l)" },
1202 { PERL_MAGIC_shared_scalar, "shared_scalar(n)" },
1203 { PERL_MAGIC_collxfrm, "collxfrm(o)" },
1204 { PERL_MAGIC_tiedelem, "tiedelem(p)" },
1205 { PERL_MAGIC_tiedscalar, "tiedscalar(q)" },
1206 { PERL_MAGIC_qr, "qr(r)" },
1207 { PERL_MAGIC_sigelem, "sigelem(s)" },
1208 { PERL_MAGIC_taint, "taint(t)" },
1209 { PERL_MAGIC_uvar_elem, "uvar_elem(u)" },
1210 { PERL_MAGIC_vec, "vec(v)" },
1211 { PERL_MAGIC_vstring, "vstring(V)" },
1212 { PERL_MAGIC_utf8, "utf8(w)" },
1213 { PERL_MAGIC_substr, "substr(x)" },
1214 { PERL_MAGIC_defelem, "defelem(y)" },
1215 { PERL_MAGIC_ext, "ext(~)" },
1216 /* this null string terminates the list */
1221 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1223 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1225 for (; mg; mg = mg->mg_moremagic) {
1226 Perl_dump_indent(aTHX_ level, file,
1227 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1228 if (mg->mg_virtual) {
1229 const MGVTBL * const v = mg->mg_virtual;
1231 if (v == &PL_vtbl_sv) s = "sv";
1232 else if (v == &PL_vtbl_env) s = "env";
1233 else if (v == &PL_vtbl_envelem) s = "envelem";
1234 else if (v == &PL_vtbl_sig) s = "sig";
1235 else if (v == &PL_vtbl_sigelem) s = "sigelem";
1236 else if (v == &PL_vtbl_pack) s = "pack";
1237 else if (v == &PL_vtbl_packelem) s = "packelem";
1238 else if (v == &PL_vtbl_dbline) s = "dbline";
1239 else if (v == &PL_vtbl_isa) s = "isa";
1240 else if (v == &PL_vtbl_arylen) s = "arylen";
1241 else if (v == &PL_vtbl_mglob) s = "mglob";
1242 else if (v == &PL_vtbl_nkeys) s = "nkeys";
1243 else if (v == &PL_vtbl_taint) s = "taint";
1244 else if (v == &PL_vtbl_substr) s = "substr";
1245 else if (v == &PL_vtbl_vec) s = "vec";
1246 else if (v == &PL_vtbl_pos) s = "pos";
1247 else if (v == &PL_vtbl_bm) s = "bm";
1248 else if (v == &PL_vtbl_fm) s = "fm";
1249 else if (v == &PL_vtbl_uvar) s = "uvar";
1250 else if (v == &PL_vtbl_defelem) s = "defelem";
1251 #ifdef USE_LOCALE_COLLATE
1252 else if (v == &PL_vtbl_collxfrm) s = "collxfrm";
1254 else if (v == &PL_vtbl_amagic) s = "amagic";
1255 else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
1256 else if (v == &PL_vtbl_backref) s = "backref";
1257 else if (v == &PL_vtbl_utf8) s = "utf8";
1258 else if (v == &PL_vtbl_arylen_p) s = "arylen_p";
1259 else if (v == &PL_vtbl_hintselem) s = "hintselem";
1262 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s);
1264 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1267 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1270 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1274 const char *name = NULL;
1275 for (n = 0; magic_names[n].name; n++) {
1276 if (mg->mg_type == magic_names[n].type) {
1277 name = magic_names[n].name;
1282 Perl_dump_indent(aTHX_ level, file,
1283 " MG_TYPE = PERL_MAGIC_%s\n", name);
1285 Perl_dump_indent(aTHX_ level, file,
1286 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1290 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1291 if (mg->mg_type == PERL_MAGIC_envelem &&
1292 mg->mg_flags & MGf_TAINTEDDIR)
1293 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1294 if (mg->mg_flags & MGf_REFCOUNTED)
1295 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1296 if (mg->mg_flags & MGf_GSKIP)
1297 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1298 if (mg->mg_type == PERL_MAGIC_regex_global &&
1299 mg->mg_flags & MGf_MINMATCH)
1300 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1303 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1304 PTR2UV(mg->mg_obj));
1305 if (mg->mg_type == PERL_MAGIC_qr) {
1306 REGEXP* const re = (REGEXP *)mg->mg_obj;
1307 SV * const dsv = sv_newmortal();
1308 const char * const s
1309 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1311 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1312 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1314 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1315 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1318 if (mg->mg_flags & MGf_REFCOUNTED)
1319 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1322 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1324 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1325 if (mg->mg_len >= 0) {
1326 if (mg->mg_type != PERL_MAGIC_utf8) {
1327 SV * const sv = newSVpvs("");
1328 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1332 else if (mg->mg_len == HEf_SVKEY) {
1333 PerlIO_puts(file, " => HEf_SVKEY\n");
1334 do_sv_dump(level+2, file, (SV*)((mg)->mg_ptr), nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1338 PerlIO_puts(file, " ???? - please notify IZ");
1339 PerlIO_putc(file, '\n');
1341 if (mg->mg_type == PERL_MAGIC_utf8) {
1342 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1345 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1346 Perl_dump_indent(aTHX_ level, file,
1347 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1350 (UV)cache[i * 2 + 1]);
1357 Perl_magic_dump(pTHX_ const MAGIC *mg)
1359 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1363 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1367 PERL_ARGS_ASSERT_DO_HV_DUMP;
1369 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1370 if (sv && (hvname = HvNAME_get(sv)))
1371 PerlIO_printf(file, "\t\"%s\"\n", hvname);
1373 PerlIO_putc(file, '\n');
1377 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1379 PERL_ARGS_ASSERT_DO_GV_DUMP;
1381 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1382 if (sv && GvNAME(sv))
1383 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1385 PerlIO_putc(file, '\n');
1389 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1391 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1393 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1394 if (sv && GvNAME(sv)) {
1396 PerlIO_printf(file, "\t\"");
1397 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1398 PerlIO_printf(file, "%s\" :: \"", hvname);
1399 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1402 PerlIO_putc(file, '\n');
1406 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1414 PERL_ARGS_ASSERT_DO_SV_DUMP;
1417 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1421 flags = SvFLAGS(sv);
1424 d = Perl_newSVpvf(aTHX_
1425 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1426 PTR2UV(SvANY(sv)), PTR2UV(sv),
1427 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1428 (int)(PL_dumpindent*level), "");
1430 if (!(flags & SVpad_NAME && (type == SVt_PVMG || type == SVt_PVNV))) {
1431 if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,");
1433 if (!(flags & SVpad_NAME && type == SVt_PVMG)) {
1434 if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
1435 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1437 if (flags & SVs_TEMP) sv_catpv(d, "TEMP,");
1438 if (flags & SVs_OBJECT) sv_catpv(d, "OBJECT,");
1439 if (flags & SVs_GMG) sv_catpv(d, "GMG,");
1440 if (flags & SVs_SMG) sv_catpv(d, "SMG,");
1441 if (flags & SVs_RMG) sv_catpv(d, "RMG,");
1443 if (flags & SVf_IOK) sv_catpv(d, "IOK,");
1444 if (flags & SVf_NOK) sv_catpv(d, "NOK,");
1445 if (flags & SVf_POK) sv_catpv(d, "POK,");
1446 if (flags & SVf_ROK) {
1447 sv_catpv(d, "ROK,");
1448 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1450 if (flags & SVf_OOK) sv_catpv(d, "OOK,");
1451 if (flags & SVf_FAKE) sv_catpv(d, "FAKE,");
1452 if (flags & SVf_READONLY) sv_catpv(d, "READONLY,");
1453 if (flags & SVf_BREAK) sv_catpv(d, "BREAK,");
1455 if (flags & SVf_AMAGIC) sv_catpv(d, "OVERLOAD,");
1456 if (flags & SVp_IOK) sv_catpv(d, "pIOK,");
1457 if (flags & SVp_NOK) sv_catpv(d, "pNOK,");
1458 if (flags & SVp_POK) sv_catpv(d, "pPOK,");
1459 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1460 if (SvPCS_IMPORTED(sv))
1461 sv_catpv(d, "PCS_IMPORTED,");
1463 sv_catpv(d, "SCREAM,");
1469 if (CvANON(sv)) sv_catpv(d, "ANON,");
1470 if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1471 if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
1472 if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
1473 if (CvCONST(sv)) sv_catpv(d, "CONST,");
1474 if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
1475 if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
1476 if (CvLVALUE(sv)) sv_catpv(d, "LVALUE,");
1477 if (CvMETHOD(sv)) sv_catpv(d, "METHOD,");
1478 if (CvLOCKED(sv)) sv_catpv(d, "LOCKED,");
1479 if (CvWEAKOUTSIDE(sv)) sv_catpv(d, "WEAKOUTSIDE,");
1482 if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
1483 if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
1484 if (HvHASKFLAGS(sv)) sv_catpv(d, "HASKFLAGS,");
1485 if (HvREHASH(sv)) sv_catpv(d, "REHASH,");
1486 if (flags & SVphv_CLONEABLE) sv_catpv(d, "CLONEABLE,");
1490 if (isGV_with_GP(sv)) {
1491 if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
1492 if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
1493 if (GvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1494 if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
1495 if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,");
1497 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1498 sv_catpv(d, "IMPORT");
1499 if (GvIMPORTED(sv) == GVf_IMPORTED)
1500 sv_catpv(d, "ALL,");
1503 if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
1504 if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
1505 if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
1506 if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
1510 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1511 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1515 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1516 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1519 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1520 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1523 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1528 /* SVphv_SHAREKEYS is also 0x20000000 */
1529 if ((type != SVt_PVHV) && SvUTF8(sv))
1530 sv_catpv(d, "UTF8");
1532 if (*(SvEND(d) - 1) == ',') {
1533 SvCUR_set(d, SvCUR(d) - 1);
1534 SvPVX(d)[SvCUR(d)] = '\0';
1539 #ifdef DEBUG_LEAKING_SCALARS
1540 Perl_dump_indent(aTHX_ level, file, "ALLOCATED at %s:%d %s %s%s\n",
1541 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1543 sv->sv_debug_inpad ? "for" : "by",
1544 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1545 sv->sv_debug_cloned ? " (cloned)" : "");
1547 Perl_dump_indent(aTHX_ level, file, "SV = ");
1548 if (type < SVt_LAST) {
1549 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1551 if (type == SVt_NULL) {
1556 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1560 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1561 && type != SVt_PVCV && !isGV_with_GP(sv) && type != SVt_PVFM)
1562 || (type == SVt_IV && !SvROK(sv))) {
1564 #ifdef PERL_OLD_COPY_ON_WRITE
1568 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1570 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1571 #ifdef PERL_OLD_COPY_ON_WRITE
1572 if (SvIsCOW_shared_hash(sv))
1573 PerlIO_printf(file, " (HASH)");
1574 else if (SvIsCOW_normal(sv))
1575 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1577 PerlIO_putc(file, '\n');
1579 if ((type == SVt_PVNV || type == SVt_PVMG) && SvFLAGS(sv) & SVpad_NAME) {
1580 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1581 (UV) COP_SEQ_RANGE_LOW(sv));
1582 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1583 (UV) COP_SEQ_RANGE_HIGH(sv));
1584 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1585 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1586 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1587 || type == SVt_NV) {
1588 STORE_NUMERIC_LOCAL_SET_STANDARD();
1589 /* %Vg doesn't work? --jhi */
1590 #ifdef USE_LONG_DOUBLE
1591 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1593 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1595 RESTORE_NUMERIC_LOCAL();
1598 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1600 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1602 if (type < SVt_PV) {
1606 if ((type <= SVt_PVLV && !isGV_with_GP(sv)) || type == SVt_PVFM) {
1607 if (SvPVX_const(sv)) {
1610 SvOOK_offset(sv, delta);
1611 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1616 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1618 PerlIO_printf(file, "( %s . ) ",
1619 pv_display(d, SvPVX_const(sv) - delta, delta, 0,
1622 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1623 if (SvUTF8(sv)) /* the 6? \x{....} */
1624 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
1625 PerlIO_printf(file, "\n");
1626 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1627 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
1630 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1632 if (type == SVt_REGEXP) {
1634 Perl_dump_indent(aTHX_ level, file, " REGEXP = 0x%"UVxf"\n",
1635 PTR2UV(((struct regexp *)SvANY(sv))->xrx_regexp));
1638 if (type >= SVt_PVMG) {
1639 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1640 HV * const ost = SvOURSTASH(sv);
1642 do_hv_dump(level, file, " OURSTASH", ost);
1645 do_magic_dump(level, file, SvMAGIC(sv), nest, maxnest, dumpops, pvlim);
1648 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1652 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1653 if (AvARRAY(sv) != AvALLOC(sv)) {
1654 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1655 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1658 PerlIO_putc(file, '\n');
1659 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1660 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1661 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1662 sv_setpvn(d, "", 0);
1663 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1664 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1665 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1666 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1667 if (nest < maxnest && av_len((AV*)sv) >= 0) {
1669 for (count = 0; count <= av_len((AV*)sv) && count < maxnest; count++) {
1670 SV** const elt = av_fetch((AV*)sv,count,0);
1672 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1674 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1679 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1680 if (HvARRAY(sv) && HvKEYS(sv)) {
1681 /* Show distribution of HEs in the ARRAY */
1683 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1686 U32 pow2 = 2, keys = HvKEYS(sv);
1687 NV theoret, sum = 0;
1689 PerlIO_printf(file, " (");
1690 Zero(freq, FREQ_MAX + 1, int);
1691 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1694 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1696 if (count > FREQ_MAX)
1702 for (i = 0; i <= max; i++) {
1704 PerlIO_printf(file, "%d%s:%d", i,
1705 (i == FREQ_MAX) ? "+" : "",
1708 PerlIO_printf(file, ", ");
1711 PerlIO_putc(file, ')');
1712 /* The "quality" of a hash is defined as the total number of
1713 comparisons needed to access every element once, relative
1714 to the expected number needed for a random hash.
1716 The total number of comparisons is equal to the sum of
1717 the squares of the number of entries in each bucket.
1718 For a random hash of n keys into k buckets, the expected
1723 for (i = max; i > 0; i--) { /* Precision: count down. */
1724 sum += freq[i] * i * i;
1726 while ((keys = keys >> 1))
1728 theoret = HvKEYS(sv);
1729 theoret += theoret * (theoret-1)/pow2;
1730 PerlIO_putc(file, '\n');
1731 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1733 PerlIO_putc(file, '\n');
1734 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
1735 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1736 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1737 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1738 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1740 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1741 if (mg && mg->mg_obj) {
1742 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1746 const char * const hvname = HvNAME_get(sv);
1748 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1751 const AV * const backrefs
1752 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1754 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1756 do_sv_dump(level+1, file, (SV*)backrefs, nest+1, maxnest,
1760 if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
1762 HV * const hv = MUTABLE_HV(sv);
1763 int count = maxnest - nest;
1766 while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
1769 const U32 hash = HeHASH(he);
1770 SV * const keysv = hv_iterkeysv(he);
1771 const char * const keypv = SvPV_const(keysv, len);
1772 SV * const elt = hv_iterval(hv, he);
1774 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1776 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1778 PerlIO_printf(file, "[REHASH] ");
1779 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash);
1780 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1782 hv_iterinit(hv); /* Return to status quo */
1788 const char *const proto = SvPV_const(sv, len);
1789 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1794 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1795 if (!CvISXSUB(sv)) {
1797 Perl_dump_indent(aTHX_ level, file,
1798 " START = 0x%"UVxf" ===> %"IVdf"\n",
1799 PTR2UV(CvSTART(sv)),
1800 (IV)sequence_num(CvSTART(sv)));
1802 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1803 PTR2UV(CvROOT(sv)));
1804 if (CvROOT(sv) && dumpops) {
1805 do_op_dump(level+1, file, CvROOT(sv));
1808 SV * const constant = cv_const_sv((CV *)sv);
1810 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1813 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1815 PTR2UV(CvXSUBANY(sv).any_ptr));
1816 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1819 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1820 (IV)CvXSUBANY(sv).any_i32);
1823 do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1824 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1825 if (type == SVt_PVCV)
1826 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1827 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1828 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1829 if (type == SVt_PVFM)
1830 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
1831 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1832 if (nest < maxnest) {
1833 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1836 const CV * const outside = CvOUTSIDE(sv);
1837 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1840 : CvANON(outside) ? "ANON"
1841 : (outside == PL_main_cv) ? "MAIN"
1842 : CvUNIQUE(outside) ? "UNIQUE"
1843 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1845 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1846 do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim);
1850 if (type == SVt_PVLV) {
1851 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1852 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1853 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1854 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1855 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1856 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1860 Perl_dump_indent(aTHX_ level, file, " FLAGS = %u\n", (U8)BmFLAGS(sv));
1861 Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
1862 Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1863 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1865 if (!isGV_with_GP(sv))
1867 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1868 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1869 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1870 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1873 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1874 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1875 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1876 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1877 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1878 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1879 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1880 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1881 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1882 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1883 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1884 do_gv_dump (level, file, " EGV", GvEGV(sv));
1887 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1888 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1889 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1890 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
1891 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1892 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1893 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1895 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1896 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1897 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
1899 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
1900 PTR2UV(IoTOP_GV(sv)));
1901 do_sv_dump (level+1, file, (SV *) IoTOP_GV(sv), nest+1, maxnest,
1904 /* Source filters hide things that are not GVs in these three, so let's
1905 be careful out there. */
1907 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
1908 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
1909 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
1911 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
1912 PTR2UV(IoFMT_GV(sv)));
1913 do_sv_dump (level+1, file, (SV *) IoFMT_GV(sv), nest+1, maxnest,
1916 if (IoBOTTOM_NAME(sv))
1917 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
1918 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
1919 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
1921 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
1922 PTR2UV(IoBOTTOM_GV(sv)));
1923 do_sv_dump (level+1, file, (SV *) IoBOTTOM_GV(sv), nest+1, maxnest,
1926 if (isPRINT(IoTYPE(sv)))
1927 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
1929 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
1930 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
1937 Perl_sv_dump(pTHX_ SV *sv)
1941 PERL_ARGS_ASSERT_SV_DUMP;
1944 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
1946 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
1950 Perl_runops_debug(pTHX)
1954 if (ckWARN_d(WARN_DEBUGGING))
1955 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
1959 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
1963 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
1964 PerlIO_printf(Perl_debug_log,
1965 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
1966 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
1967 PTR2UV(*PL_watchaddr));
1968 if (DEBUG_s_TEST_) {
1969 if (DEBUG_v_TEST_) {
1970 PerlIO_printf(Perl_debug_log, "\n");
1978 if (DEBUG_t_TEST_) debop(PL_op);
1979 if (DEBUG_P_TEST_) debprof(PL_op);
1981 } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX)));
1982 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
1989 Perl_debop(pTHX_ const OP *o)
1993 PERL_ARGS_ASSERT_DEBOP;
1995 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
1998 Perl_deb(aTHX_ "%s", OP_NAME(o));
1999 switch (o->op_type) {
2002 /* With ITHREADS, consts are stored in the pad, and the right pad
2003 * may not be active here, so check.
2004 * Looks like only during compiling the pads are illegal.
2007 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2009 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2014 SV * const sv = newSV(0);
2016 /* FIXME - is this making unwarranted assumptions about the
2017 UTF-8 cleanliness of the dump file handle? */
2020 gv_fullname3(sv, cGVOPo_gv, NULL);
2021 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2025 PerlIO_printf(Perl_debug_log, "(NULL)");
2031 /* print the lexical's name */
2032 CV * const cv = deb_curcv(cxstack_ix);
2035 AV * const padlist = CvPADLIST(cv);
2036 AV * const comppad = (AV*)(*av_fetch(padlist, 0, FALSE));
2037 sv = *av_fetch(comppad, o->op_targ, FALSE);
2041 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2043 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
2049 PerlIO_printf(Perl_debug_log, "\n");
2054 S_deb_curcv(pTHX_ const I32 ix)
2057 const PERL_CONTEXT * const cx = &cxstack[ix];
2058 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2059 return cx->blk_sub.cv;
2060 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2062 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2067 return deb_curcv(ix - 1);
2071 Perl_watch(pTHX_ char **addr)
2075 PERL_ARGS_ASSERT_WATCH;
2077 PL_watchaddr = addr;
2079 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2080 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2084 S_debprof(pTHX_ const OP *o)
2088 PERL_ARGS_ASSERT_DEBPROF;
2090 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2092 if (!PL_profiledata)
2093 Newxz(PL_profiledata, MAXO, U32);
2094 ++PL_profiledata[o->op_type];
2098 Perl_debprofdump(pTHX)
2102 if (!PL_profiledata)
2104 for (i = 0; i < MAXO; i++) {
2105 if (PL_profiledata[i])
2106 PerlIO_printf(Perl_debug_log,
2107 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2114 * XML variants of most of the above routines
2118 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2122 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2124 PerlIO_printf(file, "\n ");
2125 va_start(args, pat);
2126 xmldump_vindent(level, file, pat, &args);
2132 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2135 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
2136 va_start(args, pat);
2137 xmldump_vindent(level, file, pat, &args);
2142 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2144 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2146 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2147 PerlIO_vprintf(file, pat, *args);
2151 Perl_xmldump_all(pTHX)
2153 PerlIO_setlinebuf(PL_xmlfp);
2155 op_xmldump(PL_main_root);
2156 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2157 PerlIO_close(PL_xmlfp);
2162 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2167 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
2169 if (!HvARRAY(stash))
2171 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2172 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2173 GV *gv = (GV*)HeVAL(entry);
2175 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2181 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2182 && (hv = GvHV(gv)) && hv != PL_defstash)
2183 xmldump_packsubs(hv); /* nested package */
2189 Perl_xmldump_sub(pTHX_ const GV *gv)
2191 SV * const sv = sv_newmortal();
2193 PERL_ARGS_ASSERT_XMLDUMP_SUB;
2195 gv_fullname3(sv, gv, NULL);
2196 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2197 if (CvXSUB(GvCV(gv)))
2198 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2199 PTR2UV(CvXSUB(GvCV(gv))),
2200 (int)CvXSUBANY(GvCV(gv)).any_i32);
2201 else if (CvROOT(GvCV(gv)))
2202 op_xmldump(CvROOT(GvCV(gv)));
2204 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2208 Perl_xmldump_form(pTHX_ const GV *gv)
2210 SV * const sv = sv_newmortal();
2212 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2214 gv_fullname3(sv, gv, NULL);
2215 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2216 if (CvROOT(GvFORM(gv)))
2217 op_xmldump(CvROOT(GvFORM(gv)));
2219 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2223 Perl_xmldump_eval(pTHX)
2225 op_xmldump(PL_eval_root);
2229 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2231 PERL_ARGS_ASSERT_SV_CATXMLSV;
2232 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2236 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2239 const char * const e = pv + len;
2240 const char * const start = pv;
2244 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2246 sv_catpvn(dsv,"",0);
2247 dsvcur = SvCUR(dsv); /* in case we have to restart */
2252 c = utf8_to_uvchr((U8*)pv, &cl);
2254 SvCUR(dsv) = dsvcur;
2319 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2322 sv_catpvs(dsv, "<");
2325 sv_catpvs(dsv, ">");
2328 sv_catpvs(dsv, "&");
2331 sv_catpvs(dsv, """);
2335 if (c < 32 || c > 127) {
2336 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2339 const char string = (char) c;
2340 sv_catpvn(dsv, &string, 1);
2344 if ((c >= 0xD800 && c <= 0xDB7F) ||
2345 (c >= 0xDC00 && c <= 0xDFFF) ||
2346 (c >= 0xFFF0 && c <= 0xFFFF) ||
2348 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2350 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2363 Perl_sv_xmlpeek(pTHX_ SV *sv)
2365 SV * const t = sv_newmortal();
2369 PERL_ARGS_ASSERT_SV_XMLPEEK;
2372 sv_setpvn(t, "", 0);
2375 sv_catpv(t, "VOID=\"\"");
2378 else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
2379 sv_catpv(t, "WILD=\"\"");
2382 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2383 if (sv == &PL_sv_undef) {
2384 sv_catpv(t, "SV_UNDEF=\"1\"");
2385 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2386 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2390 else if (sv == &PL_sv_no) {
2391 sv_catpv(t, "SV_NO=\"1\"");
2392 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2393 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2394 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2395 SVp_POK|SVp_NOK)) &&
2400 else if (sv == &PL_sv_yes) {
2401 sv_catpv(t, "SV_YES=\"1\"");
2402 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2403 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2404 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2405 SVp_POK|SVp_NOK)) &&
2407 SvPVX(sv) && *SvPVX(sv) == '1' &&
2412 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2413 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2414 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2418 sv_catpv(t, " XXX=\"\" ");
2420 else if (SvREFCNT(sv) == 0) {
2421 sv_catpv(t, " refcnt=\"0\"");
2424 else if (DEBUG_R_TEST_) {
2427 /* is this SV on the tmps stack? */
2428 for (ix=PL_tmps_ix; ix>=0; ix--) {
2429 if (PL_tmps_stack[ix] == sv) {
2434 if (SvREFCNT(sv) > 1)
2435 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2438 sv_catpv(t, " DRT=\"<T>\"");
2442 sv_catpv(t, " ROK=\"\"");
2444 switch (SvTYPE(sv)) {
2446 sv_catpv(t, " FREED=\"1\"");
2450 sv_catpv(t, " UNDEF=\"1\"");
2453 sv_catpv(t, " IV=\"");
2456 sv_catpv(t, " NV=\"");
2459 sv_catpv(t, " PV=\"");
2462 sv_catpv(t, " PVIV=\"");
2465 sv_catpv(t, " PVNV=\"");
2468 sv_catpv(t, " PVMG=\"");
2471 sv_catpv(t, " PVLV=\"");
2474 sv_catpv(t, " AV=\"");
2477 sv_catpv(t, " HV=\"");
2481 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2483 sv_catpv(t, " CV=\"()\"");
2486 sv_catpv(t, " GV=\"");
2489 sv_catpv(t, " BIND=\"");
2492 sv_catpv(t, " ORANGE=\"");
2495 sv_catpv(t, " FM=\"");
2498 sv_catpv(t, " IO=\"");
2507 else if (SvNOKp(sv)) {
2508 STORE_NUMERIC_LOCAL_SET_STANDARD();
2509 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2510 RESTORE_NUMERIC_LOCAL();
2512 else if (SvIOKp(sv)) {
2514 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2516 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2525 return SvPV(t, n_a);
2529 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2531 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2534 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2537 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2540 REGEXP *const r = PM_GETRE(pm);
2541 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2542 sv_catxmlsv(tmpsv, (SV*)r);
2543 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2545 SvREFCNT_dec(tmpsv);
2546 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2547 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2550 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2551 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
2552 SV * const tmpsv = pm_description(pm);
2553 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2554 SvREFCNT_dec(tmpsv);
2558 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2559 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2560 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2561 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2562 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2563 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2566 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2570 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2572 do_pmop_xmldump(0, PL_xmlfp, pm);
2576 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2581 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2586 seq = sequence_num(o);
2587 Perl_xmldump_indent(aTHX_ level, file,
2588 "<op_%s seq=\"%"UVuf" -> ",
2593 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2594 sequence_num(o->op_next));
2596 PerlIO_printf(file, "DONE\"");
2599 if (o->op_type == OP_NULL)
2601 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2602 if (o->op_targ == OP_NEXTSTATE)
2605 PerlIO_printf(file, " line=\"%"UVuf"\"",
2606 (UV)CopLINE(cCOPo));
2607 if (CopSTASHPV(cCOPo))
2608 PerlIO_printf(file, " package=\"%s\"",
2610 if (CopLABEL(cCOPo))
2611 PerlIO_printf(file, " label=\"%s\"",
2616 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2619 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2622 SV * const tmpsv = newSVpvn("", 0);
2623 switch (o->op_flags & OPf_WANT) {
2625 sv_catpv(tmpsv, ",VOID");
2627 case OPf_WANT_SCALAR:
2628 sv_catpv(tmpsv, ",SCALAR");
2631 sv_catpv(tmpsv, ",LIST");
2634 sv_catpv(tmpsv, ",UNKNOWN");
2637 if (o->op_flags & OPf_KIDS)
2638 sv_catpv(tmpsv, ",KIDS");
2639 if (o->op_flags & OPf_PARENS)
2640 sv_catpv(tmpsv, ",PARENS");
2641 if (o->op_flags & OPf_STACKED)
2642 sv_catpv(tmpsv, ",STACKED");
2643 if (o->op_flags & OPf_REF)
2644 sv_catpv(tmpsv, ",REF");
2645 if (o->op_flags & OPf_MOD)
2646 sv_catpv(tmpsv, ",MOD");
2647 if (o->op_flags & OPf_SPECIAL)
2648 sv_catpv(tmpsv, ",SPECIAL");
2649 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2650 SvREFCNT_dec(tmpsv);
2652 if (o->op_private) {
2653 SV * const tmpsv = newSVpvn("", 0);
2654 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2655 if (o->op_private & OPpTARGET_MY)
2656 sv_catpv(tmpsv, ",TARGET_MY");
2658 else if (o->op_type == OP_LEAVESUB ||
2659 o->op_type == OP_LEAVE ||
2660 o->op_type == OP_LEAVESUBLV ||
2661 o->op_type == OP_LEAVEWRITE) {
2662 if (o->op_private & OPpREFCOUNTED)
2663 sv_catpv(tmpsv, ",REFCOUNTED");
2665 else if (o->op_type == OP_AASSIGN) {
2666 if (o->op_private & OPpASSIGN_COMMON)
2667 sv_catpv(tmpsv, ",COMMON");
2669 else if (o->op_type == OP_SASSIGN) {
2670 if (o->op_private & OPpASSIGN_BACKWARDS)
2671 sv_catpv(tmpsv, ",BACKWARDS");
2673 else if (o->op_type == OP_TRANS) {
2674 if (o->op_private & OPpTRANS_SQUASH)
2675 sv_catpv(tmpsv, ",SQUASH");
2676 if (o->op_private & OPpTRANS_DELETE)
2677 sv_catpv(tmpsv, ",DELETE");
2678 if (o->op_private & OPpTRANS_COMPLEMENT)
2679 sv_catpv(tmpsv, ",COMPLEMENT");
2680 if (o->op_private & OPpTRANS_IDENTICAL)
2681 sv_catpv(tmpsv, ",IDENTICAL");
2682 if (o->op_private & OPpTRANS_GROWS)
2683 sv_catpv(tmpsv, ",GROWS");
2685 else if (o->op_type == OP_REPEAT) {
2686 if (o->op_private & OPpREPEAT_DOLIST)
2687 sv_catpv(tmpsv, ",DOLIST");
2689 else if (o->op_type == OP_ENTERSUB ||
2690 o->op_type == OP_RV2SV ||
2691 o->op_type == OP_GVSV ||
2692 o->op_type == OP_RV2AV ||
2693 o->op_type == OP_RV2HV ||
2694 o->op_type == OP_RV2GV ||
2695 o->op_type == OP_AELEM ||
2696 o->op_type == OP_HELEM )
2698 if (o->op_type == OP_ENTERSUB) {
2699 if (o->op_private & OPpENTERSUB_AMPER)
2700 sv_catpv(tmpsv, ",AMPER");
2701 if (o->op_private & OPpENTERSUB_DB)
2702 sv_catpv(tmpsv, ",DB");
2703 if (o->op_private & OPpENTERSUB_HASTARG)
2704 sv_catpv(tmpsv, ",HASTARG");
2705 if (o->op_private & OPpENTERSUB_NOPAREN)
2706 sv_catpv(tmpsv, ",NOPAREN");
2707 if (o->op_private & OPpENTERSUB_INARGS)
2708 sv_catpv(tmpsv, ",INARGS");
2709 if (o->op_private & OPpENTERSUB_NOMOD)
2710 sv_catpv(tmpsv, ",NOMOD");
2713 switch (o->op_private & OPpDEREF) {
2715 sv_catpv(tmpsv, ",SV");
2718 sv_catpv(tmpsv, ",AV");
2721 sv_catpv(tmpsv, ",HV");
2724 if (o->op_private & OPpMAYBE_LVSUB)
2725 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2727 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2728 if (o->op_private & OPpLVAL_DEFER)
2729 sv_catpv(tmpsv, ",LVAL_DEFER");
2732 if (o->op_private & HINT_STRICT_REFS)
2733 sv_catpv(tmpsv, ",STRICT_REFS");
2734 if (o->op_private & OPpOUR_INTRO)
2735 sv_catpv(tmpsv, ",OUR_INTRO");
2738 else if (o->op_type == OP_CONST) {
2739 if (o->op_private & OPpCONST_BARE)
2740 sv_catpv(tmpsv, ",BARE");
2741 if (o->op_private & OPpCONST_STRICT)
2742 sv_catpv(tmpsv, ",STRICT");
2743 if (o->op_private & OPpCONST_ARYBASE)
2744 sv_catpv(tmpsv, ",ARYBASE");
2745 if (o->op_private & OPpCONST_WARNING)
2746 sv_catpv(tmpsv, ",WARNING");
2747 if (o->op_private & OPpCONST_ENTERED)
2748 sv_catpv(tmpsv, ",ENTERED");
2750 else if (o->op_type == OP_FLIP) {
2751 if (o->op_private & OPpFLIP_LINENUM)
2752 sv_catpv(tmpsv, ",LINENUM");
2754 else if (o->op_type == OP_FLOP) {
2755 if (o->op_private & OPpFLIP_LINENUM)
2756 sv_catpv(tmpsv, ",LINENUM");
2758 else if (o->op_type == OP_RV2CV) {
2759 if (o->op_private & OPpLVAL_INTRO)
2760 sv_catpv(tmpsv, ",INTRO");
2762 else if (o->op_type == OP_GV) {
2763 if (o->op_private & OPpEARLY_CV)
2764 sv_catpv(tmpsv, ",EARLY_CV");
2766 else if (o->op_type == OP_LIST) {
2767 if (o->op_private & OPpLIST_GUESSED)
2768 sv_catpv(tmpsv, ",GUESSED");
2770 else if (o->op_type == OP_DELETE) {
2771 if (o->op_private & OPpSLICE)
2772 sv_catpv(tmpsv, ",SLICE");
2774 else if (o->op_type == OP_EXISTS) {
2775 if (o->op_private & OPpEXISTS_SUB)
2776 sv_catpv(tmpsv, ",EXISTS_SUB");
2778 else if (o->op_type == OP_SORT) {
2779 if (o->op_private & OPpSORT_NUMERIC)
2780 sv_catpv(tmpsv, ",NUMERIC");
2781 if (o->op_private & OPpSORT_INTEGER)
2782 sv_catpv(tmpsv, ",INTEGER");
2783 if (o->op_private & OPpSORT_REVERSE)
2784 sv_catpv(tmpsv, ",REVERSE");
2786 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2787 if (o->op_private & OPpOPEN_IN_RAW)
2788 sv_catpv(tmpsv, ",IN_RAW");
2789 if (o->op_private & OPpOPEN_IN_CRLF)
2790 sv_catpv(tmpsv, ",IN_CRLF");
2791 if (o->op_private & OPpOPEN_OUT_RAW)
2792 sv_catpv(tmpsv, ",OUT_RAW");
2793 if (o->op_private & OPpOPEN_OUT_CRLF)
2794 sv_catpv(tmpsv, ",OUT_CRLF");
2796 else if (o->op_type == OP_EXIT) {
2797 if (o->op_private & OPpEXIT_VMSISH)
2798 sv_catpv(tmpsv, ",EXIT_VMSISH");
2799 if (o->op_private & OPpHUSH_VMSISH)
2800 sv_catpv(tmpsv, ",HUSH_VMSISH");
2802 else if (o->op_type == OP_DIE) {
2803 if (o->op_private & OPpHUSH_VMSISH)
2804 sv_catpv(tmpsv, ",HUSH_VMSISH");
2806 else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
2807 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
2808 sv_catpv(tmpsv, ",FT_ACCESS");
2809 if (o->op_private & OPpFT_STACKED)
2810 sv_catpv(tmpsv, ",FT_STACKED");
2812 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2813 sv_catpv(tmpsv, ",INTRO");
2815 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
2816 SvREFCNT_dec(tmpsv);
2819 switch (o->op_type) {
2821 if (o->op_flags & OPf_SPECIAL) {
2827 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
2829 if (cSVOPo->op_sv) {
2830 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
2831 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
2837 gv_fullname3(tmpsv1, (GV*)cSVOPo->op_sv, NULL);
2838 s = SvPV(tmpsv1,len);
2839 sv_catxmlpvn(tmpsv2, s, len, 1);
2840 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
2844 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
2849 case OP_METHOD_NAMED:
2850 #ifndef USE_ITHREADS
2851 /* with ITHREADS, consts are stored in the pad, and the right pad
2852 * may not be active here, so skip */
2853 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
2859 PerlIO_printf(file, ">\n");
2861 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
2866 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
2867 (UV)CopLINE(cCOPo));
2868 if (CopSTASHPV(cCOPo))
2869 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
2871 if (CopLABEL(cCOPo))
2872 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
2876 S_xmldump_attr(aTHX_ level, file, "redo=\"");
2877 if (cLOOPo->op_redoop)
2878 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
2880 PerlIO_printf(file, "DONE\"");
2881 S_xmldump_attr(aTHX_ level, file, "next=\"");
2882 if (cLOOPo->op_nextop)
2883 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
2885 PerlIO_printf(file, "DONE\"");
2886 S_xmldump_attr(aTHX_ level, file, "last=\"");
2887 if (cLOOPo->op_lastop)
2888 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
2890 PerlIO_printf(file, "DONE\"");
2898 S_xmldump_attr(aTHX_ level, file, "other=\"");
2899 if (cLOGOPo->op_other)
2900 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
2902 PerlIO_printf(file, "DONE\"");
2910 if (o->op_private & OPpREFCOUNTED)
2911 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
2917 if (PL_madskills && o->op_madprop) {
2918 char prevkey = '\0';
2919 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2920 const MADPROP* mp = o->op_madprop;
2924 PerlIO_printf(file, ">\n");
2926 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
2929 char tmp = mp->mad_key;
2930 sv_setpvn(tmpsv,"\"",1);
2932 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
2933 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
2934 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
2937 sv_catpv(tmpsv, "\"");
2938 switch (mp->mad_type) {
2940 sv_catpv(tmpsv, "NULL");
2941 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
2944 sv_catpv(tmpsv, " val=\"");
2945 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
2946 sv_catpv(tmpsv, "\"");
2947 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
2950 sv_catpv(tmpsv, " val=\"");
2951 sv_catxmlsv(tmpsv, (SV*)mp->mad_val);
2952 sv_catpv(tmpsv, "\"");
2953 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
2956 if ((OP*)mp->mad_val) {
2957 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
2958 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
2959 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
2963 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
2969 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
2971 SvREFCNT_dec(tmpsv);
2974 switch (o->op_type) {
2981 PerlIO_printf(file, ">\n");
2983 do_pmop_xmldump(level, file, cPMOPo);
2989 if (o->op_flags & OPf_KIDS) {
2993 PerlIO_printf(file, ">\n");
2995 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
2996 do_op_xmldump(level, file, kid);
3000 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3002 PerlIO_printf(file, " />\n");
3006 Perl_op_xmldump(pTHX_ const OP *o)
3008 PERL_ARGS_ASSERT_OP_XMLDUMP;
3010 do_op_xmldump(0, PL_xmlfp, o);
3016 * c-indentation-style: bsd
3018 * indent-tabs-mode: t
3021 * ex: set ts=8 sts=4 sw=4 noet: