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
30 static const char* const svtypenames[SVt_LAST] = {
50 static const char* const svshorttypenames[SVt_LAST] = {
75 S_append_flags(pTHX_ SV *sv, U32 flags, const struct flag_to_name *start,
76 const struct flag_to_name *const end)
79 if (flags & start->flag)
80 sv_catpv(sv, start->name);
81 } while (++start < end);
84 #define append_flags(sv, f, flags) \
85 S_append_flags(aTHX_ (sv), (f), (flags), C_ARRAY_END(flags))
90 Escapes at most the first "count" chars of pv and puts the results into
91 dsv such that the size of the escaped string will not exceed "max" chars
92 and will not contain any incomplete escape sequences.
94 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
97 Normally the SV will be cleared before the escaped string is prepared,
98 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
100 If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
101 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
102 using C<is_utf8_string()> to determine if it is Unicode.
104 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
105 using C<\x01F1> style escapes, otherwise if PERL_PV_ESCAPE_NONASCII is set, only
106 non-ASCII chars will be escaped using this style; otherwise, only chars above
107 255 will be so escaped; other non printable chars will use octal or
108 common escaped patterns like C<\n>. Otherwise, if PERL_PV_ESCAPE_NOBACKSLASH
109 then all chars below 255 will be treated as printable and
110 will be output as literals.
112 If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
113 string will be escaped, regardless of max. If the output is to be in hex,
114 then it will be returned as a plain hex
115 sequence. Thus the output will either be a single char,
116 an octal escape sequence, a special escape like C<\n> or a hex value.
118 If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
119 not a '\\'. This is because regexes very often contain backslashed
120 sequences, whereas '%' is not a particularly common character in patterns.
122 Returns a pointer to the escaped text as held by dsv.
126 #define PV_ESCAPE_OCTBUFSIZE 32
129 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
130 const STRLEN count, const STRLEN max,
131 STRLEN * const escaped, const U32 flags )
133 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
134 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
135 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
136 STRLEN wrote = 0; /* chars written so far */
137 STRLEN chsize = 0; /* size of data to be written */
138 STRLEN readsize = 1; /* size of data just read */
139 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
140 const char *pv = str;
141 const char * const end = pv + count; /* end of string */
144 PERL_ARGS_ASSERT_PV_ESCAPE;
146 if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
147 /* This won't alter the UTF-8 flag */
151 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
154 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
155 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
156 const U8 c = (U8)u & 0xFF;
159 || (flags & PERL_PV_ESCAPE_ALL)
160 || (( ! isASCII(u) ) && (flags & PERL_PV_ESCAPE_NONASCII)))
162 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
163 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
166 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
167 "%cx{%"UVxf"}", esc, u);
168 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
171 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
175 case '\\' : /* fallthrough */
176 case '%' : if ( c == esc ) {
182 case '\v' : octbuf[1] = 'v'; break;
183 case '\t' : octbuf[1] = 't'; break;
184 case '\r' : octbuf[1] = 'r'; break;
185 case '\n' : octbuf[1] = 'n'; break;
186 case '\f' : octbuf[1] = 'f'; break;
194 if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
195 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
198 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
205 if ( max && (wrote + chsize > max) ) {
207 } else if (chsize > 1) {
208 sv_catpvn(dsv, octbuf, chsize);
211 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
212 can be appended raw to the dsv. If dsv happens to be
213 UTF-8 then we need catpvf to upgrade them for us.
214 Or add a new API call sv_catpvc(). Think about that name, and
215 how to keep it clear that it's unlike the s of catpvs, which is
216 really an array of octets, not a string. */
217 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
220 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
228 =for apidoc pv_pretty
230 Converts a string into something presentable, handling escaping via
231 pv_escape() and supporting quoting and ellipses.
233 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
234 double quoted with any double quotes in the string escaped. Otherwise
235 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
238 If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
239 string were output then an ellipsis C<...> will be appended to the
240 string. Note that this happens AFTER it has been quoted.
242 If start_color is non-null then it will be inserted after the opening
243 quote (if there is one) but before the escaped text. If end_color
244 is non-null then it will be inserted after the escaped text but before
245 any quotes or ellipses.
247 Returns a pointer to the prettified text as held by dsv.
253 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
254 const STRLEN max, char const * const start_color, char const * const end_color,
257 const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
260 PERL_ARGS_ASSERT_PV_PRETTY;
262 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
263 /* This won't alter the UTF-8 flag */
268 sv_catpvs(dsv, "\"");
269 else if ( flags & PERL_PV_PRETTY_LTGT )
272 if ( start_color != NULL )
273 sv_catpv(dsv, start_color);
275 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
277 if ( end_color != NULL )
278 sv_catpv(dsv, end_color);
281 sv_catpvs( dsv, "\"");
282 else if ( flags & PERL_PV_PRETTY_LTGT )
285 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
286 sv_catpvs(dsv, "...");
292 =for apidoc pv_display
296 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
298 except that an additional "\0" will be appended to the string when
299 len > cur and pv[cur] is "\0".
301 Note that the final string may be up to 7 chars longer than pvlim.
307 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
309 PERL_ARGS_ASSERT_PV_DISPLAY;
311 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
312 if (len > cur && pv[cur] == '\0')
313 sv_catpvs( dsv, "\\0");
318 Perl_sv_peek(pTHX_ SV *sv)
321 SV * const t = sv_newmortal();
331 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
332 /* detect data corruption under memory poisoning */
336 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
337 if (sv == &PL_sv_undef) {
338 sv_catpv(t, "SV_UNDEF");
339 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
340 SVs_GMG|SVs_SMG|SVs_RMG)) &&
344 else if (sv == &PL_sv_no) {
345 sv_catpv(t, "SV_NO");
346 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
347 SVs_GMG|SVs_SMG|SVs_RMG)) &&
348 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
354 else if (sv == &PL_sv_yes) {
355 sv_catpv(t, "SV_YES");
356 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
357 SVs_GMG|SVs_SMG|SVs_RMG)) &&
358 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
361 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
366 sv_catpv(t, "SV_PLACEHOLDER");
367 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
368 SVs_GMG|SVs_SMG|SVs_RMG)) &&
374 else if (SvREFCNT(sv) == 0) {
378 else if (DEBUG_R_TEST_) {
381 /* is this SV on the tmps stack? */
382 for (ix=PL_tmps_ix; ix>=0; ix--) {
383 if (PL_tmps_stack[ix] == sv) {
388 if (SvREFCNT(sv) > 1)
389 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
397 if (SvCUR(t) + unref > 10) {
398 SvCUR_set(t, unref + 3);
407 if (type == SVt_PVCV) {
408 Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
410 } else if (type < SVt_LAST) {
411 sv_catpv(t, svshorttypenames[type]);
413 if (type == SVt_NULL)
416 sv_catpv(t, "FREED");
421 if (!SvPVX_const(sv))
422 sv_catpv(t, "(null)");
424 SV * const tmp = newSVpvs("");
428 SvOOK_offset(sv, delta);
429 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
431 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
433 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
434 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
436 SvREFCNT_dec_NN(tmp);
439 else if (SvNOKp(sv)) {
440 STORE_NUMERIC_LOCAL_SET_STANDARD();
441 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
442 RESTORE_NUMERIC_LOCAL();
444 else if (SvIOKp(sv)) {
446 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
448 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
456 if (TAINTING_get && SvTAINTED(sv))
457 sv_catpv(t, " [tainted]");
458 return SvPV_nolen(t);
462 =head1 Debugging Utilities
466 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
469 PERL_ARGS_ASSERT_DUMP_INDENT;
471 dump_vindent(level, file, pat, &args);
476 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
479 PERL_ARGS_ASSERT_DUMP_VINDENT;
480 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
481 PerlIO_vprintf(file, pat, *args);
487 Dumps the entire optree of the current program starting at C<PL_main_root> to
488 C<STDERR>. Also dumps the optrees for all visible subroutines in C<PL_defstash>.
496 dump_all_perl(FALSE);
500 Perl_dump_all_perl(pTHX_ bool justperl)
504 PerlIO_setlinebuf(Perl_debug_log);
506 op_dump(PL_main_root);
507 dump_packsubs_perl(PL_defstash, justperl);
511 =for apidoc dump_packsubs
513 Dumps the optrees for all visible subroutines in C<stash>.
519 Perl_dump_packsubs(pTHX_ const HV *stash)
521 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
522 dump_packsubs_perl(stash, FALSE);
526 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
531 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
535 for (i = 0; i <= (I32) HvMAX(stash); i++) {
537 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
538 const GV * const gv = (const GV *)HeVAL(entry);
539 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
542 dump_sub_perl(gv, justperl);
545 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
546 const HV * const hv = GvHV(gv);
547 if (hv && (hv != PL_defstash))
548 dump_packsubs_perl(hv, justperl); /* nested package */
555 Perl_dump_sub(pTHX_ const GV *gv)
557 PERL_ARGS_ASSERT_DUMP_SUB;
558 dump_sub_perl(gv, FALSE);
562 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
566 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
568 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
572 gv_fullname3(sv, gv, NULL);
573 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
574 if (CvISXSUB(GvCV(gv)))
575 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
576 PTR2UV(CvXSUB(GvCV(gv))),
577 (int)CvXSUBANY(GvCV(gv)).any_i32);
578 else if (CvROOT(GvCV(gv)))
579 op_dump(CvROOT(GvCV(gv)));
581 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
585 Perl_dump_form(pTHX_ const GV *gv)
587 SV * const sv = sv_newmortal();
589 PERL_ARGS_ASSERT_DUMP_FORM;
591 gv_fullname3(sv, gv, NULL);
592 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
593 if (CvROOT(GvFORM(gv)))
594 op_dump(CvROOT(GvFORM(gv)));
596 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
603 op_dump(PL_eval_root);
607 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
611 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
614 Perl_dump_indent(aTHX_ level, file, "{}\n");
617 Perl_dump_indent(aTHX_ level, file, "{\n");
619 if (pm->op_pmflags & PMf_ONCE)
624 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
625 ch, RX_PRECOMP(PM_GETRE(pm)), ch,
626 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
628 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
629 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
630 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
631 op_dump(pm->op_pmreplrootu.op_pmreplroot);
633 if (pm->op_code_list) {
634 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
635 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
636 do_op_dump(level, file, pm->op_code_list);
639 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
640 PTR2UV(pm->op_code_list));
642 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
643 SV * const tmpsv = pm_description(pm);
644 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
645 SvREFCNT_dec_NN(tmpsv);
648 Perl_dump_indent(aTHX_ level-1, file, "}\n");
651 const struct flag_to_name pmflags_flags_names[] = {
652 {PMf_CONST, ",CONST"},
654 {PMf_GLOBAL, ",GLOBAL"},
655 {PMf_CONTINUE, ",CONTINUE"},
656 {PMf_RETAINT, ",RETAINT"},
658 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
659 {PMf_HAS_CV, ",HAS_CV"},
660 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
661 {PMf_IS_QR, ",IS_QR"}
665 S_pm_description(pTHX_ const PMOP *pm)
667 SV * const desc = newSVpvs("");
668 const REGEXP * const regex = PM_GETRE(pm);
669 const U32 pmflags = pm->op_pmflags;
671 PERL_ARGS_ASSERT_PM_DESCRIPTION;
673 if (pmflags & PMf_ONCE)
674 sv_catpv(desc, ",ONCE");
676 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
677 sv_catpv(desc, ":USED");
679 if (pmflags & PMf_USED)
680 sv_catpv(desc, ":USED");
684 if (RX_ISTAINTED(regex))
685 sv_catpv(desc, ",TAINTED");
686 if (RX_CHECK_SUBSTR(regex)) {
687 if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN))
688 sv_catpv(desc, ",SCANFIRST");
689 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
690 sv_catpv(desc, ",ALL");
692 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
693 sv_catpv(desc, ",SKIPWHITE");
696 append_flags(desc, pmflags, pmflags_flags_names);
701 Perl_pmop_dump(pTHX_ PMOP *pm)
703 do_pmop_dump(0, Perl_debug_log, pm);
706 /* Return a unique integer to represent the address of op o.
707 * If it already exists in PL_op_sequence, just return it;
709 * *** Note that this isn't thread-safe */
712 S_sequence_num(pTHX_ const OP *o)
721 op = newSVuv(PTR2UV(o));
723 key = SvPV_const(op, len);
725 PL_op_sequence = newHV();
726 seq = hv_fetch(PL_op_sequence, key, len, 0);
729 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
733 const struct flag_to_name op_flags_names[] = {
735 {OPf_PARENS, ",PARENS"},
738 {OPf_STACKED, ",STACKED"},
739 {OPf_SPECIAL, ",SPECIAL"}
742 const struct flag_to_name op_trans_names[] = {
743 {OPpTRANS_FROM_UTF, ",FROM_UTF"},
744 {OPpTRANS_TO_UTF, ",TO_UTF"},
745 {OPpTRANS_IDENTICAL, ",IDENTICAL"},
746 {OPpTRANS_SQUASH, ",SQUASH"},
747 {OPpTRANS_COMPLEMENT, ",COMPLEMENT"},
748 {OPpTRANS_GROWS, ",GROWS"},
749 {OPpTRANS_DELETE, ",DELETE"}
752 const struct flag_to_name op_entersub_names[] = {
753 {OPpENTERSUB_DB, ",DB"},
754 {OPpENTERSUB_HASTARG, ",HASTARG"},
755 {OPpENTERSUB_AMPER, ",AMPER"},
756 {OPpENTERSUB_NOPAREN, ",NOPAREN"},
757 {OPpENTERSUB_INARGS, ",INARGS"}
760 const struct flag_to_name op_const_names[] = {
761 {OPpCONST_NOVER, ",NOVER"},
762 {OPpCONST_SHORTCIRCUIT, ",SHORTCIRCUIT"},
763 {OPpCONST_STRICT, ",STRICT"},
764 {OPpCONST_ENTERED, ",ENTERED"},
765 {OPpCONST_BARE, ",BARE"}
768 const struct flag_to_name op_sort_names[] = {
769 {OPpSORT_NUMERIC, ",NUMERIC"},
770 {OPpSORT_INTEGER, ",INTEGER"},
771 {OPpSORT_REVERSE, ",REVERSE"},
772 {OPpSORT_INPLACE, ",INPLACE"},
773 {OPpSORT_DESCEND, ",DESCEND"},
774 {OPpSORT_QSORT, ",QSORT"},
775 {OPpSORT_STABLE, ",STABLE"}
778 const struct flag_to_name op_open_names[] = {
779 {OPpOPEN_IN_RAW, ",IN_RAW"},
780 {OPpOPEN_IN_CRLF, ",IN_CRLF"},
781 {OPpOPEN_OUT_RAW, ",OUT_RAW"},
782 {OPpOPEN_OUT_CRLF, ",OUT_CRLF"}
785 const struct flag_to_name op_sassign_names[] = {
786 {OPpASSIGN_BACKWARDS, ",BACKWARDS"},
787 {OPpASSIGN_CV_TO_GV, ",CV2GV"}
790 const struct flag_to_name op_leave_names[] = {
791 {OPpREFCOUNTED, ",REFCOUNTED"},
792 {OPpLVALUE, ",LVALUE"}
795 #define OP_PRIVATE_ONCE(op, flag, name) \
796 const struct flag_to_name CAT2(op, _names)[] = { \
800 OP_PRIVATE_ONCE(op_leavesub, OPpREFCOUNTED, ",REFCOUNTED");
801 OP_PRIVATE_ONCE(op_repeat, OPpREPEAT_DOLIST, ",DOLIST");
802 OP_PRIVATE_ONCE(op_reverse, OPpREVERSE_INPLACE, ",INPLACE");
803 OP_PRIVATE_ONCE(op_rv2cv, OPpLVAL_INTRO, ",INTRO");
804 OP_PRIVATE_ONCE(op_flip, OPpFLIP_LINENUM, ",LINENUM");
805 OP_PRIVATE_ONCE(op_gv, OPpEARLY_CV, ",EARLY_CV");
806 OP_PRIVATE_ONCE(op_list, OPpLIST_GUESSED, ",GUESSED");
807 OP_PRIVATE_ONCE(op_delete, OPpSLICE, ",SLICE");
808 OP_PRIVATE_ONCE(op_exists, OPpEXISTS_SUB, ",EXISTS_SUB");
809 OP_PRIVATE_ONCE(op_die, OPpHUSH_VMSISH, ",HUSH_VMSISH");
810 OP_PRIVATE_ONCE(op_split, OPpSPLIT_IMPLIM, ",IMPLIM");
811 OP_PRIVATE_ONCE(op_dbstate, OPpHUSH_VMSISH, ",HUSH_VMSISH");
813 struct op_private_by_op {
816 const struct flag_to_name *start;
819 const struct op_private_by_op op_private_names[] = {
820 {OP_LEAVESUB, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
821 {OP_LEAVE, C_ARRAY_LENGTH(op_leave_names), op_leave_names },
822 {OP_LEAVESUBLV, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
823 {OP_LEAVEWRITE, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
824 {OP_DIE, C_ARRAY_LENGTH(op_die_names), op_die_names },
825 {OP_DELETE, C_ARRAY_LENGTH(op_delete_names), op_delete_names },
826 {OP_EXISTS, C_ARRAY_LENGTH(op_exists_names), op_exists_names },
827 {OP_FLIP, C_ARRAY_LENGTH(op_flip_names), op_flip_names },
828 {OP_FLOP, C_ARRAY_LENGTH(op_flip_names), op_flip_names },
829 {OP_GV, C_ARRAY_LENGTH(op_gv_names), op_gv_names },
830 {OP_LIST, C_ARRAY_LENGTH(op_list_names), op_list_names },
831 {OP_SASSIGN, C_ARRAY_LENGTH(op_sassign_names), op_sassign_names },
832 {OP_REPEAT, C_ARRAY_LENGTH(op_repeat_names), op_repeat_names },
833 {OP_RV2CV, C_ARRAY_LENGTH(op_rv2cv_names), op_rv2cv_names },
834 {OP_TRANS, C_ARRAY_LENGTH(op_trans_names), op_trans_names },
835 {OP_CONST, C_ARRAY_LENGTH(op_const_names), op_const_names },
836 {OP_SORT, C_ARRAY_LENGTH(op_sort_names), op_sort_names },
837 {OP_OPEN, C_ARRAY_LENGTH(op_open_names), op_open_names },
838 {OP_SPLIT, C_ARRAY_LENGTH(op_split_names), op_split_names },
839 {OP_DBSTATE, C_ARRAY_LENGTH(op_dbstate_names), op_dbstate_names },
840 {OP_NEXTSTATE, C_ARRAY_LENGTH(op_dbstate_names), op_dbstate_names },
841 {OP_BACKTICK, C_ARRAY_LENGTH(op_open_names), op_open_names }
845 S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
846 const struct op_private_by_op *start = op_private_names;
847 const struct op_private_by_op *const end
848 = op_private_names + C_ARRAY_LENGTH(op_private_names);
850 /* This is a linear search, but no worse than the code that it replaced.
851 It's debugging code - size is more important than speed. */
853 if (optype == start->op_type) {
854 S_append_flags(aTHX_ tmpsv, op_private, start->start,
855 start->start + start->len);
858 } while (++start < end);
862 #define DUMP_OP_FLAGS(o,xml,level,file) \
863 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) { \
864 SV * const tmpsv = newSVpvs(""); \
865 switch (o->op_flags & OPf_WANT) { \
866 case OPf_WANT_VOID: \
867 sv_catpv(tmpsv, ",VOID"); \
869 case OPf_WANT_SCALAR: \
870 sv_catpv(tmpsv, ",SCALAR"); \
872 case OPf_WANT_LIST: \
873 sv_catpv(tmpsv, ",LIST"); \
876 sv_catpv(tmpsv, ",UNKNOWN"); \
879 append_flags(tmpsv, o->op_flags, op_flags_names); \
880 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED"); \
881 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE"); \
882 if (o->op_static) sv_catpvs(tmpsv, ",STATIC"); \
883 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED"); \
885 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", \
886 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");\
888 PerlIO_printf(file, " flags=\"%s\"", \
889 SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : ""); \
890 SvREFCNT_dec_NN(tmpsv); \
893 #if !defined(PERL_MAD)
894 # define xmldump_attr1(level, file, pat, arg)
896 # define xmldump_attr1(level, file, pat, arg) \
897 S_xmldump_attr(aTHX_ level, file, pat, arg)
900 #define DUMP_OP_PRIVATE(o,xml,level,file) \
901 if (o->op_private) { \
902 U32 optype = o->op_type; \
903 U32 oppriv = o->op_private; \
904 SV * const tmpsv = newSVpvs(""); \
905 if (PL_opargs[optype] & OA_TARGLEX) { \
906 if (oppriv & OPpTARGET_MY) \
907 sv_catpv(tmpsv, ",TARGET_MY"); \
909 else if (optype == OP_ENTERSUB || \
910 optype == OP_RV2SV || \
911 optype == OP_GVSV || \
912 optype == OP_RV2AV || \
913 optype == OP_RV2HV || \
914 optype == OP_RV2GV || \
915 optype == OP_AELEM || \
916 optype == OP_HELEM ) \
918 if (optype == OP_ENTERSUB) { \
919 append_flags(tmpsv, oppriv, op_entersub_names); \
922 switch (oppriv & OPpDEREF) { \
924 sv_catpv(tmpsv, ",SV"); \
927 sv_catpv(tmpsv, ",AV"); \
930 sv_catpv(tmpsv, ",HV"); \
933 if (oppriv & OPpMAYBE_LVSUB) \
934 sv_catpv(tmpsv, ",MAYBE_LVSUB"); \
936 if (optype == OP_AELEM || optype == OP_HELEM) { \
937 if (oppriv & OPpLVAL_DEFER) \
938 sv_catpv(tmpsv, ",LVAL_DEFER"); \
940 else if (optype == OP_RV2HV || optype == OP_PADHV) { \
941 if (oppriv & OPpMAYBE_TRUEBOOL) \
942 sv_catpvs(tmpsv, ",OPpMAYBE_TRUEBOOL"); \
943 if (oppriv & OPpTRUEBOOL) \
944 sv_catpvs(tmpsv, ",OPpTRUEBOOL"); \
947 if (oppriv & HINT_STRICT_REFS) \
948 sv_catpv(tmpsv, ",STRICT_REFS"); \
949 if (oppriv & OPpOUR_INTRO) \
950 sv_catpv(tmpsv, ",OUR_INTRO"); \
953 else if (S_op_private_to_names(aTHX_ tmpsv, optype, oppriv)) { \
955 else if (OP_IS_FILETEST(o->op_type)) { \
956 if (oppriv & OPpFT_ACCESS) \
957 sv_catpv(tmpsv, ",FT_ACCESS"); \
958 if (oppriv & OPpFT_STACKED) \
959 sv_catpv(tmpsv, ",FT_STACKED"); \
960 if (oppriv & OPpFT_STACKING) \
961 sv_catpv(tmpsv, ",FT_STACKING"); \
962 if (oppriv & OPpFT_AFTER_t) \
963 sv_catpv(tmpsv, ",AFTER_t"); \
965 else if (o->op_type == OP_AASSIGN) { \
966 if (oppriv & OPpASSIGN_COMMON) \
967 sv_catpvs(tmpsv, ",COMMON"); \
968 if (oppriv & OPpMAYBE_LVSUB) \
969 sv_catpvs(tmpsv, ",MAYBE_LVSUB"); \
971 if (o->op_flags & OPf_MOD && oppriv & OPpLVAL_INTRO) \
972 sv_catpv(tmpsv, ",INTRO"); \
973 if (o->op_type == OP_PADRANGE) \
974 Perl_sv_catpvf(aTHX_ tmpsv, ",COUNT=%"UVuf, \
975 (UV)(oppriv & OPpPADRANGE_COUNTMASK)); \
976 if ( (o->op_type == OP_RV2HV || o->op_type == OP_RV2AV || \
977 o->op_type == OP_PADAV || o->op_type == OP_PADHV || \
978 o->op_type == OP_ASLICE || o->op_type == OP_HSLICE) \
979 && oppriv & OPpSLICEWARNING ) \
980 sv_catpvs(tmpsv, ",SLICEWARNING"); \
981 if (SvCUR(tmpsv)) { \
983 xmldump_attr1(level+1, file, "private=\"%s\"", SvPVX(tmpsv)+1); \
985 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1); \
987 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n", \
989 SvREFCNT_dec_NN(tmpsv); \
994 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
998 const OPCODE optype = o->op_type;
1000 PERL_ARGS_ASSERT_DO_OP_DUMP;
1002 Perl_dump_indent(aTHX_ level, file, "{\n");
1004 seq = sequence_num(o);
1006 PerlIO_printf(file, "%-4"UVuf, seq);
1008 PerlIO_printf(file, "????");
1010 "%*sTYPE = %s ===> ",
1011 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
1014 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
1015 sequence_num(o->op_next));
1017 PerlIO_printf(file, "NULL\n");
1019 if (optype == OP_NULL) {
1020 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
1021 if (o->op_targ == OP_NEXTSTATE) {
1023 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1024 (UV)CopLINE(cCOPo));
1025 if (CopSTASHPV(cCOPo))
1026 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1028 if (CopLABEL(cCOPo))
1029 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1034 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
1037 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
1040 DUMP_OP_FLAGS(o,0,level,file);
1041 DUMP_OP_PRIVATE(o,0,level,file);
1044 if (PL_madskills && o->op_madprop) {
1045 SV * const tmpsv = newSVpvs("");
1046 MADPROP* mp = o->op_madprop;
1047 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
1050 const char tmp = mp->mad_key;
1051 sv_setpvs(tmpsv,"'");
1053 sv_catpvn(tmpsv, &tmp, 1);
1054 sv_catpv(tmpsv, "'=");
1055 switch (mp->mad_type) {
1057 sv_catpv(tmpsv, "NULL");
1058 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1061 sv_catpv(tmpsv, "<");
1062 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
1063 sv_catpv(tmpsv, ">");
1064 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1067 if ((OP*)mp->mad_val) {
1068 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1069 do_op_dump(level, file, (OP*)mp->mad_val);
1073 sv_catpv(tmpsv, "(UNK)");
1074 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1080 Perl_dump_indent(aTHX_ level, file, "}\n");
1082 SvREFCNT_dec_NN(tmpsv);
1091 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1093 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
1094 if (cSVOPo->op_sv) {
1095 SV * const tmpsv = newSV(0);
1099 /* FIXME - is this making unwarranted assumptions about the
1100 UTF-8 cleanliness of the dump file handle? */
1103 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
1104 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1105 SvPV_nolen_const(tmpsv));
1109 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1115 case OP_METHOD_NAMED:
1116 #ifndef USE_ITHREADS
1117 /* with ITHREADS, consts are stored in the pad, and the right pad
1118 * may not be active here, so skip */
1119 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1125 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1126 (UV)CopLINE(cCOPo));
1127 if (CopSTASHPV(cCOPo))
1128 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1130 if (CopLABEL(cCOPo))
1131 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1135 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1136 if (cLOOPo->op_redoop)
1137 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1139 PerlIO_printf(file, "DONE\n");
1140 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1141 if (cLOOPo->op_nextop)
1142 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1144 PerlIO_printf(file, "DONE\n");
1145 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1146 if (cLOOPo->op_lastop)
1147 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1149 PerlIO_printf(file, "DONE\n");
1157 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1158 if (cLOGOPo->op_other)
1159 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1161 PerlIO_printf(file, "DONE\n");
1167 do_pmop_dump(level, file, cPMOPo);
1175 if (o->op_private & OPpREFCOUNTED)
1176 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1181 if (o->op_flags & OPf_KIDS) {
1183 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1184 do_op_dump(level, file, kid);
1186 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1192 Dumps the optree starting at OP C<o> to C<STDERR>.
1198 Perl_op_dump(pTHX_ const OP *o)
1200 PERL_ARGS_ASSERT_OP_DUMP;
1201 do_op_dump(0, Perl_debug_log, o);
1205 Perl_gv_dump(pTHX_ GV *gv)
1209 PERL_ARGS_ASSERT_GV_DUMP;
1212 PerlIO_printf(Perl_debug_log, "{}\n");
1215 sv = sv_newmortal();
1216 PerlIO_printf(Perl_debug_log, "{\n");
1217 gv_fullname3(sv, gv, NULL);
1218 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1219 if (gv != GvEGV(gv)) {
1220 gv_efullname3(sv, GvEGV(gv), NULL);
1221 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1223 PerlIO_putc(Perl_debug_log, '\n');
1224 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1228 /* map magic types to the symbolic names
1229 * (with the PERL_MAGIC_ prefixed stripped)
1232 static const struct { const char type; const char *name; } magic_names[] = {
1233 #include "mg_names.c"
1234 /* this null string terminates the list */
1239 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1241 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1243 for (; mg; mg = mg->mg_moremagic) {
1244 Perl_dump_indent(aTHX_ level, file,
1245 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1246 if (mg->mg_virtual) {
1247 const MGVTBL * const v = mg->mg_virtual;
1248 if (v >= PL_magic_vtables
1249 && v < PL_magic_vtables + magic_vtable_max) {
1250 const U32 i = v - PL_magic_vtables;
1251 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1254 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1257 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1260 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1264 const char *name = NULL;
1265 for (n = 0; magic_names[n].name; n++) {
1266 if (mg->mg_type == magic_names[n].type) {
1267 name = magic_names[n].name;
1272 Perl_dump_indent(aTHX_ level, file,
1273 " MG_TYPE = PERL_MAGIC_%s\n", name);
1275 Perl_dump_indent(aTHX_ level, file,
1276 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1280 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1281 if (mg->mg_type == PERL_MAGIC_envelem &&
1282 mg->mg_flags & MGf_TAINTEDDIR)
1283 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1284 if (mg->mg_type == PERL_MAGIC_regex_global &&
1285 mg->mg_flags & MGf_MINMATCH)
1286 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1287 if (mg->mg_flags & MGf_REFCOUNTED)
1288 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1289 if (mg->mg_flags & MGf_GSKIP)
1290 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1291 if (mg->mg_flags & MGf_COPY)
1292 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1293 if (mg->mg_flags & MGf_DUP)
1294 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1295 if (mg->mg_flags & MGf_LOCAL)
1296 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1297 if (mg->mg_type == PERL_MAGIC_regex_global &&
1298 mg->mg_flags & MGf_BYTES)
1299 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1302 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1303 PTR2UV(mg->mg_obj));
1304 if (mg->mg_type == PERL_MAGIC_qr) {
1305 REGEXP* const re = (REGEXP *)mg->mg_obj;
1306 SV * const dsv = sv_newmortal();
1307 const char * const s
1308 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1310 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1311 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1313 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1314 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1317 if (mg->mg_flags & MGf_REFCOUNTED)
1318 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1321 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1323 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1324 if (mg->mg_len >= 0) {
1325 if (mg->mg_type != PERL_MAGIC_utf8) {
1326 SV * const sv = newSVpvs("");
1327 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1328 SvREFCNT_dec_NN(sv);
1331 else if (mg->mg_len == HEf_SVKEY) {
1332 PerlIO_puts(file, " => HEf_SVKEY\n");
1333 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1334 maxnest, dumpops, pvlim); /* MG is already +1 */
1337 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1342 " does not know how to handle this MG_LEN"
1344 PerlIO_putc(file, '\n');
1346 if (mg->mg_type == PERL_MAGIC_utf8) {
1347 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1350 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1351 Perl_dump_indent(aTHX_ level, file,
1352 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1355 (UV)cache[i * 2 + 1]);
1362 Perl_magic_dump(pTHX_ const MAGIC *mg)
1364 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1368 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1372 PERL_ARGS_ASSERT_DO_HV_DUMP;
1374 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1375 if (sv && (hvname = HvNAME_get(sv)))
1377 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1378 name which quite legally could contain insane things like tabs, newlines, nulls or
1379 other scary crap - this should produce sane results - except maybe for unicode package
1380 names - but we will wait for someone to file a bug on that - demerphq */
1381 SV * const tmpsv = newSVpvs("");
1382 PerlIO_printf(file, "\t%s\n", pv_display(tmpsv, hvname, HvNAMELEN_get(sv), 0, 1024));
1385 PerlIO_putc(file, '\n');
1389 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1391 PERL_ARGS_ASSERT_DO_GV_DUMP;
1393 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1394 if (sv && GvNAME(sv))
1395 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1397 PerlIO_putc(file, '\n');
1401 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1403 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1405 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1406 if (sv && GvNAME(sv)) {
1408 PerlIO_printf(file, "\t\"");
1409 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1410 PerlIO_printf(file, "%s\" :: \"", hvname);
1411 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1414 PerlIO_putc(file, '\n');
1417 const struct flag_to_name first_sv_flags_names[] = {
1418 {SVs_TEMP, "TEMP,"},
1419 {SVs_OBJECT, "OBJECT,"},
1428 const struct flag_to_name second_sv_flags_names[] = {
1430 {SVf_FAKE, "FAKE,"},
1431 {SVf_READONLY, "READONLY,"},
1432 {SVf_IsCOW, "IsCOW,"},
1433 {SVf_BREAK, "BREAK,"},
1434 {SVf_AMAGIC, "OVERLOAD,"},
1440 const struct flag_to_name cv_flags_names[] = {
1441 {CVf_ANON, "ANON,"},
1442 {CVf_UNIQUE, "UNIQUE,"},
1443 {CVf_CLONE, "CLONE,"},
1444 {CVf_CLONED, "CLONED,"},
1445 {CVf_CONST, "CONST,"},
1446 {CVf_NODEBUG, "NODEBUG,"},
1447 {CVf_LVALUE, "LVALUE,"},
1448 {CVf_METHOD, "METHOD,"},
1449 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1450 {CVf_CVGV_RC, "CVGV_RC,"},
1451 {CVf_DYNFILE, "DYNFILE,"},
1452 {CVf_AUTOLOAD, "AUTOLOAD,"},
1453 {CVf_HASEVAL, "HASEVAL"},
1454 {CVf_SLABBED, "SLABBED,"},
1455 {CVf_ISXSUB, "ISXSUB,"}
1458 const struct flag_to_name hv_flags_names[] = {
1459 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1460 {SVphv_LAZYDEL, "LAZYDEL,"},
1461 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1462 {SVphv_CLONEABLE, "CLONEABLE,"}
1465 const struct flag_to_name gp_flags_names[] = {
1466 {GVf_INTRO, "INTRO,"},
1467 {GVf_MULTI, "MULTI,"},
1468 {GVf_ASSUMECV, "ASSUMECV,"},
1469 {GVf_IN_PAD, "IN_PAD,"}
1472 const struct flag_to_name gp_flags_imported_names[] = {
1473 {GVf_IMPORTED_SV, " SV"},
1474 {GVf_IMPORTED_AV, " AV"},
1475 {GVf_IMPORTED_HV, " HV"},
1476 {GVf_IMPORTED_CV, " CV"},
1479 const struct flag_to_name regexp_flags_names[] = {
1480 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1481 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1482 {RXf_PMf_FOLD, "PMf_FOLD,"},
1483 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1484 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1485 {RXf_ANCH_BOL, "ANCH_BOL,"},
1486 {RXf_ANCH_MBOL, "ANCH_MBOL,"},
1487 {RXf_ANCH_SBOL, "ANCH_SBOL,"},
1488 {RXf_ANCH_GPOS, "ANCH_GPOS,"},
1489 {RXf_GPOS_SEEN, "GPOS_SEEN,"},
1490 {RXf_GPOS_FLOAT, "GPOS_FLOAT,"},
1491 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1492 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1493 {RXf_CANY_SEEN, "CANY_SEEN,"},
1494 {RXf_NOSCAN, "NOSCAN,"},
1495 {RXf_CHECK_ALL, "CHECK_ALL,"},
1496 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1497 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1498 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1499 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1500 {RXf_SPLIT, "SPLIT,"},
1501 {RXf_COPY_DONE, "COPY_DONE,"},
1502 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1503 {RXf_TAINTED, "TAINTED,"},
1504 {RXf_START_ONLY, "START_ONLY,"},
1505 {RXf_SKIPWHITE, "SKIPWHITE,"},
1506 {RXf_WHITE, "WHITE,"},
1507 {RXf_NULL, "NULL,"},
1511 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1519 PERL_ARGS_ASSERT_DO_SV_DUMP;
1522 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1526 flags = SvFLAGS(sv);
1529 /* process general SV flags */
1531 d = Perl_newSVpvf(aTHX_
1532 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1533 PTR2UV(SvANY(sv)), PTR2UV(sv),
1534 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1535 (int)(PL_dumpindent*level), "");
1537 if (!((flags & SVpad_NAME) == SVpad_NAME
1538 && (type == SVt_PVMG || type == SVt_PVNV))) {
1539 if ((flags & SVs_PADMY) && (flags & SVs_PADSTALE))
1540 sv_catpv(d, "PADSTALE,");
1542 if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
1543 if (!(flags & SVs_PADMY) && (flags & SVs_PADTMP))
1544 sv_catpv(d, "PADTMP,");
1545 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1547 append_flags(d, flags, first_sv_flags_names);
1548 if (flags & SVf_ROK) {
1549 sv_catpv(d, "ROK,");
1550 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1552 append_flags(d, flags, second_sv_flags_names);
1553 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1554 && type != SVt_PVAV) {
1555 if (SvPCS_IMPORTED(sv))
1556 sv_catpv(d, "PCS_IMPORTED,");
1558 sv_catpv(d, "SCREAM,");
1561 /* process type-specific SV flags */
1566 append_flags(d, CvFLAGS(sv), cv_flags_names);
1569 append_flags(d, flags, hv_flags_names);
1573 if (isGV_with_GP(sv)) {
1574 append_flags(d, GvFLAGS(sv), gp_flags_names);
1576 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1577 sv_catpv(d, "IMPORT");
1578 if (GvIMPORTED(sv) == GVf_IMPORTED)
1579 sv_catpv(d, "ALL,");
1582 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1589 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1590 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1593 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1594 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1595 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1596 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1599 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1602 if (AvPAD_NAMELIST(sv)) sv_catpvs(d, "NAMELIST,");
1605 /* SVphv_SHAREKEYS is also 0x20000000 */
1606 if ((type != SVt_PVHV) && SvUTF8(sv))
1607 sv_catpv(d, "UTF8");
1609 if (*(SvEND(d) - 1) == ',') {
1610 SvCUR_set(d, SvCUR(d) - 1);
1611 SvPVX(d)[SvCUR(d)] = '\0';
1616 /* dump initial SV details */
1618 #ifdef DEBUG_LEAKING_SCALARS
1619 Perl_dump_indent(aTHX_ level, file,
1620 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1621 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1623 sv->sv_debug_inpad ? "for" : "by",
1624 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1625 PTR2UV(sv->sv_debug_parent),
1629 Perl_dump_indent(aTHX_ level, file, "SV = ");
1633 if (type < SVt_LAST) {
1634 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1636 if (type == SVt_NULL) {
1641 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1646 /* Dump general SV fields */
1648 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1649 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1650 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1651 || (type == SVt_IV && !SvROK(sv))) {
1653 #ifdef PERL_OLD_COPY_ON_WRITE
1657 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1659 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1660 #ifdef PERL_OLD_COPY_ON_WRITE
1661 if (SvIsCOW_shared_hash(sv))
1662 PerlIO_printf(file, " (HASH)");
1663 else if (SvIsCOW_normal(sv))
1664 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1666 PerlIO_putc(file, '\n');
1669 if ((type == SVt_PVNV || type == SVt_PVMG)
1670 && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
1671 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1672 (UV) COP_SEQ_RANGE_LOW(sv));
1673 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1674 (UV) COP_SEQ_RANGE_HIGH(sv));
1675 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1676 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1677 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1678 || type == SVt_NV) {
1679 STORE_NUMERIC_LOCAL_SET_STANDARD();
1680 /* %Vg doesn't work? --jhi */
1681 #ifdef USE_LONG_DOUBLE
1682 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1684 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1686 RESTORE_NUMERIC_LOCAL();
1690 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1692 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1695 if (type < SVt_PV) {
1700 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1701 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1702 const bool re = isREGEXP(sv);
1703 const char * const ptr =
1704 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1708 SvOOK_offset(sv, delta);
1709 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1714 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
1716 PerlIO_printf(file, "( %s . ) ",
1717 pv_display(d, ptr - delta, delta, 0,
1720 if (type == SVt_INVLIST) {
1721 PerlIO_printf(file, "\n");
1722 /* 4 blanks indents 2 beyond the PV, etc */
1723 _invlist_dump(file, level, " ", sv);
1726 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1729 if (SvUTF8(sv)) /* the 6? \x{....} */
1730 PerlIO_printf(file, " [UTF8 \"%s\"]",
1731 sv_uni_display(d, sv, 6 * SvCUR(sv),
1733 PerlIO_printf(file, "\n");
1735 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1737 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1739 #ifdef PERL_NEW_COPY_ON_WRITE
1740 if (SvIsCOW(sv) && SvLEN(sv))
1741 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1746 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1749 if (type >= SVt_PVMG) {
1750 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1751 HV * const ost = SvOURSTASH(sv);
1753 do_hv_dump(level, file, " OURSTASH", ost);
1754 } else if (SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv)) {
1755 Perl_dump_indent(aTHX_ level, file, " MAXNAMED = %"UVuf"\n",
1756 (UV)PadnamelistMAXNAMED(sv));
1759 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1762 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1764 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1765 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1769 /* Dump type-specific SV fields */
1773 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1774 if (AvARRAY(sv) != AvALLOC(sv)) {
1775 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1776 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1779 PerlIO_putc(file, '\n');
1780 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1781 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1782 /* arylen is stored in magic, and padnamelists use SvMAGIC for
1784 if (!AvPAD_NAMELIST(sv))
1785 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n",
1786 SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1788 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1789 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1790 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1791 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1792 if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) {
1794 for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) {
1795 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
1797 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1799 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1804 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1805 if (HvARRAY(sv) && HvUSEDKEYS(sv)) {
1806 /* Show distribution of HEs in the ARRAY */
1808 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1811 U32 pow2 = 2, keys = HvUSEDKEYS(sv);
1812 NV theoret, sum = 0;
1814 PerlIO_printf(file, " (");
1815 Zero(freq, FREQ_MAX + 1, int);
1816 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1819 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1821 if (count > FREQ_MAX)
1827 for (i = 0; i <= max; i++) {
1829 PerlIO_printf(file, "%d%s:%d", i,
1830 (i == FREQ_MAX) ? "+" : "",
1833 PerlIO_printf(file, ", ");
1836 PerlIO_putc(file, ')');
1837 /* The "quality" of a hash is defined as the total number of
1838 comparisons needed to access every element once, relative
1839 to the expected number needed for a random hash.
1841 The total number of comparisons is equal to the sum of
1842 the squares of the number of entries in each bucket.
1843 For a random hash of n keys into k buckets, the expected
1848 for (i = max; i > 0; i--) { /* Precision: count down. */
1849 sum += freq[i] * i * i;
1851 while ((keys = keys >> 1))
1853 theoret = HvUSEDKEYS(sv);
1854 theoret += theoret * (theoret-1)/pow2;
1855 PerlIO_putc(file, '\n');
1856 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1858 PerlIO_putc(file, '\n');
1859 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
1862 HE **ents = HvARRAY(sv);
1865 HE *const *const last = ents + HvMAX(sv);
1866 count = last + 1 - ents;
1871 } while (++ents <= last);
1875 struct xpvhv_aux *const aux = HvAUX(sv);
1876 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf
1877 " (cached = %"UVuf")\n",
1878 (UV)count, (UV)aux->xhv_fill_lazy);
1880 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1884 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1886 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1887 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1888 #ifdef PERL_HASH_RANDOMIZE_KEYS
1889 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1890 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1891 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
1894 PerlIO_putc(file, '\n');
1897 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1898 if (mg && mg->mg_obj) {
1899 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1903 const char * const hvname = HvNAME_get(sv);
1905 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1909 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1910 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1911 if (HvAUX(sv)->xhv_name_count)
1912 Perl_dump_indent(aTHX_
1913 level, file, " NAMECOUNT = %"IVdf"\n",
1914 (IV)HvAUX(sv)->xhv_name_count
1916 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1917 const I32 count = HvAUX(sv)->xhv_name_count;
1919 SV * const names = newSVpvs_flags("", SVs_TEMP);
1920 /* The starting point is the first element if count is
1921 positive and the second element if count is negative. */
1922 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1923 + (count < 0 ? 1 : 0);
1924 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1925 + (count < 0 ? -count : count);
1926 while (hekp < endp) {
1928 sv_catpvs(names, ", \"");
1929 sv_catpvn(names, HEK_KEY(*hekp), HEK_LEN(*hekp));
1930 sv_catpvs(names, "\"");
1932 /* This should never happen. */
1933 sv_catpvs(names, ", (null)");
1937 Perl_dump_indent(aTHX_
1938 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1942 Perl_dump_indent(aTHX_
1943 level, file, " ENAME = \"%s\"\n", HvENAME_get(sv)
1947 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1949 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1953 /* FIXME - mro_algs kflags can signal a UTF-8 name. */
1954 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%.*s\" (0x%"UVxf")\n",
1955 (int)meta->mro_which->length,
1956 meta->mro_which->name,
1957 PTR2UV(meta->mro_which));
1958 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1959 (UV)meta->cache_gen);
1960 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1962 if (meta->mro_linear_all) {
1963 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1964 PTR2UV(meta->mro_linear_all));
1965 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1968 if (meta->mro_linear_current) {
1969 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1970 PTR2UV(meta->mro_linear_current));
1971 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1974 if (meta->mro_nextmethod) {
1975 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1976 PTR2UV(meta->mro_nextmethod));
1977 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1981 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1983 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1988 if (nest < maxnest) {
1989 HV * const hv = MUTABLE_HV(sv);
1994 int count = maxnest - nest;
1995 for (i=0; i <= HvMAX(hv); i++) {
1996 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2003 if (count-- <= 0) goto DONEHV;
2006 keysv = hv_iterkeysv(he);
2007 keypv = SvPV_const(keysv, len);
2010 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
2012 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2013 if (HvEITER_get(hv) == he)
2014 PerlIO_printf(file, "[CURRENT] ");
2015 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
2016 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2025 if (CvAUTOLOAD(sv)) {
2027 const char *const name = SvPV_const(sv, len);
2028 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%.*s\"\n",
2032 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
2033 (int) CvPROTOLEN(sv), CvPROTO(sv));
2037 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
2038 if (!CvISXSUB(sv)) {
2040 Perl_dump_indent(aTHX_ level, file,
2041 " START = 0x%"UVxf" ===> %"IVdf"\n",
2042 PTR2UV(CvSTART(sv)),
2043 (IV)sequence_num(CvSTART(sv)));
2045 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
2046 PTR2UV(CvROOT(sv)));
2047 if (CvROOT(sv) && dumpops) {
2048 do_op_dump(level+1, file, CvROOT(sv));
2051 SV * const constant = cv_const_sv((const CV *)sv);
2053 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
2056 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
2058 PTR2UV(CvXSUBANY(sv).any_ptr));
2059 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2062 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
2063 (IV)CvXSUBANY(sv).any_i32);
2067 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2068 HEK_KEY(CvNAME_HEK((CV *)sv)));
2069 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
2070 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
2071 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
2072 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
2073 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
2074 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
2075 if (nest < maxnest) {
2076 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2079 const CV * const outside = CvOUTSIDE(sv);
2080 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
2083 : CvANON(outside) ? "ANON"
2084 : (outside == PL_main_cv) ? "MAIN"
2085 : CvUNIQUE(outside) ? "UNIQUE"
2086 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
2088 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
2089 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2094 if (type == SVt_PVLV) {
2095 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2096 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2097 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2098 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
2099 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
2100 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
2101 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2104 if (isREGEXP(sv)) goto dumpregexp;
2105 if (!isGV_with_GP(sv))
2107 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
2108 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
2109 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2110 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
2113 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2114 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2115 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2116 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2117 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2118 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2119 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2120 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
2121 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
2122 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2123 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
2124 do_gv_dump (level, file, " EGV", GvEGV(sv));
2127 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2128 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2129 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2130 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2131 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2132 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2133 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
2135 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2136 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2137 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2139 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2140 PTR2UV(IoTOP_GV(sv)));
2141 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2142 maxnest, dumpops, pvlim);
2144 /* Source filters hide things that are not GVs in these three, so let's
2145 be careful out there. */
2147 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2148 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2149 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2151 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2152 PTR2UV(IoFMT_GV(sv)));
2153 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2154 maxnest, dumpops, pvlim);
2156 if (IoBOTTOM_NAME(sv))
2157 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2158 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2159 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2161 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2162 PTR2UV(IoBOTTOM_GV(sv)));
2163 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2164 maxnest, dumpops, pvlim);
2166 if (isPRINT(IoTYPE(sv)))
2167 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2169 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2170 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2175 struct regexp * const r = ReANY((REGEXP*)sv);
2176 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags) STMT_START { \
2178 append_flags(d, flags, regexp_flags_names); \
2179 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2180 SvCUR_set(d, SvCUR(d) - 1); \
2181 SvPVX(d)[SvCUR(d)] = '\0'; \
2184 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags);
2185 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2186 (UV)(r->compflags), SvPVX_const(d));
2188 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags);
2189 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2190 (UV)(r->extflags), SvPVX_const(d));
2191 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2193 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2195 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2197 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2198 (UV)(r->lastparen));
2199 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2200 (UV)(r->lastcloseparen));
2201 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2203 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2204 (IV)(r->minlenret));
2205 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2207 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2208 (UV)(r->pre_prefix));
2209 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2211 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2212 (IV)(r->suboffset));
2213 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2214 (IV)(r->subcoffset));
2216 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2218 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2220 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2221 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf"\n",
2223 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2224 PTR2UV(r->mother_re));
2225 if (nest < maxnest && r->mother_re)
2226 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2227 maxnest, dumpops, pvlim);
2228 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2229 PTR2UV(r->paren_names));
2230 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2231 PTR2UV(r->substrs));
2232 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2233 PTR2UV(r->pprivate));
2234 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2236 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2237 PTR2UV(r->qr_anoncv));
2239 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2240 PTR2UV(r->saved_copy));
2251 Dumps the contents of an SV to the C<STDERR> filehandle.
2253 For an example of its output, see L<Devel::Peek>.
2259 Perl_sv_dump(pTHX_ SV *sv)
2263 PERL_ARGS_ASSERT_SV_DUMP;
2266 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2268 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2272 Perl_runops_debug(pTHX)
2276 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2280 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2282 #ifdef PERL_TRACE_OPS
2283 ++PL_op_exec_cnt[PL_op->op_type];
2286 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2287 PerlIO_printf(Perl_debug_log,
2288 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2289 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2290 PTR2UV(*PL_watchaddr));
2291 if (DEBUG_s_TEST_) {
2292 if (DEBUG_v_TEST_) {
2293 PerlIO_printf(Perl_debug_log, "\n");
2301 if (DEBUG_t_TEST_) debop(PL_op);
2302 if (DEBUG_P_TEST_) debprof(PL_op);
2305 OP_ENTRY_PROBE(OP_NAME(PL_op));
2306 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2307 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2315 Perl_debop(pTHX_ const OP *o)
2319 PERL_ARGS_ASSERT_DEBOP;
2321 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2324 Perl_deb(aTHX_ "%s", OP_NAME(o));
2325 switch (o->op_type) {
2328 /* With ITHREADS, consts are stored in the pad, and the right pad
2329 * may not be active here, so check.
2330 * Looks like only during compiling the pads are illegal.
2333 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2335 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2340 SV * const sv = newSV(0);
2342 /* FIXME - is this making unwarranted assumptions about the
2343 UTF-8 cleanliness of the dump file handle? */
2346 gv_fullname3(sv, cGVOPo_gv, NULL);
2347 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2348 SvREFCNT_dec_NN(sv);
2351 PerlIO_printf(Perl_debug_log, "(NULL)");
2363 count = o->op_private & OPpPADRANGE_COUNTMASK;
2365 /* print the lexical's name */
2367 CV * const cv = deb_curcv(cxstack_ix);
2369 PAD * comppad = NULL;
2373 PADLIST * const padlist = CvPADLIST(cv);
2374 comppad = *PadlistARRAY(padlist);
2376 PerlIO_printf(Perl_debug_log, "(");
2377 for (i = 0; i < count; i++) {
2379 (sv = *av_fetch(comppad, o->op_targ + i, FALSE)))
2380 PerlIO_printf(Perl_debug_log, "%s", SvPV_nolen_const(sv));
2382 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2385 PerlIO_printf(Perl_debug_log, ",");
2387 PerlIO_printf(Perl_debug_log, ")");
2395 PerlIO_printf(Perl_debug_log, "\n");
2400 S_deb_curcv(pTHX_ const I32 ix)
2403 const PERL_CONTEXT * const cx = &cxstack[ix];
2404 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2405 return cx->blk_sub.cv;
2406 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2407 return cx->blk_eval.cv;
2408 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2413 return deb_curcv(ix - 1);
2417 Perl_watch(pTHX_ char **addr)
2421 PERL_ARGS_ASSERT_WATCH;
2423 PL_watchaddr = addr;
2425 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2426 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2430 S_debprof(pTHX_ const OP *o)
2434 PERL_ARGS_ASSERT_DEBPROF;
2436 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2438 if (!PL_profiledata)
2439 Newxz(PL_profiledata, MAXO, U32);
2440 ++PL_profiledata[o->op_type];
2444 Perl_debprofdump(pTHX)
2448 if (!PL_profiledata)
2450 for (i = 0; i < MAXO; i++) {
2451 if (PL_profiledata[i])
2452 PerlIO_printf(Perl_debug_log,
2453 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2460 * XML variants of most of the above routines
2464 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2468 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2470 PerlIO_printf(file, "\n ");
2471 va_start(args, pat);
2472 xmldump_vindent(level, file, pat, &args);
2478 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2481 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
2482 va_start(args, pat);
2483 xmldump_vindent(level, file, pat, &args);
2488 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2490 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2492 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2493 PerlIO_vprintf(file, pat, *args);
2497 Perl_xmldump_all(pTHX)
2499 xmldump_all_perl(FALSE);
2503 Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
2505 PerlIO_setlinebuf(PL_xmlfp);
2507 op_xmldump(PL_main_root);
2508 /* someday we might call this, when it outputs XML: */
2509 /* xmldump_packsubs_perl(PL_defstash, justperl); */
2510 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2511 PerlIO_close(PL_xmlfp);
2516 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2518 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
2519 xmldump_packsubs_perl(stash, FALSE);
2523 Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
2528 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
2530 if (!HvARRAY(stash))
2532 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2533 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2534 GV *gv = MUTABLE_GV(HeVAL(entry));
2536 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2539 xmldump_sub_perl(gv, justperl);
2542 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2543 && (hv = GvHV(gv)) && hv != PL_defstash)
2544 xmldump_packsubs_perl(hv, justperl); /* nested package */
2550 Perl_xmldump_sub(pTHX_ const GV *gv)
2552 PERL_ARGS_ASSERT_XMLDUMP_SUB;
2553 xmldump_sub_perl(gv, FALSE);
2557 Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
2561 PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
2563 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
2566 sv = sv_newmortal();
2567 gv_fullname3(sv, gv, NULL);
2568 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2569 if (CvXSUB(GvCV(gv)))
2570 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2571 PTR2UV(CvXSUB(GvCV(gv))),
2572 (int)CvXSUBANY(GvCV(gv)).any_i32);
2573 else if (CvROOT(GvCV(gv)))
2574 op_xmldump(CvROOT(GvCV(gv)));
2576 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2580 Perl_xmldump_form(pTHX_ const GV *gv)
2582 SV * const sv = sv_newmortal();
2584 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2586 gv_fullname3(sv, gv, NULL);
2587 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2588 if (CvROOT(GvFORM(gv)))
2589 op_xmldump(CvROOT(GvFORM(gv)));
2591 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2595 Perl_xmldump_eval(pTHX)
2597 op_xmldump(PL_eval_root);
2601 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2603 PERL_ARGS_ASSERT_SV_CATXMLSV;
2604 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2608 Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
2610 PERL_ARGS_ASSERT_SV_CATXMLPV;
2611 return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
2615 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2618 const char * const e = pv + len;
2619 const char * const start = pv;
2623 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2626 dsvcur = SvCUR(dsv); /* in case we have to restart */
2631 c = utf8_to_uvchr_buf((U8*)pv, (U8*)e, &cl);
2633 SvCUR(dsv) = dsvcur;
2646 && c != LATIN1_TO_NATIVE(0x85))
2648 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2652 sv_catpvs(dsv, "<");
2655 sv_catpvs(dsv, ">");
2658 sv_catpvs(dsv, "&");
2661 sv_catpvs(dsv, """);
2666 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2669 const char string = (char) c;
2670 sv_catpvn(dsv, &string, 1);
2674 if ((c >= 0xD800 && c <= 0xDB7F) ||
2675 (c >= 0xDC00 && c <= 0xDFFF) ||
2676 (c >= 0xFFF0 && c <= 0xFFFF) ||
2678 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2680 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2693 Perl_sv_xmlpeek(pTHX_ SV *sv)
2695 SV * const t = sv_newmortal();
2699 PERL_ARGS_ASSERT_SV_XMLPEEK;
2705 sv_catpv(t, "VOID=\"\"");
2708 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
2709 sv_catpv(t, "WILD=\"\"");
2712 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2713 if (sv == &PL_sv_undef) {
2714 sv_catpv(t, "SV_UNDEF=\"1\"");
2715 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2716 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2720 else if (sv == &PL_sv_no) {
2721 sv_catpv(t, "SV_NO=\"1\"");
2722 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2723 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2724 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2725 SVp_POK|SVp_NOK)) &&
2730 else if (sv == &PL_sv_yes) {
2731 sv_catpv(t, "SV_YES=\"1\"");
2732 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2733 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2734 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2735 SVp_POK|SVp_NOK)) &&
2737 SvPVX(sv) && *SvPVX(sv) == '1' &&
2742 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2743 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2744 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2748 sv_catpv(t, " XXX=\"\" ");
2750 else if (SvREFCNT(sv) == 0) {
2751 sv_catpv(t, " refcnt=\"0\"");
2754 else if (DEBUG_R_TEST_) {
2757 /* is this SV on the tmps stack? */
2758 for (ix=PL_tmps_ix; ix>=0; ix--) {
2759 if (PL_tmps_stack[ix] == sv) {
2764 if (SvREFCNT(sv) > 1)
2765 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2768 sv_catpv(t, " DRT=\"<T>\"");
2772 sv_catpv(t, " ROK=\"\"");
2774 switch (SvTYPE(sv)) {
2776 sv_catpv(t, " FREED=\"1\"");
2780 sv_catpv(t, " UNDEF=\"1\"");
2783 sv_catpv(t, " IV=\"");
2786 sv_catpv(t, " NV=\"");
2789 sv_catpv(t, " PV=\"");
2792 sv_catpv(t, " PVIV=\"");
2795 sv_catpv(t, " PVNV=\"");
2798 sv_catpv(t, " PVMG=\"");
2801 sv_catpv(t, " PVLV=\"");
2804 sv_catpv(t, " AV=\"");
2807 sv_catpv(t, " HV=\"");
2811 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2813 sv_catpv(t, " CV=\"()\"");
2816 sv_catpv(t, " GV=\"");
2819 sv_catpv(t, " DUMMY=\"");
2822 sv_catpv(t, " REGEXP=\"");
2825 sv_catpv(t, " FM=\"");
2828 sv_catpv(t, " IO=\"");
2837 else if (SvNOKp(sv)) {
2838 STORE_NUMERIC_LOCAL_SET_STANDARD();
2839 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2840 RESTORE_NUMERIC_LOCAL();
2842 else if (SvIOKp(sv)) {
2844 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2846 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2855 return SvPV(t, n_a);
2859 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2861 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2864 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2867 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2870 REGEXP *const r = PM_GETRE(pm);
2871 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2872 sv_catxmlsv(tmpsv, MUTABLE_SV(r));
2873 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2875 SvREFCNT_dec_NN(tmpsv);
2876 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2877 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2880 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2881 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
2882 SV * const tmpsv = pm_description(pm);
2883 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2884 SvREFCNT_dec_NN(tmpsv);
2888 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2889 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2890 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2891 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2892 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2893 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2896 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2900 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2902 do_pmop_xmldump(0, PL_xmlfp, pm);
2906 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2910 const OPCODE optype = o->op_type;
2912 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2916 seq = sequence_num(o);
2917 Perl_xmldump_indent(aTHX_ level, file,
2918 "<op_%s seq=\"%"UVuf" -> ",
2923 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2924 sequence_num(o->op_next));
2926 PerlIO_printf(file, "DONE\"");
2929 if (optype == OP_NULL)
2931 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2932 if (o->op_targ == OP_NEXTSTATE)
2935 PerlIO_printf(file, " line=\"%"UVuf"\"",
2936 (UV)CopLINE(cCOPo));
2937 if (CopSTASHPV(cCOPo))
2938 PerlIO_printf(file, " package=\"%s\"",
2940 if (CopLABEL(cCOPo))
2941 PerlIO_printf(file, " label=\"%s\"",
2946 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2949 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2952 DUMP_OP_FLAGS(o,1,0,file);
2953 DUMP_OP_PRIVATE(o,1,0,file);
2957 if (o->op_flags & OPf_SPECIAL) {
2963 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
2965 if (cSVOPo->op_sv) {
2966 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
2967 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
2973 gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
2974 s = SvPV(tmpsv1,len);
2975 sv_catxmlpvn(tmpsv2, s, len, 1);
2976 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
2980 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
2985 case OP_METHOD_NAMED:
2986 #ifndef USE_ITHREADS
2987 /* with ITHREADS, consts are stored in the pad, and the right pad
2988 * may not be active here, so skip */
2989 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
2995 PerlIO_printf(file, ">\n");
2997 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
3002 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
3003 (UV)CopLINE(cCOPo));
3004 if (CopSTASHPV(cCOPo))
3005 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
3007 if (CopLABEL(cCOPo))
3008 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
3012 S_xmldump_attr(aTHX_ level, file, "redo=\"");
3013 if (cLOOPo->op_redoop)
3014 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
3016 PerlIO_printf(file, "DONE\"");
3017 S_xmldump_attr(aTHX_ level, file, "next=\"");
3018 if (cLOOPo->op_nextop)
3019 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
3021 PerlIO_printf(file, "DONE\"");
3022 S_xmldump_attr(aTHX_ level, file, "last=\"");
3023 if (cLOOPo->op_lastop)
3024 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
3026 PerlIO_printf(file, "DONE\"");
3034 S_xmldump_attr(aTHX_ level, file, "other=\"");
3035 if (cLOGOPo->op_other)
3036 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
3038 PerlIO_printf(file, "DONE\"");
3046 if (o->op_private & OPpREFCOUNTED)
3047 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
3053 if (PL_madskills && o->op_madprop) {
3054 char prevkey = '\0';
3055 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
3056 const MADPROP* mp = o->op_madprop;
3060 PerlIO_printf(file, ">\n");
3062 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
3065 char tmp = mp->mad_key;
3066 sv_setpvs(tmpsv,"\"");
3068 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
3069 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
3070 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
3073 sv_catpv(tmpsv, "\"");
3074 switch (mp->mad_type) {
3076 sv_catpv(tmpsv, "NULL");
3077 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
3080 sv_catpv(tmpsv, " val=\"");
3081 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
3082 sv_catpv(tmpsv, "\"");
3083 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
3086 sv_catpv(tmpsv, " val=\"");
3087 sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
3088 sv_catpv(tmpsv, "\"");
3089 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
3092 if ((OP*)mp->mad_val) {
3093 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
3094 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
3095 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
3099 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
3105 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
3107 SvREFCNT_dec_NN(tmpsv);
3117 PerlIO_printf(file, ">\n");
3119 do_pmop_xmldump(level, file, cPMOPo);
3125 if (o->op_flags & OPf_KIDS) {
3129 PerlIO_printf(file, ">\n");
3131 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3132 do_op_xmldump(level, file, kid);
3136 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3138 PerlIO_printf(file, " />\n");
3142 Perl_op_xmldump(pTHX_ const OP *o)
3144 PERL_ARGS_ASSERT_OP_XMLDUMP;
3146 do_op_xmldump(0, PL_xmlfp, o);
3152 * c-indentation-style: bsd
3154 * indent-tabs-mode: nil
3157 * ex: set ts=8 sts=4 sw=4 et: