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;
662 if (pm->op_pmflags & PMf_ONCE)
667 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%.*s%c%s\n",
668 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch,
669 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
671 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
673 if (pm->op_type == OP_SPLIT)
674 Perl_dump_indent(aTHX_ level, file, "TARGOFF/GV = 0x%"UVxf"\n",
675 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
677 if (pm->op_pmreplrootu.op_pmreplroot) {
678 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
679 op_dump(pm->op_pmreplrootu.op_pmreplroot);
683 if (pm->op_code_list) {
684 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
685 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
686 do_op_dump(level, file, pm->op_code_list);
689 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
690 PTR2UV(pm->op_code_list));
692 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
693 SV * const tmpsv = pm_description(pm);
694 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
695 SvREFCNT_dec_NN(tmpsv);
699 const struct flag_to_name pmflags_flags_names[] = {
700 {PMf_CONST, ",CONST"},
702 {PMf_GLOBAL, ",GLOBAL"},
703 {PMf_CONTINUE, ",CONTINUE"},
704 {PMf_RETAINT, ",RETAINT"},
706 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
707 {PMf_HAS_CV, ",HAS_CV"},
708 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
709 {PMf_IS_QR, ",IS_QR"}
713 S_pm_description(pTHX_ const PMOP *pm)
715 SV * const desc = newSVpvs("");
716 const REGEXP * const regex = PM_GETRE(pm);
717 const U32 pmflags = pm->op_pmflags;
719 PERL_ARGS_ASSERT_PM_DESCRIPTION;
721 if (pmflags & PMf_ONCE)
722 sv_catpv(desc, ",ONCE");
724 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
725 sv_catpv(desc, ":USED");
727 if (pmflags & PMf_USED)
728 sv_catpv(desc, ":USED");
732 if (RX_ISTAINTED(regex))
733 sv_catpv(desc, ",TAINTED");
734 if (RX_CHECK_SUBSTR(regex)) {
735 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
736 sv_catpv(desc, ",SCANFIRST");
737 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
738 sv_catpv(desc, ",ALL");
740 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
741 sv_catpv(desc, ",SKIPWHITE");
744 append_flags(desc, pmflags, pmflags_flags_names);
749 Perl_pmop_dump(pTHX_ PMOP *pm)
751 do_pmop_dump(0, Perl_debug_log, pm);
754 /* Return a unique integer to represent the address of op o.
755 * If it already exists in PL_op_sequence, just return it;
757 * *** Note that this isn't thread-safe */
760 S_sequence_num(pTHX_ const OP *o)
769 op = newSVuv(PTR2UV(o));
771 key = SvPV_const(op, len);
773 PL_op_sequence = newHV();
774 seq = hv_fetch(PL_op_sequence, key, len, 0);
777 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
785 const struct flag_to_name op_flags_names[] = {
787 {OPf_PARENS, ",PARENS"},
790 {OPf_STACKED, ",STACKED"},
791 {OPf_SPECIAL, ",SPECIAL"}
796 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
799 const OPCODE optype = o->op_type;
801 PERL_ARGS_ASSERT_DO_OP_DUMP;
803 Perl_dump_indent(aTHX_ level, file, "{\n");
805 seq = sequence_num(o);
807 PerlIO_printf(file, "%-4"UVuf, seq);
809 PerlIO_printf(file, "????");
811 "%*sTYPE = %s ===> ",
812 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
815 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
816 sequence_num(o->op_next));
818 PerlIO_printf(file, "NULL\n");
820 if (optype == OP_NULL) {
821 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
824 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
827 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
830 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
831 SV * const tmpsv = newSVpvs("");
832 switch (o->op_flags & OPf_WANT) {
834 sv_catpv(tmpsv, ",VOID");
836 case OPf_WANT_SCALAR:
837 sv_catpv(tmpsv, ",SCALAR");
840 sv_catpv(tmpsv, ",LIST");
843 sv_catpv(tmpsv, ",UNKNOWN");
846 append_flags(tmpsv, o->op_flags, op_flags_names);
847 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
848 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
849 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
850 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
851 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
852 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
853 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
857 U16 oppriv = o->op_private;
858 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
863 tmpsv = newSVpvs("");
864 for (; !stop; op_ix++) {
865 U16 entry = PL_op_private_bitdefs[op_ix];
866 U16 bit = (entry >> 2) & 7;
873 I16 const *p = &PL_op_private_bitfields[ix];
874 U16 bitmin = (U16) *p++;
881 for (i = bitmin; i<= bit; i++)
884 val = (oppriv & mask);
887 && PL_op_private_labels[label] == '-'
888 && PL_op_private_labels[label+1] == '\0'
890 /* display as raw number */
903 if (val == 0 && enum_label == -1)
904 /* don't display anonymous zero values */
907 sv_catpv(tmpsv, ",");
909 sv_catpv(tmpsv, &PL_op_private_labels[label]);
910 sv_catpv(tmpsv, "=");
912 if (enum_label == -1)
913 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)val);
915 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
920 if ( oppriv & (1<<bit)
921 && !(PL_op_private_labels[ix] == '-'
922 && PL_op_private_labels[ix+1] == '\0'))
925 sv_catpv(tmpsv, ",");
926 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
931 sv_catpv(tmpsv, ",");
932 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)oppriv);
935 if (tmpsv && SvCUR(tmpsv)) {
936 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
938 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
947 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
949 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
953 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
954 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
955 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
956 name = SvPV_const(tmpsv, len);
957 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
958 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
961 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
968 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
969 UV i, count = items[-1].uv;
971 Perl_dump_indent(aTHX_ level, file, "ARGS = \n");
972 for (i=0; i < count; i++)
973 Perl_dump_indent(aTHX_ level+1, file, "%"UVuf" => 0x%"UVxf"\n",
980 case OP_METHOD_NAMED:
981 case OP_METHOD_SUPER:
982 case OP_METHOD_REDIR:
983 case OP_METHOD_REDIR_SUPER:
985 /* with ITHREADS, consts are stored in the pad, and the right pad
986 * may not be active here, so skip */
987 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cMETHOPx_meth(o)));
991 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
997 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
999 if (CopSTASHPV(cCOPo)) {
1000 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1001 HV *stash = CopSTASH(cCOPo);
1002 const char * const hvname = HvNAME_get(stash);
1004 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1005 generic_pv_escape(tmpsv, hvname,
1006 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1008 if (CopLABEL(cCOPo)) {
1009 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1012 const char *label = CopLABEL_len_flags(cCOPo,
1013 &label_len, &label_flags);
1014 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1015 generic_pv_escape( tmpsv, label, label_len,
1016 (label_flags & SVf_UTF8)));
1018 Perl_dump_indent(aTHX_ level, file, "SEQ = %u\n",
1019 (unsigned int)cCOPo->cop_seq);
1022 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
1023 if (cLOOPo->op_redoop)
1024 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
1026 PerlIO_printf(file, "DONE\n");
1027 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
1028 if (cLOOPo->op_nextop)
1029 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
1031 PerlIO_printf(file, "DONE\n");
1032 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
1033 if (cLOOPo->op_lastop)
1034 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
1036 PerlIO_printf(file, "DONE\n");
1044 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
1045 if (cLOGOPo->op_other)
1046 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
1048 PerlIO_printf(file, "DONE\n");
1054 do_pmop_dump(level, file, cPMOPo);
1062 if (o->op_private & OPpREFCOUNTED)
1063 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1068 if (o->op_flags & OPf_KIDS) {
1070 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1071 do_op_dump(level, file, kid);
1073 Perl_dump_indent(aTHX_ level-1, file, "}\n");
1079 Dumps the optree starting at OP C<o> to C<STDERR>.
1085 Perl_op_dump(pTHX_ const OP *o)
1087 PERL_ARGS_ASSERT_OP_DUMP;
1088 do_op_dump(0, Perl_debug_log, o);
1092 Perl_gv_dump(pTHX_ GV *gv)
1096 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1099 PerlIO_printf(Perl_debug_log, "{}\n");
1102 sv = sv_newmortal();
1103 PerlIO_printf(Perl_debug_log, "{\n");
1104 gv_fullname3(sv, gv, NULL);
1105 name = SvPV_const(sv, len);
1106 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1107 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1108 if (gv != GvEGV(gv)) {
1109 gv_efullname3(sv, GvEGV(gv), NULL);
1110 name = SvPV_const(sv, len);
1111 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1112 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1114 (void)PerlIO_putc(Perl_debug_log, '\n');
1115 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1119 /* map magic types to the symbolic names
1120 * (with the PERL_MAGIC_ prefixed stripped)
1123 static const struct { const char type; const char *name; } magic_names[] = {
1124 #include "mg_names.inc"
1125 /* this null string terminates the list */
1130 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1132 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1134 for (; mg; mg = mg->mg_moremagic) {
1135 Perl_dump_indent(aTHX_ level, file,
1136 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
1137 if (mg->mg_virtual) {
1138 const MGVTBL * const v = mg->mg_virtual;
1139 if (v >= PL_magic_vtables
1140 && v < PL_magic_vtables + magic_vtable_max) {
1141 const U32 i = v - PL_magic_vtables;
1142 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1145 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
1148 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1151 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1155 const char *name = NULL;
1156 for (n = 0; magic_names[n].name; n++) {
1157 if (mg->mg_type == magic_names[n].type) {
1158 name = magic_names[n].name;
1163 Perl_dump_indent(aTHX_ level, file,
1164 " MG_TYPE = PERL_MAGIC_%s\n", name);
1166 Perl_dump_indent(aTHX_ level, file,
1167 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1171 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1172 if (mg->mg_type == PERL_MAGIC_envelem &&
1173 mg->mg_flags & MGf_TAINTEDDIR)
1174 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1175 if (mg->mg_type == PERL_MAGIC_regex_global &&
1176 mg->mg_flags & MGf_MINMATCH)
1177 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1178 if (mg->mg_flags & MGf_REFCOUNTED)
1179 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1180 if (mg->mg_flags & MGf_GSKIP)
1181 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1182 if (mg->mg_flags & MGf_COPY)
1183 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1184 if (mg->mg_flags & MGf_DUP)
1185 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1186 if (mg->mg_flags & MGf_LOCAL)
1187 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1188 if (mg->mg_type == PERL_MAGIC_regex_global &&
1189 mg->mg_flags & MGf_BYTES)
1190 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1193 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
1194 PTR2UV(mg->mg_obj));
1195 if (mg->mg_type == PERL_MAGIC_qr) {
1196 REGEXP* const re = (REGEXP *)mg->mg_obj;
1197 SV * const dsv = sv_newmortal();
1198 const char * const s
1199 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1201 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1202 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1204 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1205 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
1208 if (mg->mg_flags & MGf_REFCOUNTED)
1209 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1212 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1214 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
1215 if (mg->mg_len >= 0) {
1216 if (mg->mg_type != PERL_MAGIC_utf8) {
1217 SV * const sv = newSVpvs("");
1218 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1219 SvREFCNT_dec_NN(sv);
1222 else if (mg->mg_len == HEf_SVKEY) {
1223 PerlIO_puts(file, " => HEf_SVKEY\n");
1224 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1225 maxnest, dumpops, pvlim); /* MG is already +1 */
1228 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1233 " does not know how to handle this MG_LEN"
1235 (void)PerlIO_putc(file, '\n');
1237 if (mg->mg_type == PERL_MAGIC_utf8) {
1238 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1241 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1242 Perl_dump_indent(aTHX_ level, file,
1243 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1246 (UV)cache[i * 2 + 1]);
1253 Perl_magic_dump(pTHX_ const MAGIC *mg)
1255 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1259 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1263 PERL_ARGS_ASSERT_DO_HV_DUMP;
1265 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1266 if (sv && (hvname = HvNAME_get(sv)))
1268 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1269 name which quite legally could contain insane things like tabs, newlines, nulls or
1270 other scary crap - this should produce sane results - except maybe for unicode package
1271 names - but we will wait for someone to file a bug on that - demerphq */
1272 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1273 PerlIO_printf(file, "\t\"%s\"\n",
1274 generic_pv_escape( tmpsv, hvname,
1275 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1278 (void)PerlIO_putc(file, '\n');
1282 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1284 PERL_ARGS_ASSERT_DO_GV_DUMP;
1286 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1287 if (sv && GvNAME(sv)) {
1288 SV * const tmpsv = newSVpvs("");
1289 PerlIO_printf(file, "\t\"%s\"\n",
1290 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1293 (void)PerlIO_putc(file, '\n');
1297 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1299 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1301 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1302 if (sv && GvNAME(sv)) {
1303 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1305 HV * const stash = GvSTASH(sv);
1306 PerlIO_printf(file, "\t");
1307 /* TODO might have an extra \" here */
1308 if (stash && (hvname = HvNAME_get(stash))) {
1309 PerlIO_printf(file, "\"%s\" :: \"",
1310 generic_pv_escape(tmp, hvname,
1311 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1313 PerlIO_printf(file, "%s\"\n",
1314 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1317 (void)PerlIO_putc(file, '\n');
1320 const struct flag_to_name first_sv_flags_names[] = {
1321 {SVs_TEMP, "TEMP,"},
1322 {SVs_OBJECT, "OBJECT,"},
1331 const struct flag_to_name second_sv_flags_names[] = {
1333 {SVf_FAKE, "FAKE,"},
1334 {SVf_READONLY, "READONLY,"},
1335 {SVf_PROTECT, "PROTECT,"},
1336 {SVf_BREAK, "BREAK,"},
1342 const struct flag_to_name cv_flags_names[] = {
1343 {CVf_ANON, "ANON,"},
1344 {CVf_UNIQUE, "UNIQUE,"},
1345 {CVf_CLONE, "CLONE,"},
1346 {CVf_CLONED, "CLONED,"},
1347 {CVf_CONST, "CONST,"},
1348 {CVf_NODEBUG, "NODEBUG,"},
1349 {CVf_LVALUE, "LVALUE,"},
1350 {CVf_METHOD, "METHOD,"},
1351 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1352 {CVf_CVGV_RC, "CVGV_RC,"},
1353 {CVf_DYNFILE, "DYNFILE,"},
1354 {CVf_AUTOLOAD, "AUTOLOAD,"},
1355 {CVf_HASEVAL, "HASEVAL,"},
1356 {CVf_SLABBED, "SLABBED,"},
1357 {CVf_NAMED, "NAMED,"},
1358 {CVf_LEXICAL, "LEXICAL,"},
1359 {CVf_ISXSUB, "ISXSUB,"}
1362 const struct flag_to_name hv_flags_names[] = {
1363 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1364 {SVphv_LAZYDEL, "LAZYDEL,"},
1365 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1366 {SVf_AMAGIC, "OVERLOAD,"},
1367 {SVphv_CLONEABLE, "CLONEABLE,"}
1370 const struct flag_to_name gp_flags_names[] = {
1371 {GVf_INTRO, "INTRO,"},
1372 {GVf_MULTI, "MULTI,"},
1373 {GVf_ASSUMECV, "ASSUMECV,"},
1376 const struct flag_to_name gp_flags_imported_names[] = {
1377 {GVf_IMPORTED_SV, " SV"},
1378 {GVf_IMPORTED_AV, " AV"},
1379 {GVf_IMPORTED_HV, " HV"},
1380 {GVf_IMPORTED_CV, " CV"},
1383 /* NOTE: this structure is mostly duplicative of one generated by
1384 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1385 * the two. - Yves */
1386 const struct flag_to_name regexp_extflags_names[] = {
1387 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1388 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1389 {RXf_PMf_FOLD, "PMf_FOLD,"},
1390 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1391 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1392 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1393 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1394 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1395 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1396 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1397 {RXf_CHECK_ALL, "CHECK_ALL,"},
1398 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1399 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1400 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1401 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1402 {RXf_SPLIT, "SPLIT,"},
1403 {RXf_COPY_DONE, "COPY_DONE,"},
1404 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1405 {RXf_TAINTED, "TAINTED,"},
1406 {RXf_START_ONLY, "START_ONLY,"},
1407 {RXf_SKIPWHITE, "SKIPWHITE,"},
1408 {RXf_WHITE, "WHITE,"},
1409 {RXf_NULL, "NULL,"},
1412 /* NOTE: this structure is mostly duplicative of one generated by
1413 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1414 * the two. - Yves */
1415 const struct flag_to_name regexp_core_intflags_names[] = {
1416 {PREGf_SKIP, "SKIP,"},
1417 {PREGf_IMPLICIT, "IMPLICIT,"},
1418 {PREGf_NAUGHTY, "NAUGHTY,"},
1419 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1420 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1421 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1422 {PREGf_NOSCAN, "NOSCAN,"},
1423 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1424 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1425 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1426 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1427 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1430 /* Perl_do_sv_dump():
1432 * level: amount to indent the output
1433 * sv: the object to dump
1434 * nest: the current level of recursion
1435 * maxnest: the maximum allowed level of recursion
1436 * dumpops: if true, also dump the ops associated with a CV
1437 * pvlim: limit on the length of any strings that are output
1441 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1448 PERL_ARGS_ASSERT_DO_SV_DUMP;
1451 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1455 flags = SvFLAGS(sv);
1458 /* process general SV flags */
1460 d = Perl_newSVpvf(aTHX_
1461 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
1462 PTR2UV(SvANY(sv)), PTR2UV(sv),
1463 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1464 (int)(PL_dumpindent*level), "");
1466 if ((flags & SVs_PADSTALE))
1467 sv_catpv(d, "PADSTALE,");
1468 if ((flags & SVs_PADTMP))
1469 sv_catpv(d, "PADTMP,");
1470 append_flags(d, flags, first_sv_flags_names);
1471 if (flags & SVf_ROK) {
1472 sv_catpv(d, "ROK,");
1473 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1475 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1476 append_flags(d, flags, second_sv_flags_names);
1477 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1478 && type != SVt_PVAV) {
1479 if (SvPCS_IMPORTED(sv))
1480 sv_catpv(d, "PCS_IMPORTED,");
1482 sv_catpv(d, "SCREAM,");
1485 /* process type-specific SV flags */
1490 append_flags(d, CvFLAGS(sv), cv_flags_names);
1493 append_flags(d, flags, hv_flags_names);
1497 if (isGV_with_GP(sv)) {
1498 append_flags(d, GvFLAGS(sv), gp_flags_names);
1500 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1501 sv_catpv(d, "IMPORT");
1502 if (GvIMPORTED(sv) == GVf_IMPORTED)
1503 sv_catpv(d, "ALL,");
1506 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1513 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1516 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1517 if (SvVALID(sv)) sv_catpv(d, "VALID,");
1522 /* SVphv_SHAREKEYS is also 0x20000000 */
1523 if ((type != SVt_PVHV) && SvUTF8(sv))
1524 sv_catpv(d, "UTF8");
1526 if (*(SvEND(d) - 1) == ',') {
1527 SvCUR_set(d, SvCUR(d) - 1);
1528 SvPVX(d)[SvCUR(d)] = '\0';
1533 /* dump initial SV details */
1535 #ifdef DEBUG_LEAKING_SCALARS
1536 Perl_dump_indent(aTHX_ level, file,
1537 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
1538 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1540 sv->sv_debug_inpad ? "for" : "by",
1541 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1542 PTR2UV(sv->sv_debug_parent),
1546 Perl_dump_indent(aTHX_ level, file, "SV = ");
1550 if (type < SVt_LAST) {
1551 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1553 if (type == SVt_NULL) {
1558 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
1563 /* Dump general SV fields */
1565 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1566 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1567 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1568 || (type == SVt_IV && !SvROK(sv))) {
1571 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
1573 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
1574 (void)PerlIO_putc(file, '\n');
1577 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1578 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1579 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1580 || type == SVt_NV) {
1581 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1582 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1583 RESTORE_LC_NUMERIC_UNDERLYING();
1587 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
1589 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1592 if (type < SVt_PV) {
1597 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1598 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1599 const bool re = isREGEXP(sv);
1600 const char * const ptr =
1601 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1605 SvOOK_offset(sv, delta);
1606 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
1611 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
1613 PerlIO_printf(file, "( %s . ) ",
1614 pv_display(d, ptr - delta, delta, 0,
1617 if (type == SVt_INVLIST) {
1618 PerlIO_printf(file, "\n");
1619 /* 4 blanks indents 2 beyond the PV, etc */
1620 _invlist_dump(file, level, " ", sv);
1623 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1626 if (SvUTF8(sv)) /* the 6? \x{....} */
1627 PerlIO_printf(file, " [UTF8 \"%s\"]",
1628 sv_uni_display(d, sv, 6 * SvCUR(sv),
1630 PerlIO_printf(file, "\n");
1632 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1634 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1636 #ifdef PERL_COPY_ON_WRITE
1637 if (SvIsCOW(sv) && SvLEN(sv))
1638 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1643 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1646 if (type >= SVt_PVMG) {
1648 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1650 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1652 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1653 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1657 /* Dump type-specific SV fields */
1661 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
1662 if (AvARRAY(sv) != AvALLOC(sv)) {
1663 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1664 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
1667 (void)PerlIO_putc(file, '\n');
1668 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1669 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
1671 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1672 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1673 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1674 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1675 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1677 SV **svp = AvARRAY(MUTABLE_AV(sv));
1679 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1682 SV* const elt = *svp;
1683 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
1684 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1691 struct xpvhv_aux *const aux = HvAUX(sv);
1692 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %"UVuf"\n",
1693 (UV)aux->xhv_aux_flags);
1695 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1696 usedkeys = HvUSEDKEYS(sv);
1697 if (HvARRAY(sv) && usedkeys) {
1698 /* Show distribution of HEs in the ARRAY */
1700 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1703 U32 pow2 = 2, keys = usedkeys;
1704 NV theoret, sum = 0;
1706 PerlIO_printf(file, " (");
1707 Zero(freq, FREQ_MAX + 1, int);
1708 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1711 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1713 if (count > FREQ_MAX)
1719 for (i = 0; i <= max; i++) {
1721 PerlIO_printf(file, "%d%s:%d", i,
1722 (i == FREQ_MAX) ? "+" : "",
1725 PerlIO_printf(file, ", ");
1728 (void)PerlIO_putc(file, ')');
1729 /* The "quality" of a hash is defined as the total number of
1730 comparisons needed to access every element once, relative
1731 to the expected number needed for a random hash.
1733 The total number of comparisons is equal to the sum of
1734 the squares of the number of entries in each bucket.
1735 For a random hash of n keys into k buckets, the expected
1740 for (i = max; i > 0; i--) { /* Precision: count down. */
1741 sum += freq[i] * i * i;
1743 while ((keys = keys >> 1))
1746 theoret += theoret * (theoret-1)/pow2;
1747 (void)PerlIO_putc(file, '\n');
1748 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
1750 (void)PerlIO_putc(file, '\n');
1751 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)usedkeys);
1754 HE **ents = HvARRAY(sv);
1757 HE *const *const last = ents + HvMAX(sv);
1758 count = last + 1 - ents;
1763 } while (++ents <= last);
1766 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1769 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1771 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1772 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
1773 #ifdef PERL_HASH_RANDOMIZE_KEYS
1774 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1775 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1776 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
1779 (void)PerlIO_putc(file, '\n');
1782 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1783 if (mg && mg->mg_obj) {
1784 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1788 const char * const hvname = HvNAME_get(sv);
1790 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1791 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1792 generic_pv_escape( tmpsv, hvname,
1793 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1798 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1799 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1800 if (HvAUX(sv)->xhv_name_count)
1801 Perl_dump_indent(aTHX_
1802 level, file, " NAMECOUNT = %"IVdf"\n",
1803 (IV)HvAUX(sv)->xhv_name_count
1805 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1806 const I32 count = HvAUX(sv)->xhv_name_count;
1808 SV * const names = newSVpvs_flags("", SVs_TEMP);
1809 /* The starting point is the first element if count is
1810 positive and the second element if count is negative. */
1811 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1812 + (count < 0 ? 1 : 0);
1813 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1814 + (count < 0 ? -count : count);
1815 while (hekp < endp) {
1817 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1818 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1819 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
1821 /* This should never happen. */
1822 sv_catpvs(names, ", (null)");
1826 Perl_dump_indent(aTHX_
1827 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1831 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1832 const char *const hvename = HvENAME_get(sv);
1833 Perl_dump_indent(aTHX_
1834 level, file, " ENAME = \"%s\"\n",
1835 generic_pv_escape(tmp, hvename,
1836 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1840 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1842 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
1846 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1847 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"UVxf")\n",
1848 generic_pv_escape( tmpsv, meta->mro_which->name,
1849 meta->mro_which->length,
1850 (meta->mro_which->kflags & HVhek_UTF8)),
1851 PTR2UV(meta->mro_which));
1852 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1853 (UV)meta->cache_gen);
1854 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1856 if (meta->mro_linear_all) {
1857 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1858 PTR2UV(meta->mro_linear_all));
1859 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1862 if (meta->mro_linear_current) {
1863 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1864 PTR2UV(meta->mro_linear_current));
1865 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1868 if (meta->mro_nextmethod) {
1869 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1870 PTR2UV(meta->mro_nextmethod));
1871 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1875 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1877 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1882 if (nest < maxnest) {
1883 HV * const hv = MUTABLE_HV(sv);
1888 int count = maxnest - nest;
1889 for (i=0; i <= HvMAX(hv); i++) {
1890 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1897 if (count-- <= 0) goto DONEHV;
1900 keysv = hv_iterkeysv(he);
1901 keypv = SvPV_const(keysv, len);
1904 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1906 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
1907 if (HvEITER_get(hv) == he)
1908 PerlIO_printf(file, "[CURRENT] ");
1909 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1910 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1917 } /* case SVt_PVHV */
1920 if (CvAUTOLOAD(sv)) {
1921 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1923 const char *const name = SvPV_const(sv, len);
1924 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
1925 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
1928 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1929 const char *const proto = CvPROTO(sv);
1930 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
1931 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
1936 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
1937 if (!CvISXSUB(sv)) {
1940 Perl_dump_indent(aTHX_ level, file,
1941 " SLAB = 0x%"UVxf"\n",
1942 PTR2UV(CvSTART(sv)));
1944 Perl_dump_indent(aTHX_ level, file,
1945 " START = 0x%"UVxf" ===> %"IVdf"\n",
1946 PTR2UV(CvSTART(sv)),
1947 (IV)sequence_num(CvSTART(sv)));
1949 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1950 PTR2UV(CvROOT(sv)));
1951 if (CvROOT(sv) && dumpops) {
1952 do_op_dump(level+1, file, CvROOT(sv));
1955 SV * const constant = cv_const_sv((const CV *)sv);
1957 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
1960 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1962 PTR2UV(CvXSUBANY(sv).any_ptr));
1963 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1966 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1967 (IV)CvXSUBANY(sv).any_i32);
1971 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1972 HEK_KEY(CvNAME_HEK((CV *)sv)));
1973 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
1974 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
1975 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
1976 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
1977 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
1978 if (!CvISXSUB(sv)) {
1979 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1980 if (nest < maxnest) {
1981 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1985 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
1987 const CV * const outside = CvOUTSIDE(sv);
1988 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
1991 : CvANON(outside) ? "ANON"
1992 : (outside == PL_main_cv) ? "MAIN"
1993 : CvUNIQUE(outside) ? "UNIQUE"
1996 newSVpvs_flags("", SVs_TEMP),
1997 GvNAME(CvGV(outside)),
1998 GvNAMELEN(CvGV(outside)),
1999 GvNAMEUTF8(CvGV(outside)))
2003 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2004 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2009 if (type == SVt_PVLV) {
2010 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2011 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2012 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2013 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
2014 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
2015 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2016 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2019 if (isREGEXP(sv)) goto dumpregexp;
2020 if (!isGV_with_GP(sv))
2023 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2024 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2025 generic_pv_escape(tmpsv, GvNAME(sv),
2029 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
2030 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2031 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
2032 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
2035 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2036 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2037 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2038 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2039 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2040 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2041 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2042 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
2043 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf
2047 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
2048 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2049 do_gv_dump (level, file, " EGV", GvEGV(sv));
2052 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2053 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2054 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2055 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2056 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2057 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2058 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
2060 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2061 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2062 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2064 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2065 PTR2UV(IoTOP_GV(sv)));
2066 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2067 maxnest, dumpops, pvlim);
2069 /* Source filters hide things that are not GVs in these three, so let's
2070 be careful out there. */
2072 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2073 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2074 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2076 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2077 PTR2UV(IoFMT_GV(sv)));
2078 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2079 maxnest, dumpops, pvlim);
2081 if (IoBOTTOM_NAME(sv))
2082 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2083 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2084 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2086 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2087 PTR2UV(IoBOTTOM_GV(sv)));
2088 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2089 maxnest, dumpops, pvlim);
2091 if (isPRINT(IoTYPE(sv)))
2092 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2094 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2095 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
2100 struct regexp * const r = ReANY((REGEXP*)sv);
2102 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2104 append_flags(d, flags, names); \
2105 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2106 SvCUR_set(d, SvCUR(d) - 1); \
2107 SvPVX(d)[SvCUR(d)] = '\0'; \
2110 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2111 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2112 (UV)(r->compflags), SvPVX_const(d));
2114 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2115 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2116 (UV)(r->extflags), SvPVX_const(d));
2118 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf" (%s)\n",
2119 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2120 if (r->engine == &PL_core_reg_engine) {
2121 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2122 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf" (%s)\n",
2123 (UV)(r->intflags), SvPVX_const(d));
2125 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2128 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2129 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2131 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2132 (UV)(r->lastparen));
2133 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2134 (UV)(r->lastcloseparen));
2135 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2137 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2138 (IV)(r->minlenret));
2139 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2141 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2142 (UV)(r->pre_prefix));
2143 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2145 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2146 (IV)(r->suboffset));
2147 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2148 (IV)(r->subcoffset));
2150 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2152 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2154 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2155 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2156 PTR2UV(r->mother_re));
2157 if (nest < maxnest && r->mother_re)
2158 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2159 maxnest, dumpops, pvlim);
2160 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2161 PTR2UV(r->paren_names));
2162 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2163 PTR2UV(r->substrs));
2164 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2165 PTR2UV(r->pprivate));
2166 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2168 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2169 PTR2UV(r->qr_anoncv));
2171 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2172 PTR2UV(r->saved_copy));
2183 Dumps the contents of an SV to the C<STDERR> filehandle.
2185 For an example of its output, see L<Devel::Peek>.
2191 Perl_sv_dump(pTHX_ SV *sv)
2193 PERL_ARGS_ASSERT_SV_DUMP;
2196 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2198 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2202 Perl_runops_debug(pTHX)
2205 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2209 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2211 #ifdef PERL_TRACE_OPS
2212 ++PL_op_exec_cnt[PL_op->op_type];
2217 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2218 PerlIO_printf(Perl_debug_log,
2219 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2220 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2221 PTR2UV(*PL_watchaddr));
2222 if (DEBUG_s_TEST_) {
2223 if (DEBUG_v_TEST_) {
2224 PerlIO_printf(Perl_debug_log, "\n");
2232 if (DEBUG_t_TEST_) debop(PL_op);
2233 if (DEBUG_P_TEST_) debprof(PL_op);
2238 PERL_DTRACE_PROBE_OP(PL_op);
2239 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2240 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2248 /* print the names of the n lexical vars starting at pad offset off */
2251 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2254 CV * const cv = deb_curcv(cxstack_ix);
2255 PADNAMELIST *comppad = NULL;
2259 PADLIST * const padlist = CvPADLIST(cv);
2260 comppad = PadlistNAMES(padlist);
2263 PerlIO_printf(Perl_debug_log, "(");
2264 for (i = 0; i < n; i++) {
2265 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2266 PerlIO_printf(Perl_debug_log, "%"PNf, PNfARG(sv));
2268 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2271 PerlIO_printf(Perl_debug_log, ",");
2274 PerlIO_printf(Perl_debug_log, ")");
2278 /* append to the out SV, the name of the lexical at offset off in the CV
2282 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2283 bool paren, bool is_scalar)
2286 PADNAMELIST *namepad = NULL;
2290 PADLIST * const padlist = CvPADLIST(cv);
2291 namepad = PadlistNAMES(padlist);
2295 sv_catpvs_nomg(out, "(");
2296 for (i = 0; i < n; i++) {
2297 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2299 STRLEN cur = SvCUR(out);
2300 Perl_sv_catpvf(aTHX_ out, "[%"UTF8f,
2301 UTF8fARG(1, PadnameLEN(sv) - 1,
2302 PadnamePV(sv) + 1));
2304 SvPVX(out)[cur] = '$';
2307 Perl_sv_catpvf(aTHX_ out, "[%"UVuf"]", (UV)(off+i));
2309 sv_catpvs_nomg(out, ",");
2312 sv_catpvs_nomg(out, "(");
2317 S_append_gv_name(pTHX_ GV *gv, SV *out)
2321 sv_catpvs_nomg(out, "<NULLGV>");
2325 gv_fullname4(sv, gv, NULL, FALSE);
2326 Perl_sv_catpvf(aTHX_ out, "$%"SVf, SVfARG(sv));
2327 SvREFCNT_dec_NN(sv);
2331 # define ITEM_SV(item) (comppad ? \
2332 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2334 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2338 /* return a temporary SV containing a stringified representation of
2339 * the op_aux field of a MULTIDEREF op, associated with CV cv
2343 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2345 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2346 UV actions = items->uv;
2349 bool is_hash = FALSE;
2351 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2356 PADLIST *padlist = CvPADLIST(cv);
2357 comppad = PadlistARRAY(padlist)[1];
2363 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2366 switch (actions & MDEREF_ACTION_MASK) {
2369 actions = (++items)->uv;
2371 NOT_REACHED; /* NOTREACHED */
2373 case MDEREF_HV_padhv_helem:
2376 case MDEREF_AV_padav_aelem:
2378 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2380 NOT_REACHED; /* NOTREACHED */
2382 case MDEREF_HV_gvhv_helem:
2385 case MDEREF_AV_gvav_aelem:
2388 sv = ITEM_SV(items);
2389 S_append_gv_name(aTHX_ (GV*)sv, out);
2391 NOT_REACHED; /* NOTREACHED */
2393 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2396 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2398 sv = ITEM_SV(items);
2399 S_append_gv_name(aTHX_ (GV*)sv, out);
2400 goto do_vivify_rv2xv_elem;
2401 NOT_REACHED; /* NOTREACHED */
2403 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2406 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2407 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2408 goto do_vivify_rv2xv_elem;
2409 NOT_REACHED; /* NOTREACHED */
2411 case MDEREF_HV_pop_rv2hv_helem:
2412 case MDEREF_HV_vivify_rv2hv_helem:
2415 do_vivify_rv2xv_elem:
2416 case MDEREF_AV_pop_rv2av_aelem:
2417 case MDEREF_AV_vivify_rv2av_aelem:
2419 sv_catpvs_nomg(out, "->");
2421 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2422 sv_catpvs_nomg(out, "->");
2427 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2428 switch (actions & MDEREF_INDEX_MASK) {
2429 case MDEREF_INDEX_const:
2432 sv = ITEM_SV(items);
2434 sv_catpvs_nomg(out, "???");
2439 pv_pretty(out, s, cur, 30,
2441 (PERL_PV_PRETTY_NOCLEAR
2442 |PERL_PV_PRETTY_QUOTE
2443 |PERL_PV_PRETTY_ELLIPSES));
2447 Perl_sv_catpvf(aTHX_ out, "%"IVdf, (++items)->iv);
2449 case MDEREF_INDEX_padsv:
2450 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2452 case MDEREF_INDEX_gvsv:
2454 sv = ITEM_SV(items);
2455 S_append_gv_name(aTHX_ (GV*)sv, out);
2458 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2460 if (actions & MDEREF_FLAG_last)
2467 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2468 (int)(actions & MDEREF_ACTION_MASK));
2474 actions >>= MDEREF_SHIFT;
2481 Perl_debop(pTHX_ const OP *o)
2483 PERL_ARGS_ASSERT_DEBOP;
2485 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2488 Perl_deb(aTHX_ "%s", OP_NAME(o));
2489 switch (o->op_type) {
2492 /* With ITHREADS, consts are stored in the pad, and the right pad
2493 * may not be active here, so check.
2494 * Looks like only during compiling the pads are illegal.
2497 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2499 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2503 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
2504 SV * const sv = newSV(0);
2505 gv_fullname3(sv, cGVOPo_gv, NULL);
2506 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2507 SvREFCNT_dec_NN(sv);
2509 else if (cGVOPo_gv) {
2510 SV * const sv = newSV(0);
2511 assert(SvROK(cGVOPo_gv));
2512 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2513 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
2514 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
2515 SvREFCNT_dec_NN(sv);
2518 PerlIO_printf(Perl_debug_log, "(NULL)");
2525 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2529 S_deb_padvar(aTHX_ o->op_targ,
2530 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2534 PerlIO_printf(Perl_debug_log, "(%"SVf")",
2535 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2541 PerlIO_printf(Perl_debug_log, "\n");
2546 S_deb_curcv(pTHX_ I32 ix)
2548 PERL_SI *si = PL_curstackinfo;
2549 for (; ix >=0; ix--) {
2550 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2552 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2553 return cx->blk_sub.cv;
2554 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2555 return cx->blk_eval.cv;
2556 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2558 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2559 && si->si_type == PERLSI_SORT)
2561 /* fake sort sub; use CV of caller */
2563 ix = si->si_cxix + 1;
2570 Perl_watch(pTHX_ char **addr)
2572 PERL_ARGS_ASSERT_WATCH;
2574 PL_watchaddr = addr;
2576 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2577 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2581 S_debprof(pTHX_ const OP *o)
2583 PERL_ARGS_ASSERT_DEBPROF;
2585 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2587 if (!PL_profiledata)
2588 Newxz(PL_profiledata, MAXO, U32);
2589 ++PL_profiledata[o->op_type];
2593 Perl_debprofdump(pTHX)
2596 if (!PL_profiledata)
2598 for (i = 0; i < MAXO; i++) {
2599 if (PL_profiledata[i])
2600 PerlIO_printf(Perl_debug_log,
2601 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2608 * ex: set ts=8 sts=4 sw=4 et: