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 (SvREFCNT(sv) > 1)
425 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
433 if (SvCUR(t) + unref > 10) {
434 SvCUR_set(t, unref + 3);
443 if (type == SVt_PVCV) {
444 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
446 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
447 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
450 } else if (type < SVt_LAST) {
451 sv_catpv(t, svshorttypenames[type]);
453 if (type == SVt_NULL)
456 sv_catpv(t, "FREED");
461 if (!SvPVX_const(sv))
462 sv_catpv(t, "(null)");
464 SV * const tmp = newSVpvs("");
468 SvOOK_offset(sv, delta);
469 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
471 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
473 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
474 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
476 SvREFCNT_dec_NN(tmp);
479 else if (SvNOKp(sv)) {
480 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
481 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
482 RESTORE_LC_NUMERIC_UNDERLYING();
484 else if (SvIOKp(sv)) {
486 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
488 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
496 if (TAINTING_get && sv && SvTAINTED(sv))
497 sv_catpv(t, " [tainted]");
498 return SvPV_nolen(t);
502 =head1 Debugging Utilities
506 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
509 PERL_ARGS_ASSERT_DUMP_INDENT;
511 dump_vindent(level, file, pat, &args);
516 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
518 PERL_ARGS_ASSERT_DUMP_VINDENT;
519 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
520 PerlIO_vprintf(file, pat, *args);
526 Dumps the entire optree of the current program starting at C<PL_main_root> to
527 C<STDERR>. Also dumps the optrees for all visible subroutines in
536 dump_all_perl(FALSE);
540 Perl_dump_all_perl(pTHX_ bool justperl)
542 PerlIO_setlinebuf(Perl_debug_log);
544 op_dump(PL_main_root);
545 dump_packsubs_perl(PL_defstash, justperl);
549 =for apidoc dump_packsubs
551 Dumps the optrees for all visible subroutines in C<stash>.
557 Perl_dump_packsubs(pTHX_ const HV *stash)
559 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
560 dump_packsubs_perl(stash, FALSE);
564 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
568 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
572 for (i = 0; i <= (I32) HvMAX(stash); i++) {
574 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
575 GV * gv = (GV *)HeVAL(entry);
576 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
577 /* unfake a fake GV */
578 (void)CvGV(SvRV(gv));
579 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
582 dump_sub_perl(gv, justperl);
585 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
586 const HV * const hv = GvHV(gv);
587 if (hv && (hv != PL_defstash))
588 dump_packsubs_perl(hv, justperl); /* nested package */
595 Perl_dump_sub(pTHX_ const GV *gv)
597 PERL_ARGS_ASSERT_DUMP_SUB;
598 dump_sub_perl(gv, FALSE);
602 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
605 SV * const sv = newSVpvs_flags("", SVs_TEMP);
609 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
611 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
614 tmpsv = newSVpvs_flags("", SVs_TEMP);
615 gv_fullname3(sv, gv, NULL);
616 name = SvPV_const(sv, len);
617 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
618 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
619 if (CvISXSUB(GvCV(gv)))
620 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
621 PTR2UV(CvXSUB(GvCV(gv))),
622 (int)CvXSUBANY(GvCV(gv)).any_i32);
623 else if (CvROOT(GvCV(gv)))
624 op_dump(CvROOT(GvCV(gv)));
626 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
630 Perl_dump_form(pTHX_ const GV *gv)
632 SV * const sv = sv_newmortal();
634 PERL_ARGS_ASSERT_DUMP_FORM;
636 gv_fullname3(sv, gv, NULL);
637 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
638 if (CvROOT(GvFORM(gv)))
639 op_dump(CvROOT(GvFORM(gv)));
641 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
647 op_dump(PL_eval_root);
651 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
655 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
658 Perl_dump_indent(aTHX_ level, file, "{}\n");
661 Perl_dump_indent(aTHX_ level, file, "{\n");
663 if (pm->op_pmflags & PMf_ONCE)
668 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%.*s%c%s\n",
669 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch,
670 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
672 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
674 if (pm->op_type == OP_SPLIT)
675 Perl_dump_indent(aTHX_ level, file, "TARGOFF/GV = 0x%"UVxf"\n",
676 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
678 if (pm->op_pmreplrootu.op_pmreplroot) {
679 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
680 op_dump(pm->op_pmreplrootu.op_pmreplroot);
684 if (pm->op_code_list) {
685 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
686 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
687 do_op_dump(level, file, pm->op_code_list);
690 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
691 PTR2UV(pm->op_code_list));
693 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
694 SV * const tmpsv = pm_description(pm);
695 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
696 SvREFCNT_dec_NN(tmpsv);
699 Perl_dump_indent(aTHX_ level-1, file, "}\n");
702 const struct flag_to_name pmflags_flags_names[] = {
703 {PMf_CONST, ",CONST"},
705 {PMf_GLOBAL, ",GLOBAL"},
706 {PMf_CONTINUE, ",CONTINUE"},
707 {PMf_RETAINT, ",RETAINT"},
709 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
710 {PMf_HAS_CV, ",HAS_CV"},
711 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
712 {PMf_IS_QR, ",IS_QR"}
716 S_pm_description(pTHX_ const PMOP *pm)
718 SV * const desc = newSVpvs("");
719 const REGEXP * const regex = PM_GETRE(pm);
720 const U32 pmflags = pm->op_pmflags;
722 PERL_ARGS_ASSERT_PM_DESCRIPTION;
724 if (pmflags & PMf_ONCE)
725 sv_catpv(desc, ",ONCE");
727 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
728 sv_catpv(desc, ":USED");
730 if (pmflags & PMf_USED)
731 sv_catpv(desc, ":USED");
735 if (RX_ISTAINTED(regex))
736 sv_catpv(desc, ",TAINTED");
737 if (RX_CHECK_SUBSTR(regex)) {
738 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
739 sv_catpv(desc, ",SCANFIRST");
740 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
741 sv_catpv(desc, ",ALL");
743 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
744 sv_catpv(desc, ",SKIPWHITE");
747 append_flags(desc, pmflags, pmflags_flags_names);
752 Perl_pmop_dump(pTHX_ PMOP *pm)
754 do_pmop_dump(0, Perl_debug_log, pm);
757 /* Return a unique integer to represent the address of op o.
758 * If it already exists in PL_op_sequence, just return it;
760 * *** Note that this isn't thread-safe */
763 S_sequence_num(pTHX_ const OP *o)
772 op = newSVuv(PTR2UV(o));
774 key = SvPV_const(op, len);
776 PL_op_sequence = newHV();
777 seq = hv_fetch(PL_op_sequence, key, len, 0);
780 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
788 const struct flag_to_name op_flags_names[] = {
790 {OPf_PARENS, ",PARENS"},
793 {OPf_STACKED, ",STACKED"},
794 {OPf_SPECIAL, ",SPECIAL"}
799 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
802 const OPCODE optype = o->op_type;
804 PERL_ARGS_ASSERT_DO_OP_DUMP;
806 Perl_dump_indent(aTHX_ level, file, "{\n");
808 seq = sequence_num(o);
810 PerlIO_printf(file, "%-4"UVuf, seq);
812 PerlIO_printf(file, "????");
814 "%*sTYPE = %s ===> ",
815 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
818 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
819 sequence_num(o->op_next));
821 PerlIO_printf(file, "NULL\n");
823 if (optype == OP_NULL) {
824 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
827 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
830 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
833 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
834 SV * const tmpsv = newSVpvs("");
835 switch (o->op_flags & OPf_WANT) {
837 sv_catpv(tmpsv, ",VOID");
839 case OPf_WANT_SCALAR:
840 sv_catpv(tmpsv, ",SCALAR");
843 sv_catpv(tmpsv, ",LIST");
846 sv_catpv(tmpsv, ",UNKNOWN");
849 append_flags(tmpsv, o->op_flags, op_flags_names);
850 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
851 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
852 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
853 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
854 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
855 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
856 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
860 U16 oppriv = o->op_private;
861 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
866 tmpsv = newSVpvs("");
867 for (; !stop; op_ix++) {
868 U16 entry = PL_op_private_bitdefs[op_ix];
869 U16 bit = (entry >> 2) & 7;
876 I16 const *p = &PL_op_private_bitfields[ix];
877 U16 bitmin = (U16) *p++;
884 for (i = bitmin; i<= bit; i++)
887 val = (oppriv & mask);
890 && PL_op_private_labels[label] == '-'
891 && PL_op_private_labels[label+1] == '\0'
893 /* display as raw number */
906 if (val == 0 && enum_label == -1)
907 /* don't display anonymous zero values */
910 sv_catpv(tmpsv, ",");
912 sv_catpv(tmpsv, &PL_op_private_labels[label]);
913 sv_catpv(tmpsv, "=");
915 if (enum_label == -1)
916 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)val);
918 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
923 if ( oppriv & (1<<bit)
924 && !(PL_op_private_labels[ix] == '-'
925 && PL_op_private_labels[ix+1] == '\0'))
928 sv_catpv(tmpsv, ",");
929 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
934 sv_catpv(tmpsv, ",");
935 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)oppriv);
938 if (tmpsv && SvCUR(tmpsv)) {
939 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
941 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
950 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
952 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
956 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
957 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
958 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
959 name = SvPV_const(tmpsv, len);
960 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
961 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
964 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
971 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
972 UV i, count = items[-1].uv;
974 Perl_dump_indent(aTHX_ level, file, "ARGS = \n");
975 for (i=0; i < count; i++)
976 Perl_dump_indent(aTHX_ level+1, file, "%"UVuf" => 0x%"UVxf"\n",
983 case OP_METHOD_NAMED:
984 case OP_METHOD_SUPER:
985 case OP_METHOD_REDIR:
986 case OP_METHOD_REDIR_SUPER:
988 /* with ITHREADS, consts are stored in the pad, and the right pad
989 * may not be active here, so skip */
990 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cMETHOPx_meth(o)));
994 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1000 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
1001 (UV)CopLINE(cCOPo));
1002 if (CopSTASHPV(cCOPo)) {
1003 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1004 HV *stash = CopSTASH(cCOPo);
1005 const char * const hvname = HvNAME_get(stash);
1007 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1008 generic_pv_escape(tmpsv, hvname,
1009 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1011 if (CopLABEL(cCOPo)) {
1012 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1015 const char *label = CopLABEL_len_flags(cCOPo,
1016 &label_len, &label_flags);
1017 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1018 generic_pv_escape( tmpsv, label, label_len,
1019 (label_flags & SVf_UTF8)));
1021 Perl_dump_indent(aTHX_ level, file, "SEQ = %u\n",
1022 (unsigned int)cCOPo->cop_seq);
1025 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1026 if (cLOOPo->op_redoop)
1027 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1029 PerlIO_printf(file, "DONE\n");
1030 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1031 if (cLOOPo->op_nextop)
1032 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1034 PerlIO_printf(file, "DONE\n");
1035 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1036 if (cLOOPo->op_lastop)
1037 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1039 PerlIO_printf(file, "DONE\n");
1047 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1048 if (cLOGOPo->op_other)
1049 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1051 PerlIO_printf(file, "DONE\n");
1057 do_pmop_dump(level, file, cPMOPo);
1065 if (o->op_private & OPpREFCOUNTED)
1066 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1071 if (o->op_flags & OPf_KIDS) {
1073 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1074 do_op_dump(level, file, kid);
1076 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1082 Dumps the optree starting at OP C<o> to C<STDERR>.
1088 Perl_op_dump(pTHX_ const OP *o)
1090 PERL_ARGS_ASSERT_OP_DUMP;
1091 do_op_dump(0, Perl_debug_log, o);
1095 Perl_gv_dump(pTHX_ GV *gv)
1099 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1102 PerlIO_printf(Perl_debug_log, "{}\n");
1105 sv = sv_newmortal();
1106 PerlIO_printf(Perl_debug_log, "{\n");
1107 gv_fullname3(sv, gv, NULL);
1108 name = SvPV_const(sv, len);
1109 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1110 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1111 if (gv != GvEGV(gv)) {
1112 gv_efullname3(sv, GvEGV(gv), NULL);
1113 name = SvPV_const(sv, len);
1114 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1115 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1117 (void)PerlIO_putc(Perl_debug_log, '\n');
1118 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1122 /* map magic types to the symbolic names
1123 * (with the PERL_MAGIC_ prefixed stripped)
1126 static const struct { const char type; const char *name; } magic_names[] = {
1127 #include "mg_names.inc"
1128 /* this null string terminates the list */
1133 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1135 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1137 for (; mg; mg = mg->mg_moremagic) {
1138 Perl_dump_indent(aTHX_ level, file,
1139 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1140 if (mg->mg_virtual) {
1141 const MGVTBL * const v = mg->mg_virtual;
1142 if (v >= PL_magic_vtables
1143 && v < PL_magic_vtables + magic_vtable_max) {
1144 const U32 i = v - PL_magic_vtables;
1145 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1148 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1151 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1154 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1158 const char *name = NULL;
1159 for (n = 0; magic_names[n].name; n++) {
1160 if (mg->mg_type == magic_names[n].type) {
1161 name = magic_names[n].name;
1166 Perl_dump_indent(aTHX_ level, file,
1167 " MG_TYPE = PERL_MAGIC_%s\n", name);
1169 Perl_dump_indent(aTHX_ level, file,
1170 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1174 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1175 if (mg->mg_type == PERL_MAGIC_envelem &&
1176 mg->mg_flags & MGf_TAINTEDDIR)
1177 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1178 if (mg->mg_type == PERL_MAGIC_regex_global &&
1179 mg->mg_flags & MGf_MINMATCH)
1180 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1181 if (mg->mg_flags & MGf_REFCOUNTED)
1182 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1183 if (mg->mg_flags & MGf_GSKIP)
1184 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1185 if (mg->mg_flags & MGf_COPY)
1186 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1187 if (mg->mg_flags & MGf_DUP)
1188 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1189 if (mg->mg_flags & MGf_LOCAL)
1190 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1191 if (mg->mg_type == PERL_MAGIC_regex_global &&
1192 mg->mg_flags & MGf_BYTES)
1193 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1196 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1197 PTR2UV(mg->mg_obj));
1198 if (mg->mg_type == PERL_MAGIC_qr) {
1199 REGEXP* const re = (REGEXP *)mg->mg_obj;
1200 SV * const dsv = sv_newmortal();
1201 const char * const s
1202 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1204 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1205 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1207 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1208 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1211 if (mg->mg_flags & MGf_REFCOUNTED)
1212 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1215 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1217 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1218 if (mg->mg_len >= 0) {
1219 if (mg->mg_type != PERL_MAGIC_utf8) {
1220 SV * const sv = newSVpvs("");
1221 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1222 SvREFCNT_dec_NN(sv);
1225 else if (mg->mg_len == HEf_SVKEY) {
1226 PerlIO_puts(file, " => HEf_SVKEY\n");
1227 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1228 maxnest, dumpops, pvlim); /* MG is already +1 */
1231 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1236 " does not know how to handle this MG_LEN"
1238 (void)PerlIO_putc(file, '\n');
1240 if (mg->mg_type == PERL_MAGIC_utf8) {
1241 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1244 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1245 Perl_dump_indent(aTHX_ level, file,
1246 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1249 (UV)cache[i * 2 + 1]);
1256 Perl_magic_dump(pTHX_ const MAGIC *mg)
1258 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1262 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1266 PERL_ARGS_ASSERT_DO_HV_DUMP;
1268 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1269 if (sv && (hvname = HvNAME_get(sv)))
1271 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1272 name which quite legally could contain insane things like tabs, newlines, nulls or
1273 other scary crap - this should produce sane results - except maybe for unicode package
1274 names - but we will wait for someone to file a bug on that - demerphq */
1275 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1276 PerlIO_printf(file, "\t\"%s\"\n",
1277 generic_pv_escape( tmpsv, hvname,
1278 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1281 (void)PerlIO_putc(file, '\n');
1285 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1287 PERL_ARGS_ASSERT_DO_GV_DUMP;
1289 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1290 if (sv && GvNAME(sv)) {
1291 SV * const tmpsv = newSVpvs("");
1292 PerlIO_printf(file, "\t\"%s\"\n",
1293 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1296 (void)PerlIO_putc(file, '\n');
1300 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1302 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1304 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1305 if (sv && GvNAME(sv)) {
1306 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1308 HV * const stash = GvSTASH(sv);
1309 PerlIO_printf(file, "\t");
1310 /* TODO might have an extra \" here */
1311 if (stash && (hvname = HvNAME_get(stash))) {
1312 PerlIO_printf(file, "\"%s\" :: \"",
1313 generic_pv_escape(tmp, hvname,
1314 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1316 PerlIO_printf(file, "%s\"\n",
1317 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1320 (void)PerlIO_putc(file, '\n');
1323 const struct flag_to_name first_sv_flags_names[] = {
1324 {SVs_TEMP, "TEMP,"},
1325 {SVs_OBJECT, "OBJECT,"},
1334 const struct flag_to_name second_sv_flags_names[] = {
1336 {SVf_FAKE, "FAKE,"},
1337 {SVf_READONLY, "READONLY,"},
1338 {SVf_PROTECT, "PROTECT,"},
1339 {SVf_BREAK, "BREAK,"},
1345 const struct flag_to_name cv_flags_names[] = {
1346 {CVf_ANON, "ANON,"},
1347 {CVf_UNIQUE, "UNIQUE,"},
1348 {CVf_CLONE, "CLONE,"},
1349 {CVf_CLONED, "CLONED,"},
1350 {CVf_CONST, "CONST,"},
1351 {CVf_NODEBUG, "NODEBUG,"},
1352 {CVf_LVALUE, "LVALUE,"},
1353 {CVf_METHOD, "METHOD,"},
1354 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1355 {CVf_CVGV_RC, "CVGV_RC,"},
1356 {CVf_DYNFILE, "DYNFILE,"},
1357 {CVf_AUTOLOAD, "AUTOLOAD,"},
1358 {CVf_HASEVAL, "HASEVAL,"},
1359 {CVf_SLABBED, "SLABBED,"},
1360 {CVf_NAMED, "NAMED,"},
1361 {CVf_LEXICAL, "LEXICAL,"},
1362 {CVf_ISXSUB, "ISXSUB,"}
1365 const struct flag_to_name hv_flags_names[] = {
1366 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1367 {SVphv_LAZYDEL, "LAZYDEL,"},
1368 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1369 {SVf_AMAGIC, "OVERLOAD,"},
1370 {SVphv_CLONEABLE, "CLONEABLE,"}
1373 const struct flag_to_name gp_flags_names[] = {
1374 {GVf_INTRO, "INTRO,"},
1375 {GVf_MULTI, "MULTI,"},
1376 {GVf_ASSUMECV, "ASSUMECV,"},
1379 const struct flag_to_name gp_flags_imported_names[] = {
1380 {GVf_IMPORTED_SV, " SV"},
1381 {GVf_IMPORTED_AV, " AV"},
1382 {GVf_IMPORTED_HV, " HV"},
1383 {GVf_IMPORTED_CV, " CV"},
1386 /* NOTE: this structure is mostly duplicative of one generated by
1387 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1388 * the two. - Yves */
1389 const struct flag_to_name regexp_extflags_names[] = {
1390 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1391 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1392 {RXf_PMf_FOLD, "PMf_FOLD,"},
1393 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1394 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1395 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1396 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1397 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1398 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1399 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1400 {RXf_CHECK_ALL, "CHECK_ALL,"},
1401 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1402 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1403 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1404 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1405 {RXf_SPLIT, "SPLIT,"},
1406 {RXf_COPY_DONE, "COPY_DONE,"},
1407 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1408 {RXf_TAINTED, "TAINTED,"},
1409 {RXf_START_ONLY, "START_ONLY,"},
1410 {RXf_SKIPWHITE, "SKIPWHITE,"},
1411 {RXf_WHITE, "WHITE,"},
1412 {RXf_NULL, "NULL,"},
1415 /* NOTE: this structure is mostly duplicative of one generated by
1416 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1417 * the two. - Yves */
1418 const struct flag_to_name regexp_core_intflags_names[] = {
1419 {PREGf_SKIP, "SKIP,"},
1420 {PREGf_IMPLICIT, "IMPLICIT,"},
1421 {PREGf_NAUGHTY, "NAUGHTY,"},
1422 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1423 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1424 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1425 {PREGf_NOSCAN, "NOSCAN,"},
1426 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1427 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1428 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1429 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1430 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1433 /* Perl_do_sv_dump():
1435 * level: amount to indent the output
1436 * sv: the object to dump
1437 * nest: the current level of recursion
1438 * maxnest: the maximum allowed level of recursion
1439 * dumpops: if true, also dump the ops associated with a CV
1440 * pvlim: limit on the length of any strings that are output
1444 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1451 PERL_ARGS_ASSERT_DO_SV_DUMP;
1454 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1458 flags = SvFLAGS(sv);
1461 /* process general SV flags */
1463 d = Perl_newSVpvf(aTHX_
1464 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1465 PTR2UV(SvANY(sv)), PTR2UV(sv),
1466 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1467 (int)(PL_dumpindent*level), "");
1469 if ((flags & SVs_PADSTALE))
1470 sv_catpv(d, "PADSTALE,");
1471 if ((flags & SVs_PADTMP))
1472 sv_catpv(d, "PADTMP,");
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 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1479 append_flags(d, flags, second_sv_flags_names);
1480 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1481 && type != SVt_PVAV) {
1482 if (SvPCS_IMPORTED(sv))
1483 sv_catpv(d, "PCS_IMPORTED,");
1485 sv_catpv(d, "SCREAM,");
1488 /* process type-specific SV flags */
1493 append_flags(d, CvFLAGS(sv), cv_flags_names);
1496 append_flags(d, flags, hv_flags_names);
1500 if (isGV_with_GP(sv)) {
1501 append_flags(d, GvFLAGS(sv), gp_flags_names);
1503 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1504 sv_catpv(d, "IMPORT");
1505 if (GvIMPORTED(sv) == GVf_IMPORTED)
1506 sv_catpv(d, "ALL,");
1509 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1516 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
1517 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1520 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1521 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1527 /* SVphv_SHAREKEYS is also 0x20000000 */
1528 if ((type != SVt_PVHV) && SvUTF8(sv))
1529 sv_catpv(d, "UTF8");
1531 if (*(SvEND(d) - 1) == ',') {
1532 SvCUR_set(d, SvCUR(d) - 1);
1533 SvPVX(d)[SvCUR(d)] = '\0';
1538 /* dump initial SV details */
1540 #ifdef DEBUG_LEAKING_SCALARS
1541 Perl_dump_indent(aTHX_ level, file,
1542 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1543 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1545 sv->sv_debug_inpad ? "for" : "by",
1546 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1547 PTR2UV(sv->sv_debug_parent),
1551 Perl_dump_indent(aTHX_ level, file, "SV = ");
1555 if (type < SVt_LAST) {
1556 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1558 if (type == SVt_NULL) {
1563 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1568 /* Dump general SV fields */
1570 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1571 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1572 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1573 || (type == SVt_IV && !SvROK(sv))) {
1576 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1578 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1579 (void)PerlIO_putc(file, '\n');
1582 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1583 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1584 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1585 || type == SVt_NV) {
1586 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1587 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1588 RESTORE_LC_NUMERIC_UNDERLYING();
1592 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1594 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1597 if (type < SVt_PV) {
1602 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1603 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1604 const bool re = isREGEXP(sv);
1605 const char * const ptr =
1606 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1610 SvOOK_offset(sv, delta);
1611 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1616 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
1618 PerlIO_printf(file, "( %s . ) ",
1619 pv_display(d, ptr - delta, delta, 0,
1622 if (type == SVt_INVLIST) {
1623 PerlIO_printf(file, "\n");
1624 /* 4 blanks indents 2 beyond the PV, etc */
1625 _invlist_dump(file, level, " ", sv);
1628 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1631 if (SvUTF8(sv)) /* the 6? \x{....} */
1632 PerlIO_printf(file, " [UTF8 \"%s\"]",
1633 sv_uni_display(d, sv, 6 * SvCUR(sv),
1635 PerlIO_printf(file, "\n");
1637 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1639 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1641 #ifdef PERL_COPY_ON_WRITE
1642 if (SvIsCOW(sv) && SvLEN(sv))
1643 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1648 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1651 if (type >= SVt_PVMG) {
1653 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1655 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1657 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1658 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1662 /* Dump type-specific SV fields */
1666 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1667 if (AvARRAY(sv) != AvALLOC(sv)) {
1668 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1669 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1672 (void)PerlIO_putc(file, '\n');
1673 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1674 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1675 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n",
1676 SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
1678 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1679 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1680 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1681 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1682 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1684 SV **svp = AvARRAY(MUTABLE_AV(sv));
1686 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1689 SV* const elt = *svp;
1690 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1691 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1698 struct xpvhv_aux *const aux = HvAUX(sv);
1699 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %"UVuf"\n",
1700 (UV)aux->xhv_aux_flags);
1702 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1703 usedkeys = HvUSEDKEYS(sv);
1704 if (HvARRAY(sv) && usedkeys) {
1705 /* Show distribution of HEs in the ARRAY */
1707 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1710 U32 pow2 = 2, keys = usedkeys;
1711 NV theoret, sum = 0;
1713 PerlIO_printf(file, " (");
1714 Zero(freq, FREQ_MAX + 1, int);
1715 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1718 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1720 if (count > FREQ_MAX)
1726 for (i = 0; i <= max; i++) {
1728 PerlIO_printf(file, "%d%s:%d", i,
1729 (i == FREQ_MAX) ? "+" : "",
1732 PerlIO_printf(file, ", ");
1735 (void)PerlIO_putc(file, ')');
1736 /* The "quality" of a hash is defined as the total number of
1737 comparisons needed to access every element once, relative
1738 to the expected number needed for a random hash.
1740 The total number of comparisons is equal to the sum of
1741 the squares of the number of entries in each bucket.
1742 For a random hash of n keys into k buckets, the expected
1747 for (i = max; i > 0; i--) { /* Precision: count down. */
1748 sum += freq[i] * i * i;
1750 while ((keys = keys >> 1))
1753 theoret += theoret * (theoret-1)/pow2;
1754 (void)PerlIO_putc(file, '\n');
1755 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1757 (void)PerlIO_putc(file, '\n');
1758 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)usedkeys);
1761 HE **ents = HvARRAY(sv);
1764 HE *const *const last = ents + HvMAX(sv);
1765 count = last + 1 - ents;
1770 } while (++ents <= last);
1773 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1776 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1778 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1779 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1780 #ifdef PERL_HASH_RANDOMIZE_KEYS
1781 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1782 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1783 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
1786 (void)PerlIO_putc(file, '\n');
1789 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1790 if (mg && mg->mg_obj) {
1791 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1795 const char * const hvname = HvNAME_get(sv);
1797 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1798 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1799 generic_pv_escape( tmpsv, hvname,
1800 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1805 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1806 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1807 if (HvAUX(sv)->xhv_name_count)
1808 Perl_dump_indent(aTHX_
1809 level, file, " NAMECOUNT = %"IVdf"\n",
1810 (IV)HvAUX(sv)->xhv_name_count
1812 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1813 const I32 count = HvAUX(sv)->xhv_name_count;
1815 SV * const names = newSVpvs_flags("", SVs_TEMP);
1816 /* The starting point is the first element if count is
1817 positive and the second element if count is negative. */
1818 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1819 + (count < 0 ? 1 : 0);
1820 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1821 + (count < 0 ? -count : count);
1822 while (hekp < endp) {
1824 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1825 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1826 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
1828 /* This should never happen. */
1829 sv_catpvs(names, ", (null)");
1833 Perl_dump_indent(aTHX_
1834 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1838 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1839 const char *const hvename = HvENAME_get(sv);
1840 Perl_dump_indent(aTHX_
1841 level, file, " ENAME = \"%s\"\n",
1842 generic_pv_escape(tmp, hvename,
1843 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1847 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1849 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1853 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1854 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"UVxf")\n",
1855 generic_pv_escape( tmpsv, meta->mro_which->name,
1856 meta->mro_which->length,
1857 (meta->mro_which->kflags & HVhek_UTF8)),
1858 PTR2UV(meta->mro_which));
1859 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1860 (UV)meta->cache_gen);
1861 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1863 if (meta->mro_linear_all) {
1864 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1865 PTR2UV(meta->mro_linear_all));
1866 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1869 if (meta->mro_linear_current) {
1870 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1871 PTR2UV(meta->mro_linear_current));
1872 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1875 if (meta->mro_nextmethod) {
1876 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1877 PTR2UV(meta->mro_nextmethod));
1878 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1882 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1884 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1889 if (nest < maxnest) {
1890 HV * const hv = MUTABLE_HV(sv);
1895 int count = maxnest - nest;
1896 for (i=0; i <= HvMAX(hv); i++) {
1897 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1904 if (count-- <= 0) goto DONEHV;
1907 keysv = hv_iterkeysv(he);
1908 keypv = SvPV_const(keysv, len);
1911 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1913 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1914 if (HvEITER_get(hv) == he)
1915 PerlIO_printf(file, "[CURRENT] ");
1916 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1917 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1924 } /* case SVt_PVHV */
1927 if (CvAUTOLOAD(sv)) {
1928 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1930 const char *const name = SvPV_const(sv, len);
1931 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
1932 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
1935 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1936 const char *const proto = CvPROTO(sv);
1937 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
1938 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
1943 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1944 if (!CvISXSUB(sv)) {
1947 Perl_dump_indent(aTHX_ level, file,
1948 " SLAB = 0x%"UVxf"\n",
1949 PTR2UV(CvSTART(sv)));
1951 Perl_dump_indent(aTHX_ level, file,
1952 " START = 0x%"UVxf" ===> %"IVdf"\n",
1953 PTR2UV(CvSTART(sv)),
1954 (IV)sequence_num(CvSTART(sv)));
1956 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1957 PTR2UV(CvROOT(sv)));
1958 if (CvROOT(sv) && dumpops) {
1959 do_op_dump(level+1, file, CvROOT(sv));
1962 SV * const constant = cv_const_sv((const CV *)sv);
1964 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1967 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1969 PTR2UV(CvXSUBANY(sv).any_ptr));
1970 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1973 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1974 (IV)CvXSUBANY(sv).any_i32);
1978 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1979 HEK_KEY(CvNAME_HEK((CV *)sv)));
1980 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1981 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1982 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1983 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1984 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1985 if (!CvISXSUB(sv)) {
1986 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1987 if (nest < maxnest) {
1988 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1992 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
1994 const CV * const outside = CvOUTSIDE(sv);
1995 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1998 : CvANON(outside) ? "ANON"
1999 : (outside == PL_main_cv) ? "MAIN"
2000 : CvUNIQUE(outside) ? "UNIQUE"
2003 newSVpvs_flags("", SVs_TEMP),
2004 GvNAME(CvGV(outside)),
2005 GvNAMELEN(CvGV(outside)),
2006 GvNAMEUTF8(CvGV(outside)))
2010 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2011 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2016 if (type == SVt_PVLV) {
2017 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2018 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2019 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2020 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
2021 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
2022 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2023 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2026 if (isREGEXP(sv)) goto dumpregexp;
2027 if (!isGV_with_GP(sv))
2030 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2031 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2032 generic_pv_escape(tmpsv, GvNAME(sv),
2036 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
2037 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2038 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
2039 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
2042 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2043 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2044 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2045 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2046 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2047 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2048 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2049 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
2050 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf
2054 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
2055 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2056 do_gv_dump (level, file, " EGV", GvEGV(sv));
2059 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2060 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2061 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2062 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2063 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2064 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2065 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
2067 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2068 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2069 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2071 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2072 PTR2UV(IoTOP_GV(sv)));
2073 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2074 maxnest, dumpops, pvlim);
2076 /* Source filters hide things that are not GVs in these three, so let's
2077 be careful out there. */
2079 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2080 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2081 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2083 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2084 PTR2UV(IoFMT_GV(sv)));
2085 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2086 maxnest, dumpops, pvlim);
2088 if (IoBOTTOM_NAME(sv))
2089 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2090 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2091 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2093 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2094 PTR2UV(IoBOTTOM_GV(sv)));
2095 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2096 maxnest, dumpops, pvlim);
2098 if (isPRINT(IoTYPE(sv)))
2099 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2101 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2102 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2107 struct regexp * const r = ReANY((REGEXP*)sv);
2109 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2111 append_flags(d, flags, names); \
2112 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2113 SvCUR_set(d, SvCUR(d) - 1); \
2114 SvPVX(d)[SvCUR(d)] = '\0'; \
2117 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2118 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2119 (UV)(r->compflags), SvPVX_const(d));
2121 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2122 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2123 (UV)(r->extflags), SvPVX_const(d));
2125 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf" (%s)\n",
2126 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2127 if (r->engine == &PL_core_reg_engine) {
2128 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2129 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf" (%s)\n",
2130 (UV)(r->intflags), SvPVX_const(d));
2132 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2135 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2136 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2138 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2139 (UV)(r->lastparen));
2140 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2141 (UV)(r->lastcloseparen));
2142 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2144 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2145 (IV)(r->minlenret));
2146 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2148 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2149 (UV)(r->pre_prefix));
2150 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2152 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2153 (IV)(r->suboffset));
2154 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2155 (IV)(r->subcoffset));
2157 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2159 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2161 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2162 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2163 PTR2UV(r->mother_re));
2164 if (nest < maxnest && r->mother_re)
2165 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2166 maxnest, dumpops, pvlim);
2167 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2168 PTR2UV(r->paren_names));
2169 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2170 PTR2UV(r->substrs));
2171 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2172 PTR2UV(r->pprivate));
2173 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2175 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2176 PTR2UV(r->qr_anoncv));
2178 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2179 PTR2UV(r->saved_copy));
2190 Dumps the contents of an SV to the C<STDERR> filehandle.
2192 For an example of its output, see L<Devel::Peek>.
2198 Perl_sv_dump(pTHX_ SV *sv)
2200 PERL_ARGS_ASSERT_SV_DUMP;
2203 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2205 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2209 Perl_runops_debug(pTHX)
2212 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2216 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2218 #ifdef PERL_TRACE_OPS
2219 ++PL_op_exec_cnt[PL_op->op_type];
2224 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2225 PerlIO_printf(Perl_debug_log,
2226 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2227 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2228 PTR2UV(*PL_watchaddr));
2229 if (DEBUG_s_TEST_) {
2230 if (DEBUG_v_TEST_) {
2231 PerlIO_printf(Perl_debug_log, "\n");
2239 if (DEBUG_t_TEST_) debop(PL_op);
2240 if (DEBUG_P_TEST_) debprof(PL_op);
2245 PERL_DTRACE_PROBE_OP(PL_op);
2246 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2247 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2255 /* print the names of the n lexical vars starting at pad offset off */
2258 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2261 CV * const cv = deb_curcv(cxstack_ix);
2262 PADNAMELIST *comppad = NULL;
2266 PADLIST * const padlist = CvPADLIST(cv);
2267 comppad = PadlistNAMES(padlist);
2270 PerlIO_printf(Perl_debug_log, "(");
2271 for (i = 0; i < n; i++) {
2272 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2273 PerlIO_printf(Perl_debug_log, "%"PNf, PNfARG(sv));
2275 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2278 PerlIO_printf(Perl_debug_log, ",");
2281 PerlIO_printf(Perl_debug_log, ")");
2285 /* append to the out SV, the name of the lexical at offset off in the CV
2289 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2290 bool paren, bool is_scalar)
2293 PADNAMELIST *namepad = NULL;
2297 PADLIST * const padlist = CvPADLIST(cv);
2298 namepad = PadlistNAMES(padlist);
2302 sv_catpvs_nomg(out, "(");
2303 for (i = 0; i < n; i++) {
2304 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2306 STRLEN cur = SvCUR(out);
2307 Perl_sv_catpvf(aTHX_ out, "[%"UTF8f,
2308 UTF8fARG(1, PadnameLEN(sv) - 1,
2309 PadnamePV(sv) + 1));
2311 SvPVX(out)[cur] = '$';
2314 Perl_sv_catpvf(aTHX_ out, "[%"UVuf"]", (UV)(off+i));
2316 sv_catpvs_nomg(out, ",");
2319 sv_catpvs_nomg(out, "(");
2324 S_append_gv_name(pTHX_ GV *gv, SV *out)
2328 sv_catpvs_nomg(out, "<NULLGV>");
2332 gv_fullname4(sv, gv, NULL, FALSE);
2333 Perl_sv_catpvf(aTHX_ out, "$%"SVf, SVfARG(sv));
2334 SvREFCNT_dec_NN(sv);
2338 # define ITEM_SV(item) (comppad ? \
2339 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2341 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2345 /* return a temporary SV containing a stringified representation of
2346 * the op_aux field of a MULTIDEREF op, associated with CV cv
2350 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2352 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2353 UV actions = items->uv;
2356 bool is_hash = FALSE;
2358 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2363 PADLIST *padlist = CvPADLIST(cv);
2364 comppad = PadlistARRAY(padlist)[1];
2370 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2373 switch (actions & MDEREF_ACTION_MASK) {
2376 actions = (++items)->uv;
2378 NOT_REACHED; /* NOTREACHED */
2380 case MDEREF_HV_padhv_helem:
2383 case MDEREF_AV_padav_aelem:
2385 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2387 NOT_REACHED; /* NOTREACHED */
2389 case MDEREF_HV_gvhv_helem:
2392 case MDEREF_AV_gvav_aelem:
2395 sv = ITEM_SV(items);
2396 S_append_gv_name(aTHX_ (GV*)sv, out);
2398 NOT_REACHED; /* NOTREACHED */
2400 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2403 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2405 sv = ITEM_SV(items);
2406 S_append_gv_name(aTHX_ (GV*)sv, out);
2407 goto do_vivify_rv2xv_elem;
2408 NOT_REACHED; /* NOTREACHED */
2410 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2413 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2414 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2415 goto do_vivify_rv2xv_elem;
2416 NOT_REACHED; /* NOTREACHED */
2418 case MDEREF_HV_pop_rv2hv_helem:
2419 case MDEREF_HV_vivify_rv2hv_helem:
2422 do_vivify_rv2xv_elem:
2423 case MDEREF_AV_pop_rv2av_aelem:
2424 case MDEREF_AV_vivify_rv2av_aelem:
2426 sv_catpvs_nomg(out, "->");
2428 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2429 sv_catpvs_nomg(out, "->");
2434 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2435 switch (actions & MDEREF_INDEX_MASK) {
2436 case MDEREF_INDEX_const:
2439 sv = ITEM_SV(items);
2441 sv_catpvs_nomg(out, "???");
2446 pv_pretty(out, s, cur, 30,
2448 (PERL_PV_PRETTY_NOCLEAR
2449 |PERL_PV_PRETTY_QUOTE
2450 |PERL_PV_PRETTY_ELLIPSES));
2454 Perl_sv_catpvf(aTHX_ out, "%"IVdf, (++items)->iv);
2456 case MDEREF_INDEX_padsv:
2457 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2459 case MDEREF_INDEX_gvsv:
2461 sv = ITEM_SV(items);
2462 S_append_gv_name(aTHX_ (GV*)sv, out);
2465 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2467 if (actions & MDEREF_FLAG_last)
2474 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2475 (int)(actions & MDEREF_ACTION_MASK));
2481 actions >>= MDEREF_SHIFT;
2488 Perl_debop(pTHX_ const OP *o)
2490 PERL_ARGS_ASSERT_DEBOP;
2492 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2495 Perl_deb(aTHX_ "%s", OP_NAME(o));
2496 switch (o->op_type) {
2499 /* With ITHREADS, consts are stored in the pad, and the right pad
2500 * may not be active here, so check.
2501 * Looks like only during compiling the pads are illegal.
2504 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2506 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2510 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
2511 SV * const sv = newSV(0);
2512 gv_fullname3(sv, cGVOPo_gv, NULL);
2513 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2514 SvREFCNT_dec_NN(sv);
2516 else if (cGVOPo_gv) {
2517 SV * const sv = newSV(0);
2518 assert(SvROK(cGVOPo_gv));
2519 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2520 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
2521 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
2522 SvREFCNT_dec_NN(sv);
2525 PerlIO_printf(Perl_debug_log, "(NULL)");
2532 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2536 S_deb_padvar(aTHX_ o->op_targ,
2537 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2541 PerlIO_printf(Perl_debug_log, "(%"SVf")",
2542 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2548 PerlIO_printf(Perl_debug_log, "\n");
2553 S_deb_curcv(pTHX_ I32 ix)
2555 PERL_SI *si = PL_curstackinfo;
2556 for (; ix >=0; ix--) {
2557 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2559 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2560 return cx->blk_sub.cv;
2561 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2562 return cx->blk_eval.cv;
2563 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2565 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2566 && si->si_type == PERLSI_SORT)
2568 /* fake sort sub; use CV of caller */
2570 ix = si->si_cxix + 1;
2577 Perl_watch(pTHX_ char **addr)
2579 PERL_ARGS_ASSERT_WATCH;
2581 PL_watchaddr = addr;
2583 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2584 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2588 S_debprof(pTHX_ const OP *o)
2590 PERL_ARGS_ASSERT_DEBPROF;
2592 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2594 if (!PL_profiledata)
2595 Newxz(PL_profiledata, MAXO, U32);
2596 ++PL_profiledata[o->op_type];
2600 Perl_debprofdump(pTHX)
2603 if (!PL_profiledata)
2605 for (i = 0; i < MAXO; i++) {
2606 if (PL_profiledata[i])
2607 PerlIO_printf(Perl_debug_log,
2608 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2615 * ex: set ts=8 sts=4 sw=4 et: