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"},
644 {PMf_IS_QR, ",IS_QR"}
648 S_pm_description(pTHX_ const PMOP *pm)
650 SV * const desc = newSVpvs("");
651 const REGEXP * const regex = PM_GETRE(pm);
652 const U32 pmflags = pm->op_pmflags;
654 PERL_ARGS_ASSERT_PM_DESCRIPTION;
656 if (pmflags & PMf_ONCE)
657 sv_catpv(desc, ",ONCE");
659 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
660 sv_catpv(desc, ":USED");
662 if (pmflags & PMf_USED)
663 sv_catpv(desc, ":USED");
667 if (RX_EXTFLAGS(regex) & RXf_TAINTED)
668 sv_catpv(desc, ",TAINTED");
669 if (RX_CHECK_SUBSTR(regex)) {
670 if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN))
671 sv_catpv(desc, ",SCANFIRST");
672 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
673 sv_catpv(desc, ",ALL");
677 append_flags(desc, pmflags, pmflags_flags_names);
682 Perl_pmop_dump(pTHX_ PMOP *pm)
684 do_pmop_dump(0, Perl_debug_log, pm);
687 /* Return a unique integer to represent the address of op o.
688 * If it already exists in PL_op_sequence, just return it;
690 * *** Note that this isn't thread-safe */
693 S_sequence_num(pTHX_ const OP *o)
702 op = newSVuv(PTR2UV(o));
704 key = SvPV_const(op, len);
706 PL_op_sequence = newHV();
707 seq = hv_fetch(PL_op_sequence, key, len, 0);
710 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
714 const struct flag_to_name op_flags_names[] = {
716 {OPf_PARENS, ",PARENS"},
719 {OPf_STACKED, ",STACKED"},
720 {OPf_SPECIAL, ",SPECIAL"}
723 const struct flag_to_name op_trans_names[] = {
724 {OPpTRANS_FROM_UTF, ",FROM_UTF"},
725 {OPpTRANS_TO_UTF, ",TO_UTF"},
726 {OPpTRANS_IDENTICAL, ",IDENTICAL"},
727 {OPpTRANS_SQUASH, ",SQUASH"},
728 {OPpTRANS_COMPLEMENT, ",COMPLEMENT"},
729 {OPpTRANS_GROWS, ",GROWS"},
730 {OPpTRANS_DELETE, ",DELETE"}
733 const struct flag_to_name op_entersub_names[] = {
734 {OPpENTERSUB_DB, ",DB"},
735 {OPpENTERSUB_HASTARG, ",HASTARG"},
736 {OPpENTERSUB_AMPER, ",AMPER"},
737 {OPpENTERSUB_NOPAREN, ",NOPAREN"},
738 {OPpENTERSUB_INARGS, ",INARGS"}
741 const struct flag_to_name op_const_names[] = {
742 {OPpCONST_NOVER, ",NOVER"},
743 {OPpCONST_SHORTCIRCUIT, ",SHORTCIRCUIT"},
744 {OPpCONST_STRICT, ",STRICT"},
745 {OPpCONST_ENTERED, ",ENTERED"},
746 {OPpCONST_FOLDED, ",FOLDED"},
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_slabbed || o->op_savefree) {
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);
901 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
902 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
903 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
907 SV * const tmpsv = newSVpvs("");
908 if (PL_opargs[optype] & OA_TARGLEX) {
909 if (o->op_private & OPpTARGET_MY)
910 sv_catpv(tmpsv, ",TARGET_MY");
912 else if (optype == OP_ENTERSUB ||
913 optype == OP_RV2SV ||
915 optype == OP_RV2AV ||
916 optype == OP_RV2HV ||
917 optype == OP_RV2GV ||
918 optype == OP_AELEM ||
921 if (optype == OP_ENTERSUB) {
922 append_flags(tmpsv, o->op_private, op_entersub_names);
925 switch (o->op_private & OPpDEREF) {
927 sv_catpv(tmpsv, ",SV");
930 sv_catpv(tmpsv, ",AV");
933 sv_catpv(tmpsv, ",HV");
936 if (o->op_private & OPpMAYBE_LVSUB)
937 sv_catpv(tmpsv, ",MAYBE_LVSUB");
940 if (optype == OP_AELEM || optype == OP_HELEM) {
941 if (o->op_private & OPpLVAL_DEFER)
942 sv_catpv(tmpsv, ",LVAL_DEFER");
944 else if (optype == OP_RV2HV || optype == OP_PADHV) {
945 if (o->op_private & OPpMAYBE_TRUEBOOL)
946 sv_catpvs(tmpsv, ",OPpMAYBE_TRUEBOOL");
947 if (o->op_private & OPpTRUEBOOL)
948 sv_catpvs(tmpsv, ",OPpTRUEBOOL");
951 if (o->op_private & HINT_STRICT_REFS)
952 sv_catpv(tmpsv, ",STRICT_REFS");
953 if (o->op_private & OPpOUR_INTRO)
954 sv_catpv(tmpsv, ",OUR_INTRO");
957 else if (S_op_private_to_names(aTHX_ tmpsv, optype, o->op_private)) {
959 else if (PL_check[optype] != Perl_ck_ftst) {
960 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
961 sv_catpv(tmpsv, ",FT_ACCESS");
962 if (o->op_private & OPpFT_STACKED)
963 sv_catpv(tmpsv, ",FT_STACKED");
965 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
966 sv_catpv(tmpsv, ",INTRO");
968 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
973 if (PL_madskills && o->op_madprop) {
974 SV * const tmpsv = newSVpvs("");
975 MADPROP* mp = o->op_madprop;
976 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
979 const char tmp = mp->mad_key;
980 sv_setpvs(tmpsv,"'");
982 sv_catpvn(tmpsv, &tmp, 1);
983 sv_catpv(tmpsv, "'=");
984 switch (mp->mad_type) {
986 sv_catpv(tmpsv, "NULL");
987 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
990 sv_catpv(tmpsv, "<");
991 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
992 sv_catpv(tmpsv, ">");
993 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
996 if ((OP*)mp->mad_val) {
997 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
998 do_op_dump(level, file, (OP*)mp->mad_val);
1002 sv_catpv(tmpsv, "(UNK)");
1003 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1009 Perl_dump_indent(aTHX_ level, file, "}\n");
1011 SvREFCNT_dec(tmpsv);
1020 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1022 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
1023 if (cSVOPo->op_sv) {
1024 SV * const tmpsv = newSV(0);
1028 /* FIXME - is this making unwarranted assumptions about the
1029 UTF-8 cleanliness of the dump file handle? */
1032 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
1033 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1034 SvPV_nolen_const(tmpsv));
1038 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1044 case OP_METHOD_NAMED:
1045 #ifndef USE_ITHREADS
1046 /* with ITHREADS, consts are stored in the pad, and the right pad
1047 * may not be active here, so skip */
1048 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1054 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1055 (UV)CopLINE(cCOPo));
1056 if (CopSTASHPV(cCOPo))
1057 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1059 if (CopLABEL(cCOPo))
1060 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1064 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1065 if (cLOOPo->op_redoop)
1066 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1068 PerlIO_printf(file, "DONE\n");
1069 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1070 if (cLOOPo->op_nextop)
1071 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1073 PerlIO_printf(file, "DONE\n");
1074 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1075 if (cLOOPo->op_lastop)
1076 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1078 PerlIO_printf(file, "DONE\n");
1086 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1087 if (cLOGOPo->op_other)
1088 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1090 PerlIO_printf(file, "DONE\n");
1096 do_pmop_dump(level, file, cPMOPo);
1104 if (o->op_private & OPpREFCOUNTED)
1105 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1110 if (o->op_flags & OPf_KIDS) {
1112 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1113 do_op_dump(level, file, kid);
1115 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1119 Perl_op_dump(pTHX_ const OP *o)
1121 PERL_ARGS_ASSERT_OP_DUMP;
1122 do_op_dump(0, Perl_debug_log, o);
1126 Perl_gv_dump(pTHX_ GV *gv)
1130 PERL_ARGS_ASSERT_GV_DUMP;
1133 PerlIO_printf(Perl_debug_log, "{}\n");
1136 sv = sv_newmortal();
1137 PerlIO_printf(Perl_debug_log, "{\n");
1138 gv_fullname3(sv, gv, NULL);
1139 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1140 if (gv != GvEGV(gv)) {
1141 gv_efullname3(sv, GvEGV(gv), NULL);
1142 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1144 PerlIO_putc(Perl_debug_log, '\n');
1145 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1149 /* map magic types to the symbolic names
1150 * (with the PERL_MAGIC_ prefixed stripped)
1153 static const struct { const char type; const char *name; } magic_names[] = {
1154 #include "mg_names.c"
1155 /* this null string terminates the list */
1160 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1162 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1164 for (; mg; mg = mg->mg_moremagic) {
1165 Perl_dump_indent(aTHX_ level, file,
1166 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1167 if (mg->mg_virtual) {
1168 const MGVTBL * const v = mg->mg_virtual;
1169 if (v >= PL_magic_vtables
1170 && v < PL_magic_vtables + magic_vtable_max) {
1171 const U32 i = v - PL_magic_vtables;
1172 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1175 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1178 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1181 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1185 const char *name = NULL;
1186 for (n = 0; magic_names[n].name; n++) {
1187 if (mg->mg_type == magic_names[n].type) {
1188 name = magic_names[n].name;
1193 Perl_dump_indent(aTHX_ level, file,
1194 " MG_TYPE = PERL_MAGIC_%s\n", name);
1196 Perl_dump_indent(aTHX_ level, file,
1197 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1201 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1202 if (mg->mg_type == PERL_MAGIC_envelem &&
1203 mg->mg_flags & MGf_TAINTEDDIR)
1204 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1205 if (mg->mg_type == PERL_MAGIC_regex_global &&
1206 mg->mg_flags & MGf_MINMATCH)
1207 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1208 if (mg->mg_flags & MGf_REFCOUNTED)
1209 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1210 if (mg->mg_flags & MGf_GSKIP)
1211 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1212 if (mg->mg_flags & MGf_COPY)
1213 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1214 if (mg->mg_flags & MGf_DUP)
1215 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1216 if (mg->mg_flags & MGf_LOCAL)
1217 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1220 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1221 PTR2UV(mg->mg_obj));
1222 if (mg->mg_type == PERL_MAGIC_qr) {
1223 REGEXP* const re = (REGEXP *)mg->mg_obj;
1224 SV * const dsv = sv_newmortal();
1225 const char * const s
1226 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1228 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1229 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1231 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1232 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1235 if (mg->mg_flags & MGf_REFCOUNTED)
1236 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1239 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1241 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1242 if (mg->mg_len >= 0) {
1243 if (mg->mg_type != PERL_MAGIC_utf8) {
1244 SV * const sv = newSVpvs("");
1245 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1249 else if (mg->mg_len == HEf_SVKEY) {
1250 PerlIO_puts(file, " => HEf_SVKEY\n");
1251 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1252 maxnest, dumpops, pvlim); /* MG is already +1 */
1255 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1260 " does not know how to handle this MG_LEN"
1262 PerlIO_putc(file, '\n');
1264 if (mg->mg_type == PERL_MAGIC_utf8) {
1265 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1268 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1269 Perl_dump_indent(aTHX_ level, file,
1270 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1273 (UV)cache[i * 2 + 1]);
1280 Perl_magic_dump(pTHX_ const MAGIC *mg)
1282 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1286 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1290 PERL_ARGS_ASSERT_DO_HV_DUMP;
1292 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1293 if (sv && (hvname = HvNAME_get(sv)))
1295 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1296 name which quite legally could contain insane things like tabs, newlines, nulls or
1297 other scary crap - this should produce sane results - except maybe for unicode package
1298 names - but we will wait for someone to file a bug on that - demerphq */
1299 SV * const tmpsv = newSVpvs("");
1300 PerlIO_printf(file, "\t%s\n", pv_display(tmpsv, hvname, HvNAMELEN_get(sv), 0, 1024));
1303 PerlIO_putc(file, '\n');
1307 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1309 PERL_ARGS_ASSERT_DO_GV_DUMP;
1311 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1312 if (sv && GvNAME(sv))
1313 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1315 PerlIO_putc(file, '\n');
1319 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1321 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1323 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1324 if (sv && GvNAME(sv)) {
1326 PerlIO_printf(file, "\t\"");
1327 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1328 PerlIO_printf(file, "%s\" :: \"", hvname);
1329 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1332 PerlIO_putc(file, '\n');
1335 const struct flag_to_name first_sv_flags_names[] = {
1336 {SVs_TEMP, "TEMP,"},
1337 {SVs_OBJECT, "OBJECT,"},
1346 const struct flag_to_name second_sv_flags_names[] = {
1348 {SVf_FAKE, "FAKE,"},
1349 {SVf_READONLY, "READONLY,"},
1350 {SVf_BREAK, "BREAK,"},
1351 {SVf_AMAGIC, "OVERLOAD,"},
1357 const struct flag_to_name cv_flags_names[] = {
1358 {CVf_ANON, "ANON,"},
1359 {CVf_UNIQUE, "UNIQUE,"},
1360 {CVf_CLONE, "CLONE,"},
1361 {CVf_CLONED, "CLONED,"},
1362 {CVf_CONST, "CONST,"},
1363 {CVf_NODEBUG, "NODEBUG,"},
1364 {CVf_LVALUE, "LVALUE,"},
1365 {CVf_METHOD, "METHOD,"},
1366 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1367 {CVf_CVGV_RC, "CVGV_RC,"},
1368 {CVf_DYNFILE, "DYNFILE,"},
1369 {CVf_AUTOLOAD, "AUTOLOAD,"},
1370 {CVf_HASEVAL, "HASEVAL"},
1371 {CVf_SLABBED, "SLABBED,"},
1372 {CVf_ISXSUB, "ISXSUB,"}
1375 const struct flag_to_name hv_flags_names[] = {
1376 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1377 {SVphv_LAZYDEL, "LAZYDEL,"},
1378 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1379 {SVphv_REHASH, "REHASH,"},
1380 {SVphv_CLONEABLE, "CLONEABLE,"}
1383 const struct flag_to_name gp_flags_names[] = {
1384 {GVf_INTRO, "INTRO,"},
1385 {GVf_MULTI, "MULTI,"},
1386 {GVf_ASSUMECV, "ASSUMECV,"},
1387 {GVf_IN_PAD, "IN_PAD,"}
1390 const struct flag_to_name gp_flags_imported_names[] = {
1391 {GVf_IMPORTED_SV, " SV"},
1392 {GVf_IMPORTED_AV, " AV"},
1393 {GVf_IMPORTED_HV, " HV"},
1394 {GVf_IMPORTED_CV, " CV"},
1397 const struct flag_to_name regexp_flags_names[] = {
1398 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1399 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1400 {RXf_PMf_FOLD, "PMf_FOLD,"},
1401 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1402 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1403 {RXf_ANCH_BOL, "ANCH_BOL,"},
1404 {RXf_ANCH_MBOL, "ANCH_MBOL,"},
1405 {RXf_ANCH_SBOL, "ANCH_SBOL,"},
1406 {RXf_ANCH_GPOS, "ANCH_GPOS,"},
1407 {RXf_GPOS_SEEN, "GPOS_SEEN,"},
1408 {RXf_GPOS_FLOAT, "GPOS_FLOAT,"},
1409 {RXf_LOOKBEHIND_SEEN, "LOOKBEHIND_SEEN,"},
1410 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1411 {RXf_CANY_SEEN, "CANY_SEEN,"},
1412 {RXf_NOSCAN, "NOSCAN,"},
1413 {RXf_CHECK_ALL, "CHECK_ALL,"},
1414 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1415 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1416 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1417 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1418 {RXf_COPY_DONE, "COPY_DONE,"},
1419 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1420 {RXf_TAINTED, "TAINTED,"},
1421 {RXf_START_ONLY, "START_ONLY,"},
1422 {RXf_WHITE, "WHITE,"},
1423 {RXf_NULL, "NULL,"},
1427 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1435 PERL_ARGS_ASSERT_DO_SV_DUMP;
1438 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1442 flags = SvFLAGS(sv);
1445 /* process general SV flags */
1447 d = Perl_newSVpvf(aTHX_
1448 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1449 PTR2UV(SvANY(sv)), PTR2UV(sv),
1450 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1451 (int)(PL_dumpindent*level), "");
1453 if (!((flags & SVpad_NAME) == SVpad_NAME
1454 && (type == SVt_PVMG || type == SVt_PVNV))) {
1455 if ((flags & SVs_PADMY) && (flags & SVs_PADSTALE))
1456 sv_catpv(d, "PADSTALE,");
1458 if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
1459 if (!(flags & SVs_PADMY) && (flags & SVs_PADTMP))
1460 sv_catpv(d, "PADTMP,");
1461 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1463 append_flags(d, flags, first_sv_flags_names);
1464 if (flags & SVf_ROK) {
1465 sv_catpv(d, "ROK,");
1466 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1468 append_flags(d, flags, second_sv_flags_names);
1469 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1470 if (SvPCS_IMPORTED(sv))
1471 sv_catpv(d, "PCS_IMPORTED,");
1473 sv_catpv(d, "SCREAM,");
1476 /* process type-specific SV flags */
1481 append_flags(d, CvFLAGS(sv), cv_flags_names);
1484 append_flags(d, flags, hv_flags_names);
1488 if (isGV_with_GP(sv)) {
1489 append_flags(d, GvFLAGS(sv), gp_flags_names);
1491 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1492 sv_catpv(d, "IMPORT");
1493 if (GvIMPORTED(sv) == GVf_IMPORTED)
1494 sv_catpv(d, "ALL,");
1497 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1504 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1505 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1508 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1509 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1510 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1511 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1514 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1519 /* SVphv_SHAREKEYS is also 0x20000000 */
1520 if ((type != SVt_PVHV) && SvUTF8(sv))
1521 sv_catpv(d, "UTF8");
1523 if (*(SvEND(d) - 1) == ',') {
1524 SvCUR_set(d, SvCUR(d) - 1);
1525 SvPVX(d)[SvCUR(d)] = '\0';
1530 /* dump initial SV details */
1532 #ifdef DEBUG_LEAKING_SCALARS
1533 Perl_dump_indent(aTHX_ level, file,
1534 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1535 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1537 sv->sv_debug_inpad ? "for" : "by",
1538 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1539 PTR2UV(sv->sv_debug_parent),
1543 Perl_dump_indent(aTHX_ level, file, "SV = ");
1547 if (type < SVt_LAST) {
1548 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1550 if (type == SVt_NULL) {
1555 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1560 /* Dump general SV fields */
1562 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1563 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1564 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1565 || (type == SVt_IV && !SvROK(sv))) {
1567 #ifdef PERL_OLD_COPY_ON_WRITE
1571 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1573 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1574 #ifdef PERL_OLD_COPY_ON_WRITE
1575 if (SvIsCOW_shared_hash(sv))
1576 PerlIO_printf(file, " (HASH)");
1577 else if (SvIsCOW_normal(sv))
1578 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1580 PerlIO_putc(file, '\n');
1583 if ((type == SVt_PVNV || type == SVt_PVMG)
1584 && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
1585 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1586 (UV) COP_SEQ_RANGE_LOW(sv));
1587 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1588 (UV) COP_SEQ_RANGE_HIGH(sv));
1589 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1590 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1591 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1592 || type == SVt_NV) {
1593 STORE_NUMERIC_LOCAL_SET_STANDARD();
1594 /* %Vg doesn't work? --jhi */
1595 #ifdef USE_LONG_DOUBLE
1596 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1598 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1600 RESTORE_NUMERIC_LOCAL();
1604 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1606 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1609 if (type < SVt_PV) {
1614 if (type <= SVt_PVLV && !isGV_with_GP(sv)) {
1615 if (SvPVX_const(sv)) {
1618 SvOOK_offset(sv, delta);
1619 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1624 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
1626 PerlIO_printf(file, "( %s . ) ",
1627 pv_display(d, SvPVX_const(sv) - delta, delta, 0,
1630 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
1631 if (SvUTF8(sv)) /* the 6? \x{....} */
1632 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
1633 PerlIO_printf(file, "\n");
1634 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1635 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
1638 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1641 if (type >= SVt_PVMG) {
1642 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1643 HV * const ost = SvOURSTASH(sv);
1645 do_hv_dump(level, file, " OURSTASH", ost);
1648 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1651 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1653 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1654 Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
1655 Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1656 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1660 /* Dump type-specific SV fields */
1664 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1665 if (AvARRAY(sv) != AvALLOC(sv)) {
1666 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1667 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1670 PerlIO_putc(file, '\n');
1671 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1672 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1673 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1675 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1676 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1677 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1678 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1679 if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) {
1681 for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) {
1682 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
1684 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1686 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1691 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1692 if (HvARRAY(sv) && HvUSEDKEYS(sv)) {
1693 /* Show distribution of HEs in the ARRAY */
1695 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1698 U32 pow2 = 2, keys = HvUSEDKEYS(sv);
1699 NV theoret, sum = 0;
1701 PerlIO_printf(file, " (");
1702 Zero(freq, FREQ_MAX + 1, int);
1703 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1706 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1708 if (count > FREQ_MAX)
1714 for (i = 0; i <= max; i++) {
1716 PerlIO_printf(file, "%d%s:%d", i,
1717 (i == FREQ_MAX) ? "+" : "",
1720 PerlIO_printf(file, ", ");
1723 PerlIO_putc(file, ')');
1724 /* The "quality" of a hash is defined as the total number of
1725 comparisons needed to access every element once, relative
1726 to the expected number needed for a random hash.
1728 The total number of comparisons is equal to the sum of
1729 the squares of the number of entries in each bucket.
1730 For a random hash of n keys into k buckets, the expected
1735 for (i = max; i > 0; i--) { /* Precision: count down. */
1736 sum += freq[i] * i * i;
1738 while ((keys = keys >> 1))
1740 theoret = HvUSEDKEYS(sv);
1741 theoret += theoret * (theoret-1)/pow2;
1742 PerlIO_putc(file, '\n');
1743 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1745 PerlIO_putc(file, '\n');
1746 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
1747 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1748 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1749 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1750 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1752 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1753 if (mg && mg->mg_obj) {
1754 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1758 const char * const hvname = HvNAME_get(sv);
1760 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1764 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1765 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1766 if (HvAUX(sv)->xhv_name_count)
1767 Perl_dump_indent(aTHX_
1768 level, file, " NAMECOUNT = %"IVdf"\n",
1769 (IV)HvAUX(sv)->xhv_name_count
1771 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1772 const I32 count = HvAUX(sv)->xhv_name_count;
1774 SV * const names = newSVpvs_flags("", SVs_TEMP);
1775 /* The starting point is the first element if count is
1776 positive and the second element if count is negative. */
1777 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1778 + (count < 0 ? 1 : 0);
1779 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1780 + (count < 0 ? -count : count);
1781 while (hekp < endp) {
1783 sv_catpvs(names, ", \"");
1784 sv_catpvn(names, HEK_KEY(*hekp), HEK_LEN(*hekp));
1785 sv_catpvs(names, "\"");
1787 /* This should never happen. */
1788 sv_catpvs(names, ", (null)");
1792 Perl_dump_indent(aTHX_
1793 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1797 Perl_dump_indent(aTHX_
1798 level, file, " ENAME = \"%s\"\n", HvENAME_get(sv)
1802 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1804 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1808 /* FIXME - mro_algs kflags can signal a UTF-8 name. */
1809 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%.*s\" (0x%"UVxf")\n",
1810 (int)meta->mro_which->length,
1811 meta->mro_which->name,
1812 PTR2UV(meta->mro_which));
1813 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1814 (UV)meta->cache_gen);
1815 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1817 if (meta->mro_linear_all) {
1818 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1819 PTR2UV(meta->mro_linear_all));
1820 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1823 if (meta->mro_linear_current) {
1824 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1825 PTR2UV(meta->mro_linear_current));
1826 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1829 if (meta->mro_nextmethod) {
1830 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1831 PTR2UV(meta->mro_nextmethod));
1832 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1836 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1838 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1843 if (nest < maxnest) {
1844 HV * const hv = MUTABLE_HV(sv);
1849 int count = maxnest - nest;
1850 for (i=0; i <= HvMAX(hv); i++) {
1851 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1858 if (count-- <= 0) goto DONEHV;
1861 keysv = hv_iterkeysv(he);
1862 keypv = SvPV_const(keysv, len);
1865 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1867 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1868 if (HvEITER_get(hv) == he)
1869 PerlIO_printf(file, "[CURRENT] ");
1871 PerlIO_printf(file, "[REHASH] ");
1872 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1873 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1882 if (CvAUTOLOAD(sv)) {
1884 const char *const name = SvPV_const(sv, len);
1885 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%.*s\"\n",
1889 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1890 (int) CvPROTOLEN(sv), CvPROTO(sv));
1894 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1895 if (!CvISXSUB(sv)) {
1897 Perl_dump_indent(aTHX_ level, file,
1898 " START = 0x%"UVxf" ===> %"IVdf"\n",
1899 PTR2UV(CvSTART(sv)),
1900 (IV)sequence_num(CvSTART(sv)));
1902 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1903 PTR2UV(CvROOT(sv)));
1904 if (CvROOT(sv) && dumpops) {
1905 do_op_dump(level+1, file, CvROOT(sv));
1908 SV * const constant = cv_const_sv((const CV *)sv);
1910 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1913 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1915 PTR2UV(CvXSUBANY(sv).any_ptr));
1916 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1919 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1920 (IV)CvXSUBANY(sv).any_i32);
1924 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1925 HEK_KEY(CvNAME_HEK((CV *)sv)));
1926 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1927 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1928 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1929 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1930 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1931 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1932 if (nest < maxnest) {
1933 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1936 const CV * const outside = CvOUTSIDE(sv);
1937 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1940 : CvANON(outside) ? "ANON"
1941 : (outside == PL_main_cv) ? "MAIN"
1942 : CvUNIQUE(outside) ? "UNIQUE"
1943 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1945 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1946 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
1951 if (type == SVt_PVLV) {
1952 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1953 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1954 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1955 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1956 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
1957 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1958 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1961 if (!isGV_with_GP(sv))
1963 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1964 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1965 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1966 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1969 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1970 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1971 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1972 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1973 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1974 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1975 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1976 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1977 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1978 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1979 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1980 do_gv_dump (level, file, " EGV", GvEGV(sv));
1983 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
1984 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
1985 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
1986 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
1987 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
1988 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
1989 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
1991 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
1992 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
1993 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
1995 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
1996 PTR2UV(IoTOP_GV(sv)));
1997 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
1998 maxnest, dumpops, pvlim);
2000 /* Source filters hide things that are not GVs in these three, so let's
2001 be careful out there. */
2003 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2004 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2005 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2007 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2008 PTR2UV(IoFMT_GV(sv)));
2009 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2010 maxnest, dumpops, pvlim);
2012 if (IoBOTTOM_NAME(sv))
2013 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2014 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2015 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2017 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2018 PTR2UV(IoBOTTOM_GV(sv)));
2019 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2020 maxnest, dumpops, pvlim);
2022 if (isPRINT(IoTYPE(sv)))
2023 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2025 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2026 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2030 struct regexp * const r = (struct regexp *)SvANY(sv);
2031 flags = RX_EXTFLAGS((REGEXP*)sv);
2033 append_flags(d, flags, regexp_flags_names);
2034 if (*(SvEND(d) - 1) == ',') {
2035 SvCUR_set(d, SvCUR(d) - 1);
2036 SvPVX(d)[SvCUR(d)] = '\0';
2038 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2039 (UV)flags, SvPVX_const(d));
2040 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2042 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2044 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2045 (UV)(r->lastparen));
2046 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2047 (UV)(r->lastcloseparen));
2048 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2050 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2051 (IV)(r->minlenret));
2052 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2054 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2055 (UV)(r->pre_prefix));
2056 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2058 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2059 (IV)(r->suboffset));
2060 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2061 (IV)(r->subcoffset));
2063 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2065 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2067 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2068 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf"\n",
2070 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2071 PTR2UV(r->mother_re));
2072 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2073 PTR2UV(r->paren_names));
2074 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2075 PTR2UV(r->substrs));
2076 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2077 PTR2UV(r->pprivate));
2078 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2080 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2081 PTR2UV(r->qr_anoncv));
2082 #ifdef PERL_OLD_COPY_ON_WRITE
2083 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2084 PTR2UV(r->saved_copy));
2093 Perl_sv_dump(pTHX_ SV *sv)
2097 PERL_ARGS_ASSERT_SV_DUMP;
2100 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2102 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2106 Perl_runops_debug(pTHX)
2110 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2114 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2117 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2118 PerlIO_printf(Perl_debug_log,
2119 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2120 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2121 PTR2UV(*PL_watchaddr));
2122 if (DEBUG_s_TEST_) {
2123 if (DEBUG_v_TEST_) {
2124 PerlIO_printf(Perl_debug_log, "\n");
2132 if (DEBUG_t_TEST_) debop(PL_op);
2133 if (DEBUG_P_TEST_) debprof(PL_op);
2136 OP_ENTRY_PROBE(OP_NAME(PL_op));
2137 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2138 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2145 Perl_debop(pTHX_ const OP *o)
2149 PERL_ARGS_ASSERT_DEBOP;
2151 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2154 Perl_deb(aTHX_ "%s", OP_NAME(o));
2155 switch (o->op_type) {
2158 /* With ITHREADS, consts are stored in the pad, and the right pad
2159 * may not be active here, so check.
2160 * Looks like only during compiling the pads are illegal.
2163 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2165 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2170 SV * const sv = newSV(0);
2172 /* FIXME - is this making unwarranted assumptions about the
2173 UTF-8 cleanliness of the dump file handle? */
2176 gv_fullname3(sv, cGVOPo_gv, NULL);
2177 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2181 PerlIO_printf(Perl_debug_log, "(NULL)");
2187 /* print the lexical's name */
2188 CV * const cv = deb_curcv(cxstack_ix);
2191 PADLIST * const padlist = CvPADLIST(cv);
2192 PAD * const comppad = *PadlistARRAY(padlist);
2193 sv = *av_fetch(comppad, o->op_targ, FALSE);
2197 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2199 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
2205 PerlIO_printf(Perl_debug_log, "\n");
2210 S_deb_curcv(pTHX_ const I32 ix)
2213 const PERL_CONTEXT * const cx = &cxstack[ix];
2214 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2215 return cx->blk_sub.cv;
2216 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2217 return cx->blk_eval.cv;
2218 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2223 return deb_curcv(ix - 1);
2227 Perl_watch(pTHX_ char **addr)
2231 PERL_ARGS_ASSERT_WATCH;
2233 PL_watchaddr = addr;
2235 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2236 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2240 S_debprof(pTHX_ const OP *o)
2244 PERL_ARGS_ASSERT_DEBPROF;
2246 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2248 if (!PL_profiledata)
2249 Newxz(PL_profiledata, MAXO, U32);
2250 ++PL_profiledata[o->op_type];
2254 Perl_debprofdump(pTHX)
2258 if (!PL_profiledata)
2260 for (i = 0; i < MAXO; i++) {
2261 if (PL_profiledata[i])
2262 PerlIO_printf(Perl_debug_log,
2263 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2270 * XML variants of most of the above routines
2274 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2278 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2280 PerlIO_printf(file, "\n ");
2281 va_start(args, pat);
2282 xmldump_vindent(level, file, pat, &args);
2288 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2291 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
2292 va_start(args, pat);
2293 xmldump_vindent(level, file, pat, &args);
2298 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2300 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2302 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2303 PerlIO_vprintf(file, pat, *args);
2307 Perl_xmldump_all(pTHX)
2309 xmldump_all_perl(FALSE);
2313 Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
2315 PerlIO_setlinebuf(PL_xmlfp);
2317 op_xmldump(PL_main_root);
2318 /* someday we might call this, when it outputs XML: */
2319 /* xmldump_packsubs_perl(PL_defstash, justperl); */
2320 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2321 PerlIO_close(PL_xmlfp);
2326 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2328 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
2329 xmldump_packsubs_perl(stash, FALSE);
2333 Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
2338 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
2340 if (!HvARRAY(stash))
2342 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2343 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2344 GV *gv = MUTABLE_GV(HeVAL(entry));
2346 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2349 xmldump_sub_perl(gv, justperl);
2352 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2353 && (hv = GvHV(gv)) && hv != PL_defstash)
2354 xmldump_packsubs_perl(hv, justperl); /* nested package */
2360 Perl_xmldump_sub(pTHX_ const GV *gv)
2362 PERL_ARGS_ASSERT_XMLDUMP_SUB;
2363 xmldump_sub_perl(gv, FALSE);
2367 Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
2371 PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
2373 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
2376 sv = sv_newmortal();
2377 gv_fullname3(sv, gv, NULL);
2378 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2379 if (CvXSUB(GvCV(gv)))
2380 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2381 PTR2UV(CvXSUB(GvCV(gv))),
2382 (int)CvXSUBANY(GvCV(gv)).any_i32);
2383 else if (CvROOT(GvCV(gv)))
2384 op_xmldump(CvROOT(GvCV(gv)));
2386 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2390 Perl_xmldump_form(pTHX_ const GV *gv)
2392 SV * const sv = sv_newmortal();
2394 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2396 gv_fullname3(sv, gv, NULL);
2397 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2398 if (CvROOT(GvFORM(gv)))
2399 op_xmldump(CvROOT(GvFORM(gv)));
2401 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2405 Perl_xmldump_eval(pTHX)
2407 op_xmldump(PL_eval_root);
2411 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2413 PERL_ARGS_ASSERT_SV_CATXMLSV;
2414 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2418 Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
2420 PERL_ARGS_ASSERT_SV_CATXMLPV;
2421 return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
2425 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2428 const char * const e = pv + len;
2429 const char * const start = pv;
2433 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2436 dsvcur = SvCUR(dsv); /* in case we have to restart */
2441 c = utf8_to_uvchr_buf((U8*)pv, (U8*)e, &cl);
2443 SvCUR(dsv) = dsvcur;
2508 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2511 sv_catpvs(dsv, "<");
2514 sv_catpvs(dsv, ">");
2517 sv_catpvs(dsv, "&");
2520 sv_catpvs(dsv, """);
2524 if (c < 32 || c > 127) {
2525 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2528 const char string = (char) c;
2529 sv_catpvn(dsv, &string, 1);
2533 if ((c >= 0xD800 && c <= 0xDB7F) ||
2534 (c >= 0xDC00 && c <= 0xDFFF) ||
2535 (c >= 0xFFF0 && c <= 0xFFFF) ||
2537 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2539 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2552 Perl_sv_xmlpeek(pTHX_ SV *sv)
2554 SV * const t = sv_newmortal();
2558 PERL_ARGS_ASSERT_SV_XMLPEEK;
2564 sv_catpv(t, "VOID=\"\"");
2567 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
2568 sv_catpv(t, "WILD=\"\"");
2571 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2572 if (sv == &PL_sv_undef) {
2573 sv_catpv(t, "SV_UNDEF=\"1\"");
2574 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2575 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2579 else if (sv == &PL_sv_no) {
2580 sv_catpv(t, "SV_NO=\"1\"");
2581 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2582 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2583 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2584 SVp_POK|SVp_NOK)) &&
2589 else if (sv == &PL_sv_yes) {
2590 sv_catpv(t, "SV_YES=\"1\"");
2591 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2592 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2593 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2594 SVp_POK|SVp_NOK)) &&
2596 SvPVX(sv) && *SvPVX(sv) == '1' &&
2601 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2602 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2603 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2607 sv_catpv(t, " XXX=\"\" ");
2609 else if (SvREFCNT(sv) == 0) {
2610 sv_catpv(t, " refcnt=\"0\"");
2613 else if (DEBUG_R_TEST_) {
2616 /* is this SV on the tmps stack? */
2617 for (ix=PL_tmps_ix; ix>=0; ix--) {
2618 if (PL_tmps_stack[ix] == sv) {
2623 if (SvREFCNT(sv) > 1)
2624 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2627 sv_catpv(t, " DRT=\"<T>\"");
2631 sv_catpv(t, " ROK=\"\"");
2633 switch (SvTYPE(sv)) {
2635 sv_catpv(t, " FREED=\"1\"");
2639 sv_catpv(t, " UNDEF=\"1\"");
2642 sv_catpv(t, " IV=\"");
2645 sv_catpv(t, " NV=\"");
2648 sv_catpv(t, " PV=\"");
2651 sv_catpv(t, " PVIV=\"");
2654 sv_catpv(t, " PVNV=\"");
2657 sv_catpv(t, " PVMG=\"");
2660 sv_catpv(t, " PVLV=\"");
2663 sv_catpv(t, " AV=\"");
2666 sv_catpv(t, " HV=\"");
2670 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2672 sv_catpv(t, " CV=\"()\"");
2675 sv_catpv(t, " GV=\"");
2678 sv_catpv(t, " BIND=\"");
2681 sv_catpv(t, " REGEXP=\"");
2684 sv_catpv(t, " FM=\"");
2687 sv_catpv(t, " IO=\"");
2696 else if (SvNOKp(sv)) {
2697 STORE_NUMERIC_LOCAL_SET_STANDARD();
2698 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2699 RESTORE_NUMERIC_LOCAL();
2701 else if (SvIOKp(sv)) {
2703 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2705 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2714 return SvPV(t, n_a);
2718 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2720 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2723 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2726 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2729 REGEXP *const r = PM_GETRE(pm);
2730 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2731 sv_catxmlsv(tmpsv, MUTABLE_SV(r));
2732 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2734 SvREFCNT_dec(tmpsv);
2735 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2736 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2739 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2740 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
2741 SV * const tmpsv = pm_description(pm);
2742 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2743 SvREFCNT_dec(tmpsv);
2747 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2748 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2749 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2750 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2751 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2752 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2755 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2759 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2761 do_pmop_xmldump(0, PL_xmlfp, pm);
2765 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2770 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2774 seq = sequence_num(o);
2775 Perl_xmldump_indent(aTHX_ level, file,
2776 "<op_%s seq=\"%"UVuf" -> ",
2781 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2782 sequence_num(o->op_next));
2784 PerlIO_printf(file, "DONE\"");
2787 if (o->op_type == OP_NULL)
2789 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2790 if (o->op_targ == OP_NEXTSTATE)
2793 PerlIO_printf(file, " line=\"%"UVuf"\"",
2794 (UV)CopLINE(cCOPo));
2795 if (CopSTASHPV(cCOPo))
2796 PerlIO_printf(file, " package=\"%s\"",
2798 if (CopLABEL(cCOPo))
2799 PerlIO_printf(file, " label=\"%s\"",
2804 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2807 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2810 SV * const tmpsv = newSVpvs("");
2811 switch (o->op_flags & OPf_WANT) {
2813 sv_catpv(tmpsv, ",VOID");
2815 case OPf_WANT_SCALAR:
2816 sv_catpv(tmpsv, ",SCALAR");
2819 sv_catpv(tmpsv, ",LIST");
2822 sv_catpv(tmpsv, ",UNKNOWN");
2825 if (o->op_flags & OPf_KIDS)
2826 sv_catpv(tmpsv, ",KIDS");
2827 if (o->op_flags & OPf_PARENS)
2828 sv_catpv(tmpsv, ",PARENS");
2829 if (o->op_flags & OPf_STACKED)
2830 sv_catpv(tmpsv, ",STACKED");
2831 if (o->op_flags & OPf_REF)
2832 sv_catpv(tmpsv, ",REF");
2833 if (o->op_flags & OPf_MOD)
2834 sv_catpv(tmpsv, ",MOD");
2835 if (o->op_flags & OPf_SPECIAL)
2836 sv_catpv(tmpsv, ",SPECIAL");
2837 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2838 SvREFCNT_dec(tmpsv);
2840 if (o->op_private) {
2841 SV * const tmpsv = newSVpvs("");
2842 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2843 if (o->op_private & OPpTARGET_MY)
2844 sv_catpv(tmpsv, ",TARGET_MY");
2846 else if (o->op_type == OP_LEAVESUB ||
2847 o->op_type == OP_LEAVE ||
2848 o->op_type == OP_LEAVESUBLV ||
2849 o->op_type == OP_LEAVEWRITE) {
2850 if (o->op_private & OPpREFCOUNTED)
2851 sv_catpv(tmpsv, ",REFCOUNTED");
2853 else if (o->op_type == OP_AASSIGN) {
2854 if (o->op_private & OPpASSIGN_COMMON)
2855 sv_catpv(tmpsv, ",COMMON");
2857 else if (o->op_type == OP_SASSIGN) {
2858 if (o->op_private & OPpASSIGN_BACKWARDS)
2859 sv_catpv(tmpsv, ",BACKWARDS");
2861 else if (o->op_type == OP_TRANS) {
2862 if (o->op_private & OPpTRANS_SQUASH)
2863 sv_catpv(tmpsv, ",SQUASH");
2864 if (o->op_private & OPpTRANS_DELETE)
2865 sv_catpv(tmpsv, ",DELETE");
2866 if (o->op_private & OPpTRANS_COMPLEMENT)
2867 sv_catpv(tmpsv, ",COMPLEMENT");
2868 if (o->op_private & OPpTRANS_IDENTICAL)
2869 sv_catpv(tmpsv, ",IDENTICAL");
2870 if (o->op_private & OPpTRANS_GROWS)
2871 sv_catpv(tmpsv, ",GROWS");
2873 else if (o->op_type == OP_REPEAT) {
2874 if (o->op_private & OPpREPEAT_DOLIST)
2875 sv_catpv(tmpsv, ",DOLIST");
2877 else if (o->op_type == OP_ENTERSUB ||
2878 o->op_type == OP_RV2SV ||
2879 o->op_type == OP_GVSV ||
2880 o->op_type == OP_RV2AV ||
2881 o->op_type == OP_RV2HV ||
2882 o->op_type == OP_RV2GV ||
2883 o->op_type == OP_AELEM ||
2884 o->op_type == OP_HELEM )
2886 if (o->op_type == OP_ENTERSUB) {
2887 if (o->op_private & OPpENTERSUB_AMPER)
2888 sv_catpv(tmpsv, ",AMPER");
2889 if (o->op_private & OPpENTERSUB_DB)
2890 sv_catpv(tmpsv, ",DB");
2891 if (o->op_private & OPpENTERSUB_HASTARG)
2892 sv_catpv(tmpsv, ",HASTARG");
2893 if (o->op_private & OPpENTERSUB_NOPAREN)
2894 sv_catpv(tmpsv, ",NOPAREN");
2895 if (o->op_private & OPpENTERSUB_INARGS)
2896 sv_catpv(tmpsv, ",INARGS");
2899 switch (o->op_private & OPpDEREF) {
2901 sv_catpv(tmpsv, ",SV");
2904 sv_catpv(tmpsv, ",AV");
2907 sv_catpv(tmpsv, ",HV");
2910 if (o->op_private & OPpMAYBE_LVSUB)
2911 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2913 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2914 if (o->op_private & OPpLVAL_DEFER)
2915 sv_catpv(tmpsv, ",LVAL_DEFER");
2918 if (o->op_private & HINT_STRICT_REFS)
2919 sv_catpv(tmpsv, ",STRICT_REFS");
2920 if (o->op_private & OPpOUR_INTRO)
2921 sv_catpv(tmpsv, ",OUR_INTRO");
2924 else if (o->op_type == OP_CONST) {
2925 if (o->op_private & OPpCONST_BARE)
2926 sv_catpv(tmpsv, ",BARE");
2927 if (o->op_private & OPpCONST_STRICT)
2928 sv_catpv(tmpsv, ",STRICT");
2929 if (o->op_private & OPpCONST_ENTERED)
2930 sv_catpv(tmpsv, ",ENTERED");
2931 if (o->op_private & OPpCONST_FOLDED)
2932 sv_catpv(tmpsv, ",FOLDED");
2934 else if (o->op_type == OP_FLIP) {
2935 if (o->op_private & OPpFLIP_LINENUM)
2936 sv_catpv(tmpsv, ",LINENUM");
2938 else if (o->op_type == OP_FLOP) {
2939 if (o->op_private & OPpFLIP_LINENUM)
2940 sv_catpv(tmpsv, ",LINENUM");
2942 else if (o->op_type == OP_RV2CV) {
2943 if (o->op_private & OPpLVAL_INTRO)
2944 sv_catpv(tmpsv, ",INTRO");
2946 else if (o->op_type == OP_GV) {
2947 if (o->op_private & OPpEARLY_CV)
2948 sv_catpv(tmpsv, ",EARLY_CV");
2950 else if (o->op_type == OP_LIST) {
2951 if (o->op_private & OPpLIST_GUESSED)
2952 sv_catpv(tmpsv, ",GUESSED");
2954 else if (o->op_type == OP_DELETE) {
2955 if (o->op_private & OPpSLICE)
2956 sv_catpv(tmpsv, ",SLICE");
2958 else if (o->op_type == OP_EXISTS) {
2959 if (o->op_private & OPpEXISTS_SUB)
2960 sv_catpv(tmpsv, ",EXISTS_SUB");
2962 else if (o->op_type == OP_SORT) {
2963 if (o->op_private & OPpSORT_NUMERIC)
2964 sv_catpv(tmpsv, ",NUMERIC");
2965 if (o->op_private & OPpSORT_INTEGER)
2966 sv_catpv(tmpsv, ",INTEGER");
2967 if (o->op_private & OPpSORT_REVERSE)
2968 sv_catpv(tmpsv, ",REVERSE");
2970 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
2971 if (o->op_private & OPpOPEN_IN_RAW)
2972 sv_catpv(tmpsv, ",IN_RAW");
2973 if (o->op_private & OPpOPEN_IN_CRLF)
2974 sv_catpv(tmpsv, ",IN_CRLF");
2975 if (o->op_private & OPpOPEN_OUT_RAW)
2976 sv_catpv(tmpsv, ",OUT_RAW");
2977 if (o->op_private & OPpOPEN_OUT_CRLF)
2978 sv_catpv(tmpsv, ",OUT_CRLF");
2980 else if (o->op_type == OP_EXIT) {
2981 if (o->op_private & OPpEXIT_VMSISH)
2982 sv_catpv(tmpsv, ",EXIT_VMSISH");
2983 if (o->op_private & OPpHUSH_VMSISH)
2984 sv_catpv(tmpsv, ",HUSH_VMSISH");
2986 else if (o->op_type == OP_DIE) {
2987 if (o->op_private & OPpHUSH_VMSISH)
2988 sv_catpv(tmpsv, ",HUSH_VMSISH");
2990 else if (PL_check[o->op_type] != Perl_ck_ftst) {
2991 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
2992 sv_catpv(tmpsv, ",FT_ACCESS");
2993 if (o->op_private & OPpFT_STACKED)
2994 sv_catpv(tmpsv, ",FT_STACKED");
2996 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
2997 sv_catpv(tmpsv, ",INTRO");
2999 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
3000 SvREFCNT_dec(tmpsv);
3003 switch (o->op_type) {
3005 if (o->op_flags & OPf_SPECIAL) {
3011 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
3013 if (cSVOPo->op_sv) {
3014 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
3015 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
3021 gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
3022 s = SvPV(tmpsv1,len);
3023 sv_catxmlpvn(tmpsv2, s, len, 1);
3024 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
3028 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
3033 case OP_METHOD_NAMED:
3034 #ifndef USE_ITHREADS
3035 /* with ITHREADS, consts are stored in the pad, and the right pad
3036 * may not be active here, so skip */
3037 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
3043 PerlIO_printf(file, ">\n");
3045 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
3050 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
3051 (UV)CopLINE(cCOPo));
3052 if (CopSTASHPV(cCOPo))
3053 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
3055 if (CopLABEL(cCOPo))
3056 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
3060 S_xmldump_attr(aTHX_ level, file, "redo=\"");
3061 if (cLOOPo->op_redoop)
3062 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
3064 PerlIO_printf(file, "DONE\"");
3065 S_xmldump_attr(aTHX_ level, file, "next=\"");
3066 if (cLOOPo->op_nextop)
3067 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
3069 PerlIO_printf(file, "DONE\"");
3070 S_xmldump_attr(aTHX_ level, file, "last=\"");
3071 if (cLOOPo->op_lastop)
3072 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
3074 PerlIO_printf(file, "DONE\"");
3082 S_xmldump_attr(aTHX_ level, file, "other=\"");
3083 if (cLOGOPo->op_other)
3084 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
3086 PerlIO_printf(file, "DONE\"");
3094 if (o->op_private & OPpREFCOUNTED)
3095 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
3101 if (PL_madskills && o->op_madprop) {
3102 char prevkey = '\0';
3103 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
3104 const MADPROP* mp = o->op_madprop;
3108 PerlIO_printf(file, ">\n");
3110 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
3113 char tmp = mp->mad_key;
3114 sv_setpvs(tmpsv,"\"");
3116 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
3117 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
3118 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
3121 sv_catpv(tmpsv, "\"");
3122 switch (mp->mad_type) {
3124 sv_catpv(tmpsv, "NULL");
3125 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
3128 sv_catpv(tmpsv, " val=\"");
3129 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
3130 sv_catpv(tmpsv, "\"");
3131 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
3134 sv_catpv(tmpsv, " val=\"");
3135 sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
3136 sv_catpv(tmpsv, "\"");
3137 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
3140 if ((OP*)mp->mad_val) {
3141 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
3142 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
3143 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
3147 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
3153 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
3155 SvREFCNT_dec(tmpsv);
3158 switch (o->op_type) {
3165 PerlIO_printf(file, ">\n");
3167 do_pmop_xmldump(level, file, cPMOPo);
3173 if (o->op_flags & OPf_KIDS) {
3177 PerlIO_printf(file, ">\n");
3179 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3180 do_op_xmldump(level, file, kid);
3184 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3186 PerlIO_printf(file, " />\n");
3190 Perl_op_xmldump(pTHX_ const OP *o)
3192 PERL_ARGS_ASSERT_OP_XMLDUMP;
3194 do_op_xmldump(0, PL_xmlfp, o);
3200 * c-indentation-style: bsd
3202 * indent-tabs-mode: nil
3205 * ex: set ts=8 sts=4 sw=4 et: