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 (TAINTING_get && 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_ISTAINTED(regex))
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("");
909 if (PL_opargs[optype] & OA_TARGLEX) {
910 if (o->op_private & OPpTARGET_MY)
911 sv_catpv(tmpsv, ",TARGET_MY");
913 else if (optype == OP_ENTERSUB ||
914 optype == OP_RV2SV ||
916 optype == OP_RV2AV ||
917 optype == OP_RV2HV ||
918 optype == OP_RV2GV ||
919 optype == OP_AELEM ||
922 if (optype == OP_ENTERSUB) {
923 append_flags(tmpsv, o->op_private, op_entersub_names);
926 switch (o->op_private & OPpDEREF) {
928 sv_catpv(tmpsv, ",SV");
931 sv_catpv(tmpsv, ",AV");
934 sv_catpv(tmpsv, ",HV");
937 if (o->op_private & OPpMAYBE_LVSUB)
938 sv_catpv(tmpsv, ",MAYBE_LVSUB");
941 if (optype == OP_AELEM || optype == OP_HELEM) {
942 if (o->op_private & OPpLVAL_DEFER)
943 sv_catpv(tmpsv, ",LVAL_DEFER");
945 else if (optype == OP_RV2HV || optype == OP_PADHV) {
946 if (o->op_private & OPpMAYBE_TRUEBOOL)
947 sv_catpvs(tmpsv, ",OPpMAYBE_TRUEBOOL");
948 if (o->op_private & OPpTRUEBOOL)
949 sv_catpvs(tmpsv, ",OPpTRUEBOOL");
952 if (o->op_private & HINT_STRICT_REFS)
953 sv_catpv(tmpsv, ",STRICT_REFS");
954 if (o->op_private & OPpOUR_INTRO)
955 sv_catpv(tmpsv, ",OUR_INTRO");
958 else if (S_op_private_to_names(aTHX_ tmpsv, optype, o->op_private)) {
960 else if (PL_check[optype] != Perl_ck_ftst) {
961 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
962 sv_catpv(tmpsv, ",FT_ACCESS");
963 if (o->op_private & OPpFT_STACKED)
964 sv_catpv(tmpsv, ",FT_STACKED");
967 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
968 sv_catpv(tmpsv, ",INTRO");
970 if (o->op_type == OP_PADRANGE)
971 Perl_sv_catpvf(aTHX_ tmpsv, ",COUNT=%"UVuf,
972 (UV)(o->op_private & OPpPADRANGE_COUNTMASK));
975 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
977 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
983 if (PL_madskills && o->op_madprop) {
984 SV * const tmpsv = newSVpvs("");
985 MADPROP* mp = o->op_madprop;
986 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
989 const char tmp = mp->mad_key;
990 sv_setpvs(tmpsv,"'");
992 sv_catpvn(tmpsv, &tmp, 1);
993 sv_catpv(tmpsv, "'=");
994 switch (mp->mad_type) {
996 sv_catpv(tmpsv, "NULL");
997 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1000 sv_catpv(tmpsv, "<");
1001 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
1002 sv_catpv(tmpsv, ">");
1003 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1006 if ((OP*)mp->mad_val) {
1007 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1008 do_op_dump(level, file, (OP*)mp->mad_val);
1012 sv_catpv(tmpsv, "(UNK)");
1013 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1019 Perl_dump_indent(aTHX_ level, file, "}\n");
1021 SvREFCNT_dec(tmpsv);
1030 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1032 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
1033 if (cSVOPo->op_sv) {
1034 SV * const tmpsv = newSV(0);
1038 /* FIXME - is this making unwarranted assumptions about the
1039 UTF-8 cleanliness of the dump file handle? */
1042 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
1043 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
1044 SvPV_nolen_const(tmpsv));
1048 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
1054 case OP_METHOD_NAMED:
1055 #ifndef USE_ITHREADS
1056 /* with ITHREADS, consts are stored in the pad, and the right pad
1057 * may not be active here, so skip */
1058 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
1064 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1065 (UV)CopLINE(cCOPo));
1066 if (CopSTASHPV(cCOPo))
1067 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1069 if (CopLABEL(cCOPo))
1070 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1074 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1075 if (cLOOPo->op_redoop)
1076 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1078 PerlIO_printf(file, "DONE\n");
1079 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1080 if (cLOOPo->op_nextop)
1081 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1083 PerlIO_printf(file, "DONE\n");
1084 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1085 if (cLOOPo->op_lastop)
1086 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1088 PerlIO_printf(file, "DONE\n");
1096 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1097 if (cLOGOPo->op_other)
1098 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1100 PerlIO_printf(file, "DONE\n");
1106 do_pmop_dump(level, file, cPMOPo);
1114 if (o->op_private & OPpREFCOUNTED)
1115 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1120 if (o->op_flags & OPf_KIDS) {
1122 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
1123 do_op_dump(level, file, kid);
1125 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1129 Perl_op_dump(pTHX_ const OP *o)
1131 PERL_ARGS_ASSERT_OP_DUMP;
1132 do_op_dump(0, Perl_debug_log, o);
1136 Perl_gv_dump(pTHX_ GV *gv)
1140 PERL_ARGS_ASSERT_GV_DUMP;
1143 PerlIO_printf(Perl_debug_log, "{}\n");
1146 sv = sv_newmortal();
1147 PerlIO_printf(Perl_debug_log, "{\n");
1148 gv_fullname3(sv, gv, NULL);
1149 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
1150 if (gv != GvEGV(gv)) {
1151 gv_efullname3(sv, GvEGV(gv), NULL);
1152 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
1154 PerlIO_putc(Perl_debug_log, '\n');
1155 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1159 /* map magic types to the symbolic names
1160 * (with the PERL_MAGIC_ prefixed stripped)
1163 static const struct { const char type; const char *name; } magic_names[] = {
1164 #include "mg_names.c"
1165 /* this null string terminates the list */
1170 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1172 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1174 for (; mg; mg = mg->mg_moremagic) {
1175 Perl_dump_indent(aTHX_ level, file,
1176 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1177 if (mg->mg_virtual) {
1178 const MGVTBL * const v = mg->mg_virtual;
1179 if (v >= PL_magic_vtables
1180 && v < PL_magic_vtables + magic_vtable_max) {
1181 const U32 i = v - PL_magic_vtables;
1182 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1185 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1188 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1191 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1195 const char *name = NULL;
1196 for (n = 0; magic_names[n].name; n++) {
1197 if (mg->mg_type == magic_names[n].type) {
1198 name = magic_names[n].name;
1203 Perl_dump_indent(aTHX_ level, file,
1204 " MG_TYPE = PERL_MAGIC_%s\n", name);
1206 Perl_dump_indent(aTHX_ level, file,
1207 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1211 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1212 if (mg->mg_type == PERL_MAGIC_envelem &&
1213 mg->mg_flags & MGf_TAINTEDDIR)
1214 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1215 if (mg->mg_type == PERL_MAGIC_regex_global &&
1216 mg->mg_flags & MGf_MINMATCH)
1217 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1218 if (mg->mg_flags & MGf_REFCOUNTED)
1219 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1220 if (mg->mg_flags & MGf_GSKIP)
1221 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1222 if (mg->mg_flags & MGf_COPY)
1223 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1224 if (mg->mg_flags & MGf_DUP)
1225 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1226 if (mg->mg_flags & MGf_LOCAL)
1227 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1230 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1231 PTR2UV(mg->mg_obj));
1232 if (mg->mg_type == PERL_MAGIC_qr) {
1233 REGEXP* const re = (REGEXP *)mg->mg_obj;
1234 SV * const dsv = sv_newmortal();
1235 const char * const s
1236 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1238 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1239 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1241 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1242 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1245 if (mg->mg_flags & MGf_REFCOUNTED)
1246 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1249 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1251 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1252 if (mg->mg_len >= 0) {
1253 if (mg->mg_type != PERL_MAGIC_utf8) {
1254 SV * const sv = newSVpvs("");
1255 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1259 else if (mg->mg_len == HEf_SVKEY) {
1260 PerlIO_puts(file, " => HEf_SVKEY\n");
1261 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1262 maxnest, dumpops, pvlim); /* MG is already +1 */
1265 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1270 " does not know how to handle this MG_LEN"
1272 PerlIO_putc(file, '\n');
1274 if (mg->mg_type == PERL_MAGIC_utf8) {
1275 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1278 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1279 Perl_dump_indent(aTHX_ level, file,
1280 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1283 (UV)cache[i * 2 + 1]);
1290 Perl_magic_dump(pTHX_ const MAGIC *mg)
1292 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1296 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1300 PERL_ARGS_ASSERT_DO_HV_DUMP;
1302 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1303 if (sv && (hvname = HvNAME_get(sv)))
1305 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1306 name which quite legally could contain insane things like tabs, newlines, nulls or
1307 other scary crap - this should produce sane results - except maybe for unicode package
1308 names - but we will wait for someone to file a bug on that - demerphq */
1309 SV * const tmpsv = newSVpvs("");
1310 PerlIO_printf(file, "\t%s\n", pv_display(tmpsv, hvname, HvNAMELEN_get(sv), 0, 1024));
1313 PerlIO_putc(file, '\n');
1317 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1319 PERL_ARGS_ASSERT_DO_GV_DUMP;
1321 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1322 if (sv && GvNAME(sv))
1323 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
1325 PerlIO_putc(file, '\n');
1329 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1331 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1333 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1334 if (sv && GvNAME(sv)) {
1336 PerlIO_printf(file, "\t\"");
1337 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1338 PerlIO_printf(file, "%s\" :: \"", hvname);
1339 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
1342 PerlIO_putc(file, '\n');
1345 const struct flag_to_name first_sv_flags_names[] = {
1346 {SVs_TEMP, "TEMP,"},
1347 {SVs_OBJECT, "OBJECT,"},
1356 const struct flag_to_name second_sv_flags_names[] = {
1358 {SVf_FAKE, "FAKE,"},
1359 {SVf_READONLY, "READONLY,"},
1360 {SVf_BREAK, "BREAK,"},
1361 {SVf_AMAGIC, "OVERLOAD,"},
1367 const struct flag_to_name cv_flags_names[] = {
1368 {CVf_ANON, "ANON,"},
1369 {CVf_UNIQUE, "UNIQUE,"},
1370 {CVf_CLONE, "CLONE,"},
1371 {CVf_CLONED, "CLONED,"},
1372 {CVf_CONST, "CONST,"},
1373 {CVf_NODEBUG, "NODEBUG,"},
1374 {CVf_LVALUE, "LVALUE,"},
1375 {CVf_METHOD, "METHOD,"},
1376 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1377 {CVf_CVGV_RC, "CVGV_RC,"},
1378 {CVf_DYNFILE, "DYNFILE,"},
1379 {CVf_AUTOLOAD, "AUTOLOAD,"},
1380 {CVf_HASEVAL, "HASEVAL"},
1381 {CVf_SLABBED, "SLABBED,"},
1382 {CVf_ISXSUB, "ISXSUB,"}
1385 const struct flag_to_name hv_flags_names[] = {
1386 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1387 {SVphv_LAZYDEL, "LAZYDEL,"},
1388 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1389 {SVphv_REHASH, "REHASH,"},
1390 {SVphv_CLONEABLE, "CLONEABLE,"}
1393 const struct flag_to_name gp_flags_names[] = {
1394 {GVf_INTRO, "INTRO,"},
1395 {GVf_MULTI, "MULTI,"},
1396 {GVf_ASSUMECV, "ASSUMECV,"},
1397 {GVf_IN_PAD, "IN_PAD,"}
1400 const struct flag_to_name gp_flags_imported_names[] = {
1401 {GVf_IMPORTED_SV, " SV"},
1402 {GVf_IMPORTED_AV, " AV"},
1403 {GVf_IMPORTED_HV, " HV"},
1404 {GVf_IMPORTED_CV, " CV"},
1407 const struct flag_to_name regexp_flags_names[] = {
1408 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1409 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1410 {RXf_PMf_FOLD, "PMf_FOLD,"},
1411 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1412 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1413 {RXf_ANCH_BOL, "ANCH_BOL,"},
1414 {RXf_ANCH_MBOL, "ANCH_MBOL,"},
1415 {RXf_ANCH_SBOL, "ANCH_SBOL,"},
1416 {RXf_ANCH_GPOS, "ANCH_GPOS,"},
1417 {RXf_GPOS_SEEN, "GPOS_SEEN,"},
1418 {RXf_GPOS_FLOAT, "GPOS_FLOAT,"},
1419 {RXf_LOOKBEHIND_SEEN, "LOOKBEHIND_SEEN,"},
1420 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1421 {RXf_CANY_SEEN, "CANY_SEEN,"},
1422 {RXf_NOSCAN, "NOSCAN,"},
1423 {RXf_CHECK_ALL, "CHECK_ALL,"},
1424 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1425 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1426 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1427 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1428 {RXf_COPY_DONE, "COPY_DONE,"},
1429 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1430 {RXf_TAINTED, "TAINTED,"},
1431 {RXf_START_ONLY, "START_ONLY,"},
1432 {RXf_WHITE, "WHITE,"},
1433 {RXf_NULL, "NULL,"},
1437 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1445 PERL_ARGS_ASSERT_DO_SV_DUMP;
1448 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1452 flags = SvFLAGS(sv);
1455 /* process general SV flags */
1457 d = Perl_newSVpvf(aTHX_
1458 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1459 PTR2UV(SvANY(sv)), PTR2UV(sv),
1460 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1461 (int)(PL_dumpindent*level), "");
1463 if (!((flags & SVpad_NAME) == SVpad_NAME
1464 && (type == SVt_PVMG || type == SVt_PVNV))) {
1465 if ((flags & SVs_PADMY) && (flags & SVs_PADSTALE))
1466 sv_catpv(d, "PADSTALE,");
1468 if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
1469 if (!(flags & SVs_PADMY) && (flags & SVs_PADTMP))
1470 sv_catpv(d, "PADTMP,");
1471 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1473 append_flags(d, flags, first_sv_flags_names);
1474 if (flags & SVf_ROK) {
1475 sv_catpv(d, "ROK,");
1476 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1478 append_flags(d, flags, second_sv_flags_names);
1479 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1480 if (SvPCS_IMPORTED(sv))
1481 sv_catpv(d, "PCS_IMPORTED,");
1483 sv_catpv(d, "SCREAM,");
1486 /* process type-specific SV flags */
1491 append_flags(d, CvFLAGS(sv), cv_flags_names);
1494 append_flags(d, flags, hv_flags_names);
1498 if (isGV_with_GP(sv)) {
1499 append_flags(d, GvFLAGS(sv), gp_flags_names);
1501 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1502 sv_catpv(d, "IMPORT");
1503 if (GvIMPORTED(sv) == GVf_IMPORTED)
1504 sv_catpv(d, "ALL,");
1507 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1514 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1515 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1518 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1519 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1520 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
1521 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
1524 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1529 /* SVphv_SHAREKEYS is also 0x20000000 */
1530 if ((type != SVt_PVHV) && SvUTF8(sv))
1531 sv_catpv(d, "UTF8");
1533 if (*(SvEND(d) - 1) == ',') {
1534 SvCUR_set(d, SvCUR(d) - 1);
1535 SvPVX(d)[SvCUR(d)] = '\0';
1540 /* dump initial SV details */
1542 #ifdef DEBUG_LEAKING_SCALARS
1543 Perl_dump_indent(aTHX_ level, file,
1544 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1545 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1547 sv->sv_debug_inpad ? "for" : "by",
1548 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1549 PTR2UV(sv->sv_debug_parent),
1553 Perl_dump_indent(aTHX_ level, file, "SV = ");
1557 if (type < SVt_LAST) {
1558 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1560 if (type == SVt_NULL) {
1565 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1570 /* Dump general SV fields */
1572 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1573 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1574 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1575 || (type == SVt_IV && !SvROK(sv))) {
1577 #ifdef PERL_OLD_COPY_ON_WRITE
1581 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1583 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1584 #ifdef PERL_OLD_COPY_ON_WRITE
1585 if (SvIsCOW_shared_hash(sv))
1586 PerlIO_printf(file, " (HASH)");
1587 else if (SvIsCOW_normal(sv))
1588 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1590 PerlIO_putc(file, '\n');
1593 if ((type == SVt_PVNV || type == SVt_PVMG)
1594 && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
1595 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1596 (UV) COP_SEQ_RANGE_LOW(sv));
1597 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1598 (UV) COP_SEQ_RANGE_HIGH(sv));
1599 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1600 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1601 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1602 || type == SVt_NV) {
1603 STORE_NUMERIC_LOCAL_SET_STANDARD();
1604 /* %Vg doesn't work? --jhi */
1605 #ifdef USE_LONG_DOUBLE
1606 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
1608 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
1610 RESTORE_NUMERIC_LOCAL();
1614 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1616 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1619 if (type < SVt_PV) {
1624 if (type <= SVt_PVLV && !isGV_with_GP(sv)) {
1625 const bool re = isREGEXP(sv);
1626 const char * const ptr =
1627 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1631 SvOOK_offset(sv, delta);
1632 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1637 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
1639 PerlIO_printf(file, "( %s . ) ",
1640 pv_display(d, ptr - delta, delta, 0,
1643 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1646 if (SvUTF8(sv)) /* the 6? \x{....} */
1647 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
1648 PerlIO_printf(file, "\n");
1649 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1651 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1655 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1658 if (type >= SVt_PVMG) {
1659 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
1660 HV * const ost = SvOURSTASH(sv);
1662 do_hv_dump(level, file, " OURSTASH", ost);
1665 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1668 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1670 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1671 Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
1672 Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1673 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1677 /* Dump type-specific SV fields */
1681 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1682 if (AvARRAY(sv) != AvALLOC(sv)) {
1683 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1684 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1687 PerlIO_putc(file, '\n');
1688 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1689 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1690 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1692 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1693 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1694 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1695 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1696 if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) {
1698 for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) {
1699 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
1701 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1703 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1708 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1709 if (HvARRAY(sv) && HvUSEDKEYS(sv)) {
1710 /* Show distribution of HEs in the ARRAY */
1712 #define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
1715 U32 pow2 = 2, keys = HvUSEDKEYS(sv);
1716 NV theoret, sum = 0;
1718 PerlIO_printf(file, " (");
1719 Zero(freq, FREQ_MAX + 1, int);
1720 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1723 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1725 if (count > FREQ_MAX)
1731 for (i = 0; i <= max; i++) {
1733 PerlIO_printf(file, "%d%s:%d", i,
1734 (i == FREQ_MAX) ? "+" : "",
1737 PerlIO_printf(file, ", ");
1740 PerlIO_putc(file, ')');
1741 /* The "quality" of a hash is defined as the total number of
1742 comparisons needed to access every element once, relative
1743 to the expected number needed for a random hash.
1745 The total number of comparisons is equal to the sum of
1746 the squares of the number of entries in each bucket.
1747 For a random hash of n keys into k buckets, the expected
1752 for (i = max; i > 0; i--) { /* Precision: count down. */
1753 sum += freq[i] * i * i;
1755 while ((keys = keys >> 1))
1757 theoret = HvUSEDKEYS(sv);
1758 theoret += theoret * (theoret-1)/pow2;
1759 PerlIO_putc(file, '\n');
1760 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1762 PerlIO_putc(file, '\n');
1763 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
1764 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1765 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1766 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1767 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1769 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1770 if (mg && mg->mg_obj) {
1771 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1775 const char * const hvname = HvNAME_get(sv);
1777 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1781 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1782 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1783 if (HvAUX(sv)->xhv_name_count)
1784 Perl_dump_indent(aTHX_
1785 level, file, " NAMECOUNT = %"IVdf"\n",
1786 (IV)HvAUX(sv)->xhv_name_count
1788 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1789 const I32 count = HvAUX(sv)->xhv_name_count;
1791 SV * const names = newSVpvs_flags("", SVs_TEMP);
1792 /* The starting point is the first element if count is
1793 positive and the second element if count is negative. */
1794 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1795 + (count < 0 ? 1 : 0);
1796 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1797 + (count < 0 ? -count : count);
1798 while (hekp < endp) {
1800 sv_catpvs(names, ", \"");
1801 sv_catpvn(names, HEK_KEY(*hekp), HEK_LEN(*hekp));
1802 sv_catpvs(names, "\"");
1804 /* This should never happen. */
1805 sv_catpvs(names, ", (null)");
1809 Perl_dump_indent(aTHX_
1810 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1814 Perl_dump_indent(aTHX_
1815 level, file, " ENAME = \"%s\"\n", HvENAME_get(sv)
1819 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1821 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1825 /* FIXME - mro_algs kflags can signal a UTF-8 name. */
1826 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%.*s\" (0x%"UVxf")\n",
1827 (int)meta->mro_which->length,
1828 meta->mro_which->name,
1829 PTR2UV(meta->mro_which));
1830 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1831 (UV)meta->cache_gen);
1832 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1834 if (meta->mro_linear_all) {
1835 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1836 PTR2UV(meta->mro_linear_all));
1837 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1840 if (meta->mro_linear_current) {
1841 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1842 PTR2UV(meta->mro_linear_current));
1843 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1846 if (meta->mro_nextmethod) {
1847 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1848 PTR2UV(meta->mro_nextmethod));
1849 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1853 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1855 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1860 if (nest < maxnest) {
1861 HV * const hv = MUTABLE_HV(sv);
1866 int count = maxnest - nest;
1867 for (i=0; i <= HvMAX(hv); i++) {
1868 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1875 if (count-- <= 0) goto DONEHV;
1878 keysv = hv_iterkeysv(he);
1879 keypv = SvPV_const(keysv, len);
1882 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1884 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1885 if (HvEITER_get(hv) == he)
1886 PerlIO_printf(file, "[CURRENT] ");
1888 PerlIO_printf(file, "[REHASH] ");
1889 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1890 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1899 if (CvAUTOLOAD(sv)) {
1901 const char *const name = SvPV_const(sv, len);
1902 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%.*s\"\n",
1906 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1907 (int) CvPROTOLEN(sv), CvPROTO(sv));
1911 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1912 if (!CvISXSUB(sv)) {
1914 Perl_dump_indent(aTHX_ level, file,
1915 " START = 0x%"UVxf" ===> %"IVdf"\n",
1916 PTR2UV(CvSTART(sv)),
1917 (IV)sequence_num(CvSTART(sv)));
1919 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1920 PTR2UV(CvROOT(sv)));
1921 if (CvROOT(sv) && dumpops) {
1922 do_op_dump(level+1, file, CvROOT(sv));
1925 SV * const constant = cv_const_sv((const CV *)sv);
1927 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1930 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1932 PTR2UV(CvXSUBANY(sv).any_ptr));
1933 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1936 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1937 (IV)CvXSUBANY(sv).any_i32);
1941 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1942 HEK_KEY(CvNAME_HEK((CV *)sv)));
1943 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1944 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1945 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1946 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1947 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1948 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1949 if (nest < maxnest) {
1950 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1953 const CV * const outside = CvOUTSIDE(sv);
1954 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1957 : CvANON(outside) ? "ANON"
1958 : (outside == PL_main_cv) ? "MAIN"
1959 : CvUNIQUE(outside) ? "UNIQUE"
1960 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
1962 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
1963 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
1968 if (type == SVt_PVLV) {
1969 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
1970 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
1971 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
1972 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
1973 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
1974 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
1975 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
1978 if (isREGEXP(sv)) goto dumpregexp;
1979 if (!isGV_with_GP(sv))
1981 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
1982 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
1983 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
1984 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
1987 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
1988 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
1989 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
1990 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
1991 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
1992 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
1993 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
1994 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
1995 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
1996 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
1997 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
1998 do_gv_dump (level, file, " EGV", GvEGV(sv));
2001 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2002 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2003 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2004 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2005 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2006 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2007 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
2009 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2010 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2011 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2013 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2014 PTR2UV(IoTOP_GV(sv)));
2015 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2016 maxnest, dumpops, pvlim);
2018 /* Source filters hide things that are not GVs in these three, so let's
2019 be careful out there. */
2021 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2022 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2023 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2025 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2026 PTR2UV(IoFMT_GV(sv)));
2027 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2028 maxnest, dumpops, pvlim);
2030 if (IoBOTTOM_NAME(sv))
2031 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2032 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2033 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2035 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2036 PTR2UV(IoBOTTOM_GV(sv)));
2037 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2038 maxnest, dumpops, pvlim);
2040 if (isPRINT(IoTYPE(sv)))
2041 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2043 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2044 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2049 struct regexp * const r = ReANY((REGEXP*)sv);
2050 flags = RX_EXTFLAGS((REGEXP*)sv);
2052 append_flags(d, flags, regexp_flags_names);
2053 if (*(SvEND(d) - 1) == ',') {
2054 SvCUR_set(d, SvCUR(d) - 1);
2055 SvPVX(d)[SvCUR(d)] = '\0';
2057 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2058 (UV)flags, SvPVX_const(d));
2059 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2061 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2063 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2064 (UV)(r->lastparen));
2065 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2066 (UV)(r->lastcloseparen));
2067 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2069 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2070 (IV)(r->minlenret));
2071 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2073 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2074 (UV)(r->pre_prefix));
2075 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2077 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2078 (IV)(r->suboffset));
2079 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2080 (IV)(r->subcoffset));
2082 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2084 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2086 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2087 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf"\n",
2089 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2090 PTR2UV(r->mother_re));
2091 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2092 PTR2UV(r->paren_names));
2093 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2094 PTR2UV(r->substrs));
2095 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2096 PTR2UV(r->pprivate));
2097 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2099 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2100 PTR2UV(r->qr_anoncv));
2101 #ifdef PERL_OLD_COPY_ON_WRITE
2102 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2103 PTR2UV(r->saved_copy));
2112 Perl_sv_dump(pTHX_ SV *sv)
2116 PERL_ARGS_ASSERT_SV_DUMP;
2119 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2121 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2125 Perl_runops_debug(pTHX)
2129 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2133 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2136 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2137 PerlIO_printf(Perl_debug_log,
2138 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2139 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2140 PTR2UV(*PL_watchaddr));
2141 if (DEBUG_s_TEST_) {
2142 if (DEBUG_v_TEST_) {
2143 PerlIO_printf(Perl_debug_log, "\n");
2151 if (DEBUG_t_TEST_) debop(PL_op);
2152 if (DEBUG_P_TEST_) debprof(PL_op);
2155 OP_ENTRY_PROBE(OP_NAME(PL_op));
2156 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2157 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2164 Perl_debop(pTHX_ const OP *o)
2168 PERL_ARGS_ASSERT_DEBOP;
2170 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2173 Perl_deb(aTHX_ "%s", OP_NAME(o));
2174 switch (o->op_type) {
2177 /* With ITHREADS, consts are stored in the pad, and the right pad
2178 * may not be active here, so check.
2179 * Looks like only during compiling the pads are illegal.
2182 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2184 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2189 SV * const sv = newSV(0);
2191 /* FIXME - is this making unwarranted assumptions about the
2192 UTF-8 cleanliness of the dump file handle? */
2195 gv_fullname3(sv, cGVOPo_gv, NULL);
2196 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2200 PerlIO_printf(Perl_debug_log, "(NULL)");
2212 count = o->op_private & OPpPADRANGE_COUNTMASK;
2214 /* print the lexical's name */
2216 CV * const cv = deb_curcv(cxstack_ix);
2218 PAD * comppad = NULL;
2222 PADLIST * const padlist = CvPADLIST(cv);
2223 comppad = *PadlistARRAY(padlist);
2225 PerlIO_printf(Perl_debug_log, "(");
2226 for (i = 0; i < count; i++) {
2228 (sv = *av_fetch(comppad, o->op_targ + i, FALSE)))
2229 PerlIO_printf(Perl_debug_log, "%s", SvPV_nolen_const(sv));
2231 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2234 PerlIO_printf(Perl_debug_log, ",");
2236 PerlIO_printf(Perl_debug_log, ")");
2244 PerlIO_printf(Perl_debug_log, "\n");
2249 S_deb_curcv(pTHX_ const I32 ix)
2252 const PERL_CONTEXT * const cx = &cxstack[ix];
2253 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2254 return cx->blk_sub.cv;
2255 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2256 return cx->blk_eval.cv;
2257 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2262 return deb_curcv(ix - 1);
2266 Perl_watch(pTHX_ char **addr)
2270 PERL_ARGS_ASSERT_WATCH;
2272 PL_watchaddr = addr;
2274 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2275 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2279 S_debprof(pTHX_ const OP *o)
2283 PERL_ARGS_ASSERT_DEBPROF;
2285 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2287 if (!PL_profiledata)
2288 Newxz(PL_profiledata, MAXO, U32);
2289 ++PL_profiledata[o->op_type];
2293 Perl_debprofdump(pTHX)
2297 if (!PL_profiledata)
2299 for (i = 0; i < MAXO; i++) {
2300 if (PL_profiledata[i])
2301 PerlIO_printf(Perl_debug_log,
2302 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2309 * XML variants of most of the above routines
2313 S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2317 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2319 PerlIO_printf(file, "\n ");
2320 va_start(args, pat);
2321 xmldump_vindent(level, file, pat, &args);
2327 Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2330 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
2331 va_start(args, pat);
2332 xmldump_vindent(level, file, pat, &args);
2337 Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2339 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2341 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2342 PerlIO_vprintf(file, pat, *args);
2346 Perl_xmldump_all(pTHX)
2348 xmldump_all_perl(FALSE);
2352 Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
2354 PerlIO_setlinebuf(PL_xmlfp);
2356 op_xmldump(PL_main_root);
2357 /* someday we might call this, when it outputs XML: */
2358 /* xmldump_packsubs_perl(PL_defstash, justperl); */
2359 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2360 PerlIO_close(PL_xmlfp);
2365 Perl_xmldump_packsubs(pTHX_ const HV *stash)
2367 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
2368 xmldump_packsubs_perl(stash, FALSE);
2372 Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
2377 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
2379 if (!HvARRAY(stash))
2381 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2382 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
2383 GV *gv = MUTABLE_GV(HeVAL(entry));
2385 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2388 xmldump_sub_perl(gv, justperl);
2391 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2392 && (hv = GvHV(gv)) && hv != PL_defstash)
2393 xmldump_packsubs_perl(hv, justperl); /* nested package */
2399 Perl_xmldump_sub(pTHX_ const GV *gv)
2401 PERL_ARGS_ASSERT_XMLDUMP_SUB;
2402 xmldump_sub_perl(gv, FALSE);
2406 Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
2410 PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
2412 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
2415 sv = sv_newmortal();
2416 gv_fullname3(sv, gv, NULL);
2417 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2418 if (CvXSUB(GvCV(gv)))
2419 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2420 PTR2UV(CvXSUB(GvCV(gv))),
2421 (int)CvXSUBANY(GvCV(gv)).any_i32);
2422 else if (CvROOT(GvCV(gv)))
2423 op_xmldump(CvROOT(GvCV(gv)));
2425 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2429 Perl_xmldump_form(pTHX_ const GV *gv)
2431 SV * const sv = sv_newmortal();
2433 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2435 gv_fullname3(sv, gv, NULL);
2436 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2437 if (CvROOT(GvFORM(gv)))
2438 op_xmldump(CvROOT(GvFORM(gv)));
2440 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2444 Perl_xmldump_eval(pTHX)
2446 op_xmldump(PL_eval_root);
2450 Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2452 PERL_ARGS_ASSERT_SV_CATXMLSV;
2453 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2457 Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
2459 PERL_ARGS_ASSERT_SV_CATXMLPV;
2460 return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
2464 Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
2467 const char * const e = pv + len;
2468 const char * const start = pv;
2472 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2475 dsvcur = SvCUR(dsv); /* in case we have to restart */
2480 c = utf8_to_uvchr_buf((U8*)pv, (U8*)e, &cl);
2482 SvCUR(dsv) = dsvcur;
2547 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2550 sv_catpvs(dsv, "<");
2553 sv_catpvs(dsv, ">");
2556 sv_catpvs(dsv, "&");
2559 sv_catpvs(dsv, """);
2563 if (c < 32 || c > 127) {
2564 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2567 const char string = (char) c;
2568 sv_catpvn(dsv, &string, 1);
2572 if ((c >= 0xD800 && c <= 0xDB7F) ||
2573 (c >= 0xDC00 && c <= 0xDFFF) ||
2574 (c >= 0xFFF0 && c <= 0xFFFF) ||
2576 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2578 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2591 Perl_sv_xmlpeek(pTHX_ SV *sv)
2593 SV * const t = sv_newmortal();
2597 PERL_ARGS_ASSERT_SV_XMLPEEK;
2603 sv_catpv(t, "VOID=\"\"");
2606 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
2607 sv_catpv(t, "WILD=\"\"");
2610 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2611 if (sv == &PL_sv_undef) {
2612 sv_catpv(t, "SV_UNDEF=\"1\"");
2613 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2614 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2618 else if (sv == &PL_sv_no) {
2619 sv_catpv(t, "SV_NO=\"1\"");
2620 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2621 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2622 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2623 SVp_POK|SVp_NOK)) &&
2628 else if (sv == &PL_sv_yes) {
2629 sv_catpv(t, "SV_YES=\"1\"");
2630 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2631 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2632 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2633 SVp_POK|SVp_NOK)) &&
2635 SvPVX(sv) && *SvPVX(sv) == '1' &&
2640 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2641 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2642 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2646 sv_catpv(t, " XXX=\"\" ");
2648 else if (SvREFCNT(sv) == 0) {
2649 sv_catpv(t, " refcnt=\"0\"");
2652 else if (DEBUG_R_TEST_) {
2655 /* is this SV on the tmps stack? */
2656 for (ix=PL_tmps_ix; ix>=0; ix--) {
2657 if (PL_tmps_stack[ix] == sv) {
2662 if (SvREFCNT(sv) > 1)
2663 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2666 sv_catpv(t, " DRT=\"<T>\"");
2670 sv_catpv(t, " ROK=\"\"");
2672 switch (SvTYPE(sv)) {
2674 sv_catpv(t, " FREED=\"1\"");
2678 sv_catpv(t, " UNDEF=\"1\"");
2681 sv_catpv(t, " IV=\"");
2684 sv_catpv(t, " NV=\"");
2687 sv_catpv(t, " PV=\"");
2690 sv_catpv(t, " PVIV=\"");
2693 sv_catpv(t, " PVNV=\"");
2696 sv_catpv(t, " PVMG=\"");
2699 sv_catpv(t, " PVLV=\"");
2702 sv_catpv(t, " AV=\"");
2705 sv_catpv(t, " HV=\"");
2709 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2711 sv_catpv(t, " CV=\"()\"");
2714 sv_catpv(t, " GV=\"");
2717 sv_catpv(t, " BIND=\"");
2720 sv_catpv(t, " REGEXP=\"");
2723 sv_catpv(t, " FM=\"");
2726 sv_catpv(t, " IO=\"");
2735 else if (SvNOKp(sv)) {
2736 STORE_NUMERIC_LOCAL_SET_STANDARD();
2737 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2738 RESTORE_NUMERIC_LOCAL();
2740 else if (SvIOKp(sv)) {
2742 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2744 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2753 return SvPV(t, n_a);
2757 Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2759 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2762 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2765 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2768 REGEXP *const r = PM_GETRE(pm);
2769 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
2770 sv_catxmlsv(tmpsv, MUTABLE_SV(r));
2771 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2773 SvREFCNT_dec(tmpsv);
2774 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2775 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2778 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
2779 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
2780 SV * const tmpsv = pm_description(pm);
2781 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2782 SvREFCNT_dec(tmpsv);
2786 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
2787 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2788 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
2789 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
2790 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2791 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2794 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2798 Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2800 do_pmop_xmldump(0, PL_xmlfp, pm);
2804 Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2809 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2813 seq = sequence_num(o);
2814 Perl_xmldump_indent(aTHX_ level, file,
2815 "<op_%s seq=\"%"UVuf" -> ",
2820 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2821 sequence_num(o->op_next));
2823 PerlIO_printf(file, "DONE\"");
2826 if (o->op_type == OP_NULL)
2828 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2829 if (o->op_targ == OP_NEXTSTATE)
2832 PerlIO_printf(file, " line=\"%"UVuf"\"",
2833 (UV)CopLINE(cCOPo));
2834 if (CopSTASHPV(cCOPo))
2835 PerlIO_printf(file, " package=\"%s\"",
2837 if (CopLABEL(cCOPo))
2838 PerlIO_printf(file, " label=\"%s\"",
2843 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2846 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2849 SV * const tmpsv = newSVpvs("");
2850 switch (o->op_flags & OPf_WANT) {
2852 sv_catpv(tmpsv, ",VOID");
2854 case OPf_WANT_SCALAR:
2855 sv_catpv(tmpsv, ",SCALAR");
2858 sv_catpv(tmpsv, ",LIST");
2861 sv_catpv(tmpsv, ",UNKNOWN");
2864 if (o->op_flags & OPf_KIDS)
2865 sv_catpv(tmpsv, ",KIDS");
2866 if (o->op_flags & OPf_PARENS)
2867 sv_catpv(tmpsv, ",PARENS");
2868 if (o->op_flags & OPf_STACKED)
2869 sv_catpv(tmpsv, ",STACKED");
2870 if (o->op_flags & OPf_REF)
2871 sv_catpv(tmpsv, ",REF");
2872 if (o->op_flags & OPf_MOD)
2873 sv_catpv(tmpsv, ",MOD");
2874 if (o->op_flags & OPf_SPECIAL)
2875 sv_catpv(tmpsv, ",SPECIAL");
2876 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2877 SvREFCNT_dec(tmpsv);
2879 if (o->op_private) {
2880 SV * const tmpsv = newSVpvs("");
2881 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2882 if (o->op_private & OPpTARGET_MY)
2883 sv_catpv(tmpsv, ",TARGET_MY");
2885 else if (o->op_type == OP_LEAVESUB ||
2886 o->op_type == OP_LEAVE ||
2887 o->op_type == OP_LEAVESUBLV ||
2888 o->op_type == OP_LEAVEWRITE) {
2889 if (o->op_private & OPpREFCOUNTED)
2890 sv_catpv(tmpsv, ",REFCOUNTED");
2892 else if (o->op_type == OP_AASSIGN) {
2893 if (o->op_private & OPpASSIGN_COMMON)
2894 sv_catpv(tmpsv, ",COMMON");
2896 else if (o->op_type == OP_SASSIGN) {
2897 if (o->op_private & OPpASSIGN_BACKWARDS)
2898 sv_catpv(tmpsv, ",BACKWARDS");
2900 else if (o->op_type == OP_TRANS) {
2901 if (o->op_private & OPpTRANS_SQUASH)
2902 sv_catpv(tmpsv, ",SQUASH");
2903 if (o->op_private & OPpTRANS_DELETE)
2904 sv_catpv(tmpsv, ",DELETE");
2905 if (o->op_private & OPpTRANS_COMPLEMENT)
2906 sv_catpv(tmpsv, ",COMPLEMENT");
2907 if (o->op_private & OPpTRANS_IDENTICAL)
2908 sv_catpv(tmpsv, ",IDENTICAL");
2909 if (o->op_private & OPpTRANS_GROWS)
2910 sv_catpv(tmpsv, ",GROWS");
2912 else if (o->op_type == OP_REPEAT) {
2913 if (o->op_private & OPpREPEAT_DOLIST)
2914 sv_catpv(tmpsv, ",DOLIST");
2916 else if (o->op_type == OP_ENTERSUB ||
2917 o->op_type == OP_RV2SV ||
2918 o->op_type == OP_GVSV ||
2919 o->op_type == OP_RV2AV ||
2920 o->op_type == OP_RV2HV ||
2921 o->op_type == OP_RV2GV ||
2922 o->op_type == OP_AELEM ||
2923 o->op_type == OP_HELEM )
2925 if (o->op_type == OP_ENTERSUB) {
2926 if (o->op_private & OPpENTERSUB_AMPER)
2927 sv_catpv(tmpsv, ",AMPER");
2928 if (o->op_private & OPpENTERSUB_DB)
2929 sv_catpv(tmpsv, ",DB");
2930 if (o->op_private & OPpENTERSUB_HASTARG)
2931 sv_catpv(tmpsv, ",HASTARG");
2932 if (o->op_private & OPpENTERSUB_NOPAREN)
2933 sv_catpv(tmpsv, ",NOPAREN");
2934 if (o->op_private & OPpENTERSUB_INARGS)
2935 sv_catpv(tmpsv, ",INARGS");
2938 switch (o->op_private & OPpDEREF) {
2940 sv_catpv(tmpsv, ",SV");
2943 sv_catpv(tmpsv, ",AV");
2946 sv_catpv(tmpsv, ",HV");
2949 if (o->op_private & OPpMAYBE_LVSUB)
2950 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2952 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2953 if (o->op_private & OPpLVAL_DEFER)
2954 sv_catpv(tmpsv, ",LVAL_DEFER");
2957 if (o->op_private & HINT_STRICT_REFS)
2958 sv_catpv(tmpsv, ",STRICT_REFS");
2959 if (o->op_private & OPpOUR_INTRO)
2960 sv_catpv(tmpsv, ",OUR_INTRO");
2963 else if (o->op_type == OP_CONST) {
2964 if (o->op_private & OPpCONST_BARE)
2965 sv_catpv(tmpsv, ",BARE");
2966 if (o->op_private & OPpCONST_STRICT)
2967 sv_catpv(tmpsv, ",STRICT");
2968 if (o->op_private & OPpCONST_ENTERED)
2969 sv_catpv(tmpsv, ",ENTERED");
2970 if (o->op_private & OPpCONST_FOLDED)
2971 sv_catpv(tmpsv, ",FOLDED");
2973 else if (o->op_type == OP_FLIP) {
2974 if (o->op_private & OPpFLIP_LINENUM)
2975 sv_catpv(tmpsv, ",LINENUM");
2977 else if (o->op_type == OP_FLOP) {
2978 if (o->op_private & OPpFLIP_LINENUM)
2979 sv_catpv(tmpsv, ",LINENUM");
2981 else if (o->op_type == OP_RV2CV) {
2982 if (o->op_private & OPpLVAL_INTRO)
2983 sv_catpv(tmpsv, ",INTRO");
2985 else if (o->op_type == OP_GV) {
2986 if (o->op_private & OPpEARLY_CV)
2987 sv_catpv(tmpsv, ",EARLY_CV");
2989 else if (o->op_type == OP_LIST) {
2990 if (o->op_private & OPpLIST_GUESSED)
2991 sv_catpv(tmpsv, ",GUESSED");
2993 else if (o->op_type == OP_DELETE) {
2994 if (o->op_private & OPpSLICE)
2995 sv_catpv(tmpsv, ",SLICE");
2997 else if (o->op_type == OP_EXISTS) {
2998 if (o->op_private & OPpEXISTS_SUB)
2999 sv_catpv(tmpsv, ",EXISTS_SUB");
3001 else if (o->op_type == OP_SORT) {
3002 if (o->op_private & OPpSORT_NUMERIC)
3003 sv_catpv(tmpsv, ",NUMERIC");
3004 if (o->op_private & OPpSORT_INTEGER)
3005 sv_catpv(tmpsv, ",INTEGER");
3006 if (o->op_private & OPpSORT_REVERSE)
3007 sv_catpv(tmpsv, ",REVERSE");
3009 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
3010 if (o->op_private & OPpOPEN_IN_RAW)
3011 sv_catpv(tmpsv, ",IN_RAW");
3012 if (o->op_private & OPpOPEN_IN_CRLF)
3013 sv_catpv(tmpsv, ",IN_CRLF");
3014 if (o->op_private & OPpOPEN_OUT_RAW)
3015 sv_catpv(tmpsv, ",OUT_RAW");
3016 if (o->op_private & OPpOPEN_OUT_CRLF)
3017 sv_catpv(tmpsv, ",OUT_CRLF");
3019 else if (o->op_type == OP_EXIT) {
3020 if (o->op_private & OPpEXIT_VMSISH)
3021 sv_catpv(tmpsv, ",EXIT_VMSISH");
3022 if (o->op_private & OPpHUSH_VMSISH)
3023 sv_catpv(tmpsv, ",HUSH_VMSISH");
3025 else if (o->op_type == OP_DIE) {
3026 if (o->op_private & OPpHUSH_VMSISH)
3027 sv_catpv(tmpsv, ",HUSH_VMSISH");
3029 else if (PL_check[o->op_type] != Perl_ck_ftst) {
3030 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
3031 sv_catpv(tmpsv, ",FT_ACCESS");
3032 if (o->op_private & OPpFT_STACKED)
3033 sv_catpv(tmpsv, ",FT_STACKED");
3035 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
3036 sv_catpv(tmpsv, ",INTRO");
3038 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
3039 SvREFCNT_dec(tmpsv);
3042 switch (o->op_type) {
3044 if (o->op_flags & OPf_SPECIAL) {
3050 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
3052 if (cSVOPo->op_sv) {
3053 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
3054 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
3060 gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
3061 s = SvPV(tmpsv1,len);
3062 sv_catxmlpvn(tmpsv2, s, len, 1);
3063 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
3067 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
3072 case OP_METHOD_NAMED:
3073 #ifndef USE_ITHREADS
3074 /* with ITHREADS, consts are stored in the pad, and the right pad
3075 * may not be active here, so skip */
3076 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
3082 PerlIO_printf(file, ">\n");
3084 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
3089 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
3090 (UV)CopLINE(cCOPo));
3091 if (CopSTASHPV(cCOPo))
3092 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
3094 if (CopLABEL(cCOPo))
3095 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
3099 S_xmldump_attr(aTHX_ level, file, "redo=\"");
3100 if (cLOOPo->op_redoop)
3101 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
3103 PerlIO_printf(file, "DONE\"");
3104 S_xmldump_attr(aTHX_ level, file, "next=\"");
3105 if (cLOOPo->op_nextop)
3106 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
3108 PerlIO_printf(file, "DONE\"");
3109 S_xmldump_attr(aTHX_ level, file, "last=\"");
3110 if (cLOOPo->op_lastop)
3111 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
3113 PerlIO_printf(file, "DONE\"");
3121 S_xmldump_attr(aTHX_ level, file, "other=\"");
3122 if (cLOGOPo->op_other)
3123 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
3125 PerlIO_printf(file, "DONE\"");
3133 if (o->op_private & OPpREFCOUNTED)
3134 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
3140 if (PL_madskills && o->op_madprop) {
3141 char prevkey = '\0';
3142 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
3143 const MADPROP* mp = o->op_madprop;
3147 PerlIO_printf(file, ">\n");
3149 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
3152 char tmp = mp->mad_key;
3153 sv_setpvs(tmpsv,"\"");
3155 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
3156 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
3157 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
3160 sv_catpv(tmpsv, "\"");
3161 switch (mp->mad_type) {
3163 sv_catpv(tmpsv, "NULL");
3164 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
3167 sv_catpv(tmpsv, " val=\"");
3168 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
3169 sv_catpv(tmpsv, "\"");
3170 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
3173 sv_catpv(tmpsv, " val=\"");
3174 sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
3175 sv_catpv(tmpsv, "\"");
3176 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
3179 if ((OP*)mp->mad_val) {
3180 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
3181 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
3182 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
3186 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
3192 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
3194 SvREFCNT_dec(tmpsv);
3197 switch (o->op_type) {
3204 PerlIO_printf(file, ">\n");
3206 do_pmop_xmldump(level, file, cPMOPo);
3212 if (o->op_flags & OPf_KIDS) {
3216 PerlIO_printf(file, ">\n");
3218 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3219 do_op_xmldump(level, file, kid);
3223 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3225 PerlIO_printf(file, " />\n");
3229 Perl_op_xmldump(pTHX_ const OP *o)
3231 PERL_ARGS_ASSERT_OP_XMLDUMP;
3233 do_op_xmldump(0, PL_xmlfp, o);
3239 * c-indentation-style: bsd
3241 * indent-tabs-mode: nil
3244 * ex: set ts=8 sts=4 sw=4 et: