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.
24 =head1 Display and Dump functions
28 #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))
89 #define generic_pv_escape(sv,s,len,utf8) pv_escape( (sv), (s), (len), \
90 (len) * (4+UTF8_MAXBYTES) + 1, NULL, \
91 PERL_PV_ESCAPE_NONASCII | PERL_PV_ESCAPE_DWIM \
92 | ((utf8) ? PERL_PV_ESCAPE_UNI : 0) )
97 Escapes at most the first C<count> chars of C<pv> and puts the results into
98 C<dsv> such that the size of the escaped string will not exceed C<max> chars
99 and will not contain any incomplete escape sequences. The number of bytes
100 escaped will be returned in the C<STRLEN *escaped> parameter if it is not null.
101 When the C<dsv> parameter is null no escaping actually occurs, but the number
102 of bytes that would be escaped were it not null will be calculated.
104 If flags contains C<PERL_PV_ESCAPE_QUOTE> then any double quotes in the string
105 will also be escaped.
107 Normally the SV will be cleared before the escaped string is prepared,
108 but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
110 If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
111 if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
112 using C<is_utf8_string()> to determine if it is UTF-8.
114 If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
115 using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> is set, only
116 non-ASCII chars will be escaped using this style; otherwise, only chars above
117 255 will be so escaped; other non printable chars will use octal or
118 common escaped patterns like C<\n>.
119 Otherwise, if C<PERL_PV_ESCAPE_NOBACKSLASH>
120 then all chars below 255 will be treated as printable and
121 will be output as literals.
123 If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
124 string will be escaped, regardless of max. If the output is to be in hex,
125 then it will be returned as a plain hex
126 sequence. Thus the output will either be a single char,
127 an octal escape sequence, a special escape like C<\n> or a hex value.
129 If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a C<"%"> and
130 not a C<"\\">. This is because regexes very often contain backslashed
131 sequences, whereas C<"%"> is not a particularly common character in patterns.
133 Returns a pointer to the escaped text as held by C<dsv>.
137 #define PV_ESCAPE_OCTBUFSIZE 32
140 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
141 const STRLEN count, const STRLEN max,
142 STRLEN * const escaped, const U32 flags )
144 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
145 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
146 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
147 STRLEN wrote = 0; /* chars written so far */
148 STRLEN chsize = 0; /* size of data to be written */
149 STRLEN readsize = 1; /* size of data just read */
150 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
151 const char *pv = str;
152 const char * const end = pv + count; /* end of string */
155 PERL_ARGS_ASSERT_PV_ESCAPE;
157 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
158 /* This won't alter the UTF-8 flag */
162 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
165 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
166 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
167 const U8 c = (U8)u & 0xFF;
170 || (flags & PERL_PV_ESCAPE_ALL)
171 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
173 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
174 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
177 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
178 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
180 : "%cx{%02"UVxf"}", esc, u);
182 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
185 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
189 case '\\' : /* FALLTHROUGH */
190 case '%' : if ( c == esc ) {
196 case '\v' : octbuf[1] = 'v'; break;
197 case '\t' : octbuf[1] = 't'; break;
198 case '\r' : octbuf[1] = 'r'; break;
199 case '\n' : octbuf[1] = 'n'; break;
200 case '\f' : octbuf[1] = 'f'; break;
208 if ( (flags & PERL_PV_ESCAPE_DWIM) && c != '\0' ) {
209 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
210 isuni ? "%cx{%02"UVxf"}" : "%cx%02"UVxf,
213 else if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
214 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
217 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
224 if ( max && (wrote + chsize > max) ) {
226 } else if (chsize > 1) {
228 sv_catpvn(dsv, octbuf, chsize);
231 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
232 can be appended raw to the dsv. If dsv happens to be
233 UTF-8 then we need catpvf to upgrade them for us.
234 Or add a new API call sv_catpvc(). Think about that name, and
235 how to keep it clear that it's unlike the s of catpvs, which is
236 really an array of octets, not a string. */
238 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
241 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
246 return dsv ? SvPVX(dsv) : NULL;
249 =for apidoc pv_pretty
251 Converts a string into something presentable, handling escaping via
252 C<pv_escape()> and supporting quoting and ellipses.
254 If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
255 double quoted with any double quotes in the string escaped. Otherwise
256 if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
259 If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
260 string were output then an ellipsis C<...> will be appended to the
261 string. Note that this happens AFTER it has been quoted.
263 If C<start_color> is non-null then it will be inserted after the opening
264 quote (if there is one) but before the escaped text. If C<end_color>
265 is non-null then it will be inserted after the escaped text but before
266 any quotes or ellipses.
268 Returns a pointer to the prettified text as held by C<dsv>.
274 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
275 const STRLEN max, char const * const start_color, char const * const end_color,
278 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
279 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
281 STRLEN max_adjust= 0;
284 PERL_ARGS_ASSERT_PV_PRETTY;
286 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
287 /* This won't alter the UTF-8 flag */
290 orig_cur= SvCUR(dsv);
293 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
295 if ( start_color != NULL )
296 sv_catpv(dsv, start_color);
298 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
301 assert(max > max_adjust);
302 pv_escape( NULL, str, count, max - max_adjust, &escaped, flags );
303 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
305 assert(max > max_adjust);
308 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
310 if ( end_color != NULL )
311 sv_catpv(dsv, end_color);
314 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
316 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
317 sv_catpvs(dsv, "...");
319 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
320 while( SvCUR(dsv) - orig_cur < max )
328 =for apidoc pv_display
332 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
334 except that an additional "\0" will be appended to the string when
335 len > cur and pv[cur] is "\0".
337 Note that the final string may be up to 7 chars longer than pvlim.
343 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
345 PERL_ARGS_ASSERT_PV_DISPLAY;
347 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
348 if (len > cur && pv[cur] == '\0')
349 sv_catpvs( dsv, "\\0");
354 Perl_sv_peek(pTHX_ SV *sv)
357 SV * const t = sv_newmortal();
367 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
368 /* detect data corruption under memory poisoning */
372 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
373 if (sv == &PL_sv_undef) {
374 sv_catpv(t, "SV_UNDEF");
375 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
376 SVs_GMG|SVs_SMG|SVs_RMG)) &&
380 else if (sv == &PL_sv_no) {
381 sv_catpv(t, "SV_NO");
382 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
383 SVs_GMG|SVs_SMG|SVs_RMG)) &&
384 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
390 else if (sv == &PL_sv_yes) {
391 sv_catpv(t, "SV_YES");
392 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
393 SVs_GMG|SVs_SMG|SVs_RMG)) &&
394 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
397 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
402 sv_catpv(t, "SV_PLACEHOLDER");
403 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
404 SVs_GMG|SVs_SMG|SVs_RMG)) &&
410 else if (SvREFCNT(sv) == 0) {
414 else if (DEBUG_R_TEST_) {
417 /* is this SV on the tmps stack? */
418 for (ix=PL_tmps_ix; ix>=0; ix--) {
419 if (PL_tmps_stack[ix] == sv) {
424 if (is_tmp || SvREFCNT(sv) > 1) {
425 Perl_sv_catpvf(aTHX_ t, "<");
426 if (SvREFCNT(sv) > 1)
427 Perl_sv_catpvf(aTHX_ t, "%"UVuf, (UV)SvREFCNT(sv));
429 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
430 Perl_sv_catpvf(aTHX_ t, ">");
436 if (SvCUR(t) + unref > 10) {
437 SvCUR_set(t, unref + 3);
446 if (type == SVt_PVCV) {
447 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
449 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
450 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
453 } else if (type < SVt_LAST) {
454 sv_catpv(t, svshorttypenames[type]);
456 if (type == SVt_NULL)
459 sv_catpv(t, "FREED");
464 if (!SvPVX_const(sv))
465 sv_catpv(t, "(null)");
467 SV * const tmp = newSVpvs("");
471 SvOOK_offset(sv, delta);
472 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
474 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
476 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
477 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
479 SvREFCNT_dec_NN(tmp);
482 else if (SvNOKp(sv)) {
483 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
484 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
485 RESTORE_LC_NUMERIC_UNDERLYING();
487 else if (SvIOKp(sv)) {
489 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
491 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
499 if (TAINTING_get && sv && SvTAINTED(sv))
500 sv_catpv(t, " [tainted]");
501 return SvPV_nolen(t);
505 =head1 Debugging Utilities
509 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
512 PERL_ARGS_ASSERT_DUMP_INDENT;
514 dump_vindent(level, file, pat, &args);
519 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
521 PERL_ARGS_ASSERT_DUMP_VINDENT;
522 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
523 PerlIO_vprintf(file, pat, *args);
529 Dumps the entire optree of the current program starting at C<PL_main_root> to
530 C<STDERR>. Also dumps the optrees for all visible subroutines in
539 dump_all_perl(FALSE);
543 Perl_dump_all_perl(pTHX_ bool justperl)
545 PerlIO_setlinebuf(Perl_debug_log);
547 op_dump(PL_main_root);
548 dump_packsubs_perl(PL_defstash, justperl);
552 =for apidoc dump_packsubs
554 Dumps the optrees for all visible subroutines in C<stash>.
560 Perl_dump_packsubs(pTHX_ const HV *stash)
562 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
563 dump_packsubs_perl(stash, FALSE);
567 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
571 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
575 for (i = 0; i <= (I32) HvMAX(stash); i++) {
577 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
578 GV * gv = (GV *)HeVAL(entry);
579 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
580 /* unfake a fake GV */
581 (void)CvGV(SvRV(gv));
582 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
585 dump_sub_perl(gv, justperl);
588 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
589 const HV * const hv = GvHV(gv);
590 if (hv && (hv != PL_defstash))
591 dump_packsubs_perl(hv, justperl); /* nested package */
598 Perl_dump_sub(pTHX_ const GV *gv)
600 PERL_ARGS_ASSERT_DUMP_SUB;
601 dump_sub_perl(gv, FALSE);
605 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
608 SV * const sv = newSVpvs_flags("", SVs_TEMP);
612 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
614 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
617 tmpsv = newSVpvs_flags("", SVs_TEMP);
618 gv_fullname3(sv, gv, NULL);
619 name = SvPV_const(sv, len);
620 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
621 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
622 if (CvISXSUB(GvCV(gv)))
623 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
624 PTR2UV(CvXSUB(GvCV(gv))),
625 (int)CvXSUBANY(GvCV(gv)).any_i32);
626 else if (CvROOT(GvCV(gv)))
627 op_dump(CvROOT(GvCV(gv)));
629 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
633 Perl_dump_form(pTHX_ const GV *gv)
635 SV * const sv = sv_newmortal();
637 PERL_ARGS_ASSERT_DUMP_FORM;
639 gv_fullname3(sv, gv, NULL);
640 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
641 if (CvROOT(GvFORM(gv)))
642 op_dump(CvROOT(GvFORM(gv)));
644 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
650 op_dump(PL_eval_root);
654 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
658 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
661 Perl_dump_indent(aTHX_ level, file, "{}\n");
664 Perl_dump_indent(aTHX_ level, file, "{\n");
666 if (pm->op_pmflags & PMf_ONCE)
671 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%.*s%c%s\n",
672 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch,
673 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
675 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
677 if (pm->op_type == OP_SPLIT)
678 Perl_dump_indent(aTHX_ level, file, "TARGOFF/GV = 0x%"UVxf"\n",
679 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
681 if (pm->op_pmreplrootu.op_pmreplroot) {
682 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
683 op_dump(pm->op_pmreplrootu.op_pmreplroot);
687 if (pm->op_code_list) {
688 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
689 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
690 do_op_dump(level, file, pm->op_code_list);
693 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
694 PTR2UV(pm->op_code_list));
696 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
697 SV * const tmpsv = pm_description(pm);
698 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
699 SvREFCNT_dec_NN(tmpsv);
702 Perl_dump_indent(aTHX_ level-1, file, "}\n");
705 const struct flag_to_name pmflags_flags_names[] = {
706 {PMf_CONST, ",CONST"},
708 {PMf_GLOBAL, ",GLOBAL"},
709 {PMf_CONTINUE, ",CONTINUE"},
710 {PMf_RETAINT, ",RETAINT"},
712 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
713 {PMf_HAS_CV, ",HAS_CV"},
714 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
715 {PMf_IS_QR, ",IS_QR"}
719 S_pm_description(pTHX_ const PMOP *pm)
721 SV * const desc = newSVpvs("");
722 const REGEXP * const regex = PM_GETRE(pm);
723 const U32 pmflags = pm->op_pmflags;
725 PERL_ARGS_ASSERT_PM_DESCRIPTION;
727 if (pmflags & PMf_ONCE)
728 sv_catpv(desc, ",ONCE");
730 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
731 sv_catpv(desc, ":USED");
733 if (pmflags & PMf_USED)
734 sv_catpv(desc, ":USED");
738 if (RX_ISTAINTED(regex))
739 sv_catpv(desc, ",TAINTED");
740 if (RX_CHECK_SUBSTR(regex)) {
741 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
742 sv_catpv(desc, ",SCANFIRST");
743 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
744 sv_catpv(desc, ",ALL");
746 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
747 sv_catpv(desc, ",SKIPWHITE");
750 append_flags(desc, pmflags, pmflags_flags_names);
755 Perl_pmop_dump(pTHX_ PMOP *pm)
757 do_pmop_dump(0, Perl_debug_log, pm);
760 /* Return a unique integer to represent the address of op o.
761 * If it already exists in PL_op_sequence, just return it;
763 * *** Note that this isn't thread-safe */
766 S_sequence_num(pTHX_ const OP *o)
775 op = newSVuv(PTR2UV(o));
777 key = SvPV_const(op, len);
779 PL_op_sequence = newHV();
780 seq = hv_fetch(PL_op_sequence, key, len, 0);
783 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
791 const struct flag_to_name op_flags_names[] = {
793 {OPf_PARENS, ",PARENS"},
796 {OPf_STACKED, ",STACKED"},
797 {OPf_SPECIAL, ",SPECIAL"}
802 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
805 const OPCODE optype = o->op_type;
807 PERL_ARGS_ASSERT_DO_OP_DUMP;
809 Perl_dump_indent(aTHX_ level, file, "{\n");
811 seq = sequence_num(o);
813 PerlIO_printf(file, "%-4"UVuf, seq);
815 PerlIO_printf(file, "????");
817 "%*sTYPE = %s ===> ",
818 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
821 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
822 sequence_num(o->op_next));
824 PerlIO_printf(file, "NULL\n");
826 if (optype == OP_NULL) {
827 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
830 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
833 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
836 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
837 SV * const tmpsv = newSVpvs("");
838 switch (o->op_flags & OPf_WANT) {
840 sv_catpv(tmpsv, ",VOID");
842 case OPf_WANT_SCALAR:
843 sv_catpv(tmpsv, ",SCALAR");
846 sv_catpv(tmpsv, ",LIST");
849 sv_catpv(tmpsv, ",UNKNOWN");
852 append_flags(tmpsv, o->op_flags, op_flags_names);
853 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
854 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
855 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
856 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
857 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
858 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
859 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
863 U16 oppriv = o->op_private;
864 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
869 tmpsv = newSVpvs("");
870 for (; !stop; op_ix++) {
871 U16 entry = PL_op_private_bitdefs[op_ix];
872 U16 bit = (entry >> 2) & 7;
879 I16 const *p = &PL_op_private_bitfields[ix];
880 U16 bitmin = (U16) *p++;
887 for (i = bitmin; i<= bit; i++)
890 val = (oppriv & mask);
893 && PL_op_private_labels[label] == '-'
894 && PL_op_private_labels[label+1] == '\0'
896 /* display as raw number */
909 if (val == 0 && enum_label == -1)
910 /* don't display anonymous zero values */
913 sv_catpv(tmpsv, ",");
915 sv_catpv(tmpsv, &PL_op_private_labels[label]);
916 sv_catpv(tmpsv, "=");
918 if (enum_label == -1)
919 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)val);
921 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
926 if ( oppriv & (1<<bit)
927 && !(PL_op_private_labels[ix] == '-'
928 && PL_op_private_labels[ix+1] == '\0'))
931 sv_catpv(tmpsv, ",");
932 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
937 sv_catpv(tmpsv, ",");
938 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)oppriv);
941 if (tmpsv && SvCUR(tmpsv)) {
942 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
944 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
953 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
955 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
959 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
960 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
961 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
962 name = SvPV_const(tmpsv, len);
963 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
964 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
967 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
974 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
975 UV i, count = items[-1].uv;
977 Perl_dump_indent(aTHX_ level, file, "ARGS = \n");
978 for (i=0; i < count; i++)
979 Perl_dump_indent(aTHX_ level+1, file, "%"UVuf" => 0x%"UVxf"\n",
986 case OP_METHOD_NAMED:
987 case OP_METHOD_SUPER:
988 case OP_METHOD_REDIR:
989 case OP_METHOD_REDIR_SUPER:
991 /* with ITHREADS, consts are stored in the pad, and the right pad
992 * may not be active here, so skip */
993 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cMETHOPx_meth(o)));
997 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1003 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1004 (UV)CopLINE(cCOPo));
1005 if (CopSTASHPV(cCOPo)) {
1006 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1007 HV *stash = CopSTASH(cCOPo);
1008 const char * const hvname = HvNAME_get(stash);
1010 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1011 generic_pv_escape(tmpsv, hvname,
1012 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1014 if (CopLABEL(cCOPo)) {
1015 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1018 const char *label = CopLABEL_len_flags(cCOPo,
1019 &label_len, &label_flags);
1020 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1021 generic_pv_escape( tmpsv, label, label_len,
1022 (label_flags & SVf_UTF8)));
1024 Perl_dump_indent(aTHX_ level, file, "SEQ = %u\n",
1025 (unsigned int)cCOPo->cop_seq);
1028 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1029 if (cLOOPo->op_redoop)
1030 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1032 PerlIO_printf(file, "DONE\n");
1033 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1034 if (cLOOPo->op_nextop)
1035 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1037 PerlIO_printf(file, "DONE\n");
1038 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1039 if (cLOOPo->op_lastop)
1040 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1042 PerlIO_printf(file, "DONE\n");
1050 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1051 if (cLOGOPo->op_other)
1052 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1054 PerlIO_printf(file, "DONE\n");
1060 do_pmop_dump(level, file, cPMOPo);
1068 if (o->op_private & OPpREFCOUNTED)
1069 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1074 if (o->op_flags & OPf_KIDS) {
1076 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1077 do_op_dump(level, file, kid);
1079 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1085 Dumps the optree starting at OP C<o> to C<STDERR>.
1091 Perl_op_dump(pTHX_ const OP *o)
1093 PERL_ARGS_ASSERT_OP_DUMP;
1094 do_op_dump(0, Perl_debug_log, o);
1098 Perl_gv_dump(pTHX_ GV *gv)
1102 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1105 PerlIO_printf(Perl_debug_log, "{}\n");
1108 sv = sv_newmortal();
1109 PerlIO_printf(Perl_debug_log, "{\n");
1110 gv_fullname3(sv, gv, NULL);
1111 name = SvPV_const(sv, len);
1112 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1113 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1114 if (gv != GvEGV(gv)) {
1115 gv_efullname3(sv, GvEGV(gv), NULL);
1116 name = SvPV_const(sv, len);
1117 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1118 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1120 (void)PerlIO_putc(Perl_debug_log, '\n');
1121 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1125 /* map magic types to the symbolic names
1126 * (with the PERL_MAGIC_ prefixed stripped)
1129 static const struct { const char type; const char *name; } magic_names[] = {
1130 #include "mg_names.inc"
1131 /* this null string terminates the list */
1136 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1138 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1140 for (; mg; mg = mg->mg_moremagic) {
1141 Perl_dump_indent(aTHX_ level, file,
1142 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1143 if (mg->mg_virtual) {
1144 const MGVTBL * const v = mg->mg_virtual;
1145 if (v >= PL_magic_vtables
1146 && v < PL_magic_vtables + magic_vtable_max) {
1147 const U32 i = v - PL_magic_vtables;
1148 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1151 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1154 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1157 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1161 const char *name = NULL;
1162 for (n = 0; magic_names[n].name; n++) {
1163 if (mg->mg_type == magic_names[n].type) {
1164 name = magic_names[n].name;
1169 Perl_dump_indent(aTHX_ level, file,
1170 " MG_TYPE = PERL_MAGIC_%s\n", name);
1172 Perl_dump_indent(aTHX_ level, file,
1173 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1177 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1178 if (mg->mg_type == PERL_MAGIC_envelem &&
1179 mg->mg_flags & MGf_TAINTEDDIR)
1180 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1181 if (mg->mg_type == PERL_MAGIC_regex_global &&
1182 mg->mg_flags & MGf_MINMATCH)
1183 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1184 if (mg->mg_flags & MGf_REFCOUNTED)
1185 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1186 if (mg->mg_flags & MGf_GSKIP)
1187 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1188 if (mg->mg_flags & MGf_COPY)
1189 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1190 if (mg->mg_flags & MGf_DUP)
1191 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1192 if (mg->mg_flags & MGf_LOCAL)
1193 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1194 if (mg->mg_type == PERL_MAGIC_regex_global &&
1195 mg->mg_flags & MGf_BYTES)
1196 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1199 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1200 PTR2UV(mg->mg_obj));
1201 if (mg->mg_type == PERL_MAGIC_qr) {
1202 REGEXP* const re = (REGEXP *)mg->mg_obj;
1203 SV * const dsv = sv_newmortal();
1204 const char * const s
1205 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1207 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1208 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1210 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1211 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1214 if (mg->mg_flags & MGf_REFCOUNTED)
1215 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1218 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1220 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1221 if (mg->mg_len >= 0) {
1222 if (mg->mg_type != PERL_MAGIC_utf8) {
1223 SV * const sv = newSVpvs("");
1224 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1225 SvREFCNT_dec_NN(sv);
1228 else if (mg->mg_len == HEf_SVKEY) {
1229 PerlIO_puts(file, " => HEf_SVKEY\n");
1230 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1231 maxnest, dumpops, pvlim); /* MG is already +1 */
1234 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1239 " does not know how to handle this MG_LEN"
1241 (void)PerlIO_putc(file, '\n');
1243 if (mg->mg_type == PERL_MAGIC_utf8) {
1244 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1247 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1248 Perl_dump_indent(aTHX_ level, file,
1249 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1252 (UV)cache[i * 2 + 1]);
1259 Perl_magic_dump(pTHX_ const MAGIC *mg)
1261 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1265 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1269 PERL_ARGS_ASSERT_DO_HV_DUMP;
1271 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1272 if (sv && (hvname = HvNAME_get(sv)))
1274 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1275 name which quite legally could contain insane things like tabs, newlines, nulls or
1276 other scary crap - this should produce sane results - except maybe for unicode package
1277 names - but we will wait for someone to file a bug on that - demerphq */
1278 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1279 PerlIO_printf(file, "\t\"%s\"\n",
1280 generic_pv_escape( tmpsv, hvname,
1281 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1284 (void)PerlIO_putc(file, '\n');
1288 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1290 PERL_ARGS_ASSERT_DO_GV_DUMP;
1292 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1293 if (sv && GvNAME(sv)) {
1294 SV * const tmpsv = newSVpvs("");
1295 PerlIO_printf(file, "\t\"%s\"\n",
1296 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1299 (void)PerlIO_putc(file, '\n');
1303 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1305 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1307 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1308 if (sv && GvNAME(sv)) {
1309 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1311 HV * const stash = GvSTASH(sv);
1312 PerlIO_printf(file, "\t");
1313 /* TODO might have an extra \" here */
1314 if (stash && (hvname = HvNAME_get(stash))) {
1315 PerlIO_printf(file, "\"%s\" :: \"",
1316 generic_pv_escape(tmp, hvname,
1317 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1319 PerlIO_printf(file, "%s\"\n",
1320 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1323 (void)PerlIO_putc(file, '\n');
1326 const struct flag_to_name first_sv_flags_names[] = {
1327 {SVs_TEMP, "TEMP,"},
1328 {SVs_OBJECT, "OBJECT,"},
1337 const struct flag_to_name second_sv_flags_names[] = {
1339 {SVf_FAKE, "FAKE,"},
1340 {SVf_READONLY, "READONLY,"},
1341 {SVf_PROTECT, "PROTECT,"},
1342 {SVf_BREAK, "BREAK,"},
1348 const struct flag_to_name cv_flags_names[] = {
1349 {CVf_ANON, "ANON,"},
1350 {CVf_UNIQUE, "UNIQUE,"},
1351 {CVf_CLONE, "CLONE,"},
1352 {CVf_CLONED, "CLONED,"},
1353 {CVf_CONST, "CONST,"},
1354 {CVf_NODEBUG, "NODEBUG,"},
1355 {CVf_LVALUE, "LVALUE,"},
1356 {CVf_METHOD, "METHOD,"},
1357 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1358 {CVf_CVGV_RC, "CVGV_RC,"},
1359 {CVf_DYNFILE, "DYNFILE,"},
1360 {CVf_AUTOLOAD, "AUTOLOAD,"},
1361 {CVf_HASEVAL, "HASEVAL,"},
1362 {CVf_SLABBED, "SLABBED,"},
1363 {CVf_NAMED, "NAMED,"},
1364 {CVf_LEXICAL, "LEXICAL,"},
1365 {CVf_ISXSUB, "ISXSUB,"}
1368 const struct flag_to_name hv_flags_names[] = {
1369 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1370 {SVphv_LAZYDEL, "LAZYDEL,"},
1371 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1372 {SVf_AMAGIC, "OVERLOAD,"},
1373 {SVphv_CLONEABLE, "CLONEABLE,"}
1376 const struct flag_to_name gp_flags_names[] = {
1377 {GVf_INTRO, "INTRO,"},
1378 {GVf_MULTI, "MULTI,"},
1379 {GVf_ASSUMECV, "ASSUMECV,"},
1382 const struct flag_to_name gp_flags_imported_names[] = {
1383 {GVf_IMPORTED_SV, " SV"},
1384 {GVf_IMPORTED_AV, " AV"},
1385 {GVf_IMPORTED_HV, " HV"},
1386 {GVf_IMPORTED_CV, " CV"},
1389 /* NOTE: this structure is mostly duplicative of one generated by
1390 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1391 * the two. - Yves */
1392 const struct flag_to_name regexp_extflags_names[] = {
1393 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1394 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1395 {RXf_PMf_FOLD, "PMf_FOLD,"},
1396 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1397 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1398 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1399 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1400 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1401 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1402 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1403 {RXf_CHECK_ALL, "CHECK_ALL,"},
1404 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1405 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1406 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1407 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1408 {RXf_SPLIT, "SPLIT,"},
1409 {RXf_COPY_DONE, "COPY_DONE,"},
1410 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1411 {RXf_TAINTED, "TAINTED,"},
1412 {RXf_START_ONLY, "START_ONLY,"},
1413 {RXf_SKIPWHITE, "SKIPWHITE,"},
1414 {RXf_WHITE, "WHITE,"},
1415 {RXf_NULL, "NULL,"},
1418 /* NOTE: this structure is mostly duplicative of one generated by
1419 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1420 * the two. - Yves */
1421 const struct flag_to_name regexp_core_intflags_names[] = {
1422 {PREGf_SKIP, "SKIP,"},
1423 {PREGf_IMPLICIT, "IMPLICIT,"},
1424 {PREGf_NAUGHTY, "NAUGHTY,"},
1425 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1426 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1427 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1428 {PREGf_NOSCAN, "NOSCAN,"},
1429 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1430 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1431 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1432 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1433 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1436 /* Perl_do_sv_dump():
1438 * level: amount to indent the output
1439 * sv: the object to dump
1440 * nest: the current level of recursion
1441 * maxnest: the maximum allowed level of recursion
1442 * dumpops: if true, also dump the ops associated with a CV
1443 * pvlim: limit on the length of any strings that are output
1447 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1454 PERL_ARGS_ASSERT_DO_SV_DUMP;
1457 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1461 flags = SvFLAGS(sv);
1464 /* process general SV flags */
1466 d = Perl_newSVpvf(aTHX_
1467 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1468 PTR2UV(SvANY(sv)), PTR2UV(sv),
1469 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1470 (int)(PL_dumpindent*level), "");
1472 if ((flags & SVs_PADSTALE))
1473 sv_catpv(d, "PADSTALE,");
1474 if ((flags & SVs_PADTMP))
1475 sv_catpv(d, "PADTMP,");
1476 append_flags(d, flags, first_sv_flags_names);
1477 if (flags & SVf_ROK) {
1478 sv_catpv(d, "ROK,");
1479 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1481 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1482 append_flags(d, flags, second_sv_flags_names);
1483 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1484 && type != SVt_PVAV) {
1485 if (SvPCS_IMPORTED(sv))
1486 sv_catpv(d, "PCS_IMPORTED,");
1488 sv_catpv(d, "SCREAM,");
1491 /* process type-specific SV flags */
1496 append_flags(d, CvFLAGS(sv), cv_flags_names);
1499 append_flags(d, flags, hv_flags_names);
1503 if (isGV_with_GP(sv)) {
1504 append_flags(d, GvFLAGS(sv), gp_flags_names);
1506 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1507 sv_catpv(d, "IMPORT");
1508 if (GvIMPORTED(sv) == GVf_IMPORTED)
1509 sv_catpv(d, "ALL,");
1512 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1519 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1520 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1523 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1524 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1530 /* SVphv_SHAREKEYS is also 0x20000000 */
1531 if ((type != SVt_PVHV) && SvUTF8(sv))
1532 sv_catpv(d, "UTF8");
1534 if (*(SvEND(d) - 1) == ',') {
1535 SvCUR_set(d, SvCUR(d) - 1);
1536 SvPVX(d)[SvCUR(d)] = '\0';
1541 /* dump initial SV details */
1543 #ifdef DEBUG_LEAKING_SCALARS
1544 Perl_dump_indent(aTHX_ level, file,
1545 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1546 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1548 sv->sv_debug_inpad ? "for" : "by",
1549 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1550 PTR2UV(sv->sv_debug_parent),
1554 Perl_dump_indent(aTHX_ level, file, "SV = ");
1558 if (type < SVt_LAST) {
1559 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1561 if (type == SVt_NULL) {
1566 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1571 /* Dump general SV fields */
1573 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1574 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1575 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1576 || (type == SVt_IV && !SvROK(sv))) {
1579 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1581 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1582 (void)PerlIO_putc(file, '\n');
1585 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1586 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1587 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1588 || type == SVt_NV) {
1589 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1590 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1591 RESTORE_LC_NUMERIC_UNDERLYING();
1595 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1597 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1600 if (type < SVt_PV) {
1605 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1606 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1607 const bool re = isREGEXP(sv);
1608 const char * const ptr =
1609 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1613 SvOOK_offset(sv, delta);
1614 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1619 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
1621 PerlIO_printf(file, "( %s . ) ",
1622 pv_display(d, ptr - delta, delta, 0,
1625 if (type == SVt_INVLIST) {
1626 PerlIO_printf(file, "\n");
1627 /* 4 blanks indents 2 beyond the PV, etc */
1628 _invlist_dump(file, level, " ", sv);
1631 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1634 if (SvUTF8(sv)) /* the 6? \x{....} */
1635 PerlIO_printf(file, " [UTF8 \"%s\"]",
1636 sv_uni_display(d, sv, 6 * SvCUR(sv),
1638 PerlIO_printf(file, "\n");
1640 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1642 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1644 #ifdef PERL_COPY_ON_WRITE
1645 if (SvIsCOW(sv) && SvLEN(sv))
1646 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1651 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1654 if (type >= SVt_PVMG) {
1656 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1658 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1660 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1661 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1665 /* Dump type-specific SV fields */
1669 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1670 if (AvARRAY(sv) != AvALLOC(sv)) {
1671 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1672 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1675 (void)PerlIO_putc(file, '\n');
1676 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1677 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1678 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n",
1679 SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1681 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1682 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1683 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1684 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1685 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1687 SV **svp = AvARRAY(MUTABLE_AV(sv));
1689 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1692 SV* const elt = *svp;
1693 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1694 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1701 struct xpvhv_aux *const aux = HvAUX(sv);
1702 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %"UVuf"\n",
1703 (UV)aux->xhv_aux_flags);
1705 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1706 usedkeys = HvUSEDKEYS(sv);
1707 if (HvARRAY(sv) && usedkeys) {
1708 /* Show distribution of HEs in the ARRAY */
1710 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1713 U32 pow2 = 2, keys = usedkeys;
1714 NV theoret, sum = 0;
1716 PerlIO_printf(file, " (");
1717 Zero(freq, FREQ_MAX + 1, int);
1718 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1721 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1723 if (count > FREQ_MAX)
1729 for (i = 0; i <= max; i++) {
1731 PerlIO_printf(file, "%d%s:%d", i,
1732 (i == FREQ_MAX) ? "+" : "",
1735 PerlIO_printf(file, ", ");
1738 (void)PerlIO_putc(file, ')');
1739 /* The "quality" of a hash is defined as the total number of
1740 comparisons needed to access every element once, relative
1741 to the expected number needed for a random hash.
1743 The total number of comparisons is equal to the sum of
1744 the squares of the number of entries in each bucket.
1745 For a random hash of n keys into k buckets, the expected
1750 for (i = max; i > 0; i--) { /* Precision: count down. */
1751 sum += freq[i] * i * i;
1753 while ((keys = keys >> 1))
1756 theoret += theoret * (theoret-1)/pow2;
1757 (void)PerlIO_putc(file, '\n');
1758 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1760 (void)PerlIO_putc(file, '\n');
1761 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)usedkeys);
1764 HE **ents = HvARRAY(sv);
1767 HE *const *const last = ents + HvMAX(sv);
1768 count = last + 1 - ents;
1773 } while (++ents <= last);
1776 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1779 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1781 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1782 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1783 #ifdef PERL_HASH_RANDOMIZE_KEYS
1784 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1785 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1786 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
1789 (void)PerlIO_putc(file, '\n');
1792 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1793 if (mg && mg->mg_obj) {
1794 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1798 const char * const hvname = HvNAME_get(sv);
1800 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1801 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1802 generic_pv_escape( tmpsv, hvname,
1803 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1808 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1809 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1810 if (HvAUX(sv)->xhv_name_count)
1811 Perl_dump_indent(aTHX_
1812 level, file, " NAMECOUNT = %"IVdf"\n",
1813 (IV)HvAUX(sv)->xhv_name_count
1815 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1816 const I32 count = HvAUX(sv)->xhv_name_count;
1818 SV * const names = newSVpvs_flags("", SVs_TEMP);
1819 /* The starting point is the first element if count is
1820 positive and the second element if count is negative. */
1821 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1822 + (count < 0 ? 1 : 0);
1823 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1824 + (count < 0 ? -count : count);
1825 while (hekp < endp) {
1827 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1828 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1829 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
1831 /* This should never happen. */
1832 sv_catpvs(names, ", (null)");
1836 Perl_dump_indent(aTHX_
1837 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1841 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1842 const char *const hvename = HvENAME_get(sv);
1843 Perl_dump_indent(aTHX_
1844 level, file, " ENAME = \"%s\"\n",
1845 generic_pv_escape(tmp, hvename,
1846 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1850 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1852 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1856 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1857 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"UVxf")\n",
1858 generic_pv_escape( tmpsv, meta->mro_which->name,
1859 meta->mro_which->length,
1860 (meta->mro_which->kflags & HVhek_UTF8)),
1861 PTR2UV(meta->mro_which));
1862 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1863 (UV)meta->cache_gen);
1864 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1866 if (meta->mro_linear_all) {
1867 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1868 PTR2UV(meta->mro_linear_all));
1869 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1872 if (meta->mro_linear_current) {
1873 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1874 PTR2UV(meta->mro_linear_current));
1875 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1878 if (meta->mro_nextmethod) {
1879 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1880 PTR2UV(meta->mro_nextmethod));
1881 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1885 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1887 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1892 if (nest < maxnest) {
1893 HV * const hv = MUTABLE_HV(sv);
1898 int count = maxnest - nest;
1899 for (i=0; i <= HvMAX(hv); i++) {
1900 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1907 if (count-- <= 0) goto DONEHV;
1910 keysv = hv_iterkeysv(he);
1911 keypv = SvPV_const(keysv, len);
1914 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1916 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1917 if (HvEITER_get(hv) == he)
1918 PerlIO_printf(file, "[CURRENT] ");
1919 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1920 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1927 } /* case SVt_PVHV */
1930 if (CvAUTOLOAD(sv)) {
1931 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1933 const char *const name = SvPV_const(sv, len);
1934 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
1935 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
1938 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1939 const char *const proto = CvPROTO(sv);
1940 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
1941 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
1946 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1947 if (!CvISXSUB(sv)) {
1950 Perl_dump_indent(aTHX_ level, file,
1951 " SLAB = 0x%"UVxf"\n",
1952 PTR2UV(CvSTART(sv)));
1954 Perl_dump_indent(aTHX_ level, file,
1955 " START = 0x%"UVxf" ===> %"IVdf"\n",
1956 PTR2UV(CvSTART(sv)),
1957 (IV)sequence_num(CvSTART(sv)));
1959 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1960 PTR2UV(CvROOT(sv)));
1961 if (CvROOT(sv) && dumpops) {
1962 do_op_dump(level+1, file, CvROOT(sv));
1965 SV * const constant = cv_const_sv((const CV *)sv);
1967 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1970 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1972 PTR2UV(CvXSUBANY(sv).any_ptr));
1973 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1976 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1977 (IV)CvXSUBANY(sv).any_i32);
1981 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1982 HEK_KEY(CvNAME_HEK((CV *)sv)));
1983 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1984 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1985 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1986 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1987 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1988 if (!CvISXSUB(sv)) {
1989 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1990 if (nest < maxnest) {
1991 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1995 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
1997 const CV * const outside = CvOUTSIDE(sv);
1998 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
2001 : CvANON(outside) ? "ANON"
2002 : (outside == PL_main_cv) ? "MAIN"
2003 : CvUNIQUE(outside) ? "UNIQUE"
2006 newSVpvs_flags("", SVs_TEMP),
2007 GvNAME(CvGV(outside)),
2008 GvNAMELEN(CvGV(outside)),
2009 GvNAMEUTF8(CvGV(outside)))
2013 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2014 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2019 if (type == SVt_PVLV) {
2020 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2021 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2022 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2023 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
2024 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
2025 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2026 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2029 if (isREGEXP(sv)) goto dumpregexp;
2030 if (!isGV_with_GP(sv))
2033 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2034 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2035 generic_pv_escape(tmpsv, GvNAME(sv),
2039 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
2040 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2041 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
2042 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
2045 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2046 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2047 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2048 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2049 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2050 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2051 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2052 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
2053 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf
2057 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
2058 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2059 do_gv_dump (level, file, " EGV", GvEGV(sv));
2062 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2063 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2064 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2065 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2066 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2067 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2068 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
2070 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2071 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2072 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2074 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2075 PTR2UV(IoTOP_GV(sv)));
2076 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2077 maxnest, dumpops, pvlim);
2079 /* Source filters hide things that are not GVs in these three, so let's
2080 be careful out there. */
2082 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2083 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2084 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2086 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2087 PTR2UV(IoFMT_GV(sv)));
2088 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2089 maxnest, dumpops, pvlim);
2091 if (IoBOTTOM_NAME(sv))
2092 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2093 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2094 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2096 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2097 PTR2UV(IoBOTTOM_GV(sv)));
2098 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2099 maxnest, dumpops, pvlim);
2101 if (isPRINT(IoTYPE(sv)))
2102 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2104 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2105 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2110 struct regexp * const r = ReANY((REGEXP*)sv);
2112 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2114 append_flags(d, flags, names); \
2115 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2116 SvCUR_set(d, SvCUR(d) - 1); \
2117 SvPVX(d)[SvCUR(d)] = '\0'; \
2120 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2121 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2122 (UV)(r->compflags), SvPVX_const(d));
2124 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2125 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2126 (UV)(r->extflags), SvPVX_const(d));
2128 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf" (%s)\n",
2129 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2130 if (r->engine == &PL_core_reg_engine) {
2131 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2132 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf" (%s)\n",
2133 (UV)(r->intflags), SvPVX_const(d));
2135 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2138 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2139 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2141 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2142 (UV)(r->lastparen));
2143 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2144 (UV)(r->lastcloseparen));
2145 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2147 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2148 (IV)(r->minlenret));
2149 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2151 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2152 (UV)(r->pre_prefix));
2153 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2155 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2156 (IV)(r->suboffset));
2157 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2158 (IV)(r->subcoffset));
2160 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2162 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2164 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2165 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2166 PTR2UV(r->mother_re));
2167 if (nest < maxnest && r->mother_re)
2168 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2169 maxnest, dumpops, pvlim);
2170 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2171 PTR2UV(r->paren_names));
2172 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2173 PTR2UV(r->substrs));
2174 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2175 PTR2UV(r->pprivate));
2176 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2178 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2179 PTR2UV(r->qr_anoncv));
2181 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2182 PTR2UV(r->saved_copy));
2193 Dumps the contents of an SV to the C<STDERR> filehandle.
2195 For an example of its output, see L<Devel::Peek>.
2201 Perl_sv_dump(pTHX_ SV *sv)
2203 PERL_ARGS_ASSERT_SV_DUMP;
2206 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2208 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2212 Perl_runops_debug(pTHX)
2215 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2219 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2221 #ifdef PERL_TRACE_OPS
2222 ++PL_op_exec_cnt[PL_op->op_type];
2227 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2228 PerlIO_printf(Perl_debug_log,
2229 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2230 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2231 PTR2UV(*PL_watchaddr));
2232 if (DEBUG_s_TEST_) {
2233 if (DEBUG_v_TEST_) {
2234 PerlIO_printf(Perl_debug_log, "\n");
2242 if (DEBUG_t_TEST_) debop(PL_op);
2243 if (DEBUG_P_TEST_) debprof(PL_op);
2248 PERL_DTRACE_PROBE_OP(PL_op);
2249 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2250 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2258 /* print the names of the n lexical vars starting at pad offset off */
2261 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2264 CV * const cv = deb_curcv(cxstack_ix);
2265 PADNAMELIST *comppad = NULL;
2269 PADLIST * const padlist = CvPADLIST(cv);
2270 comppad = PadlistNAMES(padlist);
2273 PerlIO_printf(Perl_debug_log, "(");
2274 for (i = 0; i < n; i++) {
2275 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2276 PerlIO_printf(Perl_debug_log, "%"PNf, PNfARG(sv));
2278 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2281 PerlIO_printf(Perl_debug_log, ",");
2284 PerlIO_printf(Perl_debug_log, ")");
2288 /* append to the out SV, the name of the lexical at offset off in the CV
2292 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2293 bool paren, bool is_scalar)
2296 PADNAMELIST *namepad = NULL;
2300 PADLIST * const padlist = CvPADLIST(cv);
2301 namepad = PadlistNAMES(padlist);
2305 sv_catpvs_nomg(out, "(");
2306 for (i = 0; i < n; i++) {
2307 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2309 STRLEN cur = SvCUR(out);
2310 Perl_sv_catpvf(aTHX_ out, "[%"UTF8f,
2311 UTF8fARG(1, PadnameLEN(sv) - 1,
2312 PadnamePV(sv) + 1));
2314 SvPVX(out)[cur] = '$';
2317 Perl_sv_catpvf(aTHX_ out, "[%"UVuf"]", (UV)(off+i));
2319 sv_catpvs_nomg(out, ",");
2322 sv_catpvs_nomg(out, "(");
2327 S_append_gv_name(pTHX_ GV *gv, SV *out)
2331 sv_catpvs_nomg(out, "<NULLGV>");
2335 gv_fullname4(sv, gv, NULL, FALSE);
2336 Perl_sv_catpvf(aTHX_ out, "$%"SVf, SVfARG(sv));
2337 SvREFCNT_dec_NN(sv);
2341 # define ITEM_SV(item) (comppad ? \
2342 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2344 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2348 /* return a temporary SV containing a stringified representation of
2349 * the op_aux field of a MULTIDEREF op, associated with CV cv
2353 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2355 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2356 UV actions = items->uv;
2359 bool is_hash = FALSE;
2361 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2366 PADLIST *padlist = CvPADLIST(cv);
2367 comppad = PadlistARRAY(padlist)[1];
2373 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2376 switch (actions & MDEREF_ACTION_MASK) {
2379 actions = (++items)->uv;
2381 NOT_REACHED; /* NOTREACHED */
2383 case MDEREF_HV_padhv_helem:
2386 case MDEREF_AV_padav_aelem:
2388 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2390 NOT_REACHED; /* NOTREACHED */
2392 case MDEREF_HV_gvhv_helem:
2395 case MDEREF_AV_gvav_aelem:
2398 sv = ITEM_SV(items);
2399 S_append_gv_name(aTHX_ (GV*)sv, out);
2401 NOT_REACHED; /* NOTREACHED */
2403 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2406 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2408 sv = ITEM_SV(items);
2409 S_append_gv_name(aTHX_ (GV*)sv, out);
2410 goto do_vivify_rv2xv_elem;
2411 NOT_REACHED; /* NOTREACHED */
2413 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2416 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2417 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2418 goto do_vivify_rv2xv_elem;
2419 NOT_REACHED; /* NOTREACHED */
2421 case MDEREF_HV_pop_rv2hv_helem:
2422 case MDEREF_HV_vivify_rv2hv_helem:
2425 do_vivify_rv2xv_elem:
2426 case MDEREF_AV_pop_rv2av_aelem:
2427 case MDEREF_AV_vivify_rv2av_aelem:
2429 sv_catpvs_nomg(out, "->");
2431 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2432 sv_catpvs_nomg(out, "->");
2437 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2438 switch (actions & MDEREF_INDEX_MASK) {
2439 case MDEREF_INDEX_const:
2442 sv = ITEM_SV(items);
2444 sv_catpvs_nomg(out, "???");
2449 pv_pretty(out, s, cur, 30,
2451 (PERL_PV_PRETTY_NOCLEAR
2452 |PERL_PV_PRETTY_QUOTE
2453 |PERL_PV_PRETTY_ELLIPSES));
2457 Perl_sv_catpvf(aTHX_ out, "%"IVdf, (++items)->iv);
2459 case MDEREF_INDEX_padsv:
2460 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2462 case MDEREF_INDEX_gvsv:
2464 sv = ITEM_SV(items);
2465 S_append_gv_name(aTHX_ (GV*)sv, out);
2468 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2470 if (actions & MDEREF_FLAG_last)
2477 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2478 (int)(actions & MDEREF_ACTION_MASK));
2484 actions >>= MDEREF_SHIFT;
2491 Perl_debop(pTHX_ const OP *o)
2493 PERL_ARGS_ASSERT_DEBOP;
2495 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2498 Perl_deb(aTHX_ "%s", OP_NAME(o));
2499 switch (o->op_type) {
2502 /* With ITHREADS, consts are stored in the pad, and the right pad
2503 * may not be active here, so check.
2504 * Looks like only during compiling the pads are illegal.
2507 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2509 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2513 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
2514 SV * const sv = newSV(0);
2515 gv_fullname3(sv, cGVOPo_gv, NULL);
2516 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2517 SvREFCNT_dec_NN(sv);
2519 else if (cGVOPo_gv) {
2520 SV * const sv = newSV(0);
2521 assert(SvROK(cGVOPo_gv));
2522 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2523 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
2524 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
2525 SvREFCNT_dec_NN(sv);
2528 PerlIO_printf(Perl_debug_log, "(NULL)");
2535 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2539 S_deb_padvar(aTHX_ o->op_targ,
2540 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2544 PerlIO_printf(Perl_debug_log, "(%"SVf")",
2545 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2551 PerlIO_printf(Perl_debug_log, "\n");
2556 S_deb_curcv(pTHX_ I32 ix)
2558 PERL_SI *si = PL_curstackinfo;
2559 for (; ix >=0; ix--) {
2560 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2562 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2563 return cx->blk_sub.cv;
2564 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2565 return cx->blk_eval.cv;
2566 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2568 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2569 && si->si_type == PERLSI_SORT)
2571 /* fake sort sub; use CV of caller */
2573 ix = si->si_cxix + 1;
2580 Perl_watch(pTHX_ char **addr)
2582 PERL_ARGS_ASSERT_WATCH;
2584 PL_watchaddr = addr;
2586 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2587 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2591 S_debprof(pTHX_ const OP *o)
2593 PERL_ARGS_ASSERT_DEBPROF;
2595 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2597 if (!PL_profiledata)
2598 Newxz(PL_profiledata, MAXO, U32);
2599 ++PL_profiledata[o->op_type];
2603 Perl_debprofdump(pTHX)
2606 if (!PL_profiledata)
2608 for (i = 0; i < MAXO; i++) {
2609 if (PL_profiledata[i])
2610 PerlIO_printf(Perl_debug_log,
2611 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2618 * ex: set ts=8 sts=4 sw=4 et: