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), C_ARRAY_END(flags))
92 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
95 PERL_ARGS_ASSERT_DUMP_INDENT;
97 dump_vindent(level, file, pat, &args);
102 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
105 PERL_ARGS_ASSERT_DUMP_VINDENT;
106 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
107 PerlIO_vprintf(file, pat, *args);
113 dump_all_perl(FALSE);
117 Perl_dump_all_perl(pTHX_ bool justperl)
121 PerlIO_setlinebuf(Perl_debug_log);
123 op_dump(PL_main_root);
124 dump_packsubs_perl(PL_defstash, justperl);
128 Perl_dump_packsubs(pTHX_ const HV *stash)
130 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
131 dump_packsubs_perl(stash, FALSE);
135 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
140 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
144 for (i = 0; i <= (I32) HvMAX(stash); i++) {
146 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
147 const GV * const gv = (const GV *)HeVAL(entry);
148 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
151 dump_sub_perl(gv, justperl);
154 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
155 const HV * const hv = GvHV(gv);
156 if (hv && (hv != PL_defstash))
157 dump_packsubs_perl(hv, justperl); /* nested package */
164 Perl_dump_sub(pTHX_ const GV *gv)
166 PERL_ARGS_ASSERT_DUMP_SUB;
167 dump_sub_perl(gv, FALSE);
171 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
175 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
177 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
181 gv_fullname3(sv, gv, NULL);
182 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
183 if (CvISXSUB(GvCV(gv)))
184 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
185 PTR2UV(CvXSUB(GvCV(gv))),
186 (int)CvXSUBANY(GvCV(gv)).any_i32);
187 else if (CvROOT(GvCV(gv)))
188 op_dump(CvROOT(GvCV(gv)));
190 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
194 Perl_dump_form(pTHX_ const GV *gv)
196 SV * const sv = sv_newmortal();
198 PERL_ARGS_ASSERT_DUMP_FORM;
200 gv_fullname3(sv, gv, NULL);
201 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
202 if (CvROOT(GvFORM(gv)))
203 op_dump(CvROOT(GvFORM(gv)));
205 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
212 op_dump(PL_eval_root);
217 =for apidoc pv_escape
219 Escapes at most the first "count" chars of pv and puts the results into
220 dsv such that the size of the escaped string will not exceed "max" chars
221 and will not contain any incomplete escape sequences.
223 If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
224 will also be escaped.
226 Normally the SV will be cleared before the escaped string is prepared,
227 but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
229 If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
230 if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
231 using C<is_utf8_string()> to determine if it is Unicode.
233 If PERL_PV_ESCAPE_ALL is set then all input chars will be output
234 using C<\x01F1> style escapes, otherwise if PERL_PV_ESCAPE_NONASCII is set, only
235 chars above 127 will be escaped using this style; otherwise, only chars above
236 255 will be so escaped; other non printable chars will use octal or
237 common escaped patterns like C<\n>. Otherwise, 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, regardless of max. If the output is to be in hex,
243 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 hex value.
247 If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
248 not a '\\'. This is because regexes very often contain backslashed
249 sequences, whereas '%' is not a particularly common character in patterns.
251 Returns a pointer to the escaped text as held by dsv.
255 #define PV_ESCAPE_OCTBUFSIZE 32
258 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
259 const STRLEN count, const STRLEN max,
260 STRLEN * const escaped, const U32 flags )
262 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
263 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
264 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
265 STRLEN wrote = 0; /* chars written so far */
266 STRLEN chsize = 0; /* size of data to be written */
267 STRLEN readsize = 1; /* size of data just read */
268 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
269 const char *pv = str;
270 const char * const end = pv + count; /* end of string */
273 PERL_ARGS_ASSERT_PV_ESCAPE;
275 if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
276 /* This won't alter the UTF-8 flag */
280 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
283 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
284 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
285 const U8 c = (U8)u & 0xFF;
288 || (flags & PERL_PV_ESCAPE_ALL)
289 || (( u > 127 ) && (flags & PERL_PV_ESCAPE_NONASCII)))
291 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
292 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
295 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
296 "%cx{%"UVxf"}", esc, u);
297 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
300 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
304 case '\\' : /* fallthrough */
305 case '%' : if ( c == esc ) {
311 case '\v' : octbuf[1] = 'v'; break;
312 case '\t' : octbuf[1] = 't'; break;
313 case '\r' : octbuf[1] = 'r'; break;
314 case '\n' : octbuf[1] = 'n'; break;
315 case '\f' : octbuf[1] = 'f'; break;
323 if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
324 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
327 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
334 if ( max && (wrote + chsize > max) ) {
336 } else if (chsize > 1) {
337 sv_catpvn(dsv, octbuf, chsize);
340 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then bytes in the range
341 128-255 can be appended raw to the dsv. If dsv happens to be
342 UTF-8 then we need catpvf to upgrade them for us.
343 Or add a new API call sv_catpvc(). Think about that name, and
344 how to keep it clear that it's unlike the s of catpvs, which is
345 really an array octets, not a string. */
346 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
349 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
357 =for apidoc pv_pretty
359 Converts a string into something presentable, handling escaping via
360 pv_escape() and supporting quoting and ellipses.
362 If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
363 double quoted with any double quotes in the string escaped. Otherwise
364 if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
367 If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
368 string were output then an ellipsis C<...> will be appended to the
369 string. Note that this happens AFTER it has been quoted.
371 If start_color is non-null then it will be inserted after the opening
372 quote (if there is one) but before the escaped text. If end_color
373 is non-null then it will be inserted after the escaped text but before
374 any quotes or ellipses.
376 Returns a pointer to the prettified text as held by dsv.
382 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
383 const STRLEN max, char const * const start_color, char const * const end_color,
386 const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
389 PERL_ARGS_ASSERT_PV_PRETTY;
391 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
392 /* This won't alter the UTF-8 flag */
397 sv_catpvs(dsv, "\"");
398 else if ( flags & PERL_PV_PRETTY_LTGT )
401 if ( start_color != NULL )
402 sv_catpv(dsv, start_color);
404 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
406 if ( end_color != NULL )
407 sv_catpv(dsv, end_color);
410 sv_catpvs( dsv, "\"");
411 else if ( flags & PERL_PV_PRETTY_LTGT )
414 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
415 sv_catpvs(dsv, "...");
421 =for apidoc pv_display
425 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
427 except that an additional "\0" will be appended to the string when
428 len > cur and pv[cur] is "\0".
430 Note that the final string may be up to 7 chars longer than pvlim.
436 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
438 PERL_ARGS_ASSERT_PV_DISPLAY;
440 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
441 if (len > cur && pv[cur] == '\0')
442 sv_catpvs( dsv, "\\0");
447 Perl_sv_peek(pTHX_ SV *sv)
450 SV * const t = sv_newmortal();
460 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
464 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
465 if (sv == &PL_sv_undef) {
466 sv_catpv(t, "SV_UNDEF");
467 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
468 SVs_GMG|SVs_SMG|SVs_RMG)) &&
472 else if (sv == &PL_sv_no) {
473 sv_catpv(t, "SV_NO");
474 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
475 SVs_GMG|SVs_SMG|SVs_RMG)) &&
476 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
482 else if (sv == &PL_sv_yes) {
483 sv_catpv(t, "SV_YES");
484 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
485 SVs_GMG|SVs_SMG|SVs_RMG)) &&
486 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
489 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
494 sv_catpv(t, "SV_PLACEHOLDER");
495 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
496 SVs_GMG|SVs_SMG|SVs_RMG)) &&
502 else if (SvREFCNT(sv) == 0) {
506 else if (DEBUG_R_TEST_) {
509 /* is this SV on the tmps stack? */
510 for (ix=PL_tmps_ix; ix>=0; ix--) {
511 if (PL_tmps_stack[ix] == sv) {
516 if (SvREFCNT(sv) > 1)
517 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
525 if (SvCUR(t) + unref > 10) {
526 SvCUR_set(t, unref + 3);
535 if (type == SVt_PVCV) {
536 Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
538 } else if (type < SVt_LAST) {
539 sv_catpv(t, svshorttypenames[type]);
541 if (type == SVt_NULL)
544 sv_catpv(t, "FREED");
549 if (!SvPVX_const(sv))
550 sv_catpv(t, "(null)");
552 SV * const tmp = newSVpvs("");
556 SvOOK_offset(sv, delta);
557 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
559 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
561 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
562 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
567 else if (SvNOKp(sv)) {
568 STORE_NUMERIC_LOCAL_SET_STANDARD();
569 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
570 RESTORE_NUMERIC_LOCAL();
572 else if (SvIOKp(sv)) {
574 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
576 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
584 if (PL_tainting && SvTAINTED(sv))
585 sv_catpv(t, " [tainted]");
586 return SvPV_nolen(t);
590 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
594 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
597 Perl_dump_indent(aTHX_ level, file, "{}\n");
600 Perl_dump_indent(aTHX_ level, file, "{\n");
602 if (pm->op_pmflags & PMf_ONCE)
607 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
608 ch, RX_PRECOMP(PM_GETRE(pm)), ch,
609 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
611 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
612 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
613 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
614 op_dump(pm->op_pmreplrootu.op_pmreplroot);
616 if (pm->op_code_list) {
617 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
618 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
619 do_op_dump(level, file, pm->op_code_list);
622 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
623 PTR2UV(pm->op_code_list));
625 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
626 SV * const tmpsv = pm_description(pm);
627 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
631 Perl_dump_indent(aTHX_ level-1, file, "}\n");
634 const struct flag_to_name pmflags_flags_names[] = {
635 {PMf_CONST, ",CONST"},
637 {PMf_GLOBAL, ",GLOBAL"},
638 {PMf_CONTINUE, ",CONTINUE"},
639 {PMf_RETAINT, ",RETAINT"},
641 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
642 {PMf_HAS_CV, ",HAS_CV"},
643 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"}
647 S_pm_description(pTHX_ const PMOP *pm)
649 SV * const desc = newSVpvs("");
650 const REGEXP * const regex = PM_GETRE(pm);
651 const U32 pmflags = pm->op_pmflags;
653 PERL_ARGS_ASSERT_PM_DESCRIPTION;
655 if (pmflags & PMf_ONCE)
656 sv_catpv(desc, ",ONCE");
658 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
659 sv_catpv(desc, ":USED");
661 if (pmflags & PMf_USED)
662 sv_catpv(desc, ":USED");
666 if (RX_EXTFLAGS(regex) & RXf_TAINTED)
667 sv_catpv(desc, ",TAINTED");
668 if (RX_CHECK_SUBSTR(regex)) {
669 if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN))
670 sv_catpv(desc, ",SCANFIRST");
671 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
672 sv_catpv(desc, ",ALL");
674 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
675 sv_catpv(desc, ",SKIPWHITE");
678 append_flags(desc, pmflags, pmflags_flags_names);
683 Perl_pmop_dump(pTHX_ PMOP *pm)
685 do_pmop_dump(0, Perl_debug_log, pm);
688 /* Return a unique integer to represent the address of op o.
689 * If it already exists in PL_op_sequence, just return it;
691 * *** Note that this isn't thread-safe */
694 S_sequence_num(pTHX_ const OP *o)
703 op = newSVuv(PTR2UV(o));
705 key = SvPV_const(op, len);
707 PL_op_sequence = newHV();
708 seq = hv_fetch(PL_op_sequence, key, len, 0);
711 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
715 const struct flag_to_name op_flags_names[] = {
717 {OPf_PARENS, ",PARENS"},
720 {OPf_STACKED, ",STACKED"},
721 {OPf_SPECIAL, ",SPECIAL"}
724 const struct flag_to_name op_trans_names[] = {
725 {OPpTRANS_FROM_UTF, ",FROM_UTF"},
726 {OPpTRANS_TO_UTF, ",TO_UTF"},
727 {OPpTRANS_IDENTICAL, ",IDENTICAL"},
728 {OPpTRANS_SQUASH, ",SQUASH"},
729 {OPpTRANS_COMPLEMENT, ",COMPLEMENT"},
730 {OPpTRANS_GROWS, ",GROWS"},
731 {OPpTRANS_DELETE, ",DELETE"}
734 const struct flag_to_name op_entersub_names[] = {
735 {OPpENTERSUB_DB, ",DB"},
736 {OPpENTERSUB_HASTARG, ",HASTARG"},
737 {OPpENTERSUB_AMPER, ",AMPER"},
738 {OPpENTERSUB_NOPAREN, ",NOPAREN"},
739 {OPpENTERSUB_INARGS, ",INARGS"}
742 const struct flag_to_name op_const_names[] = {
743 {OPpCONST_NOVER, ",NOVER"},
744 {OPpCONST_SHORTCIRCUIT, ",SHORTCIRCUIT"},
745 {OPpCONST_STRICT, ",STRICT"},
746 {OPpCONST_ENTERED, ",ENTERED"},
747 {OPpCONST_BARE, ",BARE"}
750 const struct flag_to_name op_sort_names[] = {
751 {OPpSORT_NUMERIC, ",NUMERIC"},
752 {OPpSORT_INTEGER, ",INTEGER"},
753 {OPpSORT_REVERSE, ",REVERSE"},
754 {OPpSORT_INPLACE, ",INPLACE"},
755 {OPpSORT_DESCEND, ",DESCEND"},
756 {OPpSORT_QSORT, ",QSORT"},
757 {OPpSORT_STABLE, ",STABLE"}
760 const struct flag_to_name op_open_names[] = {
761 {OPpOPEN_IN_RAW, ",IN_RAW"},
762 {OPpOPEN_IN_CRLF, ",IN_CRLF"},
763 {OPpOPEN_OUT_RAW, ",OUT_RAW"},
764 {OPpOPEN_OUT_CRLF, ",OUT_CRLF"}
767 const struct flag_to_name op_exit_names[] = {
768 {OPpEXIT_VMSISH, ",EXIT_VMSISH"},
769 {OPpHUSH_VMSISH, ",HUSH_VMSISH"}
772 #define OP_PRIVATE_ONCE(op, flag, name) \
773 const struct flag_to_name CAT2(op, _names)[] = { \
777 OP_PRIVATE_ONCE(op_aassign, OPpASSIGN_COMMON, ",COMMON");
778 OP_PRIVATE_ONCE(op_leavesub, OPpREFCOUNTED, ",REFCOUNTED");
779 OP_PRIVATE_ONCE(op_sassign, OPpASSIGN_BACKWARDS, ",BACKWARDS");
780 OP_PRIVATE_ONCE(op_repeat, OPpREPEAT_DOLIST, ",DOLIST");
781 OP_PRIVATE_ONCE(op_reverse, OPpREVERSE_INPLACE, ",INPLACE");
782 OP_PRIVATE_ONCE(op_rv2cv, OPpLVAL_INTRO, ",INTRO");
783 OP_PRIVATE_ONCE(op_flip, OPpFLIP_LINENUM, ",LINENUM");
784 OP_PRIVATE_ONCE(op_gv, OPpEARLY_CV, ",EARLY_CV");
785 OP_PRIVATE_ONCE(op_list, OPpLIST_GUESSED, ",GUESSED");
786 OP_PRIVATE_ONCE(op_delete, OPpSLICE, ",SLICE");
787 OP_PRIVATE_ONCE(op_exists, OPpEXISTS_SUB, ",EXISTS_SUB");
788 OP_PRIVATE_ONCE(op_die, OPpHUSH_VMSISH, ",HUSH_VMSISH");
790 struct op_private_by_op {
793 const struct flag_to_name *start;
796 const struct op_private_by_op op_private_names[] = {
797 {OP_LEAVESUB, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
798 {OP_LEAVE, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
799 {OP_LEAVESUBLV, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
800 {OP_LEAVEWRITE, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
801 {OP_AASSIGN, C_ARRAY_LENGTH(op_aassign_names), op_aassign_names },
802 {OP_DIE, C_ARRAY_LENGTH(op_die_names), op_die_names },
803 {OP_DELETE, C_ARRAY_LENGTH(op_delete_names), op_delete_names },
804 {OP_EXISTS, C_ARRAY_LENGTH(op_exists_names), op_exists_names },
805 {OP_EXIT, C_ARRAY_LENGTH(op_exit_names), op_exit_names },
806 {OP_FLIP, C_ARRAY_LENGTH(op_flip_names), op_flip_names },
807 {OP_FLOP, C_ARRAY_LENGTH(op_flip_names), op_flip_names },
808 {OP_GV, C_ARRAY_LENGTH(op_gv_names), op_gv_names },
809 {OP_LIST, C_ARRAY_LENGTH(op_list_names), op_list_names },
810 {OP_SASSIGN, C_ARRAY_LENGTH(op_sassign_names), op_sassign_names },
811 {OP_REPEAT, C_ARRAY_LENGTH(op_repeat_names), op_repeat_names },
812 {OP_RV2CV, C_ARRAY_LENGTH(op_rv2cv_names), op_rv2cv_names },
813 {OP_TRANS, C_ARRAY_LENGTH(op_trans_names), op_trans_names },
814 {OP_CONST, C_ARRAY_LENGTH(op_const_names), op_const_names },
815 {OP_SORT, C_ARRAY_LENGTH(op_sort_names), op_sort_names },
816 {OP_OPEN, C_ARRAY_LENGTH(op_open_names), op_open_names },
817 {OP_BACKTICK, C_ARRAY_LENGTH(op_open_names), op_open_names }
821 S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
822 const struct op_private_by_op *start = op_private_names;
823 const struct op_private_by_op *const end
824 = op_private_names + C_ARRAY_LENGTH(op_private_names);
826 /* This is a linear search, but no worse than the code that it replaced.
827 It's debugging code - size is more important than speed. */
829 if (optype == start->op_type) {
830 S_append_flags(aTHX_ tmpsv, op_private, start->start,
831 start->start + start->len);
834 } while (++start < end);
839 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
843 const OPCODE optype = o->op_type;
845 PERL_ARGS_ASSERT_DO_OP_DUMP;
847 Perl_dump_indent(aTHX_ level, file, "{\n");
849 seq = sequence_num(o);
851 PerlIO_printf(file, "%-4"UVuf, seq);
853 PerlIO_printf(file, "????");
855 "%*sTYPE = %s ===> ",
856 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
859 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
860 sequence_num(o->op_next));
862 PerlIO_printf(file, "NULL\n");
864 if (optype == OP_NULL) {
865 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
866 if (o->op_targ == OP_NEXTSTATE) {
868 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
870 if (CopSTASHPV(cCOPo))
871 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
874 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
879 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
882 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
884 if (o->op_flags || o->op_latefree || o->op_latefreed || o->op_attached) {
885 SV * const tmpsv = newSVpvs("");
886 switch (o->op_flags & OPf_WANT) {
888 sv_catpv(tmpsv, ",VOID");
890 case OPf_WANT_SCALAR:
891 sv_catpv(tmpsv, ",SCALAR");
894 sv_catpv(tmpsv, ",LIST");
897 sv_catpv(tmpsv, ",UNKNOWN");
900 append_flags(tmpsv, o->op_flags, op_flags_names);
902 sv_catpv(tmpsv, ",LATEFREE");
904 sv_catpv(tmpsv, ",LATEFREED");
906 sv_catpv(tmpsv, ",ATTACHED");
907 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
911 SV * const tmpsv = newSVpvs("");
912 if (PL_opargs[optype] & OA_TARGLEX) {
913 if (o->op_private & OPpTARGET_MY)
914 sv_catpv(tmpsv, ",TARGET_MY");
916 else if (optype == OP_ENTERSUB ||
917 optype == OP_RV2SV ||
919 optype == OP_RV2AV ||
920 optype == OP_RV2HV ||
921 optype == OP_RV2GV ||
922 optype == OP_AELEM ||
925 if (optype == OP_ENTERSUB) {
926 append_flags(tmpsv, o->op_private, op_entersub_names);
929 switch (o->op_private & OPpDEREF) {
931 sv_catpv(tmpsv, ",SV");
934 sv_catpv(tmpsv, ",AV");
937 sv_catpv(tmpsv, ",HV");
940 if (o->op_private & OPpMAYBE_LVSUB)
941 sv_catpv(tmpsv, ",MAYBE_LVSUB");
944 if (optype == OP_AELEM || optype == OP_HELEM) {
945 if (o->op_private & OPpLVAL_DEFER)
946 sv_catpv(tmpsv, ",LVAL_DEFER");
949 if (o->op_private & HINT_STRICT_REFS)
950 sv_catpv(tmpsv, ",STRICT_REFS");
951 if (o->op_private & OPpOUR_INTRO)
952 sv_catpv(tmpsv, ",OUR_INTRO");
955 else if (S_op_private_to_names(aTHX_ tmpsv, optype, o->op_private)) {
957 else if (PL_check[optype] != Perl_ck_ftst) {
958 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
959 sv_catpv(tmpsv, ",FT_ACCESS");
960 if (o->op_private & OPpFT_STACKED)
961 sv_catpv(tmpsv, ",FT_STACKED");
963 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
964 sv_catpv(tmpsv, ",INTRO");
966 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
971 if (PL_madskills && o->op_madprop) {
972 SV * const tmpsv = newSVpvs("");
973 MADPROP* mp = o->op_madprop;
974 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
977 const char tmp = mp->mad_key;
978 sv_setpvs(tmpsv,"'");
980 sv_catpvn(tmpsv, &tmp, 1);
981 sv_catpv(tmpsv, "'=");
982 switch (mp->mad_type) {
984 sv_catpv(tmpsv, "NULL");
985 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
988 sv_catpv(tmpsv, "<");
989 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
990 sv_catpv(tmpsv, ">");
991 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
994 if ((OP*)mp->mad_val) {
995 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
996 do_op_dump(level, file, (OP*)mp->mad_val);
1000 sv_catpv(tmpsv, "(UNK)");
1001 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1007 Perl_dump_indent(aTHX_ level, file, "}\n");
1009 SvREFCNT_dec(tmpsv);
1018 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1020 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
1021 if (cSVOPo->op_sv) {
1022 SV * const tmpsv = newSV(0);
1026 /* FIXME - is this making unwarranted assumptions about the
1027 UTF-8 cleanliness of the dump file handle? */
1030 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
1031 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1032 SvPV_nolen_const(tmpsv));
1036 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1042 case OP_METHOD_NAMED:
1043 #ifndef USE_ITHREADS
1044 /* with ITHREADS, consts are stored in the pad, and the right pad
1045 * may not be active here, so skip */
1046 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1052 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1053 (UV)CopLINE(cCOPo));
1054 if (CopSTASHPV(cCOPo))
1055 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1057 if (CopLABEL(cCOPo))
1058 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1062 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1063 if (cLOOPo->op_redoop)
1064 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1066 PerlIO_printf(file, "DONE\n");
1067 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1068 if (cLOOPo->op_nextop)
1069 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1071 PerlIO_printf(file, "DONE\n");
1072 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1073 if (cLOOPo->op_lastop)
1074 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1076 PerlIO_printf(file, "DONE\n");
1084 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1085 if (cLOGOPo->op_other)
1086 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1088 PerlIO_printf(file, "DONE\n");
1094 do_pmop_dump(level, file, cPMOPo);
1102 if (o->op_private & OPpREFCOUNTED)
1103 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1108 if (o->op_flags & OPf_KIDS) {
1110 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1111 do_op_dump(level, file, kid);
1113 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1117 Perl_op_dump(pTHX_ const OP *o)
1119 PERL_ARGS_ASSERT_OP_DUMP;
1120 do_op_dump(0, Perl_debug_log, o);
1124 Perl_gv_dump(pTHX_ GV *gv)
1128 PERL_ARGS_ASSERT_GV_DUMP;
1131 PerlIO_printf(Perl_debug_log, "{}\n");
1134 sv = sv_newmortal();
1135 PerlIO_printf(Perl_debug_log, "{\n");
1136 gv_fullname3(sv, gv, NULL);
1137 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1138 if (gv != GvEGV(gv)) {
1139 gv_efullname3(sv, GvEGV(gv), NULL);
1140 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1142 PerlIO_putc(Perl_debug_log, '\n');
1143 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1147 /* map magic types to the symbolic names
1148 * (with the PERL_MAGIC_ prefixed stripped)
1151 static const struct { const char type; const char *name; } magic_names[] = {
1152 #include "mg_names.c"
1153 /* this null string terminates the list */
1158 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1160 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1162 for (; mg; mg = mg->mg_moremagic) {
1163 Perl_dump_indent(aTHX_ level, file,
1164 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1165 if (mg->mg_virtual) {
1166 const MGVTBL * const v = mg->mg_virtual;
1167 if (v >= PL_magic_vtables
1168 && v < PL_magic_vtables + magic_vtable_max) {
1169 const U32 i = v - PL_magic_vtables;
1170 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1173 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1176 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1179 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1183 const char *name = NULL;
1184 for (n = 0; magic_names[n].name; n++) {
1185 if (mg->mg_type == magic_names[n].type) {
1186 name = magic_names[n].name;
1191 Perl_dump_indent(aTHX_ level, file,
1192 " MG_TYPE = PERL_MAGIC_%s\n", name);
1194 Perl_dump_indent(aTHX_ level, file,
1195 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1199 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1200 if (mg->mg_type == PERL_MAGIC_envelem &&
1201 mg->mg_flags & MGf_TAINTEDDIR)
1202 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1203 if (mg->mg_type == PERL_MAGIC_regex_global &&
1204 mg->mg_flags & MGf_MINMATCH)
1205 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1206 if (mg->mg_flags & MGf_REFCOUNTED)
1207 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1208 if (mg->mg_flags & MGf_GSKIP)
1209 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1210 if (mg->mg_flags & MGf_COPY)
1211 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1212 if (mg->mg_flags & MGf_DUP)
1213 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1214 if (mg->mg_flags & MGf_LOCAL)
1215 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1218 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1219 PTR2UV(mg->mg_obj));
1220 if (mg->mg_type == PERL_MAGIC_qr) {
1221 REGEXP* const re = (REGEXP *)mg->mg_obj;
1222 SV * const dsv = sv_newmortal();
1223 const char * const s
1224 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1226 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1227 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1229 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1230 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1233 if (mg->mg_flags & MGf_REFCOUNTED)
1234 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1237 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1239 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1240 if (mg->mg_len >= 0) {
1241 if (mg->mg_type != PERL_MAGIC_utf8) {
1242 SV * const sv = newSVpvs("");
1243 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1247 else if (mg->mg_len == HEf_SVKEY) {
1248 PerlIO_puts(file, " => HEf_SVKEY\n");
1249 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1250 maxnest, dumpops, pvlim); /* MG is already +1 */
1253 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1258 " does not know how to handle this MG_LEN"
1260 PerlIO_putc(file, '\n');
1262 if (mg->mg_type == PERL_MAGIC_utf8) {
1263 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1266 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1267 Perl_dump_indent(aTHX_ level, file,
1268 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1271 (UV)cache[i * 2 + 1]);
1278 Perl_magic_dump(pTHX_ const MAGIC *mg)
1280 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1284 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1288 PERL_ARGS_ASSERT_DO_HV_DUMP;
1290 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1291 if (sv && (hvname = HvNAME_get(sv)))
1293 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1294 name which quite legally could contain insane things like tabs, newlines, nulls or
1295 other scary crap - this should produce sane results - except maybe for unicode package
1296 names - but we will wait for someone to file a bug on that - demerphq */
1297 SV * const tmpsv = newSVpvs("");
1298 PerlIO_printf(file, "\t%s\n", pv_display(tmpsv, hvname, HvNAMELEN_get(sv), 0, 1024));
1301 PerlIO_putc(file, '\n');
1305 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1307 PERL_ARGS_ASSERT_DO_GV_DUMP;
1309 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1310 if (sv && GvNAME(sv))
1311 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1313 PerlIO_putc(file, '\n');
1317 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1319 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1321 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1322 if (sv && GvNAME(sv)) {
1324 PerlIO_printf(file, "\t\"");
1325 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1326 PerlIO_printf(file, "%s\" :: \"", hvname);
1327 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1330 PerlIO_putc(file, '\n');
1333 const struct flag_to_name first_sv_flags_names[] = {
1334 {SVs_TEMP, "TEMP,"},
1335 {SVs_OBJECT, "OBJECT,"},
1344 const struct flag_to_name second_sv_flags_names[] = {
1346 {SVf_FAKE, "FAKE,"},
1347 {SVf_READONLY, "READONLY,"},
1348 {SVf_BREAK, "BREAK,"},
1349 {SVf_AMAGIC, "OVERLOAD,"},
1355 const struct flag_to_name cv_flags_names[] = {
1356 {CVf_ANON, "ANON,"},
1357 {CVf_UNIQUE, "UNIQUE,"},
1358 {CVf_CLONE, "CLONE,"},
1359 {CVf_CLONED, "CLONED,"},
1360 {CVf_CONST, "CONST,"},
1361 {CVf_NODEBUG, "NODEBUG,"},
1362 {CVf_LVALUE, "LVALUE,"},
1363 {CVf_METHOD, "METHOD,"},
1364 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1365 {CVf_CVGV_RC, "CVGV_RC,"},
1366 {CVf_DYNFILE, "DYNFILE,"},
1367 {CVf_AUTOLOAD, "AUTOLOAD,"},
1368 {CVf_ISXSUB, "ISXSUB,"}
1371 const struct flag_to_name hv_flags_names[] = {
1372 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1373 {SVphv_LAZYDEL, "LAZYDEL,"},
1374 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1375 {SVphv_REHASH, "REHASH,"},
1376 {SVphv_CLONEABLE, "CLONEABLE,"}
1379 const struct flag_to_name gp_flags_names[] = {
1380 {GVf_INTRO, "INTRO,"},
1381 {GVf_MULTI, "MULTI,"},
1382 {GVf_ASSUMECV, "ASSUMECV,"},
1383 {GVf_IN_PAD, "IN_PAD,"}
1386 const struct flag_to_name gp_flags_imported_names[] = {
1387 {GVf_IMPORTED_SV, " SV"},
1388 {GVf_IMPORTED_AV, " AV"},
1389 {GVf_IMPORTED_HV, " HV"},
1390 {GVf_IMPORTED_CV, " CV"},
1393 const struct flag_to_name regexp_flags_names[] = {
1394 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1395 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1396 {RXf_PMf_FOLD, "PMf_FOLD,"},
1397 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1398 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1399 {RXf_ANCH_BOL, "ANCH_BOL,"},
1400 {RXf_ANCH_MBOL, "ANCH_MBOL,"},
1401 {RXf_ANCH_SBOL, "ANCH_SBOL,"},
1402 {RXf_ANCH_GPOS, "ANCH_GPOS,"},
1403 {RXf_GPOS_SEEN, "GPOS_SEEN,"},
1404 {RXf_GPOS_FLOAT, "GPOS_FLOAT,"},
1405 {RXf_LOOKBEHIND_SEEN, "LOOKBEHIND_SEEN,"},
1406 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1407 {RXf_CANY_SEEN, "CANY_SEEN,"},
1408 {RXf_NOSCAN, "NOSCAN,"},
1409 {RXf_CHECK_ALL, "CHECK_ALL,"},
1410 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1411 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1412 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1413 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1414 {RXf_SPLIT, "SPLIT,"},
1415 {RXf_COPY_DONE, "COPY_DONE,"},
1416 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1417 {RXf_TAINTED, "TAINTED,"},
1418 {RXf_START_ONLY, "START_ONLY,"},
1419 {RXf_SKIPWHITE, "SKIPWHITE,"},
1420 {RXf_WHITE, "WHITE,"},
1421 {RXf_NULL, "NULL,"},
1425 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1433 PERL_ARGS_ASSERT_DO_SV_DUMP;
1436 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1440 flags = SvFLAGS(sv);
1443 /* process general SV flags */
1445 d = Perl_newSVpvf(aTHX_
1446 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1447 PTR2UV(SvANY(sv)), PTR2UV(sv),
1448 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1449 (int)(PL_dumpindent*level), "");
1451 if (!((flags & SVpad_NAME) == SVpad_NAME
1452 && (type == SVt_PVMG || type == SVt_PVNV))) {
1453 if ((flags & SVs_PADMY) && (flags & SVs_PADSTALE))
1454 sv_catpv(d, "PADSTALE,");
1456 if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
1457 if (!(flags & SVs_PADMY) && (flags & SVs_PADTMP))
1458 sv_catpv(d, "PADTMP,");
1459 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1461 append_flags(d, flags, first_sv_flags_names);
1462 if (flags & SVf_ROK) {
1463 sv_catpv(d, "ROK,");
1464 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1466 append_flags(d, flags, second_sv_flags_names);
1467 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1468 if (SvPCS_IMPORTED(sv))
1469 sv_catpv(d, "PCS_IMPORTED,");
1471 sv_catpv(d, "SCREAM,");
1474 /* process type-specific SV flags */
1479 append_flags(d, CvFLAGS(sv), cv_flags_names);
1482 append_flags(d, flags, hv_flags_names);
1486 if (isGV_with_GP(sv)) {
1487 append_flags(d, GvFLAGS(sv), gp_flags_names);
1489 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1490 sv_catpv(d, "IMPORT");
1491 if (GvIMPORTED(sv) == GVf_IMPORTED)
1492 sv_catpv(d, "ALL,");
1495 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1502 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1503 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1506 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1507 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1508 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1509 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1512 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1517 /* SVphv_SHAREKEYS is also 0x20000000 */
1518 if ((type != SVt_PVHV) && SvUTF8(sv))
1519 sv_catpv(d, "UTF8");
1521 if (*(SvEND(d) - 1) == ',') {
1522 SvCUR_set(d, SvCUR(d) - 1);
1523 SvPVX(d)[SvCUR(d)] = '\0';
1528 /* dump initial SV details */
1530 #ifdef DEBUG_LEAKING_SCALARS
1531 Perl_dump_indent(aTHX_ level, file,
1532 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1533 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1535 sv->sv_debug_inpad ? "for" : "by",
1536 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1537 PTR2UV(sv->sv_debug_parent),
1541 Perl_dump_indent(aTHX_ level, file, "SV = ");
1545 if (type < SVt_LAST) {
1546 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1548 if (type == SVt_NULL) {
1553 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1558 /* Dump general SV fields */
1560 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1561 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1562 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1563 || (type == SVt_IV && !SvROK(sv))) {
1565 #ifdef PERL_OLD_COPY_ON_WRITE
1569 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1571 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1572 #ifdef PERL_OLD_COPY_ON_WRITE
1573 if (SvIsCOW_shared_hash(sv))
1574 PerlIO_printf(file, " (HASH)");
1575 else if (SvIsCOW_normal(sv))
1576 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1578 PerlIO_putc(file, '\n');
1581 if ((type == SVt_PVNV || type == SVt_PVMG)
1582 && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
1583 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1584 (UV) COP_SEQ_RANGE_LOW(sv));
1585 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1586 (UV) COP_SEQ_RANGE_HIGH(sv));
1587 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1588 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1589 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1590 || type == SVt_NV) {
1591 STORE_NUMERIC_LOCAL_SET_STANDARD();
1592 /* %Vg doesn't work? --jhi */
1593 #ifdef USE_LONG_DOUBLE
1594 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1596 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1598 RESTORE_NUMERIC_LOCAL();
1602 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1604 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1607 if (type < SVt_PV) {
1612 if ((type <= SVt_PVLV && !isGV_with_GP(sv)) || type == SVt_PVFM) {
1613 if (SvPVX_const(sv)) {
1616 SvOOK_offset(sv, delta);
1617 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1622 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1624 PerlIO_printf(file, "( %s . ) ",
1625 pv_display(d, SvPVX_const(sv) - delta, delta, 0,
1628 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1629 if (SvUTF8(sv)) /* the 6? \x{....} */
1630 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
1631 PerlIO_printf(file, "\n");
1632 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1633 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
1636 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1639 if (type >= SVt_PVMG) {
1640 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1641 HV * const ost = SvOURSTASH(sv);
1643 do_hv_dump(level, file, " OURSTASH", ost);
1646 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1649 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1651 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1652 Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
1653 Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1654 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1658 /* Dump type-specific SV fields */
1662 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1663 if (AvARRAY(sv) != AvALLOC(sv)) {
1664 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1665 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1668 PerlIO_putc(file, '\n');
1669 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1670 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1671 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1673 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1674 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1675 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1676 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1677 if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) {
1679 for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) {
1680 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
1682 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1684 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1689 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1690 if (HvARRAY(sv) && HvUSEDKEYS(sv)) {
1691 /* Show distribution of HEs in the ARRAY */
1693 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1696 U32 pow2 = 2, keys = HvUSEDKEYS(sv);
1697 NV theoret, sum = 0;
1699 PerlIO_printf(file, " (");
1700 Zero(freq, FREQ_MAX + 1, int);
1701 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1704 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1706 if (count > FREQ_MAX)
1712 for (i = 0; i <= max; i++) {
1714 PerlIO_printf(file, "%d%s:%d", i,
1715 (i == FREQ_MAX) ? "+" : "",
1718 PerlIO_printf(file, ", ");
1721 PerlIO_putc(file, ')');
1722 /* The "quality" of a hash is defined as the total number of
1723 comparisons needed to access every element once, relative
1724 to the expected number needed for a random hash.
1726 The total number of comparisons is equal to the sum of
1727 the squares of the number of entries in each bucket.
1728 For a random hash of n keys into k buckets, the expected
1733 for (i = max; i > 0; i--) { /* Precision: count down. */
1734 sum += freq[i] * i * i;
1736 while ((keys = keys >> 1))
1738 theoret = HvUSEDKEYS(sv);
1739 theoret += theoret * (theoret-1)/pow2;
1740 PerlIO_putc(file, '\n');
1741 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1743 PerlIO_putc(file, '\n');
1744 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
1745 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1746 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1747 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1748 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1750 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1751 if (mg && mg->mg_obj) {
1752 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1756 const char * const hvname = HvNAME_get(sv);
1758 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1762 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1763 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1764 if (HvAUX(sv)->xhv_name_count)
1765 Perl_dump_indent(aTHX_
1766 level, file, " NAMECOUNT = %"IVdf"\n",
1767 (IV)HvAUX(sv)->xhv_name_count
1769 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1770 const I32 count = HvAUX(sv)->xhv_name_count;
1772 SV * const names = newSVpvs_flags("", SVs_TEMP);
1773 /* The starting point is the first element if count is
1774 positive and the second element if count is negative. */
1775 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1776 + (count < 0 ? 1 : 0);
1777 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1778 + (count < 0 ? -count : count);
1779 while (hekp < endp) {
1781 sv_catpvs(names, ", \"");
1782 sv_catpvn(names, HEK_KEY(*hekp), HEK_LEN(*hekp));
1783 sv_catpvs(names, "\"");
1785 /* This should never happen. */
1786 sv_catpvs(names, ", (null)");
1790 Perl_dump_indent(aTHX_
1791 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1795 Perl_dump_indent(aTHX_
1796 level, file, " ENAME = \"%s\"\n", HvENAME_get(sv)
1800 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1802 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1806 /* FIXME - mro_algs kflags can signal a UTF-8 name. */
1807 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%.*s\" (0x%"UVxf")\n",
1808 (int)meta->mro_which->length,
1809 meta->mro_which->name,
1810 PTR2UV(meta->mro_which));
1811 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1812 (UV)meta->cache_gen);
1813 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1815 if (meta->mro_linear_all) {
1816 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1817 PTR2UV(meta->mro_linear_all));
1818 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1821 if (meta->mro_linear_current) {
1822 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1823 PTR2UV(meta->mro_linear_current));
1824 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1827 if (meta->mro_nextmethod) {
1828 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1829 PTR2UV(meta->mro_nextmethod));
1830 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1834 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1836 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1841 if (nest < maxnest) {
1842 HV * const hv = MUTABLE_HV(sv);
1847 int count = maxnest - nest;
1848 for (i=0; i <= HvMAX(hv); i++) {
1849 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1856 if (count-- <= 0) goto DONEHV;
1859 keysv = hv_iterkeysv(he);
1860 keypv = SvPV_const(keysv, len);
1863 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1865 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1866 if (HvEITER_get(hv) == he)
1867 PerlIO_printf(file, "[CURRENT] ");
1869 PerlIO_printf(file, "[REHASH] ");
1870 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1871 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1880 if (CvAUTOLOAD(sv)) {
1882 const char *const name = SvPV_const(sv, len);
1883 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%.*s\"\n",
1887 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1888 (int) CvPROTOLEN(sv), CvPROTO(sv));
1892 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1893 if (!CvISXSUB(sv)) {
1895 Perl_dump_indent(aTHX_ level, file,
1896 " START = 0x%"UVxf" ===> %"IVdf"\n",
1897 PTR2UV(CvSTART(sv)),
1898 (IV)sequence_num(CvSTART(sv)));
1900 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1901 PTR2UV(CvROOT(sv)));
1902 if (CvROOT(sv) && dumpops) {
1903 do_op_dump(level+1, file, CvROOT(sv));
1906 SV * const constant = cv_const_sv((const CV *)sv);
1908 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1911 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1913 PTR2UV(CvXSUBANY(sv).any_ptr));
1914 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1917 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1918 (IV)CvXSUBANY(sv).any_i32);
1921 do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1922 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1923 if (type == SVt_PVCV)
1924 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1925 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1926 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1927 if (type == SVt_PVFM)
1928 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
1929 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1930 if (nest < maxnest) {
1931 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1934 const CV * const outside = CvOUTSIDE(sv);
1935 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1938 : CvANON(outside) ? "ANON"
1939 : (outside == PL_main_cv) ? "MAIN"
1940 : CvUNIQUE(outside) ? "UNIQUE"
1941 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1943 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1944 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
1949 if (type == SVt_PVLV) {
1950 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1951 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1952 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1953 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1954 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
1955 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1956 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1959 if (!isGV_with_GP(sv))
1961 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1962 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1963 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1964 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1967 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1968 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1969 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1970 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1971 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1972 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1973 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1974 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1975 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1976 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1977 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1978 do_gv_dump (level, file, " EGV", GvEGV(sv));
1981 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1982 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1983 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1984 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
1985 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1986 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1987 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1989 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1990 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1991 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
1993 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
1994 PTR2UV(IoTOP_GV(sv)));
1995 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
1996 maxnest, dumpops, pvlim);
1998 /* Source filters hide things that are not GVs in these three, so let's
1999 be careful out there. */
2001 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2002 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2003 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2005 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2006 PTR2UV(IoFMT_GV(sv)));
2007 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2008 maxnest, dumpops, pvlim);
2010 if (IoBOTTOM_NAME(sv))
2011 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2012 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2013 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2015 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2016 PTR2UV(IoBOTTOM_GV(sv)));
2017 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2018 maxnest, dumpops, pvlim);
2020 if (isPRINT(IoTYPE(sv)))
2021 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2023 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2024 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2028 struct regexp * const r = (struct regexp *)SvANY(sv);
2029 flags = RX_EXTFLAGS((REGEXP*)sv);
2031 append_flags(d, flags, regexp_flags_names);
2032 if (*(SvEND(d) - 1) == ',') {
2033 SvCUR_set(d, SvCUR(d) - 1);
2034 SvPVX(d)[SvCUR(d)] = '\0';
2036 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2037 (UV)flags, SvPVX_const(d));
2038 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2040 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2042 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2043 (UV)(r->lastparen));
2044 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2045 (UV)(r->lastcloseparen));
2046 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2048 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2049 (IV)(r->minlenret));
2050 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2052 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2053 (UV)(r->pre_prefix));
2054 Perl_dump_indent(aTHX_ level, file, " SEEN_EVALS = %"UVuf"\n",
2055 (UV)(r->seen_evals));
2056 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2059 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2061 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2063 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2064 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf"\n",
2066 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2067 PTR2UV(r->mother_re));
2068 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2069 PTR2UV(r->paren_names));
2070 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2071 PTR2UV(r->substrs));
2072 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2073 PTR2UV(r->pprivate));
2074 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2076 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2077 PTR2UV(r->qr_anoncv));
2078 #ifdef PERL_OLD_COPY_ON_WRITE
2079 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2080 PTR2UV(r->saved_copy));
2089 Perl_sv_dump(pTHX_ SV *sv)
2093 PERL_ARGS_ASSERT_SV_DUMP;
2096 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2098 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2102 Perl_runops_debug(pTHX)
2106 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2110 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2113 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2114 PerlIO_printf(Perl_debug_log,
2115 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2116 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2117 PTR2UV(*PL_watchaddr));
2118 if (DEBUG_s_TEST_) {
2119 if (DEBUG_v_TEST_) {
2120 PerlIO_printf(Perl_debug_log, "\n");
2128 if (DEBUG_t_TEST_) debop(PL_op);
2129 if (DEBUG_P_TEST_) debprof(PL_op);
2131 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2132 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2139 Perl_debop(pTHX_ const OP *o)
2143 PERL_ARGS_ASSERT_DEBOP;
2145 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2148 Perl_deb(aTHX_ "%s", OP_NAME(o));
2149 switch (o->op_type) {
2152 /* With ITHREADS, consts are stored in the pad, and the right pad
2153 * may not be active here, so check.
2154 * Looks like only during compiling the pads are illegal.
2157 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2159 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2164 SV * const sv = newSV(0);
2166 /* FIXME - is this making unwarranted assumptions about the
2167 UTF-8 cleanliness of the dump file handle? */
2170 gv_fullname3(sv, cGVOPo_gv, NULL);
2171 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2175 PerlIO_printf(Perl_debug_log, "(NULL)");
2181 /* print the lexical's name */
2182 CV * const cv = deb_curcv(cxstack_ix);
2185 AV * const padlist = CvPADLIST(cv);
2186 AV * const comppad = MUTABLE_AV(*av_fetch(padlist, 0, FALSE));
2187 sv = *av_fetch(comppad, o->op_targ, FALSE);
2191 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2193 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
2199 PerlIO_printf(Perl_debug_log, "\n");
2204 S_deb_curcv(pTHX_ const I32 ix)
2207 const PERL_CONTEXT * const cx = &cxstack[ix];
2208 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2209 return cx->blk_sub.cv;
2210 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2211 return cx->blk_eval.cv;
2212 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2217 return deb_curcv(ix - 1);
2221 Perl_watch(pTHX_ char **addr)
2225 PERL_ARGS_ASSERT_WATCH;
2227 PL_watchaddr = addr;
2229 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2230 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2234 S_debprof(pTHX_ const OP *o)
2238 PERL_ARGS_ASSERT_DEBPROF;
2240 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2242 if (!PL_profiledata)
2243 Newxz(PL_profiledata, MAXO, U32);
2244 ++PL_profiledata[o->op_type];
2248 Perl_debprofdump(pTHX)
2252 if (!PL_profiledata)
2254 for (i = 0; i < MAXO; i++) {
2255 if (PL_profiledata[i])
2256 PerlIO_printf(Perl_debug_log,
2257 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2264 * XML variants of most of the above routines
2268 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2272 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2274 PerlIO_printf(file, "\n ");
2275 va_start(args, pat);
2276 xmldump_vindent(level, file, pat, &args);
2282 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2285 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
2286 va_start(args, pat);
2287 xmldump_vindent(level, file, pat, &args);
2292 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2294 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2296 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2297 PerlIO_vprintf(file, pat, *args);
2301 Perl_xmldump_all(pTHX)
2303 xmldump_all_perl(FALSE);
2307 Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
2309 PerlIO_setlinebuf(PL_xmlfp);
2311 op_xmldump(PL_main_root);
2312 /* someday we might call this, when it outputs XML: */
2313 /* xmldump_packsubs_perl(PL_defstash, justperl); */
2314 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2315 PerlIO_close(PL_xmlfp);
2320 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2322 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
2323 xmldump_packsubs_perl(stash, FALSE);
2327 Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
2332 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
2334 if (!HvARRAY(stash))
2336 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2337 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2338 GV *gv = MUTABLE_GV(HeVAL(entry));
2340 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2343 xmldump_sub_perl(gv, justperl);
2346 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2347 && (hv = GvHV(gv)) && hv != PL_defstash)
2348 xmldump_packsubs_perl(hv, justperl); /* nested package */
2354 Perl_xmldump_sub(pTHX_ const GV *gv)
2356 PERL_ARGS_ASSERT_XMLDUMP_SUB;
2357 xmldump_sub_perl(gv, FALSE);
2361 Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
2365 PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
2367 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
2370 sv = sv_newmortal();
2371 gv_fullname3(sv, gv, NULL);
2372 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2373 if (CvXSUB(GvCV(gv)))
2374 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2375 PTR2UV(CvXSUB(GvCV(gv))),
2376 (int)CvXSUBANY(GvCV(gv)).any_i32);
2377 else if (CvROOT(GvCV(gv)))
2378 op_xmldump(CvROOT(GvCV(gv)));
2380 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2384 Perl_xmldump_form(pTHX_ const GV *gv)
2386 SV * const sv = sv_newmortal();
2388 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2390 gv_fullname3(sv, gv, NULL);
2391 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2392 if (CvROOT(GvFORM(gv)))
2393 op_xmldump(CvROOT(GvFORM(gv)));
2395 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2399 Perl_xmldump_eval(pTHX)
2401 op_xmldump(PL_eval_root);
2405 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2407 PERL_ARGS_ASSERT_SV_CATXMLSV;
2408 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2412 Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
2414 PERL_ARGS_ASSERT_SV_CATXMLPV;
2415 return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
2419 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2422 const char * const e = pv + len;
2423 const char * const start = pv;
2427 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2430 dsvcur = SvCUR(dsv); /* in case we have to restart */
2435 c = utf8_to_uvchr_buf((U8*)pv, (U8*)e, &cl);
2437 SvCUR(dsv) = dsvcur;
2502 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2505 sv_catpvs(dsv, "<");
2508 sv_catpvs(dsv, ">");
2511 sv_catpvs(dsv, "&");
2514 sv_catpvs(dsv, """);
2518 if (c < 32 || c > 127) {
2519 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2522 const char string = (char) c;
2523 sv_catpvn(dsv, &string, 1);
2527 if ((c >= 0xD800 && c <= 0xDB7F) ||
2528 (c >= 0xDC00 && c <= 0xDFFF) ||
2529 (c >= 0xFFF0 && c <= 0xFFFF) ||
2531 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2533 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2546 Perl_sv_xmlpeek(pTHX_ SV *sv)
2548 SV * const t = sv_newmortal();
2552 PERL_ARGS_ASSERT_SV_XMLPEEK;
2558 sv_catpv(t, "VOID=\"\"");
2561 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
2562 sv_catpv(t, "WILD=\"\"");
2565 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2566 if (sv == &PL_sv_undef) {
2567 sv_catpv(t, "SV_UNDEF=\"1\"");
2568 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2569 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2573 else if (sv == &PL_sv_no) {
2574 sv_catpv(t, "SV_NO=\"1\"");
2575 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2576 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2577 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2578 SVp_POK|SVp_NOK)) &&
2583 else if (sv == &PL_sv_yes) {
2584 sv_catpv(t, "SV_YES=\"1\"");
2585 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2586 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2587 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2588 SVp_POK|SVp_NOK)) &&
2590 SvPVX(sv) && *SvPVX(sv) == '1' &&
2595 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2596 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2597 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2601 sv_catpv(t, " XXX=\"\" ");
2603 else if (SvREFCNT(sv) == 0) {
2604 sv_catpv(t, " refcnt=\"0\"");
2607 else if (DEBUG_R_TEST_) {
2610 /* is this SV on the tmps stack? */
2611 for (ix=PL_tmps_ix; ix>=0; ix--) {
2612 if (PL_tmps_stack[ix] == sv) {
2617 if (SvREFCNT(sv) > 1)
2618 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2621 sv_catpv(t, " DRT=\"<T>\"");
2625 sv_catpv(t, " ROK=\"\"");
2627 switch (SvTYPE(sv)) {
2629 sv_catpv(t, " FREED=\"1\"");
2633 sv_catpv(t, " UNDEF=\"1\"");
2636 sv_catpv(t, " IV=\"");
2639 sv_catpv(t, " NV=\"");
2642 sv_catpv(t, " PV=\"");
2645 sv_catpv(t, " PVIV=\"");
2648 sv_catpv(t, " PVNV=\"");
2651 sv_catpv(t, " PVMG=\"");
2654 sv_catpv(t, " PVLV=\"");
2657 sv_catpv(t, " AV=\"");
2660 sv_catpv(t, " HV=\"");
2664 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2666 sv_catpv(t, " CV=\"()\"");
2669 sv_catpv(t, " GV=\"");
2672 sv_catpv(t, " BIND=\"");
2675 sv_catpv(t, " REGEXP=\"");
2678 sv_catpv(t, " FM=\"");
2681 sv_catpv(t, " IO=\"");
2690 else if (SvNOKp(sv)) {
2691 STORE_NUMERIC_LOCAL_SET_STANDARD();
2692 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2693 RESTORE_NUMERIC_LOCAL();
2695 else if (SvIOKp(sv)) {
2697 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2699 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2708 return SvPV(t, n_a);
2712 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2714 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2717 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2720 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2723 REGEXP *const r = PM_GETRE(pm);
2724 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2725 sv_catxmlsv(tmpsv, MUTABLE_SV(r));
2726 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2728 SvREFCNT_dec(tmpsv);
2729 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2730 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2733 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2734 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
2735 SV * const tmpsv = pm_description(pm);
2736 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2737 SvREFCNT_dec(tmpsv);
2741 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2742 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2743 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2744 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2745 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2746 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2749 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2753 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2755 do_pmop_xmldump(0, PL_xmlfp, pm);
2759 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2764 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2768 seq = sequence_num(o);
2769 Perl_xmldump_indent(aTHX_ level, file,
2770 "<op_%s seq=\"%"UVuf" -> ",
2775 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2776 sequence_num(o->op_next));
2778 PerlIO_printf(file, "DONE\"");
2781 if (o->op_type == OP_NULL)
2783 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2784 if (o->op_targ == OP_NEXTSTATE)
2787 PerlIO_printf(file, " line=\"%"UVuf"\"",
2788 (UV)CopLINE(cCOPo));
2789 if (CopSTASHPV(cCOPo))
2790 PerlIO_printf(file, " package=\"%s\"",
2792 if (CopLABEL(cCOPo))
2793 PerlIO_printf(file, " label=\"%s\"",
2798 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2801 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2804 SV * const tmpsv = newSVpvs("");
2805 switch (o->op_flags & OPf_WANT) {
2807 sv_catpv(tmpsv, ",VOID");
2809 case OPf_WANT_SCALAR:
2810 sv_catpv(tmpsv, ",SCALAR");
2813 sv_catpv(tmpsv, ",LIST");
2816 sv_catpv(tmpsv, ",UNKNOWN");
2819 if (o->op_flags & OPf_KIDS)
2820 sv_catpv(tmpsv, ",KIDS");
2821 if (o->op_flags & OPf_PARENS)
2822 sv_catpv(tmpsv, ",PARENS");
2823 if (o->op_flags & OPf_STACKED)
2824 sv_catpv(tmpsv, ",STACKED");
2825 if (o->op_flags & OPf_REF)
2826 sv_catpv(tmpsv, ",REF");
2827 if (o->op_flags & OPf_MOD)
2828 sv_catpv(tmpsv, ",MOD");
2829 if (o->op_flags & OPf_SPECIAL)
2830 sv_catpv(tmpsv, ",SPECIAL");
2831 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2832 SvREFCNT_dec(tmpsv);
2834 if (o->op_private) {
2835 SV * const tmpsv = newSVpvs("");
2836 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2837 if (o->op_private & OPpTARGET_MY)
2838 sv_catpv(tmpsv, ",TARGET_MY");
2840 else if (o->op_type == OP_LEAVESUB ||
2841 o->op_type == OP_LEAVE ||
2842 o->op_type == OP_LEAVESUBLV ||
2843 o->op_type == OP_LEAVEWRITE) {
2844 if (o->op_private & OPpREFCOUNTED)
2845 sv_catpv(tmpsv, ",REFCOUNTED");
2847 else if (o->op_type == OP_AASSIGN) {
2848 if (o->op_private & OPpASSIGN_COMMON)
2849 sv_catpv(tmpsv, ",COMMON");
2851 else if (o->op_type == OP_SASSIGN) {
2852 if (o->op_private & OPpASSIGN_BACKWARDS)
2853 sv_catpv(tmpsv, ",BACKWARDS");
2855 else if (o->op_type == OP_TRANS) {
2856 if (o->op_private & OPpTRANS_SQUASH)
2857 sv_catpv(tmpsv, ",SQUASH");
2858 if (o->op_private & OPpTRANS_DELETE)
2859 sv_catpv(tmpsv, ",DELETE");
2860 if (o->op_private & OPpTRANS_COMPLEMENT)
2861 sv_catpv(tmpsv, ",COMPLEMENT");
2862 if (o->op_private & OPpTRANS_IDENTICAL)
2863 sv_catpv(tmpsv, ",IDENTICAL");
2864 if (o->op_private & OPpTRANS_GROWS)
2865 sv_catpv(tmpsv, ",GROWS");
2867 else if (o->op_type == OP_REPEAT) {
2868 if (o->op_private & OPpREPEAT_DOLIST)
2869 sv_catpv(tmpsv, ",DOLIST");
2871 else if (o->op_type == OP_ENTERSUB ||
2872 o->op_type == OP_RV2SV ||
2873 o->op_type == OP_GVSV ||
2874 o->op_type == OP_RV2AV ||
2875 o->op_type == OP_RV2HV ||
2876 o->op_type == OP_RV2GV ||
2877 o->op_type == OP_AELEM ||
2878 o->op_type == OP_HELEM )
2880 if (o->op_type == OP_ENTERSUB) {
2881 if (o->op_private & OPpENTERSUB_AMPER)
2882 sv_catpv(tmpsv, ",AMPER");
2883 if (o->op_private & OPpENTERSUB_DB)
2884 sv_catpv(tmpsv, ",DB");
2885 if (o->op_private & OPpENTERSUB_HASTARG)
2886 sv_catpv(tmpsv, ",HASTARG");
2887 if (o->op_private & OPpENTERSUB_NOPAREN)
2888 sv_catpv(tmpsv, ",NOPAREN");
2889 if (o->op_private & OPpENTERSUB_INARGS)
2890 sv_catpv(tmpsv, ",INARGS");
2893 switch (o->op_private & OPpDEREF) {
2895 sv_catpv(tmpsv, ",SV");
2898 sv_catpv(tmpsv, ",AV");
2901 sv_catpv(tmpsv, ",HV");
2904 if (o->op_private & OPpMAYBE_LVSUB)
2905 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2907 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2908 if (o->op_private & OPpLVAL_DEFER)
2909 sv_catpv(tmpsv, ",LVAL_DEFER");
2912 if (o->op_private & HINT_STRICT_REFS)
2913 sv_catpv(tmpsv, ",STRICT_REFS");
2914 if (o->op_private & OPpOUR_INTRO)
2915 sv_catpv(tmpsv, ",OUR_INTRO");
2918 else if (o->op_type == OP_CONST) {
2919 if (o->op_private & OPpCONST_BARE)
2920 sv_catpv(tmpsv, ",BARE");
2921 if (o->op_private & OPpCONST_STRICT)
2922 sv_catpv(tmpsv, ",STRICT");
2923 if (o->op_private & OPpCONST_ENTERED)
2924 sv_catpv(tmpsv, ",ENTERED");
2926 else if (o->op_type == OP_FLIP) {
2927 if (o->op_private & OPpFLIP_LINENUM)
2928 sv_catpv(tmpsv, ",LINENUM");
2930 else if (o->op_type == OP_FLOP) {
2931 if (o->op_private & OPpFLIP_LINENUM)
2932 sv_catpv(tmpsv, ",LINENUM");
2934 else if (o->op_type == OP_RV2CV) {
2935 if (o->op_private & OPpLVAL_INTRO)
2936 sv_catpv(tmpsv, ",INTRO");
2938 else if (o->op_type == OP_GV) {
2939 if (o->op_private & OPpEARLY_CV)
2940 sv_catpv(tmpsv, ",EARLY_CV");
2942 else if (o->op_type == OP_LIST) {
2943 if (o->op_private & OPpLIST_GUESSED)
2944 sv_catpv(tmpsv, ",GUESSED");
2946 else if (o->op_type == OP_DELETE) {
2947 if (o->op_private & OPpSLICE)
2948 sv_catpv(tmpsv, ",SLICE");
2950 else if (o->op_type == OP_EXISTS) {
2951 if (o->op_private & OPpEXISTS_SUB)
2952 sv_catpv(tmpsv, ",EXISTS_SUB");
2954 else if (o->op_type == OP_SORT) {
2955 if (o->op_private & OPpSORT_NUMERIC)
2956 sv_catpv(tmpsv, ",NUMERIC");
2957 if (o->op_private & OPpSORT_INTEGER)
2958 sv_catpv(tmpsv, ",INTEGER");
2959 if (o->op_private & OPpSORT_REVERSE)
2960 sv_catpv(tmpsv, ",REVERSE");
2962 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2963 if (o->op_private & OPpOPEN_IN_RAW)
2964 sv_catpv(tmpsv, ",IN_RAW");
2965 if (o->op_private & OPpOPEN_IN_CRLF)
2966 sv_catpv(tmpsv, ",IN_CRLF");
2967 if (o->op_private & OPpOPEN_OUT_RAW)
2968 sv_catpv(tmpsv, ",OUT_RAW");
2969 if (o->op_private & OPpOPEN_OUT_CRLF)
2970 sv_catpv(tmpsv, ",OUT_CRLF");
2972 else if (o->op_type == OP_EXIT) {
2973 if (o->op_private & OPpEXIT_VMSISH)
2974 sv_catpv(tmpsv, ",EXIT_VMSISH");
2975 if (o->op_private & OPpHUSH_VMSISH)
2976 sv_catpv(tmpsv, ",HUSH_VMSISH");
2978 else if (o->op_type == OP_DIE) {
2979 if (o->op_private & OPpHUSH_VMSISH)
2980 sv_catpv(tmpsv, ",HUSH_VMSISH");
2982 else if (PL_check[o->op_type] != Perl_ck_ftst) {
2983 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
2984 sv_catpv(tmpsv, ",FT_ACCESS");
2985 if (o->op_private & OPpFT_STACKED)
2986 sv_catpv(tmpsv, ",FT_STACKED");
2988 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2989 sv_catpv(tmpsv, ",INTRO");
2991 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
2992 SvREFCNT_dec(tmpsv);
2995 switch (o->op_type) {
2997 if (o->op_flags & OPf_SPECIAL) {
3003 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
3005 if (cSVOPo->op_sv) {
3006 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
3007 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
3013 gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
3014 s = SvPV(tmpsv1,len);
3015 sv_catxmlpvn(tmpsv2, s, len, 1);
3016 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
3020 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
3025 case OP_METHOD_NAMED:
3026 #ifndef USE_ITHREADS
3027 /* with ITHREADS, consts are stored in the pad, and the right pad
3028 * may not be active here, so skip */
3029 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
3035 PerlIO_printf(file, ">\n");
3037 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
3042 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
3043 (UV)CopLINE(cCOPo));
3044 if (CopSTASHPV(cCOPo))
3045 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
3047 if (CopLABEL(cCOPo))
3048 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
3052 S_xmldump_attr(aTHX_ level, file, "redo=\"");
3053 if (cLOOPo->op_redoop)
3054 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
3056 PerlIO_printf(file, "DONE\"");
3057 S_xmldump_attr(aTHX_ level, file, "next=\"");
3058 if (cLOOPo->op_nextop)
3059 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
3061 PerlIO_printf(file, "DONE\"");
3062 S_xmldump_attr(aTHX_ level, file, "last=\"");
3063 if (cLOOPo->op_lastop)
3064 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
3066 PerlIO_printf(file, "DONE\"");
3074 S_xmldump_attr(aTHX_ level, file, "other=\"");
3075 if (cLOGOPo->op_other)
3076 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
3078 PerlIO_printf(file, "DONE\"");
3086 if (o->op_private & OPpREFCOUNTED)
3087 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
3093 if (PL_madskills && o->op_madprop) {
3094 char prevkey = '\0';
3095 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
3096 const MADPROP* mp = o->op_madprop;
3100 PerlIO_printf(file, ">\n");
3102 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
3105 char tmp = mp->mad_key;
3106 sv_setpvs(tmpsv,"\"");
3108 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
3109 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
3110 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
3113 sv_catpv(tmpsv, "\"");
3114 switch (mp->mad_type) {
3116 sv_catpv(tmpsv, "NULL");
3117 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
3120 sv_catpv(tmpsv, " val=\"");
3121 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
3122 sv_catpv(tmpsv, "\"");
3123 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
3126 sv_catpv(tmpsv, " val=\"");
3127 sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
3128 sv_catpv(tmpsv, "\"");
3129 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
3132 if ((OP*)mp->mad_val) {
3133 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
3134 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
3135 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
3139 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
3145 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
3147 SvREFCNT_dec(tmpsv);
3150 switch (o->op_type) {
3157 PerlIO_printf(file, ">\n");
3159 do_pmop_xmldump(level, file, cPMOPo);
3165 if (o->op_flags & OPf_KIDS) {
3169 PerlIO_printf(file, ">\n");
3171 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3172 do_op_xmldump(level, file, kid);
3176 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3178 PerlIO_printf(file, " />\n");
3182 Perl_op_xmldump(pTHX_ const OP *o)
3184 PERL_ARGS_ASSERT_OP_XMLDUMP;
3186 do_op_xmldump(0, PL_xmlfp, o);
3192 * c-indentation-style: bsd
3194 * indent-tabs-mode: nil
3197 * ex: set ts=8 sts=4 sw=4 et: