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.'
15 * [p.220 of _The Lord of the Rings_, II/i: "Many Meetings"]
18 /* This file contains utility routines to dump the contents of SV and OP
19 * structures, as used by command-line options like -Dt and -Dx, and
22 * It also holds the debugging version of the runops function.
26 #define PERL_IN_DUMP_C
32 static const char* const svtypenames[SVt_LAST] = {
52 static const char* const svshorttypenames[SVt_LAST] = {
77 S_append_flags(pTHX_ SV *sv, U32 flags, const struct flag_to_name *start,
78 const struct flag_to_name *const end)
81 if (flags & start->flag)
82 sv_catpv(sv, start->name);
83 } while (++start < end);
86 #define append_flags(sv, f, flags) \
87 S_append_flags(aTHX_ (sv), (f), (flags), (flags) + C_ARRAY_LENGTH(flags))
90 #define Sequence PL_op_sequence
93 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
96 PERL_ARGS_ASSERT_DUMP_INDENT;
98 dump_vindent(level, file, pat, &args);
103 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
106 PERL_ARGS_ASSERT_DUMP_VINDENT;
107 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
108 PerlIO_vprintf(file, pat, *args);
114 dump_all_perl(FALSE);
118 Perl_dump_all_perl(pTHX_ bool justperl)
122 PerlIO_setlinebuf(Perl_debug_log);
124 op_dump(PL_main_root);
125 dump_packsubs_perl(PL_defstash, justperl);
129 Perl_dump_packsubs(pTHX_ const HV *stash)
131 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
132 dump_packsubs_perl(stash, FALSE);
136 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
141 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
145 for (i = 0; i <= (I32) HvMAX(stash); i++) {
147 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
148 const GV * const gv = (const GV *)HeVAL(entry);
149 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
152 dump_sub_perl(gv, justperl);
155 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
156 const HV * const hv = GvHV(gv);
157 if (hv && (hv != PL_defstash))
158 dump_packsubs_perl(hv, justperl); /* nested package */
165 Perl_dump_sub(pTHX_ const GV *gv)
167 PERL_ARGS_ASSERT_DUMP_SUB;
168 dump_sub_perl(gv, FALSE);
172 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
176 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
178 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
182 gv_fullname3(sv, gv, NULL);
183 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
184 if (CvISXSUB(GvCV(gv)))
185 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
186 PTR2UV(CvXSUB(GvCV(gv))),
187 (int)CvXSUBANY(GvCV(gv)).any_i32);
188 else if (CvROOT(GvCV(gv)))
189 op_dump(CvROOT(GvCV(gv)));
191 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
195 Perl_dump_form(pTHX_ const GV *gv)
197 SV * const sv = sv_newmortal();
199 PERL_ARGS_ASSERT_DUMP_FORM;
201 gv_fullname3(sv, gv, NULL);
202 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
203 if (CvROOT(GvFORM(gv)))
204 op_dump(CvROOT(GvFORM(gv)));
206 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
213 op_dump(PL_eval_root);
218 =for apidoc pv_escape
220 Escapes at most the first "count" chars of pv and puts the results into
221 dsv such that the size of the escaped string will not exceed "max" chars
222 and will not contain any incomplete escape sequences.
224 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
225 will also be escaped.
227 Normally the SV will be cleared before the escaped string is prepared,
228 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
230 If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
231 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
232 using C<is_utf8_string()> to determine if it is Unicode.
234 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
235 using C<\x01F1> style escapes, otherwise only chars above 255 will be
236 escaped using this style, other non printable chars will use octal or
237 common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
238 then all chars below 255 will be treated as printable and
239 will be output as literals.
241 If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
242 string will be escaped, regardles of max. If the string is utf8 and
243 the chars value is >255 then it will be returned as a plain hex
244 sequence. Thus the output will either be a single char,
245 an octal escape sequence, a special escape like C<\n> or a 3 or
246 more digit hex value.
248 If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
249 not a '\\'. This is because regexes very often contain backslashed
250 sequences, whereas '%' is not a particularly common character in patterns.
252 Returns a pointer to the escaped text as held by dsv.
256 #define PV_ESCAPE_OCTBUFSIZE 32
259 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
260 const STRLEN count, const STRLEN max,
261 STRLEN * const escaped, const U32 flags )
263 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
264 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
265 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
266 STRLEN wrote = 0; /* chars written so far */
267 STRLEN chsize = 0; /* size of data to be written */
268 STRLEN readsize = 1; /* size of data just read */
269 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
270 const char *pv = str;
271 const char * const end = pv + count; /* end of string */
274 PERL_ARGS_ASSERT_PV_ESCAPE;
276 if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
277 /* This won't alter the UTF-8 flag */
281 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
284 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
285 const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv;
286 const U8 c = (U8)u & 0xFF;
288 if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) {
289 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
290 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
293 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
294 "%cx{%"UVxf"}", esc, u);
295 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
298 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
302 case '\\' : /* fallthrough */
303 case '%' : if ( c == esc ) {
309 case '\v' : octbuf[1] = 'v'; break;
310 case '\t' : octbuf[1] = 't'; break;
311 case '\r' : octbuf[1] = 'r'; break;
312 case '\n' : octbuf[1] = 'n'; break;
313 case '\f' : octbuf[1] = 'f'; break;
321 if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) )
322 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
325 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
332 if ( max && (wrote + chsize > max) ) {
334 } else if (chsize > 1) {
335 sv_catpvn(dsv, octbuf, chsize);
338 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then bytes in the range
339 128-255 can be appended raw to the dsv. If dsv happens to be
340 UTF-8 then we need catpvf to upgrade them for us.
341 Or add a new API call sv_catpvc(). Think about that name, and
342 how to keep it clear that it's unlike the s of catpvs, which is
343 really an array octets, not a string. */
344 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
347 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
355 =for apidoc pv_pretty
357 Converts a string into something presentable, handling escaping via
358 pv_escape() and supporting quoting and ellipses.
360 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
361 double quoted with any double quotes in the string escaped. Otherwise
362 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
365 If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
366 string were output then an ellipsis C<...> will be appended to the
367 string. Note that this happens AFTER it has been quoted.
369 If start_color is non-null then it will be inserted after the opening
370 quote (if there is one) but before the escaped text. If end_color
371 is non-null then it will be inserted after the escaped text but before
372 any quotes or ellipses.
374 Returns a pointer to the prettified text as held by dsv.
380 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
381 const STRLEN max, char const * const start_color, char const * const end_color,
384 const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
387 PERL_ARGS_ASSERT_PV_PRETTY;
389 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
390 /* This won't alter the UTF-8 flag */
395 sv_catpvs(dsv, "\"");
396 else if ( flags & PERL_PV_PRETTY_LTGT )
399 if ( start_color != NULL )
400 sv_catpv(dsv, start_color);
402 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
404 if ( end_color != NULL )
405 sv_catpv(dsv, end_color);
408 sv_catpvs( dsv, "\"");
409 else if ( flags & PERL_PV_PRETTY_LTGT )
412 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
413 sv_catpvs(dsv, "...");
419 =for apidoc pv_display
423 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
425 except that an additional "\0" will be appended to the string when
426 len > cur and pv[cur] is "\0".
428 Note that the final string may be up to 7 chars longer than pvlim.
434 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
436 PERL_ARGS_ASSERT_PV_DISPLAY;
438 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
439 if (len > cur && pv[cur] == '\0')
440 sv_catpvs( dsv, "\\0");
445 Perl_sv_peek(pTHX_ SV *sv)
448 SV * const t = sv_newmortal();
458 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
462 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
463 if (sv == &PL_sv_undef) {
464 sv_catpv(t, "SV_UNDEF");
465 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
466 SVs_GMG|SVs_SMG|SVs_RMG)) &&
470 else if (sv == &PL_sv_no) {
471 sv_catpv(t, "SV_NO");
472 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
473 SVs_GMG|SVs_SMG|SVs_RMG)) &&
474 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
480 else if (sv == &PL_sv_yes) {
481 sv_catpv(t, "SV_YES");
482 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
483 SVs_GMG|SVs_SMG|SVs_RMG)) &&
484 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
487 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
492 sv_catpv(t, "SV_PLACEHOLDER");
493 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
494 SVs_GMG|SVs_SMG|SVs_RMG)) &&
500 else if (SvREFCNT(sv) == 0) {
504 else if (DEBUG_R_TEST_) {
507 /* is this SV on the tmps stack? */
508 for (ix=PL_tmps_ix; ix>=0; ix--) {
509 if (PL_tmps_stack[ix] == sv) {
514 if (SvREFCNT(sv) > 1)
515 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
523 if (SvCUR(t) + unref > 10) {
524 SvCUR_set(t, unref + 3);
533 if (type == SVt_PVCV) {
534 Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
536 } else if (type < SVt_LAST) {
537 sv_catpv(t, svshorttypenames[type]);
539 if (type == SVt_NULL)
542 sv_catpv(t, "FREED");
547 if (!SvPVX_const(sv))
548 sv_catpv(t, "(null)");
550 SV * const tmp = newSVpvs("");
554 SvOOK_offset(sv, delta);
555 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
557 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
559 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
560 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
565 else if (SvNOKp(sv)) {
566 STORE_NUMERIC_LOCAL_SET_STANDARD();
567 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
568 RESTORE_NUMERIC_LOCAL();
570 else if (SvIOKp(sv)) {
572 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
574 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
582 if (PL_tainting && SvTAINTED(sv))
583 sv_catpv(t, " [tainted]");
584 return SvPV_nolen(t);
588 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
592 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
595 Perl_dump_indent(aTHX_ level, file, "{}\n");
598 Perl_dump_indent(aTHX_ level, file, "{\n");
600 if (pm->op_pmflags & PMf_ONCE)
605 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
606 ch, RX_PRECOMP(PM_GETRE(pm)), ch,
607 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
609 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
610 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
611 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
612 op_dump(pm->op_pmreplrootu.op_pmreplroot);
614 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
615 SV * const tmpsv = pm_description(pm);
616 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
620 Perl_dump_indent(aTHX_ level-1, file, "}\n");
623 const struct flag_to_name pmflags_flags_names[] = {
624 {PMf_CONST, ",CONST"},
626 {PMf_GLOBAL, ",GLOBAL"},
627 {PMf_CONTINUE, ",CONTINUE"},
628 {PMf_RETAINT, ",RETAINT"},
630 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
634 S_pm_description(pTHX_ const PMOP *pm)
636 SV * const desc = newSVpvs("");
637 const REGEXP * const regex = PM_GETRE(pm);
638 const U32 pmflags = pm->op_pmflags;
640 PERL_ARGS_ASSERT_PM_DESCRIPTION;
642 if (pmflags & PMf_ONCE)
643 sv_catpv(desc, ",ONCE");
645 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
646 sv_catpv(desc, ":USED");
648 if (pmflags & PMf_USED)
649 sv_catpv(desc, ":USED");
653 if (RX_EXTFLAGS(regex) & RXf_TAINTED)
654 sv_catpv(desc, ",TAINTED");
655 if (RX_CHECK_SUBSTR(regex)) {
656 if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN))
657 sv_catpv(desc, ",SCANFIRST");
658 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
659 sv_catpv(desc, ",ALL");
661 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
662 sv_catpv(desc, ",SKIPWHITE");
665 append_flags(desc, pmflags, pmflags_flags_names);
670 Perl_pmop_dump(pTHX_ PMOP *pm)
672 do_pmop_dump(0, Perl_debug_log, pm);
675 /* An op sequencer. We visit the ops in the order they're to execute. */
678 S_sequence(pTHX_ register const OP *o)
681 const OP *oldop = NULL;
694 for (; o; o = o->op_next) {
696 SV * const op = newSVuv(PTR2UV(o));
697 const char * const key = SvPV_const(op, len);
699 if (hv_exists(Sequence, key, len))
702 switch (o->op_type) {
704 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
705 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
714 if (oldop && o->op_next)
721 if (oldop && o->op_next)
723 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
736 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
737 sequence_tail(cLOGOPo->op_other);
742 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
743 sequence_tail(cLOOPo->op_redoop);
744 sequence_tail(cLOOPo->op_nextop);
745 sequence_tail(cLOOPo->op_lastop);
749 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
750 sequence_tail(cPMOPo->op_pmstashstartu.op_pmreplstart);
759 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
767 S_sequence_tail(pTHX_ const OP *o)
769 while (o && (o->op_type == OP_NULL))
775 S_sequence_num(pTHX_ const OP *o)
783 op = newSVuv(PTR2UV(o));
784 key = SvPV_const(op, len);
785 seq = hv_fetch(Sequence, key, len, 0);
786 return seq ? SvUV(*seq): 0;
789 const struct flag_to_name op_flags_names[] = {
791 {OPf_PARENS, ",PARENS"},
792 {OPf_STACKED, ",STACKED"},
795 {OPf_SPECIAL, ",SPECIAL"}
799 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
803 const OPCODE optype = o->op_type;
805 PERL_ARGS_ASSERT_DO_OP_DUMP;
808 Perl_dump_indent(aTHX_ level, file, "{\n");
810 seq = sequence_num(o);
812 PerlIO_printf(file, "%-4"UVuf, seq);
814 PerlIO_printf(file, " ");
816 "%*sTYPE = %s ===> ",
817 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
819 PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n",
820 sequence_num(o->op_next));
822 PerlIO_printf(file, "DONE\n");
824 if (optype == OP_NULL) {
825 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
826 if (o->op_targ == OP_NEXTSTATE) {
828 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
830 if (CopSTASHPV(cCOPo))
831 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
834 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
839 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
842 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
844 if (o->op_flags || o->op_latefree || o->op_latefreed || o->op_attached) {
845 SV * const tmpsv = newSVpvs("");
846 switch (o->op_flags & OPf_WANT) {
848 sv_catpv(tmpsv, ",VOID");
850 case OPf_WANT_SCALAR:
851 sv_catpv(tmpsv, ",SCALAR");
854 sv_catpv(tmpsv, ",LIST");
857 sv_catpv(tmpsv, ",UNKNOWN");
860 append_flags(tmpsv, o->op_flags, op_flags_names);
862 sv_catpv(tmpsv, ",LATEFREE");
864 sv_catpv(tmpsv, ",LATEFREED");
866 sv_catpv(tmpsv, ",ATTACHED");
867 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
871 SV * const tmpsv = newSVpvs("");
872 if (PL_opargs[optype] & OA_TARGLEX) {
873 if (o->op_private & OPpTARGET_MY)
874 sv_catpv(tmpsv, ",TARGET_MY");
876 else if (optype == OP_LEAVESUB ||
877 optype == OP_LEAVE ||
878 optype == OP_LEAVESUBLV ||
879 optype == OP_LEAVEWRITE) {
880 if (o->op_private & OPpREFCOUNTED)
881 sv_catpv(tmpsv, ",REFCOUNTED");
883 else if (optype == OP_AASSIGN) {
884 if (o->op_private & OPpASSIGN_COMMON)
885 sv_catpv(tmpsv, ",COMMON");
887 else if (optype == OP_SASSIGN) {
888 if (o->op_private & OPpASSIGN_BACKWARDS)
889 sv_catpv(tmpsv, ",BACKWARDS");
891 else if (optype == OP_TRANS) {
892 if (o->op_private & OPpTRANS_SQUASH)
893 sv_catpv(tmpsv, ",SQUASH");
894 if (o->op_private & OPpTRANS_DELETE)
895 sv_catpv(tmpsv, ",DELETE");
896 if (o->op_private & OPpTRANS_COMPLEMENT)
897 sv_catpv(tmpsv, ",COMPLEMENT");
898 if (o->op_private & OPpTRANS_IDENTICAL)
899 sv_catpv(tmpsv, ",IDENTICAL");
900 if (o->op_private & OPpTRANS_GROWS)
901 sv_catpv(tmpsv, ",GROWS");
903 else if (optype == OP_REPEAT) {
904 if (o->op_private & OPpREPEAT_DOLIST)
905 sv_catpv(tmpsv, ",DOLIST");
907 else if (optype == OP_ENTERSUB ||
908 optype == OP_RV2SV ||
910 optype == OP_RV2AV ||
911 optype == OP_RV2HV ||
912 optype == OP_RV2GV ||
913 optype == OP_AELEM ||
916 if (optype == OP_ENTERSUB) {
917 if (o->op_private & OPpENTERSUB_AMPER)
918 sv_catpv(tmpsv, ",AMPER");
919 if (o->op_private & OPpENTERSUB_DB)
920 sv_catpv(tmpsv, ",DB");
921 if (o->op_private & OPpENTERSUB_HASTARG)
922 sv_catpv(tmpsv, ",HASTARG");
923 if (o->op_private & OPpENTERSUB_NOPAREN)
924 sv_catpv(tmpsv, ",NOPAREN");
925 if (o->op_private & OPpENTERSUB_INARGS)
926 sv_catpv(tmpsv, ",INARGS");
927 if (o->op_private & OPpENTERSUB_NOMOD)
928 sv_catpv(tmpsv, ",NOMOD");
931 switch (o->op_private & OPpDEREF) {
933 sv_catpv(tmpsv, ",SV");
936 sv_catpv(tmpsv, ",AV");
939 sv_catpv(tmpsv, ",HV");
942 if (o->op_private & OPpMAYBE_LVSUB)
943 sv_catpv(tmpsv, ",MAYBE_LVSUB");
946 if ((optype==OP_RV2SV || optype==OP_RV2AV || optype==OP_RV2HV)
947 && (o->op_private & OPpDEREFed))
948 sv_catpv(tmpsv, ",DEREFed");
950 if (optype == OP_AELEM || optype == OP_HELEM) {
951 if (o->op_private & OPpLVAL_DEFER)
952 sv_catpv(tmpsv, ",LVAL_DEFER");
955 if (o->op_private & HINT_STRICT_REFS)
956 sv_catpv(tmpsv, ",STRICT_REFS");
957 if (o->op_private & OPpOUR_INTRO)
958 sv_catpv(tmpsv, ",OUR_INTRO");
961 else if (optype == OP_CONST) {
962 if (o->op_private & OPpCONST_BARE)
963 sv_catpv(tmpsv, ",BARE");
964 if (o->op_private & OPpCONST_STRICT)
965 sv_catpv(tmpsv, ",STRICT");
966 if (o->op_private & OPpCONST_ARYBASE)
967 sv_catpv(tmpsv, ",ARYBASE");
968 if (o->op_private & OPpCONST_WARNING)
969 sv_catpv(tmpsv, ",WARNING");
970 if (o->op_private & OPpCONST_ENTERED)
971 sv_catpv(tmpsv, ",ENTERED");
973 else if (optype == OP_FLIP) {
974 if (o->op_private & OPpFLIP_LINENUM)
975 sv_catpv(tmpsv, ",LINENUM");
977 else if (optype == OP_FLOP) {
978 if (o->op_private & OPpFLIP_LINENUM)
979 sv_catpv(tmpsv, ",LINENUM");
981 else if (optype == OP_RV2CV) {
982 if (o->op_private & OPpLVAL_INTRO)
983 sv_catpv(tmpsv, ",INTRO");
985 else if (optype == OP_GV) {
986 if (o->op_private & OPpEARLY_CV)
987 sv_catpv(tmpsv, ",EARLY_CV");
989 else if (optype == OP_LIST) {
990 if (o->op_private & OPpLIST_GUESSED)
991 sv_catpv(tmpsv, ",GUESSED");
993 else if (optype == OP_DELETE) {
994 if (o->op_private & OPpSLICE)
995 sv_catpv(tmpsv, ",SLICE");
997 else if (optype == OP_EXISTS) {
998 if (o->op_private & OPpEXISTS_SUB)
999 sv_catpv(tmpsv, ",EXISTS_SUB");
1001 else if (optype == OP_SORT) {
1002 if (o->op_private & OPpSORT_NUMERIC)
1003 sv_catpv(tmpsv, ",NUMERIC");
1004 if (o->op_private & OPpSORT_INTEGER)
1005 sv_catpv(tmpsv, ",INTEGER");
1006 if (o->op_private & OPpSORT_REVERSE)
1007 sv_catpv(tmpsv, ",REVERSE");
1009 else if (optype == OP_OPEN || optype == OP_BACKTICK) {
1010 if (o->op_private & OPpOPEN_IN_RAW)
1011 sv_catpv(tmpsv, ",IN_RAW");
1012 if (o->op_private & OPpOPEN_IN_CRLF)
1013 sv_catpv(tmpsv, ",IN_CRLF");
1014 if (o->op_private & OPpOPEN_OUT_RAW)
1015 sv_catpv(tmpsv, ",OUT_RAW");
1016 if (o->op_private & OPpOPEN_OUT_CRLF)
1017 sv_catpv(tmpsv, ",OUT_CRLF");
1019 else if (optype == OP_EXIT) {
1020 if (o->op_private & OPpEXIT_VMSISH)
1021 sv_catpv(tmpsv, ",EXIT_VMSISH");
1022 if (o->op_private & OPpHUSH_VMSISH)
1023 sv_catpv(tmpsv, ",HUSH_VMSISH");
1025 else if (optype == OP_DIE) {
1026 if (o->op_private & OPpHUSH_VMSISH)
1027 sv_catpv(tmpsv, ",HUSH_VMSISH");
1029 else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
1030 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
1031 sv_catpv(tmpsv, ",FT_ACCESS");
1032 if (o->op_private & OPpFT_STACKED)
1033 sv_catpv(tmpsv, ",FT_STACKED");
1035 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
1036 sv_catpv(tmpsv, ",INTRO");
1038 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
1039 SvREFCNT_dec(tmpsv);
1043 if (PL_madskills && o->op_madprop) {
1044 SV * const tmpsv = newSVpvs("");
1045 MADPROP* mp = o->op_madprop;
1046 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
1049 const char tmp = mp->mad_key;
1050 sv_setpvs(tmpsv,"'");
1052 sv_catpvn(tmpsv, &tmp, 1);
1053 sv_catpv(tmpsv, "'=");
1054 switch (mp->mad_type) {
1056 sv_catpv(tmpsv, "NULL");
1057 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1060 sv_catpv(tmpsv, "<");
1061 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
1062 sv_catpv(tmpsv, ">");
1063 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1066 if ((OP*)mp->mad_val) {
1067 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1068 do_op_dump(level, file, (OP*)mp->mad_val);
1072 sv_catpv(tmpsv, "(UNK)");
1073 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1079 Perl_dump_indent(aTHX_ level, file, "}\n");
1081 SvREFCNT_dec(tmpsv);
1090 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1092 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
1093 if (cSVOPo->op_sv) {
1094 SV * const tmpsv = newSV(0);
1098 /* FIXME - is this making unwarranted assumptions about the
1099 UTF-8 cleanliness of the dump file handle? */
1102 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
1103 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1104 SvPV_nolen_const(tmpsv));
1108 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1114 case OP_METHOD_NAMED:
1115 #ifndef USE_ITHREADS
1116 /* with ITHREADS, consts are stored in the pad, and the right pad
1117 * may not be active here, so skip */
1118 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1124 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1125 (UV)CopLINE(cCOPo));
1126 if (CopSTASHPV(cCOPo))
1127 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1129 if (CopLABEL(cCOPo))
1130 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1134 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1135 if (cLOOPo->op_redoop)
1136 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1138 PerlIO_printf(file, "DONE\n");
1139 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1140 if (cLOOPo->op_nextop)
1141 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1143 PerlIO_printf(file, "DONE\n");
1144 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1145 if (cLOOPo->op_lastop)
1146 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1148 PerlIO_printf(file, "DONE\n");
1156 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1157 if (cLOGOPo->op_other)
1158 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1160 PerlIO_printf(file, "DONE\n");
1166 do_pmop_dump(level, file, cPMOPo);
1174 if (o->op_private & OPpREFCOUNTED)
1175 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1180 if (o->op_flags & OPf_KIDS) {
1182 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1183 do_op_dump(level, file, kid);
1185 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1189 Perl_op_dump(pTHX_ const OP *o)
1191 PERL_ARGS_ASSERT_OP_DUMP;
1192 do_op_dump(0, Perl_debug_log, o);
1196 Perl_gv_dump(pTHX_ GV *gv)
1200 PERL_ARGS_ASSERT_GV_DUMP;
1203 PerlIO_printf(Perl_debug_log, "{}\n");
1206 sv = sv_newmortal();
1207 PerlIO_printf(Perl_debug_log, "{\n");
1208 gv_fullname3(sv, gv, NULL);
1209 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1210 if (gv != GvEGV(gv)) {
1211 gv_efullname3(sv, GvEGV(gv), NULL);
1212 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1214 PerlIO_putc(Perl_debug_log, '\n');
1215 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1219 /* map magic types to the symbolic names
1220 * (with the PERL_MAGIC_ prefixed stripped)
1223 static const struct { const char type; const char *name; } magic_names[] = {
1224 { PERL_MAGIC_sv, "sv(\\0)" },
1225 { PERL_MAGIC_arylen, "arylen(#)" },
1226 { PERL_MAGIC_rhash, "rhash(%)" },
1227 { PERL_MAGIC_pos, "pos(.)" },
1228 { PERL_MAGIC_symtab, "symtab(:)" },
1229 { PERL_MAGIC_backref, "backref(<)" },
1230 { PERL_MAGIC_arylen_p, "arylen_p(@)" },
1231 { PERL_MAGIC_overload, "overload(A)" },
1232 { PERL_MAGIC_bm, "bm(B)" },
1233 { PERL_MAGIC_regdata, "regdata(D)" },
1234 { PERL_MAGIC_env, "env(E)" },
1235 { PERL_MAGIC_hints, "hints(H)" },
1236 { PERL_MAGIC_isa, "isa(I)" },
1237 { PERL_MAGIC_dbfile, "dbfile(L)" },
1238 { PERL_MAGIC_shared, "shared(N)" },
1239 { PERL_MAGIC_tied, "tied(P)" },
1240 { PERL_MAGIC_sig, "sig(S)" },
1241 { PERL_MAGIC_uvar, "uvar(U)" },
1242 { PERL_MAGIC_overload_elem, "overload_elem(a)" },
1243 { PERL_MAGIC_overload_table, "overload_table(c)" },
1244 { PERL_MAGIC_regdatum, "regdatum(d)" },
1245 { PERL_MAGIC_envelem, "envelem(e)" },
1246 { PERL_MAGIC_fm, "fm(f)" },
1247 { PERL_MAGIC_regex_global, "regex_global(g)" },
1248 { PERL_MAGIC_hintselem, "hintselem(h)" },
1249 { PERL_MAGIC_isaelem, "isaelem(i)" },
1250 { PERL_MAGIC_nkeys, "nkeys(k)" },
1251 { PERL_MAGIC_dbline, "dbline(l)" },
1252 { PERL_MAGIC_shared_scalar, "shared_scalar(n)" },
1253 { PERL_MAGIC_collxfrm, "collxfrm(o)" },
1254 { PERL_MAGIC_tiedelem, "tiedelem(p)" },
1255 { PERL_MAGIC_tiedscalar, "tiedscalar(q)" },
1256 { PERL_MAGIC_qr, "qr(r)" },
1257 { PERL_MAGIC_sigelem, "sigelem(s)" },
1258 { PERL_MAGIC_taint, "taint(t)" },
1259 { PERL_MAGIC_uvar_elem, "uvar_elem(u)" },
1260 { PERL_MAGIC_vec, "vec(v)" },
1261 { PERL_MAGIC_vstring, "vstring(V)" },
1262 { PERL_MAGIC_utf8, "utf8(w)" },
1263 { PERL_MAGIC_substr, "substr(x)" },
1264 { PERL_MAGIC_defelem, "defelem(y)" },
1265 { PERL_MAGIC_ext, "ext(~)" },
1266 /* this null string terminates the list */
1271 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1273 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1275 for (; mg; mg = mg->mg_moremagic) {
1276 Perl_dump_indent(aTHX_ level, file,
1277 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1278 if (mg->mg_virtual) {
1279 const MGVTBL * const v = mg->mg_virtual;
1281 if (v == &PL_vtbl_sv) s = "sv";
1282 else if (v == &PL_vtbl_env) s = "env";
1283 else if (v == &PL_vtbl_envelem) s = "envelem";
1284 else if (v == &PL_vtbl_sig) s = "sig";
1285 else if (v == &PL_vtbl_sigelem) s = "sigelem";
1286 else if (v == &PL_vtbl_pack) s = "pack";
1287 else if (v == &PL_vtbl_packelem) s = "packelem";
1288 else if (v == &PL_vtbl_dbline) s = "dbline";
1289 else if (v == &PL_vtbl_isa) s = "isa";
1290 else if (v == &PL_vtbl_arylen) s = "arylen";
1291 else if (v == &PL_vtbl_mglob) s = "mglob";
1292 else if (v == &PL_vtbl_nkeys) s = "nkeys";
1293 else if (v == &PL_vtbl_taint) s = "taint";
1294 else if (v == &PL_vtbl_substr) s = "substr";
1295 else if (v == &PL_vtbl_vec) s = "vec";
1296 else if (v == &PL_vtbl_pos) s = "pos";
1297 else if (v == &PL_vtbl_bm) s = "bm";
1298 else if (v == &PL_vtbl_fm) s = "fm";
1299 else if (v == &PL_vtbl_uvar) s = "uvar";
1300 else if (v == &PL_vtbl_defelem) s = "defelem";
1301 #ifdef USE_LOCALE_COLLATE
1302 else if (v == &PL_vtbl_collxfrm) s = "collxfrm";
1304 else if (v == &PL_vtbl_amagic) s = "amagic";
1305 else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
1306 else if (v == &PL_vtbl_backref) s = "backref";
1307 else if (v == &PL_vtbl_utf8) s = "utf8";
1308 else if (v == &PL_vtbl_arylen_p) s = "arylen_p";
1309 else if (v == &PL_vtbl_hintselem) s = "hintselem";
1310 else if (v == &PL_vtbl_hints) s = "hints";
1313 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s);
1315 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1318 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1321 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1325 const char *name = NULL;
1326 for (n = 0; magic_names[n].name; n++) {
1327 if (mg->mg_type == magic_names[n].type) {
1328 name = magic_names[n].name;
1333 Perl_dump_indent(aTHX_ level, file,
1334 " MG_TYPE = PERL_MAGIC_%s\n", name);
1336 Perl_dump_indent(aTHX_ level, file,
1337 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1341 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1342 if (mg->mg_type == PERL_MAGIC_envelem &&
1343 mg->mg_flags & MGf_TAINTEDDIR)
1344 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1345 if (mg->mg_flags & MGf_REFCOUNTED)
1346 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1347 if (mg->mg_flags & MGf_GSKIP)
1348 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1349 if (mg->mg_type == PERL_MAGIC_regex_global &&
1350 mg->mg_flags & MGf_MINMATCH)
1351 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1354 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1355 PTR2UV(mg->mg_obj));
1356 if (mg->mg_type == PERL_MAGIC_qr) {
1357 REGEXP* const re = (REGEXP *)mg->mg_obj;
1358 SV * const dsv = sv_newmortal();
1359 const char * const s
1360 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1362 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1363 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1365 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1366 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1369 if (mg->mg_flags & MGf_REFCOUNTED)
1370 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1373 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1375 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1376 if (mg->mg_len >= 0) {
1377 if (mg->mg_type != PERL_MAGIC_utf8) {
1378 SV * const sv = newSVpvs("");
1379 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1383 else if (mg->mg_len == HEf_SVKEY) {
1384 PerlIO_puts(file, " => HEf_SVKEY\n");
1385 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1386 maxnest, dumpops, pvlim); /* MG is already +1 */
1389 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1394 " does not know how to handle this MG_LEN"
1396 PerlIO_putc(file, '\n');
1398 if (mg->mg_type == PERL_MAGIC_utf8) {
1399 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1402 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1403 Perl_dump_indent(aTHX_ level, file,
1404 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1407 (UV)cache[i * 2 + 1]);
1414 Perl_magic_dump(pTHX_ const MAGIC *mg)
1416 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1420 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1424 PERL_ARGS_ASSERT_DO_HV_DUMP;
1426 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1427 if (sv && (hvname = HvNAME_get(sv)))
1428 PerlIO_printf(file, "\t\"%s\"\n", hvname);
1430 PerlIO_putc(file, '\n');
1434 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1436 PERL_ARGS_ASSERT_DO_GV_DUMP;
1438 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1439 if (sv && GvNAME(sv))
1440 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1442 PerlIO_putc(file, '\n');
1446 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1448 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1450 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1451 if (sv && GvNAME(sv)) {
1453 PerlIO_printf(file, "\t\"");
1454 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1455 PerlIO_printf(file, "%s\" :: \"", hvname);
1456 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1459 PerlIO_putc(file, '\n');
1462 const struct flag_to_name first_sv_flags_names[] = {
1463 {SVs_TEMP, "TEMP,"},
1464 {SVs_OBJECT, "OBJECT,"},
1473 const struct flag_to_name second_sv_flags_names[] = {
1475 {SVf_FAKE, "FAKE,"},
1476 {SVf_READONLY, "READONLY,"},
1477 {SVf_BREAK, "BREAK,"},
1478 {SVf_AMAGIC, "OVERLOAD,"},
1485 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1493 PERL_ARGS_ASSERT_DO_SV_DUMP;
1496 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1500 flags = SvFLAGS(sv);
1503 d = Perl_newSVpvf(aTHX_
1504 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1505 PTR2UV(SvANY(sv)), PTR2UV(sv),
1506 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1507 (int)(PL_dumpindent*level), "");
1509 if (!(flags & SVpad_NAME && (type == SVt_PVMG || type == SVt_PVNV))) {
1510 if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,");
1512 if (!(flags & SVpad_NAME && type == SVt_PVMG)) {
1513 if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
1514 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1516 append_flags(d, flags, first_sv_flags_names);
1517 if (flags & SVf_ROK) {
1518 sv_catpv(d, "ROK,");
1519 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1521 append_flags(d, flags, second_sv_flags_names);
1522 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1523 if (SvPCS_IMPORTED(sv))
1524 sv_catpv(d, "PCS_IMPORTED,");
1526 sv_catpv(d, "SCREAM,");
1532 if (CvANON(sv)) sv_catpv(d, "ANON,");
1533 if (CvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
1534 if (CvCLONE(sv)) sv_catpv(d, "CLONE,");
1535 if (CvCLONED(sv)) sv_catpv(d, "CLONED,");
1536 if (CvCONST(sv)) sv_catpv(d, "CONST,");
1537 if (CvNODEBUG(sv)) sv_catpv(d, "NODEBUG,");
1538 if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
1539 if (CvLVALUE(sv)) sv_catpv(d, "LVALUE,");
1540 if (CvMETHOD(sv)) sv_catpv(d, "METHOD,");
1541 if (CvWEAKOUTSIDE(sv)) sv_catpv(d, "WEAKOUTSIDE,");
1544 if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,");
1545 if (HvLAZYDEL(sv)) sv_catpv(d, "LAZYDEL,");
1546 if (HvHASKFLAGS(sv)) sv_catpv(d, "HASKFLAGS,");
1547 if (HvREHASH(sv)) sv_catpv(d, "REHASH,");
1548 if (flags & SVphv_CLONEABLE) sv_catpv(d, "CLONEABLE,");
1552 if (isGV_with_GP(sv)) {
1553 if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
1554 if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
1555 if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
1556 if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,");
1558 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1559 sv_catpv(d, "IMPORT");
1560 if (GvIMPORTED(sv) == GVf_IMPORTED)
1561 sv_catpv(d, "ALL,");
1564 if (GvIMPORTED_SV(sv)) sv_catpv(d, " SV");
1565 if (GvIMPORTED_AV(sv)) sv_catpv(d, " AV");
1566 if (GvIMPORTED_HV(sv)) sv_catpv(d, " HV");
1567 if (GvIMPORTED_CV(sv)) sv_catpv(d, " CV");
1571 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1572 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1576 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1577 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1580 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1581 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1584 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1589 /* SVphv_SHAREKEYS is also 0x20000000 */
1590 if ((type != SVt_PVHV) && SvUTF8(sv))
1591 sv_catpv(d, "UTF8");
1593 if (*(SvEND(d) - 1) == ',') {
1594 SvCUR_set(d, SvCUR(d) - 1);
1595 SvPVX(d)[SvCUR(d)] = '\0';
1600 #ifdef DEBUG_LEAKING_SCALARS
1601 Perl_dump_indent(aTHX_ level, file,
1602 "ALLOCATED at %s:%d %s %s%s; serial %"UVuf"\n",
1603 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1605 sv->sv_debug_inpad ? "for" : "by",
1606 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1607 sv->sv_debug_cloned ? " (cloned)" : "",
1611 Perl_dump_indent(aTHX_ level, file, "SV = ");
1612 if (type < SVt_LAST) {
1613 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1615 if (type == SVt_NULL) {
1620 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1624 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1625 && type != SVt_PVCV && !isGV_with_GP(sv) && type != SVt_PVFM
1626 && type != SVt_PVIO && type != SVt_REGEXP)
1627 || (type == SVt_IV && !SvROK(sv))) {
1629 #ifdef PERL_OLD_COPY_ON_WRITE
1633 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1635 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1636 #ifdef PERL_OLD_COPY_ON_WRITE
1637 if (SvIsCOW_shared_hash(sv))
1638 PerlIO_printf(file, " (HASH)");
1639 else if (SvIsCOW_normal(sv))
1640 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1642 PerlIO_putc(file, '\n');
1644 if ((type == SVt_PVNV || type == SVt_PVMG) && SvFLAGS(sv) & SVpad_NAME) {
1645 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1646 (UV) COP_SEQ_RANGE_LOW(sv));
1647 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1648 (UV) COP_SEQ_RANGE_HIGH(sv));
1649 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1650 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1651 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1652 || type == SVt_NV) {
1653 STORE_NUMERIC_LOCAL_SET_STANDARD();
1654 /* %Vg doesn't work? --jhi */
1655 #ifdef USE_LONG_DOUBLE
1656 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1658 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1660 RESTORE_NUMERIC_LOCAL();
1663 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1665 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1667 if (type < SVt_PV) {
1671 if ((type <= SVt_PVLV && !isGV_with_GP(sv)) || type == SVt_PVFM) {
1672 if (SvPVX_const(sv)) {
1675 SvOOK_offset(sv, delta);
1676 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1681 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1683 PerlIO_printf(file, "( %s . ) ",
1684 pv_display(d, SvPVX_const(sv) - delta, delta, 0,
1687 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1688 if (SvUTF8(sv)) /* the 6? \x{....} */
1689 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
1690 PerlIO_printf(file, "\n");
1691 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1692 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
1695 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1697 if (type == SVt_REGEXP) {
1699 Perl_dump_indent(aTHX_ level, file, " REGEXP = 0x%"UVxf"\n",
1700 PTR2UV(((struct regexp *)SvANY(sv))->xrx_regexp));
1703 if (type >= SVt_PVMG) {
1704 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1705 HV * const ost = SvOURSTASH(sv);
1707 do_hv_dump(level, file, " OURSTASH", ost);
1710 do_magic_dump(level, file, SvMAGIC(sv), nest, maxnest, dumpops, pvlim);
1713 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1717 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1718 if (AvARRAY(sv) != AvALLOC(sv)) {
1719 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1720 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1723 PerlIO_putc(file, '\n');
1724 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1725 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1726 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1728 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1729 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1730 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1731 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1732 if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) {
1734 for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) {
1735 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
1737 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1739 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1744 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1745 if (HvARRAY(sv) && HvKEYS(sv)) {
1746 /* Show distribution of HEs in the ARRAY */
1748 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1751 U32 pow2 = 2, keys = HvKEYS(sv);
1752 NV theoret, sum = 0;
1754 PerlIO_printf(file, " (");
1755 Zero(freq, FREQ_MAX + 1, int);
1756 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1759 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1761 if (count > FREQ_MAX)
1767 for (i = 0; i <= max; i++) {
1769 PerlIO_printf(file, "%d%s:%d", i,
1770 (i == FREQ_MAX) ? "+" : "",
1773 PerlIO_printf(file, ", ");
1776 PerlIO_putc(file, ')');
1777 /* The "quality" of a hash is defined as the total number of
1778 comparisons needed to access every element once, relative
1779 to the expected number needed for a random hash.
1781 The total number of comparisons is equal to the sum of
1782 the squares of the number of entries in each bucket.
1783 For a random hash of n keys into k buckets, the expected
1788 for (i = max; i > 0; i--) { /* Precision: count down. */
1789 sum += freq[i] * i * i;
1791 while ((keys = keys >> 1))
1793 theoret = HvKEYS(sv);
1794 theoret += theoret * (theoret-1)/pow2;
1795 PerlIO_putc(file, '\n');
1796 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1798 PerlIO_putc(file, '\n');
1799 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
1800 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1801 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1802 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1803 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1805 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1806 if (mg && mg->mg_obj) {
1807 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1811 const char * const hvname = HvNAME_get(sv);
1813 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1817 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1818 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1820 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1822 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1826 /* FIXME - mro_algs kflags can signal a UTF-8 name. */
1827 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%.*s\" (0x%"UVxf")\n",
1828 (int)meta->mro_which->length,
1829 meta->mro_which->name,
1830 PTR2UV(meta->mro_which));
1831 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1832 (UV)meta->cache_gen);
1833 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1835 if (meta->mro_linear_all) {
1836 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1837 PTR2UV(meta->mro_linear_all));
1838 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1841 if (meta->mro_linear_current) {
1842 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1843 PTR2UV(meta->mro_linear_current));
1844 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1847 if (meta->mro_nextmethod) {
1848 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1849 PTR2UV(meta->mro_nextmethod));
1850 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1854 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1856 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1861 if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
1863 HV * const hv = MUTABLE_HV(sv);
1864 int count = maxnest - nest;
1867 while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
1870 const U32 hash = HeHASH(he);
1871 SV * const keysv = hv_iterkeysv(he);
1872 const char * const keypv = SvPV_const(keysv, len);
1873 SV * const elt = hv_iterval(hv, he);
1875 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1877 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1879 PerlIO_printf(file, "[REHASH] ");
1880 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash);
1881 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1883 hv_iterinit(hv); /* Return to status quo */
1889 const char *const proto = SvPV_const(sv, len);
1890 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1895 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1896 if (!CvISXSUB(sv)) {
1898 Perl_dump_indent(aTHX_ level, file,
1899 " START = 0x%"UVxf" ===> %"IVdf"\n",
1900 PTR2UV(CvSTART(sv)),
1901 (IV)sequence_num(CvSTART(sv)));
1903 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1904 PTR2UV(CvROOT(sv)));
1905 if (CvROOT(sv) && dumpops) {
1906 do_op_dump(level+1, file, CvROOT(sv));
1909 SV * const constant = cv_const_sv((const CV *)sv);
1911 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1914 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1916 PTR2UV(CvXSUBANY(sv).any_ptr));
1917 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1920 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1921 (IV)CvXSUBANY(sv).any_i32);
1924 do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1925 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1926 if (type == SVt_PVCV)
1927 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1928 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1929 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1930 if (type == SVt_PVFM)
1931 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
1932 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1933 if (nest < maxnest) {
1934 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1937 const CV * const outside = CvOUTSIDE(sv);
1938 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1941 : CvANON(outside) ? "ANON"
1942 : (outside == PL_main_cv) ? "MAIN"
1943 : CvUNIQUE(outside) ? "UNIQUE"
1944 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1946 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1947 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
1951 if (type == SVt_PVLV) {
1952 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1953 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1954 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1955 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1956 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1957 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1961 Perl_dump_indent(aTHX_ level, file, " FLAGS = %u\n", (U8)BmFLAGS(sv));
1962 Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
1963 Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1964 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1966 if (!isGV_with_GP(sv))
1968 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1969 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1970 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1971 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1974 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1975 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1976 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1977 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1978 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1979 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1980 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1981 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1982 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1983 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1984 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1985 do_gv_dump (level, file, " EGV", GvEGV(sv));
1988 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1989 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1990 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1991 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
1992 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1993 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1994 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1996 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1997 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1998 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2000 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2001 PTR2UV(IoTOP_GV(sv)));
2002 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2003 maxnest, dumpops, pvlim);
2005 /* Source filters hide things that are not GVs in these three, so let's
2006 be careful out there. */
2008 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2009 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2010 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2012 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2013 PTR2UV(IoFMT_GV(sv)));
2014 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2015 maxnest, dumpops, pvlim);
2017 if (IoBOTTOM_NAME(sv))
2018 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2019 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2020 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2022 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2023 PTR2UV(IoBOTTOM_GV(sv)));
2024 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2025 maxnest, dumpops, pvlim);
2027 if (isPRINT(IoTYPE(sv)))
2028 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2030 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2031 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2038 Perl_sv_dump(pTHX_ SV *sv)
2042 PERL_ARGS_ASSERT_SV_DUMP;
2045 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2047 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2051 Perl_runops_debug(pTHX)
2055 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2059 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2062 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2063 PerlIO_printf(Perl_debug_log,
2064 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2065 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2066 PTR2UV(*PL_watchaddr));
2067 if (DEBUG_s_TEST_) {
2068 if (DEBUG_v_TEST_) {
2069 PerlIO_printf(Perl_debug_log, "\n");
2077 if (DEBUG_t_TEST_) debop(PL_op);
2078 if (DEBUG_P_TEST_) debprof(PL_op);
2080 } while ((PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX)));
2081 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2088 Perl_debop(pTHX_ const OP *o)
2092 PERL_ARGS_ASSERT_DEBOP;
2094 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2097 Perl_deb(aTHX_ "%s", OP_NAME(o));
2098 switch (o->op_type) {
2101 /* With ITHREADS, consts are stored in the pad, and the right pad
2102 * may not be active here, so check.
2103 * Looks like only during compiling the pads are illegal.
2106 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2108 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2113 SV * const sv = newSV(0);
2115 /* FIXME - is this making unwarranted assumptions about the
2116 UTF-8 cleanliness of the dump file handle? */
2119 gv_fullname3(sv, cGVOPo_gv, NULL);
2120 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2124 PerlIO_printf(Perl_debug_log, "(NULL)");
2130 /* print the lexical's name */
2131 CV * const cv = deb_curcv(cxstack_ix);
2134 AV * const padlist = CvPADLIST(cv);
2135 AV * const comppad = MUTABLE_AV(*av_fetch(padlist, 0, FALSE));
2136 sv = *av_fetch(comppad, o->op_targ, FALSE);
2140 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2142 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
2148 PerlIO_printf(Perl_debug_log, "\n");
2153 S_deb_curcv(pTHX_ const I32 ix)
2156 const PERL_CONTEXT * const cx = &cxstack[ix];
2157 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2158 return cx->blk_sub.cv;
2159 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2161 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2166 return deb_curcv(ix - 1);
2170 Perl_watch(pTHX_ char **addr)
2174 PERL_ARGS_ASSERT_WATCH;
2176 PL_watchaddr = addr;
2178 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2179 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2183 S_debprof(pTHX_ const OP *o)
2187 PERL_ARGS_ASSERT_DEBPROF;
2189 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2191 if (!PL_profiledata)
2192 Newxz(PL_profiledata, MAXO, U32);
2193 ++PL_profiledata[o->op_type];
2197 Perl_debprofdump(pTHX)
2201 if (!PL_profiledata)
2203 for (i = 0; i < MAXO; i++) {
2204 if (PL_profiledata[i])
2205 PerlIO_printf(Perl_debug_log,
2206 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2213 * XML variants of most of the above routines
2217 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2221 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2223 PerlIO_printf(file, "\n ");
2224 va_start(args, pat);
2225 xmldump_vindent(level, file, pat, &args);
2231 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2234 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
2235 va_start(args, pat);
2236 xmldump_vindent(level, file, pat, &args);
2241 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2243 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2245 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2246 PerlIO_vprintf(file, pat, *args);
2250 Perl_xmldump_all(pTHX)
2252 xmldump_all_perl(FALSE);
2256 Perl_xmldump_all_perl(pTHX_ bool justperl)
2258 PerlIO_setlinebuf(PL_xmlfp);
2260 op_xmldump(PL_main_root);
2261 xmldump_packsubs_perl(PL_defstash, justperl);
2262 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2263 PerlIO_close(PL_xmlfp);
2268 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2270 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
2271 xmldump_packsubs_perl(stash, FALSE);
2275 Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
2280 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
2282 if (!HvARRAY(stash))
2284 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2285 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2286 GV *gv = MUTABLE_GV(HeVAL(entry));
2288 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2291 xmldump_sub_perl(gv, justperl);
2294 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2295 && (hv = GvHV(gv)) && hv != PL_defstash)
2296 xmldump_packsubs_perl(hv, justperl); /* nested package */
2302 Perl_xmldump_sub(pTHX_ const GV *gv)
2304 PERL_ARGS_ASSERT_XMLDUMP_SUB;
2305 xmldump_sub_perl(gv, FALSE);
2309 Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
2313 PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
2315 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
2318 sv = sv_newmortal();
2319 gv_fullname3(sv, gv, NULL);
2320 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2321 if (CvXSUB(GvCV(gv)))
2322 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2323 PTR2UV(CvXSUB(GvCV(gv))),
2324 (int)CvXSUBANY(GvCV(gv)).any_i32);
2325 else if (CvROOT(GvCV(gv)))
2326 op_xmldump(CvROOT(GvCV(gv)));
2328 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2332 Perl_xmldump_form(pTHX_ const GV *gv)
2334 SV * const sv = sv_newmortal();
2336 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2338 gv_fullname3(sv, gv, NULL);
2339 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2340 if (CvROOT(GvFORM(gv)))
2341 op_xmldump(CvROOT(GvFORM(gv)));
2343 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2347 Perl_xmldump_eval(pTHX)
2349 op_xmldump(PL_eval_root);
2353 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2355 PERL_ARGS_ASSERT_SV_CATXMLSV;
2356 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2360 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2363 const char * const e = pv + len;
2364 const char * const start = pv;
2368 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2371 dsvcur = SvCUR(dsv); /* in case we have to restart */
2376 c = utf8_to_uvchr((U8*)pv, &cl);
2378 SvCUR(dsv) = dsvcur;
2443 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2446 sv_catpvs(dsv, "<");
2449 sv_catpvs(dsv, ">");
2452 sv_catpvs(dsv, "&");
2455 sv_catpvs(dsv, """);
2459 if (c < 32 || c > 127) {
2460 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2463 const char string = (char) c;
2464 sv_catpvn(dsv, &string, 1);
2468 if ((c >= 0xD800 && c <= 0xDB7F) ||
2469 (c >= 0xDC00 && c <= 0xDFFF) ||
2470 (c >= 0xFFF0 && c <= 0xFFFF) ||
2472 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2474 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2487 Perl_sv_xmlpeek(pTHX_ SV *sv)
2489 SV * const t = sv_newmortal();
2493 PERL_ARGS_ASSERT_SV_XMLPEEK;
2499 sv_catpv(t, "VOID=\"\"");
2502 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
2503 sv_catpv(t, "WILD=\"\"");
2506 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2507 if (sv == &PL_sv_undef) {
2508 sv_catpv(t, "SV_UNDEF=\"1\"");
2509 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2510 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2514 else if (sv == &PL_sv_no) {
2515 sv_catpv(t, "SV_NO=\"1\"");
2516 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2517 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2518 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2519 SVp_POK|SVp_NOK)) &&
2524 else if (sv == &PL_sv_yes) {
2525 sv_catpv(t, "SV_YES=\"1\"");
2526 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2527 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2528 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2529 SVp_POK|SVp_NOK)) &&
2531 SvPVX(sv) && *SvPVX(sv) == '1' &&
2536 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2537 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2538 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2542 sv_catpv(t, " XXX=\"\" ");
2544 else if (SvREFCNT(sv) == 0) {
2545 sv_catpv(t, " refcnt=\"0\"");
2548 else if (DEBUG_R_TEST_) {
2551 /* is this SV on the tmps stack? */
2552 for (ix=PL_tmps_ix; ix>=0; ix--) {
2553 if (PL_tmps_stack[ix] == sv) {
2558 if (SvREFCNT(sv) > 1)
2559 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2562 sv_catpv(t, " DRT=\"<T>\"");
2566 sv_catpv(t, " ROK=\"\"");
2568 switch (SvTYPE(sv)) {
2570 sv_catpv(t, " FREED=\"1\"");
2574 sv_catpv(t, " UNDEF=\"1\"");
2577 sv_catpv(t, " IV=\"");
2580 sv_catpv(t, " NV=\"");
2583 sv_catpv(t, " PV=\"");
2586 sv_catpv(t, " PVIV=\"");
2589 sv_catpv(t, " PVNV=\"");
2592 sv_catpv(t, " PVMG=\"");
2595 sv_catpv(t, " PVLV=\"");
2598 sv_catpv(t, " AV=\"");
2601 sv_catpv(t, " HV=\"");
2605 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2607 sv_catpv(t, " CV=\"()\"");
2610 sv_catpv(t, " GV=\"");
2613 sv_catpv(t, " BIND=\"");
2616 sv_catpv(t, " ORANGE=\"");
2619 sv_catpv(t, " FM=\"");
2622 sv_catpv(t, " IO=\"");
2631 else if (SvNOKp(sv)) {
2632 STORE_NUMERIC_LOCAL_SET_STANDARD();
2633 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2634 RESTORE_NUMERIC_LOCAL();
2636 else if (SvIOKp(sv)) {
2638 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2640 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2649 return SvPV(t, n_a);
2653 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2655 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2658 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2661 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2664 REGEXP *const r = PM_GETRE(pm);
2665 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2666 sv_catxmlsv(tmpsv, MUTABLE_SV(r));
2667 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2669 SvREFCNT_dec(tmpsv);
2670 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2671 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2674 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2675 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
2676 SV * const tmpsv = pm_description(pm);
2677 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2678 SvREFCNT_dec(tmpsv);
2682 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2683 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2684 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2685 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2686 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2687 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2690 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2694 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2696 do_pmop_xmldump(0, PL_xmlfp, pm);
2700 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2705 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2710 seq = sequence_num(o);
2711 Perl_xmldump_indent(aTHX_ level, file,
2712 "<op_%s seq=\"%"UVuf" -> ",
2717 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2718 sequence_num(o->op_next));
2720 PerlIO_printf(file, "DONE\"");
2723 if (o->op_type == OP_NULL)
2725 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2726 if (o->op_targ == OP_NEXTSTATE)
2729 PerlIO_printf(file, " line=\"%"UVuf"\"",
2730 (UV)CopLINE(cCOPo));
2731 if (CopSTASHPV(cCOPo))
2732 PerlIO_printf(file, " package=\"%s\"",
2734 if (CopLABEL(cCOPo))
2735 PerlIO_printf(file, " label=\"%s\"",
2740 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2743 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2746 SV * const tmpsv = newSVpvs("");
2747 switch (o->op_flags & OPf_WANT) {
2749 sv_catpv(tmpsv, ",VOID");
2751 case OPf_WANT_SCALAR:
2752 sv_catpv(tmpsv, ",SCALAR");
2755 sv_catpv(tmpsv, ",LIST");
2758 sv_catpv(tmpsv, ",UNKNOWN");
2761 if (o->op_flags & OPf_KIDS)
2762 sv_catpv(tmpsv, ",KIDS");
2763 if (o->op_flags & OPf_PARENS)
2764 sv_catpv(tmpsv, ",PARENS");
2765 if (o->op_flags & OPf_STACKED)
2766 sv_catpv(tmpsv, ",STACKED");
2767 if (o->op_flags & OPf_REF)
2768 sv_catpv(tmpsv, ",REF");
2769 if (o->op_flags & OPf_MOD)
2770 sv_catpv(tmpsv, ",MOD");
2771 if (o->op_flags & OPf_SPECIAL)
2772 sv_catpv(tmpsv, ",SPECIAL");
2773 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2774 SvREFCNT_dec(tmpsv);
2776 if (o->op_private) {
2777 SV * const tmpsv = newSVpvs("");
2778 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2779 if (o->op_private & OPpTARGET_MY)
2780 sv_catpv(tmpsv, ",TARGET_MY");
2782 else if (o->op_type == OP_LEAVESUB ||
2783 o->op_type == OP_LEAVE ||
2784 o->op_type == OP_LEAVESUBLV ||
2785 o->op_type == OP_LEAVEWRITE) {
2786 if (o->op_private & OPpREFCOUNTED)
2787 sv_catpv(tmpsv, ",REFCOUNTED");
2789 else if (o->op_type == OP_AASSIGN) {
2790 if (o->op_private & OPpASSIGN_COMMON)
2791 sv_catpv(tmpsv, ",COMMON");
2793 else if (o->op_type == OP_SASSIGN) {
2794 if (o->op_private & OPpASSIGN_BACKWARDS)
2795 sv_catpv(tmpsv, ",BACKWARDS");
2797 else if (o->op_type == OP_TRANS) {
2798 if (o->op_private & OPpTRANS_SQUASH)
2799 sv_catpv(tmpsv, ",SQUASH");
2800 if (o->op_private & OPpTRANS_DELETE)
2801 sv_catpv(tmpsv, ",DELETE");
2802 if (o->op_private & OPpTRANS_COMPLEMENT)
2803 sv_catpv(tmpsv, ",COMPLEMENT");
2804 if (o->op_private & OPpTRANS_IDENTICAL)
2805 sv_catpv(tmpsv, ",IDENTICAL");
2806 if (o->op_private & OPpTRANS_GROWS)
2807 sv_catpv(tmpsv, ",GROWS");
2809 else if (o->op_type == OP_REPEAT) {
2810 if (o->op_private & OPpREPEAT_DOLIST)
2811 sv_catpv(tmpsv, ",DOLIST");
2813 else if (o->op_type == OP_ENTERSUB ||
2814 o->op_type == OP_RV2SV ||
2815 o->op_type == OP_GVSV ||
2816 o->op_type == OP_RV2AV ||
2817 o->op_type == OP_RV2HV ||
2818 o->op_type == OP_RV2GV ||
2819 o->op_type == OP_AELEM ||
2820 o->op_type == OP_HELEM )
2822 if (o->op_type == OP_ENTERSUB) {
2823 if (o->op_private & OPpENTERSUB_AMPER)
2824 sv_catpv(tmpsv, ",AMPER");
2825 if (o->op_private & OPpENTERSUB_DB)
2826 sv_catpv(tmpsv, ",DB");
2827 if (o->op_private & OPpENTERSUB_HASTARG)
2828 sv_catpv(tmpsv, ",HASTARG");
2829 if (o->op_private & OPpENTERSUB_NOPAREN)
2830 sv_catpv(tmpsv, ",NOPAREN");
2831 if (o->op_private & OPpENTERSUB_INARGS)
2832 sv_catpv(tmpsv, ",INARGS");
2833 if (o->op_private & OPpENTERSUB_NOMOD)
2834 sv_catpv(tmpsv, ",NOMOD");
2837 switch (o->op_private & OPpDEREF) {
2839 sv_catpv(tmpsv, ",SV");
2842 sv_catpv(tmpsv, ",AV");
2845 sv_catpv(tmpsv, ",HV");
2848 if (o->op_private & OPpMAYBE_LVSUB)
2849 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2851 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2852 if (o->op_private & OPpLVAL_DEFER)
2853 sv_catpv(tmpsv, ",LVAL_DEFER");
2856 if (o->op_private & HINT_STRICT_REFS)
2857 sv_catpv(tmpsv, ",STRICT_REFS");
2858 if (o->op_private & OPpOUR_INTRO)
2859 sv_catpv(tmpsv, ",OUR_INTRO");
2862 else if (o->op_type == OP_CONST) {
2863 if (o->op_private & OPpCONST_BARE)
2864 sv_catpv(tmpsv, ",BARE");
2865 if (o->op_private & OPpCONST_STRICT)
2866 sv_catpv(tmpsv, ",STRICT");
2867 if (o->op_private & OPpCONST_ARYBASE)
2868 sv_catpv(tmpsv, ",ARYBASE");
2869 if (o->op_private & OPpCONST_WARNING)
2870 sv_catpv(tmpsv, ",WARNING");
2871 if (o->op_private & OPpCONST_ENTERED)
2872 sv_catpv(tmpsv, ",ENTERED");
2874 else if (o->op_type == OP_FLIP) {
2875 if (o->op_private & OPpFLIP_LINENUM)
2876 sv_catpv(tmpsv, ",LINENUM");
2878 else if (o->op_type == OP_FLOP) {
2879 if (o->op_private & OPpFLIP_LINENUM)
2880 sv_catpv(tmpsv, ",LINENUM");
2882 else if (o->op_type == OP_RV2CV) {
2883 if (o->op_private & OPpLVAL_INTRO)
2884 sv_catpv(tmpsv, ",INTRO");
2886 else if (o->op_type == OP_GV) {
2887 if (o->op_private & OPpEARLY_CV)
2888 sv_catpv(tmpsv, ",EARLY_CV");
2890 else if (o->op_type == OP_LIST) {
2891 if (o->op_private & OPpLIST_GUESSED)
2892 sv_catpv(tmpsv, ",GUESSED");
2894 else if (o->op_type == OP_DELETE) {
2895 if (o->op_private & OPpSLICE)
2896 sv_catpv(tmpsv, ",SLICE");
2898 else if (o->op_type == OP_EXISTS) {
2899 if (o->op_private & OPpEXISTS_SUB)
2900 sv_catpv(tmpsv, ",EXISTS_SUB");
2902 else if (o->op_type == OP_SORT) {
2903 if (o->op_private & OPpSORT_NUMERIC)
2904 sv_catpv(tmpsv, ",NUMERIC");
2905 if (o->op_private & OPpSORT_INTEGER)
2906 sv_catpv(tmpsv, ",INTEGER");
2907 if (o->op_private & OPpSORT_REVERSE)
2908 sv_catpv(tmpsv, ",REVERSE");
2910 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2911 if (o->op_private & OPpOPEN_IN_RAW)
2912 sv_catpv(tmpsv, ",IN_RAW");
2913 if (o->op_private & OPpOPEN_IN_CRLF)
2914 sv_catpv(tmpsv, ",IN_CRLF");
2915 if (o->op_private & OPpOPEN_OUT_RAW)
2916 sv_catpv(tmpsv, ",OUT_RAW");
2917 if (o->op_private & OPpOPEN_OUT_CRLF)
2918 sv_catpv(tmpsv, ",OUT_CRLF");
2920 else if (o->op_type == OP_EXIT) {
2921 if (o->op_private & OPpEXIT_VMSISH)
2922 sv_catpv(tmpsv, ",EXIT_VMSISH");
2923 if (o->op_private & OPpHUSH_VMSISH)
2924 sv_catpv(tmpsv, ",HUSH_VMSISH");
2926 else if (o->op_type == OP_DIE) {
2927 if (o->op_private & OPpHUSH_VMSISH)
2928 sv_catpv(tmpsv, ",HUSH_VMSISH");
2930 else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
2931 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
2932 sv_catpv(tmpsv, ",FT_ACCESS");
2933 if (o->op_private & OPpFT_STACKED)
2934 sv_catpv(tmpsv, ",FT_STACKED");
2936 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2937 sv_catpv(tmpsv, ",INTRO");
2939 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
2940 SvREFCNT_dec(tmpsv);
2943 switch (o->op_type) {
2945 if (o->op_flags & OPf_SPECIAL) {
2951 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
2953 if (cSVOPo->op_sv) {
2954 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
2955 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
2961 gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
2962 s = SvPV(tmpsv1,len);
2963 sv_catxmlpvn(tmpsv2, s, len, 1);
2964 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
2968 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
2973 case OP_METHOD_NAMED:
2974 #ifndef USE_ITHREADS
2975 /* with ITHREADS, consts are stored in the pad, and the right pad
2976 * may not be active here, so skip */
2977 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
2983 PerlIO_printf(file, ">\n");
2985 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
2990 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
2991 (UV)CopLINE(cCOPo));
2992 if (CopSTASHPV(cCOPo))
2993 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
2995 if (CopLABEL(cCOPo))
2996 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
3000 S_xmldump_attr(aTHX_ level, file, "redo=\"");
3001 if (cLOOPo->op_redoop)
3002 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
3004 PerlIO_printf(file, "DONE\"");
3005 S_xmldump_attr(aTHX_ level, file, "next=\"");
3006 if (cLOOPo->op_nextop)
3007 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
3009 PerlIO_printf(file, "DONE\"");
3010 S_xmldump_attr(aTHX_ level, file, "last=\"");
3011 if (cLOOPo->op_lastop)
3012 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
3014 PerlIO_printf(file, "DONE\"");
3022 S_xmldump_attr(aTHX_ level, file, "other=\"");
3023 if (cLOGOPo->op_other)
3024 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
3026 PerlIO_printf(file, "DONE\"");
3034 if (o->op_private & OPpREFCOUNTED)
3035 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
3041 if (PL_madskills && o->op_madprop) {
3042 char prevkey = '\0';
3043 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
3044 const MADPROP* mp = o->op_madprop;
3048 PerlIO_printf(file, ">\n");
3050 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
3053 char tmp = mp->mad_key;
3054 sv_setpvs(tmpsv,"\"");
3056 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
3057 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
3058 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
3061 sv_catpv(tmpsv, "\"");
3062 switch (mp->mad_type) {
3064 sv_catpv(tmpsv, "NULL");
3065 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
3068 sv_catpv(tmpsv, " val=\"");
3069 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
3070 sv_catpv(tmpsv, "\"");
3071 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
3074 sv_catpv(tmpsv, " val=\"");
3075 sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
3076 sv_catpv(tmpsv, "\"");
3077 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
3080 if ((OP*)mp->mad_val) {
3081 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
3082 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
3083 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
3087 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
3093 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
3095 SvREFCNT_dec(tmpsv);
3098 switch (o->op_type) {
3105 PerlIO_printf(file, ">\n");
3107 do_pmop_xmldump(level, file, cPMOPo);
3113 if (o->op_flags & OPf_KIDS) {
3117 PerlIO_printf(file, ">\n");
3119 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3120 do_op_xmldump(level, file, kid);
3124 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3126 PerlIO_printf(file, " />\n");
3130 Perl_op_xmldump(pTHX_ const OP *o)
3132 PERL_ARGS_ASSERT_OP_XMLDUMP;
3134 do_op_xmldump(0, PL_xmlfp, o);
3140 * c-indentation-style: bsd
3142 * indent-tabs-mode: t
3145 * ex: set ts=8 sts=4 sw=4 noet: