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 =for apidoc_section 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>.
135 =for apidoc Amnh||PERL_PV_ESCAPE_ALL
136 =for apidoc Amnh||PERL_PV_ESCAPE_FIRSTCHAR
137 =for apidoc Amnh||PERL_PV_ESCAPE_NOBACKSLASH
138 =for apidoc Amnh||PERL_PV_ESCAPE_NOCLEAR
139 =for apidoc Amnh||PERL_PV_ESCAPE_NONASCII
140 =for apidoc Amnh||PERL_PV_ESCAPE_QUOTE
141 =for apidoc Amnh||PERL_PV_ESCAPE_RE
142 =for apidoc Amnh||PERL_PV_ESCAPE_UNI
143 =for apidoc Amnh||PERL_PV_ESCAPE_UNI_DETECT
147 #define PV_ESCAPE_OCTBUFSIZE 32
150 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
151 const STRLEN count, const STRLEN max,
152 STRLEN * const escaped, const U32 flags )
154 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
155 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
156 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
157 STRLEN wrote = 0; /* chars written so far */
158 STRLEN chsize = 0; /* size of data to be written */
159 STRLEN readsize = 1; /* size of data just read */
160 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
161 const char *pv = str;
162 const char * const end = pv + count; /* end of string */
165 PERL_ARGS_ASSERT_PV_ESCAPE;
167 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
168 /* This won't alter the UTF-8 flag */
172 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
175 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
176 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
177 const U8 c = (U8)u & 0xFF;
180 || (flags & PERL_PV_ESCAPE_ALL)
181 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
183 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
184 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
187 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
188 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
190 : "%cx{%02" UVxf "}", esc, u);
192 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
195 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
199 case '\\' : /* FALLTHROUGH */
200 case '%' : if ( c == esc ) {
206 case '\v' : octbuf[1] = 'v'; break;
207 case '\t' : octbuf[1] = 't'; break;
208 case '\r' : octbuf[1] = 'r'; break;
209 case '\n' : octbuf[1] = 'n'; break;
210 case '\f' : octbuf[1] = 'f'; break;
218 if ( (flags & PERL_PV_ESCAPE_DWIM) && c != '\0' ) {
219 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
220 isuni ? "%cx{%02" UVxf "}" : "%cx%02" UVxf,
223 else if ((pv+readsize < end) && isDIGIT((U8)*(pv+readsize)))
224 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
227 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
234 if ( max && (wrote + chsize > max) ) {
236 } else if (chsize > 1) {
238 sv_catpvn(dsv, octbuf, chsize);
241 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
242 can be appended raw to the dsv. If dsv happens to be
243 UTF-8 then we need catpvf to upgrade them for us.
244 Or add a new API call sv_catpvc(). Think about that name, and
245 how to keep it clear that it's unlike the s of catpvs, which is
246 really an array of octets, not a string. */
248 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
251 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
256 return dsv ? SvPVX(dsv) : NULL;
259 =for apidoc pv_pretty
261 Converts a string into something presentable, handling escaping via
262 C<pv_escape()> and supporting quoting and ellipses.
264 If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
265 double quoted with any double quotes in the string escaped. Otherwise
266 if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
269 If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
270 string were output then an ellipsis C<...> will be appended to the
271 string. Note that this happens AFTER it has been quoted.
273 If C<start_color> is non-null then it will be inserted after the opening
274 quote (if there is one) but before the escaped text. If C<end_color>
275 is non-null then it will be inserted after the escaped text but before
276 any quotes or ellipses.
278 Returns a pointer to the prettified text as held by C<dsv>.
280 =for apidoc Amnh||PERL_PV_PRETTY_QUOTE
281 =for apidoc Amnh||PERL_PV_PRETTY_LTGT
282 =for apidoc Amnh||PERL_PV_PRETTY_ELLIPSES
288 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
289 const STRLEN max, char const * const start_color, char const * const end_color,
292 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
293 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
295 STRLEN max_adjust= 0;
298 PERL_ARGS_ASSERT_PV_PRETTY;
300 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
301 /* This won't alter the UTF-8 flag */
304 orig_cur= SvCUR(dsv);
307 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
309 if ( start_color != NULL )
310 sv_catpv(dsv, start_color);
312 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
315 assert(max > max_adjust);
316 pv_escape( NULL, str, count, max - max_adjust, &escaped, flags );
317 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
319 assert(max > max_adjust);
322 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
324 if ( end_color != NULL )
325 sv_catpv(dsv, end_color);
328 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
330 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
331 sv_catpvs(dsv, "...");
333 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
334 while( SvCUR(dsv) - orig_cur < max )
342 =for apidoc pv_display
346 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
348 except that an additional "\0" will be appended to the string when
349 len > cur and pv[cur] is "\0".
351 Note that the final string may be up to 7 chars longer than pvlim.
357 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
359 PERL_ARGS_ASSERT_PV_DISPLAY;
361 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
362 if (len > cur && pv[cur] == '\0')
363 sv_catpvs( dsv, "\\0");
368 Perl_sv_peek(pTHX_ SV *sv)
370 SV * const t = sv_newmortal();
377 sv_catpvs(t, "VOID");
380 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
381 /* detect data corruption under memory poisoning */
382 sv_catpvs(t, "WILD");
385 else if ( sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes
386 || sv == &PL_sv_zero || sv == &PL_sv_placeholder)
388 if (sv == &PL_sv_undef) {
389 sv_catpvs(t, "SV_UNDEF");
390 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
391 SVs_GMG|SVs_SMG|SVs_RMG)) &&
395 else if (sv == &PL_sv_no) {
396 sv_catpvs(t, "SV_NO");
397 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
398 SVs_GMG|SVs_SMG|SVs_RMG)) &&
399 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
405 else if (sv == &PL_sv_yes) {
406 sv_catpvs(t, "SV_YES");
407 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
408 SVs_GMG|SVs_SMG|SVs_RMG)) &&
409 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
412 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
416 else if (sv == &PL_sv_zero) {
417 sv_catpvs(t, "SV_ZERO");
418 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
419 SVs_GMG|SVs_SMG|SVs_RMG)) &&
420 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
423 SvPVX_const(sv) && *SvPVX_const(sv) == '0' &&
428 sv_catpvs(t, "SV_PLACEHOLDER");
429 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
430 SVs_GMG|SVs_SMG|SVs_RMG)) &&
436 else if (SvREFCNT(sv) == 0) {
440 else if (DEBUG_R_TEST_) {
443 /* is this SV on the tmps stack? */
444 for (ix=PL_tmps_ix; ix>=0; ix--) {
445 if (PL_tmps_stack[ix] == sv) {
450 if (is_tmp || SvREFCNT(sv) > 1) {
451 Perl_sv_catpvf(aTHX_ t, "<");
452 if (SvREFCNT(sv) > 1)
453 Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv));
455 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
456 Perl_sv_catpvf(aTHX_ t, ">");
462 if (SvCUR(t) + unref > 10) {
463 SvCUR_set(t, unref + 3);
472 if (type == SVt_PVCV) {
473 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
475 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
476 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
479 } else if (type < SVt_LAST) {
480 sv_catpv(t, svshorttypenames[type]);
482 if (type == SVt_NULL)
485 sv_catpvs(t, "FREED");
490 if (!SvPVX_const(sv))
491 sv_catpvs(t, "(null)");
493 SV * const tmp = newSVpvs("");
497 SvOOK_offset(sv, delta);
498 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
500 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
502 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
503 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
505 SvREFCNT_dec_NN(tmp);
508 else if (SvNOKp(sv)) {
509 DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
510 STORE_LC_NUMERIC_SET_STANDARD();
511 Perl_sv_catpvf(aTHX_ t, "(%" NVgf ")",SvNVX(sv));
512 RESTORE_LC_NUMERIC();
514 else if (SvIOKp(sv)) {
516 Perl_sv_catpvf(aTHX_ t, "(%" UVuf ")", (UV)SvUVX(sv));
518 Perl_sv_catpvf(aTHX_ t, "(%" IVdf ")", (IV)SvIVX(sv));
526 if (TAINTING_get && sv && SvTAINTED(sv))
527 sv_catpvs(t, " [tainted]");
528 return SvPV_nolen(t);
532 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
535 PERL_ARGS_ASSERT_DUMP_INDENT;
537 dump_vindent(level, file, pat, &args);
542 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
544 PERL_ARGS_ASSERT_DUMP_VINDENT;
545 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
546 PerlIO_vprintf(file, pat, *args);
550 /* Like Perl_dump_indent(), but specifically for ops: adds a vertical bar
551 * for each indent level as appropriate.
553 * bar contains bits indicating which indent columns should have a
554 * vertical bar displayed. Bit 0 is the RH-most column. If there are more
555 * levels than bits in bar, then the first few indents are displayed
558 * The start of a new op is signalled by passing a value for level which
559 * has been negated and offset by 1 (so that level 0 is passed as -1 and
560 * can thus be distinguished from -0); in this case, emit a suitably
561 * indented blank line, then on the next line, display the op's sequence
562 * number, and make the final indent an '+----'.
566 * | FOO # level = 1, bar = 0b1
567 * | | # level =-2-1, bar = 0b11
569 * | BAZ # level = 2, bar = 0b10
573 S_opdump_indent(pTHX_ const OP *o, I32 level, UV bar, PerlIO *file,
574 const char* pat, ...)
578 bool newop = (level < 0);
582 /* start displaying a new op? */
584 UV seq = sequence_num(o);
588 /* output preceding blank line */
589 PerlIO_puts(file, " ");
590 for (i = level-1; i >= 0; i--)
591 PerlIO_puts(file, ( i == 0
592 || (i < UVSIZE*8 && (bar & ((UV)1 << i)))
595 PerlIO_puts(file, "\n");
597 /* output sequence number */
599 PerlIO_printf(file, "%-4" UVuf " ", seq);
601 PerlIO_puts(file, "???? ");
605 PerlIO_printf(file, " ");
607 for (i = level-1; i >= 0; i--)
609 (i == 0 && newop) ? "+--"
610 : (bar & (1 << i)) ? "| "
612 PerlIO_vprintf(file, pat, args);
617 /* display a link field (e.g. op_next) in the format
618 * ====> sequence_number [opname 0x123456]
622 S_opdump_link(pTHX_ const OP *base, const OP *o, PerlIO *file)
624 PerlIO_puts(file, " ===> ");
626 PerlIO_puts(file, "[SELF]\n");
628 PerlIO_printf(file, "%" UVuf " [%s 0x%" UVxf "]\n",
629 sequence_num(o), OP_NAME(o), PTR2UV(o));
631 PerlIO_puts(file, "[0x0]\n");
637 Dumps the entire optree of the current program starting at C<PL_main_root> to
638 C<STDERR>. Also dumps the optrees for all visible subroutines in
647 dump_all_perl(FALSE);
651 Perl_dump_all_perl(pTHX_ bool justperl)
653 PerlIO_setlinebuf(Perl_debug_log);
655 op_dump(PL_main_root);
656 dump_packsubs_perl(PL_defstash, justperl);
660 =for apidoc dump_packsubs
662 Dumps the optrees for all visible subroutines in C<stash>.
668 Perl_dump_packsubs(pTHX_ const HV *stash)
670 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
671 dump_packsubs_perl(stash, FALSE);
675 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
679 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
683 for (i = 0; i <= (I32) HvMAX(stash); i++) {
685 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
686 GV * gv = (GV *)HeVAL(entry);
687 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
688 /* unfake a fake GV */
689 (void)CvGV(SvRV(gv));
690 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
693 dump_sub_perl(gv, justperl);
696 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
697 const HV * const hv = GvHV(gv);
698 if (hv && (hv != PL_defstash))
699 dump_packsubs_perl(hv, justperl); /* nested package */
706 Perl_dump_sub(pTHX_ const GV *gv)
708 PERL_ARGS_ASSERT_DUMP_SUB;
709 dump_sub_perl(gv, FALSE);
713 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
717 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
719 cv = isGV_with_GP(gv) ? GvCV(gv) :
720 (assert(SvROK((SV*)gv)), (CV*)SvRV((SV*)gv));
721 if (justperl && (CvISXSUB(cv) || !CvROOT(cv)))
724 if (isGV_with_GP(gv)) {
725 SV * const namesv = newSVpvs_flags("", SVs_TEMP);
726 SV *escsv = newSVpvs_flags("", SVs_TEMP);
729 gv_fullname3(namesv, gv, NULL);
730 namepv = SvPV_const(namesv, namelen);
731 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
732 generic_pv_escape(escsv, namepv, namelen, SvUTF8(namesv)));
734 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB = ");
737 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%" UVxf " %d)\n",
739 (int)CvXSUBANY(cv).any_i32);
743 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
747 Perl_dump_form(pTHX_ const GV *gv)
749 SV * const sv = sv_newmortal();
751 PERL_ARGS_ASSERT_DUMP_FORM;
753 gv_fullname3(sv, gv, NULL);
754 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
755 if (CvROOT(GvFORM(gv)))
756 op_dump(CvROOT(GvFORM(gv)));
758 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
764 op_dump(PL_eval_root);
768 /* returns a temp SV displaying the name of a GV. Handles the case where
769 * a GV is in fact a ref to a CV */
772 S_gv_display(pTHX_ GV *gv)
774 SV * const name = newSVpvs_flags("", SVs_TEMP);
776 SV * const raw = newSVpvs_flags("", SVs_TEMP);
780 if (isGV_with_GP(gv))
781 gv_fullname3(raw, gv, NULL);
784 assert(SvTYPE(SvRV(gv)) == SVt_PVCV);
785 Perl_sv_catpvf(aTHX_ raw, "cv ref: %s",
786 SvPV_nolen_const(cv_name((CV *)SvRV(gv), name, 0)));
788 rawpv = SvPV_const(raw, len);
789 generic_pv_escape(name, rawpv, len, SvUTF8(raw));
792 sv_catpvs(name, "(NULL)");
801 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o);
805 S_do_pmop_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const PMOP *pm)
812 kidbar = ((bar << 1) | cBOOL(pm->op_flags & OPf_KIDS)) << 1;
815 char ch = (pm->op_pmflags & PMf_ONCE) ? '?' : '/';
816 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE %c%.*s%c\n",
817 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch);
820 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE (RUNTIME)\n");
822 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
823 SV * const tmpsv = pm_description(pm);
824 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMFLAGS = (%s)\n",
825 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
826 SvREFCNT_dec_NN(tmpsv);
829 if (pm->op_type == OP_SPLIT)
830 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
831 "TARGOFF/GV = 0x%" UVxf "\n",
832 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
834 if (pm->op_pmreplrootu.op_pmreplroot) {
835 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_REPL =\n");
836 S_do_op_dump_bar(aTHX_ level + 2,
837 (kidbar|cBOOL(OpHAS_SIBLING(pm->op_pmreplrootu.op_pmreplroot))),
838 file, pm->op_pmreplrootu.op_pmreplroot);
842 if (pm->op_code_list) {
843 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
844 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "CODE_LIST =\n");
845 S_do_op_dump_bar(aTHX_ level + 2,
846 (kidbar | cBOOL(OpHAS_SIBLING(pm->op_code_list))),
847 file, pm->op_code_list);
850 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
851 "CODE_LIST = 0x%" UVxf "\n", PTR2UV(pm->op_code_list));
857 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
859 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
860 S_do_pmop_dump_bar(aTHX_ level, 0, file, pm);
864 const struct flag_to_name pmflags_flags_names[] = {
865 {PMf_CONST, ",CONST"},
867 {PMf_GLOBAL, ",GLOBAL"},
868 {PMf_CONTINUE, ",CONTINUE"},
869 {PMf_RETAINT, ",RETAINT"},
871 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
872 {PMf_HAS_CV, ",HAS_CV"},
873 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
874 {PMf_IS_QR, ",IS_QR"}
878 S_pm_description(pTHX_ const PMOP *pm)
880 SV * const desc = newSVpvs("");
881 const REGEXP * const regex = PM_GETRE(pm);
882 const U32 pmflags = pm->op_pmflags;
884 PERL_ARGS_ASSERT_PM_DESCRIPTION;
886 if (pmflags & PMf_ONCE)
887 sv_catpvs(desc, ",ONCE");
889 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
890 sv_catpvs(desc, ":USED");
892 if (pmflags & PMf_USED)
893 sv_catpvs(desc, ":USED");
897 if (RX_ISTAINTED(regex))
898 sv_catpvs(desc, ",TAINTED");
899 if (RX_CHECK_SUBSTR(regex)) {
900 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
901 sv_catpvs(desc, ",SCANFIRST");
902 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
903 sv_catpvs(desc, ",ALL");
905 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
906 sv_catpvs(desc, ",SKIPWHITE");
909 append_flags(desc, pmflags, pmflags_flags_names);
914 Perl_pmop_dump(pTHX_ PMOP *pm)
916 do_pmop_dump(0, Perl_debug_log, pm);
919 /* Return a unique integer to represent the address of op o.
920 * If it already exists in PL_op_sequence, just return it;
922 * *** Note that this isn't thread-safe */
925 S_sequence_num(pTHX_ const OP *o)
933 op = newSVuv(PTR2UV(o));
935 key = SvPV_const(op, len);
937 PL_op_sequence = newHV();
938 seq = hv_fetch(PL_op_sequence, key, len, 0);
941 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
949 const struct flag_to_name op_flags_names[] = {
951 {OPf_PARENS, ",PARENS"},
954 {OPf_STACKED, ",STACKED"},
955 {OPf_SPECIAL, ",SPECIAL"}
959 /* indexed by enum OPclass */
960 const char * const op_class_names[] = {
978 /* dump an op and any children. level indicates the initial indent.
979 * The bits of bar indicate which indents should receive a vertical bar.
980 * For example if level == 5 and bar == 0b01101, then the indent prefix
981 * emitted will be (not including the <>'s):
984 * 55554444333322221111
986 * For heavily nested output, the level may exceed the number of bits
987 * in bar; in this case the first few columns in the output will simply
988 * not have a bar, which is harmless.
992 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
994 const OPCODE optype = o->op_type;
996 PERL_ARGS_ASSERT_DO_OP_DUMP;
998 /* print op header line */
1000 S_opdump_indent(aTHX_ o, -level-1, bar, file, "%s", OP_NAME(o));
1002 if (optype == OP_NULL && o->op_targ)
1003 PerlIO_printf(file, " (ex-%s)",PL_op_name[o->op_targ]);
1005 PerlIO_printf(file, " %s(0x%" UVxf ")",
1006 op_class_names[op_class(o)], PTR2UV(o));
1007 S_opdump_link(aTHX_ o, o->op_next, file);
1009 /* print op common fields */
1012 S_opdump_indent(aTHX_ o, level, bar, file, "PARENT");
1013 S_opdump_link(aTHX_ o, op_parent((OP*)o), file);
1015 else if (!OpHAS_SIBLING(o)) {
1017 OP *p = o->op_sibparent;
1018 if (!p || !(p->op_flags & OPf_KIDS))
1021 OP *kid = cUNOPx(p)->op_first;
1023 kid = OpSIBLING(kid);
1031 S_opdump_indent(aTHX_ o, level, bar, file,
1032 "*** WILD PARENT 0x%p\n", p);
1036 if (o->op_targ && optype != OP_NULL)
1037 S_opdump_indent(aTHX_ o, level, bar, file, "TARG = %ld\n",
1040 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
1041 SV * const tmpsv = newSVpvs("");
1042 switch (o->op_flags & OPf_WANT) {
1044 sv_catpvs(tmpsv, ",VOID");
1046 case OPf_WANT_SCALAR:
1047 sv_catpvs(tmpsv, ",SCALAR");
1050 sv_catpvs(tmpsv, ",LIST");
1053 sv_catpvs(tmpsv, ",UNKNOWN");
1056 append_flags(tmpsv, o->op_flags, op_flags_names);
1057 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
1058 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
1059 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
1060 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
1061 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
1062 S_opdump_indent(aTHX_ o, level, bar, file, "FLAGS = (%s)\n",
1063 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
1066 if (o->op_private) {
1067 U16 oppriv = o->op_private;
1068 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
1073 tmpsv = newSVpvs("");
1074 for (; !stop; op_ix++) {
1075 U16 entry = PL_op_private_bitdefs[op_ix];
1076 U16 bit = (entry >> 2) & 7;
1077 U16 ix = entry >> 5;
1083 I16 const *p = &PL_op_private_bitfields[ix];
1084 U16 bitmin = (U16) *p++;
1091 for (i = bitmin; i<= bit; i++)
1094 val = (oppriv & mask);
1097 && PL_op_private_labels[label] == '-'
1098 && PL_op_private_labels[label+1] == '\0'
1100 /* display as raw number */
1113 if (val == 0 && enum_label == -1)
1114 /* don't display anonymous zero values */
1117 sv_catpvs(tmpsv, ",");
1119 sv_catpv(tmpsv, &PL_op_private_labels[label]);
1120 sv_catpvs(tmpsv, "=");
1122 if (enum_label == -1)
1123 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)val);
1125 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
1130 if ( oppriv & (1<<bit)
1131 && !(PL_op_private_labels[ix] == '-'
1132 && PL_op_private_labels[ix+1] == '\0'))
1135 sv_catpvs(tmpsv, ",");
1136 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
1141 sv_catpvs(tmpsv, ",");
1142 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)oppriv);
1145 if (tmpsv && SvCUR(tmpsv)) {
1146 S_opdump_indent(aTHX_ o, level, bar, file, "PRIVATE = (%s)\n",
1147 SvPVX_const(tmpsv) + 1);
1149 S_opdump_indent(aTHX_ o, level, bar, file,
1150 "PRIVATE = (0x%" UVxf ")\n", (UV)oppriv);
1158 S_opdump_indent(aTHX_ o, level, bar, file,
1159 "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1161 S_opdump_indent(aTHX_ o, level, bar, file,
1162 "GV = %" SVf " (0x%" UVxf ")\n",
1163 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)), PTR2UV(cGVOPo_gv));
1169 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
1170 UV i, count = items[-1].uv;
1172 S_opdump_indent(aTHX_ o, level, bar, file, "ARGS = \n");
1173 for (i=0; i < count; i++)
1174 S_opdump_indent(aTHX_ o, level+1, (bar << 1), file,
1175 "%" UVuf " => 0x%" UVxf "\n",
1180 case OP_MULTICONCAT:
1181 S_opdump_indent(aTHX_ o, level, bar, file, "NARGS = %" IVdf "\n",
1182 (IV)cUNOP_AUXo->op_aux[PERL_MULTICONCAT_IX_NARGS].ssize);
1183 /* XXX really ought to dump each field individually,
1184 * but that's too much like hard work */
1185 S_opdump_indent(aTHX_ o, level, bar, file, "CONSTS = (%" SVf ")\n",
1186 SVfARG(multiconcat_stringify(o)));
1191 case OP_METHOD_NAMED:
1192 case OP_METHOD_SUPER:
1193 case OP_METHOD_REDIR:
1194 case OP_METHOD_REDIR_SUPER:
1195 #ifndef USE_ITHREADS
1196 /* with ITHREADS, consts are stored in the pad, and the right pad
1197 * may not be active here, so skip */
1198 S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n",
1199 SvPEEK(cMETHOPx_meth(o)));
1203 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1209 S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n",
1210 (UV)CopLINE(cCOPo));
1212 if (CopSTASHPV(cCOPo)) {
1213 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1214 HV *stash = CopSTASH(cCOPo);
1215 const char * const hvname = HvNAME_get(stash);
1217 S_opdump_indent(aTHX_ o, level, bar, file, "PACKAGE = \"%s\"\n",
1218 generic_pv_escape(tmpsv, hvname,
1219 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1222 if (CopLABEL(cCOPo)) {
1223 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1226 const char *label = CopLABEL_len_flags(cCOPo,
1227 &label_len, &label_flags);
1228 S_opdump_indent(aTHX_ o, level, bar, file, "LABEL = \"%s\"\n",
1229 generic_pv_escape( tmpsv, label, label_len,
1230 (label_flags & SVf_UTF8)));
1233 S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
1234 (unsigned int)cCOPo->cop_seq);
1239 S_opdump_indent(aTHX_ o, level, bar, file, "REDO");
1240 S_opdump_link(aTHX_ o, cLOOPo->op_redoop, file);
1241 S_opdump_indent(aTHX_ o, level, bar, file, "NEXT");
1242 S_opdump_link(aTHX_ o, cLOOPo->op_nextop, file);
1243 S_opdump_indent(aTHX_ o, level, bar, file, "LAST");
1244 S_opdump_link(aTHX_ o, cLOOPo->op_lastop, file);
1264 S_opdump_indent(aTHX_ o, level, bar, file, "OTHER");
1265 S_opdump_link(aTHX_ o, cLOGOPo->op_other, file);
1271 S_do_pmop_dump_bar(aTHX_ level, bar, file, cPMOPo);
1279 if (o->op_private & OPpREFCOUNTED)
1280 S_opdump_indent(aTHX_ o, level, bar, file,
1281 "REFCNT = %" UVuf "\n", (UV)o->op_targ);
1289 if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
1292 SV * const label = newSVpvs_flags("", SVs_TEMP);
1293 generic_pv_escape(label, cPVOPo->op_pv, strlen(cPVOPo->op_pv), 0);
1294 S_opdump_indent(aTHX_ o, level, bar, file,
1295 "PV = \"%" SVf "\" (0x%" UVxf ")\n",
1296 SVfARG(label), PTR2UV(cPVOPo->op_pv));
1302 if (o->op_private & OPpTRANS_USE_SVOP) {
1303 /* utf8: table stored as an inversion map */
1304 #ifndef USE_ITHREADS
1305 /* with ITHREADS, it is stored in the pad, and the right pad
1306 * may not be active here, so skip */
1307 S_opdump_indent(aTHX_ o, level, bar, file,
1308 "INVMAP = 0x%" UVxf "\n",
1309 PTR2UV(MUTABLE_SV(cSVOPo->op_sv)));
1313 const OPtrans_map * const tbl = (OPtrans_map*)cPVOPo->op_pv;
1314 SSize_t i, size = tbl->size;
1316 S_opdump_indent(aTHX_ o, level, bar, file,
1317 "TABLE = 0x%" UVxf "\n",
1319 S_opdump_indent(aTHX_ o, level, bar, file,
1320 " SIZE: 0x%" UVxf "\n", (UV)size);
1322 /* dump size+1 values, to include the extra slot at the end */
1323 for (i = 0; i <= size; i++) {
1324 short val = tbl->map[i];
1326 S_opdump_indent(aTHX_ o, level, bar, file,
1327 " %4" UVxf ":", (UV)i);
1329 PerlIO_printf(file, " %2" IVdf, (IV)val);
1331 PerlIO_printf(file, " %02" UVxf, (UV)val);
1333 if ( i == size || (i & 0xf) == 0xf)
1334 PerlIO_printf(file, "\n");
1343 if (o->op_flags & OPf_KIDS) {
1347 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1348 S_do_op_dump_bar(aTHX_ level,
1349 (bar | cBOOL(OpHAS_SIBLING(kid))),
1356 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
1358 S_do_op_dump_bar(aTHX_ level, 0, file, o);
1365 Dumps the optree starting at OP C<o> to C<STDERR>.
1371 Perl_op_dump(pTHX_ const OP *o)
1373 PERL_ARGS_ASSERT_OP_DUMP;
1374 do_op_dump(0, Perl_debug_log, o);
1378 Perl_gv_dump(pTHX_ GV *gv)
1382 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1385 PerlIO_printf(Perl_debug_log, "{}\n");
1388 sv = sv_newmortal();
1389 PerlIO_printf(Perl_debug_log, "{\n");
1390 gv_fullname3(sv, gv, NULL);
1391 name = SvPV_const(sv, len);
1392 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1393 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1394 if (gv != GvEGV(gv)) {
1395 gv_efullname3(sv, GvEGV(gv), NULL);
1396 name = SvPV_const(sv, len);
1397 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1398 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1400 (void)PerlIO_putc(Perl_debug_log, '\n');
1401 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1405 /* map magic types to the symbolic names
1406 * (with the PERL_MAGIC_ prefixed stripped)
1409 static const struct { const char type; const char *name; } magic_names[] = {
1410 #include "mg_names.inc"
1411 /* this null string terminates the list */
1416 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1418 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1420 for (; mg; mg = mg->mg_moremagic) {
1421 Perl_dump_indent(aTHX_ level, file,
1422 " MAGIC = 0x%" UVxf "\n", PTR2UV(mg));
1423 if (mg->mg_virtual) {
1424 const MGVTBL * const v = mg->mg_virtual;
1425 if (v >= PL_magic_vtables
1426 && v < PL_magic_vtables + magic_vtable_max) {
1427 const U32 i = v - PL_magic_vtables;
1428 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1431 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"
1432 UVxf "\n", PTR2UV(v));
1435 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1438 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1442 const char *name = NULL;
1443 for (n = 0; magic_names[n].name; n++) {
1444 if (mg->mg_type == magic_names[n].type) {
1445 name = magic_names[n].name;
1450 Perl_dump_indent(aTHX_ level, file,
1451 " MG_TYPE = PERL_MAGIC_%s\n", name);
1453 Perl_dump_indent(aTHX_ level, file,
1454 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1458 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1459 if (mg->mg_type == PERL_MAGIC_envelem &&
1460 mg->mg_flags & MGf_TAINTEDDIR)
1461 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1462 if (mg->mg_type == PERL_MAGIC_regex_global &&
1463 mg->mg_flags & MGf_MINMATCH)
1464 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1465 if (mg->mg_flags & MGf_REFCOUNTED)
1466 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1467 if (mg->mg_flags & MGf_GSKIP)
1468 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1469 if (mg->mg_flags & MGf_COPY)
1470 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1471 if (mg->mg_flags & MGf_DUP)
1472 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1473 if (mg->mg_flags & MGf_LOCAL)
1474 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1475 if (mg->mg_type == PERL_MAGIC_regex_global &&
1476 mg->mg_flags & MGf_BYTES)
1477 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1480 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%" UVxf "\n",
1481 PTR2UV(mg->mg_obj));
1482 if (mg->mg_type == PERL_MAGIC_qr) {
1483 REGEXP* const re = (REGEXP *)mg->mg_obj;
1484 SV * const dsv = sv_newmortal();
1485 const char * const s
1486 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1488 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1489 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1491 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1492 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %" IVdf "\n",
1495 if (mg->mg_flags & MGf_REFCOUNTED)
1496 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1499 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1501 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%" UVxf, PTR2UV(mg->mg_ptr));
1502 if (mg->mg_len >= 0) {
1503 if (mg->mg_type != PERL_MAGIC_utf8) {
1504 SV * const sv = newSVpvs("");
1505 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1506 SvREFCNT_dec_NN(sv);
1509 else if (mg->mg_len == HEf_SVKEY) {
1510 PerlIO_puts(file, " => HEf_SVKEY\n");
1511 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1512 maxnest, dumpops, pvlim); /* MG is already +1 */
1515 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1520 " does not know how to handle this MG_LEN"
1522 (void)PerlIO_putc(file, '\n');
1524 if (mg->mg_type == PERL_MAGIC_utf8) {
1525 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1528 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1529 Perl_dump_indent(aTHX_ level, file,
1530 " %2" IVdf ": %" UVuf " -> %" UVuf "\n",
1533 (UV)cache[i * 2 + 1]);
1540 Perl_magic_dump(pTHX_ const MAGIC *mg)
1542 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1546 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1550 PERL_ARGS_ASSERT_DO_HV_DUMP;
1552 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1553 if (sv && (hvname = HvNAME_get(sv)))
1555 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1556 name which quite legally could contain insane things like tabs, newlines, nulls or
1557 other scary crap - this should produce sane results - except maybe for unicode package
1558 names - but we will wait for someone to file a bug on that - demerphq */
1559 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1560 PerlIO_printf(file, "\t\"%s\"\n",
1561 generic_pv_escape( tmpsv, hvname,
1562 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1565 (void)PerlIO_putc(file, '\n');
1569 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1571 PERL_ARGS_ASSERT_DO_GV_DUMP;
1573 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1574 if (sv && GvNAME(sv)) {
1575 SV * const tmpsv = newSVpvs("");
1576 PerlIO_printf(file, "\t\"%s\"\n",
1577 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1580 (void)PerlIO_putc(file, '\n');
1584 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1586 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1588 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1589 if (sv && GvNAME(sv)) {
1590 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1592 HV * const stash = GvSTASH(sv);
1593 PerlIO_printf(file, "\t");
1594 /* TODO might have an extra \" here */
1595 if (stash && (hvname = HvNAME_get(stash))) {
1596 PerlIO_printf(file, "\"%s\" :: \"",
1597 generic_pv_escape(tmp, hvname,
1598 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1600 PerlIO_printf(file, "%s\"\n",
1601 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1604 (void)PerlIO_putc(file, '\n');
1607 const struct flag_to_name first_sv_flags_names[] = {
1608 {SVs_TEMP, "TEMP,"},
1609 {SVs_OBJECT, "OBJECT,"},
1618 const struct flag_to_name second_sv_flags_names[] = {
1620 {SVf_FAKE, "FAKE,"},
1621 {SVf_READONLY, "READONLY,"},
1622 {SVf_PROTECT, "PROTECT,"},
1623 {SVf_BREAK, "BREAK,"},
1629 const struct flag_to_name cv_flags_names[] = {
1630 {CVf_ANON, "ANON,"},
1631 {CVf_UNIQUE, "UNIQUE,"},
1632 {CVf_CLONE, "CLONE,"},
1633 {CVf_CLONED, "CLONED,"},
1634 {CVf_CONST, "CONST,"},
1635 {CVf_NODEBUG, "NODEBUG,"},
1636 {CVf_LVALUE, "LVALUE,"},
1637 {CVf_METHOD, "METHOD,"},
1638 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1639 {CVf_CVGV_RC, "CVGV_RC,"},
1640 {CVf_DYNFILE, "DYNFILE,"},
1641 {CVf_AUTOLOAD, "AUTOLOAD,"},
1642 {CVf_HASEVAL, "HASEVAL,"},
1643 {CVf_SLABBED, "SLABBED,"},
1644 {CVf_NAMED, "NAMED,"},
1645 {CVf_LEXICAL, "LEXICAL,"},
1646 {CVf_ISXSUB, "ISXSUB,"}
1649 const struct flag_to_name hv_flags_names[] = {
1650 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1651 {SVphv_LAZYDEL, "LAZYDEL,"},
1652 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1653 {SVf_AMAGIC, "OVERLOAD,"},
1654 {SVphv_CLONEABLE, "CLONEABLE,"}
1657 const struct flag_to_name gp_flags_names[] = {
1658 {GVf_INTRO, "INTRO,"},
1659 {GVf_MULTI, "MULTI,"},
1660 {GVf_ASSUMECV, "ASSUMECV,"},
1663 const struct flag_to_name gp_flags_imported_names[] = {
1664 {GVf_IMPORTED_SV, " SV"},
1665 {GVf_IMPORTED_AV, " AV"},
1666 {GVf_IMPORTED_HV, " HV"},
1667 {GVf_IMPORTED_CV, " CV"},
1670 /* NOTE: this structure is mostly duplicative of one generated by
1671 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1672 * the two. - Yves */
1673 const struct flag_to_name regexp_extflags_names[] = {
1674 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1675 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1676 {RXf_PMf_FOLD, "PMf_FOLD,"},
1677 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1678 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1679 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1680 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1681 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1682 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1683 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1684 {RXf_CHECK_ALL, "CHECK_ALL,"},
1685 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1686 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1687 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1688 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1689 {RXf_SPLIT, "SPLIT,"},
1690 {RXf_COPY_DONE, "COPY_DONE,"},
1691 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1692 {RXf_TAINTED, "TAINTED,"},
1693 {RXf_START_ONLY, "START_ONLY,"},
1694 {RXf_SKIPWHITE, "SKIPWHITE,"},
1695 {RXf_WHITE, "WHITE,"},
1696 {RXf_NULL, "NULL,"},
1699 /* NOTE: this structure is mostly duplicative of one generated by
1700 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1701 * the two. - Yves */
1702 const struct flag_to_name regexp_core_intflags_names[] = {
1703 {PREGf_SKIP, "SKIP,"},
1704 {PREGf_IMPLICIT, "IMPLICIT,"},
1705 {PREGf_NAUGHTY, "NAUGHTY,"},
1706 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1707 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1708 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1709 {PREGf_NOSCAN, "NOSCAN,"},
1710 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1711 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1712 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1713 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1714 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1717 /* Perl_do_sv_dump():
1719 * level: amount to indent the output
1720 * sv: the object to dump
1721 * nest: the current level of recursion
1722 * maxnest: the maximum allowed level of recursion
1723 * dumpops: if true, also dump the ops associated with a CV
1724 * pvlim: limit on the length of any strings that are output
1728 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1735 PERL_ARGS_ASSERT_DO_SV_DUMP;
1738 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1742 flags = SvFLAGS(sv);
1745 /* process general SV flags */
1747 d = Perl_newSVpvf(aTHX_
1748 "(0x%" UVxf ") at 0x%" UVxf "\n%*s REFCNT = %" IVdf "\n%*s FLAGS = (",
1749 PTR2UV(SvANY(sv)), PTR2UV(sv),
1750 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1751 (int)(PL_dumpindent*level), "");
1753 if ((flags & SVs_PADSTALE))
1754 sv_catpvs(d, "PADSTALE,");
1755 if ((flags & SVs_PADTMP))
1756 sv_catpvs(d, "PADTMP,");
1757 append_flags(d, flags, first_sv_flags_names);
1758 if (flags & SVf_ROK) {
1759 sv_catpvs(d, "ROK,");
1760 if (SvWEAKREF(sv)) sv_catpvs(d, "WEAKREF,");
1762 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1763 append_flags(d, flags, second_sv_flags_names);
1764 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1765 && type != SVt_PVAV) {
1766 if (SvPCS_IMPORTED(sv))
1767 sv_catpvs(d, "PCS_IMPORTED,");
1769 sv_catpvs(d, "SCREAM,");
1772 /* process type-specific SV flags */
1777 append_flags(d, CvFLAGS(sv), cv_flags_names);
1780 append_flags(d, flags, hv_flags_names);
1784 if (isGV_with_GP(sv)) {
1785 append_flags(d, GvFLAGS(sv), gp_flags_names);
1787 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1788 sv_catpvs(d, "IMPORT");
1789 if (GvIMPORTED(sv) == GVf_IMPORTED)
1790 sv_catpvs(d, "ALL,");
1793 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1794 sv_catpvs(d, " ),");
1800 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpvs(d, "IsUV,");
1806 /* SVphv_SHAREKEYS is also 0x20000000 */
1807 if ((type != SVt_PVHV) && SvUTF8(sv))
1808 sv_catpvs(d, "UTF8");
1810 if (*(SvEND(d) - 1) == ',') {
1811 SvCUR_set(d, SvCUR(d) - 1);
1812 SvPVX(d)[SvCUR(d)] = '\0';
1817 /* dump initial SV details */
1819 #ifdef DEBUG_LEAKING_SCALARS
1820 Perl_dump_indent(aTHX_ level, file,
1821 "ALLOCATED at %s:%d %s %s (parent 0x%" UVxf "); serial %" UVuf "\n",
1822 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1824 sv->sv_debug_inpad ? "for" : "by",
1825 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1826 PTR2UV(sv->sv_debug_parent),
1830 Perl_dump_indent(aTHX_ level, file, "SV = ");
1834 if (type < SVt_LAST) {
1835 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1837 if (type == SVt_NULL) {
1842 PerlIO_printf(file, "UNKNOWN(0x%" UVxf ") %s\n", (UV)type, s);
1847 /* Dump general SV fields */
1849 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1850 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1851 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1852 || (type == SVt_IV && !SvROK(sv))) {
1855 Perl_dump_indent(aTHX_ level, file, " UV = %" UVuf, (UV)SvUVX(sv));
1857 Perl_dump_indent(aTHX_ level, file, " IV = %" IVdf, (IV)SvIVX(sv));
1858 (void)PerlIO_putc(file, '\n');
1861 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1862 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1863 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1864 || type == SVt_NV) {
1865 DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
1866 STORE_LC_NUMERIC_SET_STANDARD();
1867 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1868 RESTORE_LC_NUMERIC();
1872 Perl_dump_indent(aTHX_ level, file, " RV = 0x%" UVxf "\n",
1875 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1878 if (type < SVt_PV) {
1883 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1884 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1885 const bool re = isREGEXP(sv);
1886 const char * const ptr =
1887 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1891 SvOOK_offset(sv, delta);
1892 Perl_dump_indent(aTHX_ level, file," OFFSET = %" UVuf "\n",
1897 Perl_dump_indent(aTHX_ level, file," PV = 0x%" UVxf " ",
1900 PerlIO_printf(file, "( %s . ) ",
1901 pv_display(d, ptr - delta, delta, 0,
1904 if (type == SVt_INVLIST) {
1905 PerlIO_printf(file, "\n");
1906 /* 4 blanks indents 2 beyond the PV, etc */
1907 _invlist_dump(file, level, " ", sv);
1910 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1913 if (SvUTF8(sv)) /* the 6? \x{....} */
1914 PerlIO_printf(file, " [UTF8 \"%s\"]",
1915 sv_uni_display(d, sv, 6 * SvCUR(sv),
1917 PerlIO_printf(file, "\n");
1919 Perl_dump_indent(aTHX_ level, file, " CUR = %" IVdf "\n", (IV)SvCUR(sv));
1920 if (re && type == SVt_PVLV)
1921 /* LV-as-REGEXP usurps len field to store pointer to
1923 Perl_dump_indent(aTHX_ level, file, " REGEXP = 0x%" UVxf "\n",
1924 PTR2UV(((XPV*)SvANY(sv))->xpv_len_u.xpvlenu_rx));
1926 Perl_dump_indent(aTHX_ level, file, " LEN = %" IVdf "\n",
1928 #ifdef PERL_COPY_ON_WRITE
1929 if (SvIsCOW(sv) && SvLEN(sv))
1930 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1935 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1938 if (type >= SVt_PVMG) {
1940 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1942 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1944 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1945 Perl_dump_indent(aTHX_ level, file, " USEFUL = %" IVdf "\n",
1950 /* Dump type-specific SV fields */
1954 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf,
1955 PTR2UV(AvARRAY(sv)));
1956 if (AvARRAY(sv) != AvALLOC(sv)) {
1957 PerlIO_printf(file, " (offset=%" IVdf ")\n",
1958 (IV)(AvARRAY(sv) - AvALLOC(sv)));
1959 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%" UVxf "\n",
1960 PTR2UV(AvALLOC(sv)));
1963 (void)PerlIO_putc(file, '\n');
1964 Perl_dump_indent(aTHX_ level, file, " FILL = %" IVdf "\n",
1966 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1969 if (AvREAL(sv)) sv_catpvs(d, ",REAL");
1970 if (AvREIFY(sv)) sv_catpvs(d, ",REIFY");
1971 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1972 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1973 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1975 SV **svp = AvARRAY(MUTABLE_AV(sv));
1977 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1980 SV* const elt = *svp;
1981 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %" IVdf "\n",
1983 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1990 struct xpvhv_aux *const aux = HvAUX(sv);
1991 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n",
1992 (UV)aux->xhv_aux_flags);
1994 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
1995 usedkeys = HvUSEDKEYS(MUTABLE_HV(sv));
1996 if (HvARRAY(sv) && usedkeys) {
1997 /* Show distribution of HEs in the ARRAY */
1999 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
2002 U32 pow2 = 2, keys = usedkeys;
2003 NV theoret, sum = 0;
2005 PerlIO_printf(file, " (");
2006 Zero(freq, FREQ_MAX + 1, int);
2007 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
2010 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
2012 if (count > FREQ_MAX)
2018 for (i = 0; i <= max; i++) {
2020 PerlIO_printf(file, "%d%s:%d", i,
2021 (i == FREQ_MAX) ? "+" : "",
2024 PerlIO_printf(file, ", ");
2027 (void)PerlIO_putc(file, ')');
2028 /* The "quality" of a hash is defined as the total number of
2029 comparisons needed to access every element once, relative
2030 to the expected number needed for a random hash.
2032 The total number of comparisons is equal to the sum of
2033 the squares of the number of entries in each bucket.
2034 For a random hash of n keys into k buckets, the expected
2039 for (i = max; i > 0; i--) { /* Precision: count down. */
2040 sum += freq[i] * i * i;
2042 while ((keys = keys >> 1))
2045 theoret += theoret * (theoret-1)/pow2;
2046 (void)PerlIO_putc(file, '\n');
2047 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"
2048 NVff "%%", theoret/sum*100);
2050 (void)PerlIO_putc(file, '\n');
2051 Perl_dump_indent(aTHX_ level, file, " KEYS = %" IVdf "\n",
2055 HE **ents = HvARRAY(sv);
2058 HE *const *const last = ents + HvMAX(sv);
2059 count = last + 1 - ents;
2064 } while (++ents <= last);
2067 Perl_dump_indent(aTHX_ level, file, " FILL = %" UVuf "\n",
2070 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
2073 Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n",
2074 (IV)HvRITER_get(sv));
2075 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n",
2076 PTR2UV(HvEITER_get(sv)));
2077 #ifdef PERL_HASH_RANDOMIZE_KEYS
2078 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%" UVxf,
2079 (UV)HvRAND_get(sv));
2080 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
2081 PerlIO_printf(file, " (LAST = 0x%" UVxf ")",
2082 (UV)HvLASTRAND_get(sv));
2085 (void)PerlIO_putc(file, '\n');
2088 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
2089 if (mg && mg->mg_obj) {
2090 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%" UVxf "\n", PTR2UV(mg->mg_obj));
2094 const char * const hvname = HvNAME_get(sv);
2096 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2097 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2098 generic_pv_escape( tmpsv, hvname,
2099 HvNAMELEN(sv), HvNAMEUTF8(sv)));
2104 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
2105 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
2106 if (HvAUX(sv)->xhv_name_count)
2107 Perl_dump_indent(aTHX_
2108 level, file, " NAMECOUNT = %" IVdf "\n",
2109 (IV)HvAUX(sv)->xhv_name_count
2111 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
2112 const I32 count = HvAUX(sv)->xhv_name_count;
2114 SV * const names = newSVpvs_flags("", SVs_TEMP);
2115 /* The starting point is the first element if count is
2116 positive and the second element if count is negative. */
2117 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2118 + (count < 0 ? 1 : 0);
2119 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2120 + (count < 0 ? -count : count);
2121 while (hekp < endp) {
2123 SV *tmp = newSVpvs_flags("", SVs_TEMP);
2124 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
2125 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
2127 /* This should never happen. */
2128 sv_catpvs(names, ", (null)");
2132 Perl_dump_indent(aTHX_
2133 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
2137 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
2138 const char *const hvename = HvENAME_get(sv);
2139 Perl_dump_indent(aTHX_
2140 level, file, " ENAME = \"%s\"\n",
2141 generic_pv_escape(tmp, hvename,
2142 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
2146 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%" UVxf "\n",
2148 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
2152 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2153 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"
2155 generic_pv_escape( tmpsv, meta->mro_which->name,
2156 meta->mro_which->length,
2157 (meta->mro_which->kflags & HVhek_UTF8)),
2158 PTR2UV(meta->mro_which));
2159 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"
2161 (UV)meta->cache_gen);
2162 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%" UVxf "\n",
2164 if (meta->mro_linear_all) {
2165 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"
2167 PTR2UV(meta->mro_linear_all));
2168 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
2171 if (meta->mro_linear_current) {
2172 Perl_dump_indent(aTHX_ level, file,
2173 " MRO_LINEAR_CURRENT = 0x%" UVxf "\n",
2174 PTR2UV(meta->mro_linear_current));
2175 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
2178 if (meta->mro_nextmethod) {
2179 Perl_dump_indent(aTHX_ level, file,
2180 " MRO_NEXTMETHOD = 0x%" UVxf "\n",
2181 PTR2UV(meta->mro_nextmethod));
2182 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
2186 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%" UVxf "\n",
2188 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
2193 if (nest < maxnest) {
2194 HV * const hv = MUTABLE_HV(sv);
2199 int count = maxnest - nest;
2200 for (i=0; i <= HvMAX(hv); i++) {
2201 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2208 if (count-- <= 0) goto DONEHV;
2211 keysv = hv_iterkeysv(he);
2212 keypv = SvPV_const(keysv, len);
2215 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
2217 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2218 if (HvEITER_get(hv) == he)
2219 PerlIO_printf(file, "[CURRENT] ");
2220 PerlIO_printf(file, "HASH = 0x%" UVxf "\n", (UV) hash);
2221 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2228 } /* case SVt_PVHV */
2231 if (CvAUTOLOAD(sv)) {
2232 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2234 const char *const name = SvPV_const(sv, len);
2235 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
2236 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
2239 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2240 const char *const proto = CvPROTO(sv);
2241 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
2242 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
2247 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
2248 if (!CvISXSUB(sv)) {
2251 Perl_dump_indent(aTHX_ level, file,
2252 " SLAB = 0x%" UVxf "\n",
2253 PTR2UV(CvSTART(sv)));
2255 Perl_dump_indent(aTHX_ level, file,
2256 " START = 0x%" UVxf " ===> %" IVdf "\n",
2257 PTR2UV(CvSTART(sv)),
2258 (IV)sequence_num(CvSTART(sv)));
2260 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%" UVxf "\n",
2261 PTR2UV(CvROOT(sv)));
2262 if (CvROOT(sv) && dumpops) {
2263 do_op_dump(level+1, file, CvROOT(sv));
2266 SV * const constant = cv_const_sv((const CV *)sv);
2268 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%" UVxf "\n", PTR2UV(CvXSUB(sv)));
2271 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%" UVxf
2273 PTR2UV(CvXSUBANY(sv).any_ptr));
2274 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2277 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %" IVdf "\n",
2278 (IV)CvXSUBANY(sv).any_i32);
2282 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2283 HEK_KEY(CvNAME_HEK((CV *)sv)));
2284 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
2285 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
2286 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"
2287 IVdf "\n", (IV)CvDEPTH(sv));
2288 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n",
2290 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %" UVuf "\n", (UV)CvOUTSIDE_SEQ(sv));
2291 if (!CvISXSUB(sv)) {
2292 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%" UVxf "\n", PTR2UV(CvPADLIST(sv)));
2293 if (nest < maxnest) {
2294 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2298 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
2300 const CV * const outside = CvOUTSIDE(sv);
2301 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%" UVxf " (%s)\n",
2304 : CvANON(outside) ? "ANON"
2305 : (outside == PL_main_cv) ? "MAIN"
2306 : CvUNIQUE(outside) ? "UNIQUE"
2309 newSVpvs_flags("", SVs_TEMP),
2310 GvNAME(CvGV(outside)),
2311 GvNAMELEN(CvGV(outside)),
2312 GvNAMEUTF8(CvGV(outside)))
2316 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2317 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2322 if (type == SVt_PVLV) {
2323 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2324 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %" IVdf "\n", (IV)LvTARGOFF(sv));
2325 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %" IVdf "\n", (IV)LvTARGLEN(sv));
2326 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%" UVxf "\n", PTR2UV(LvTARG(sv)));
2327 Perl_dump_indent(aTHX_ level, file, " FLAGS = %" IVdf "\n", (IV)LvFLAGS(sv));
2328 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2329 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2332 if (isREGEXP(sv)) goto dumpregexp;
2333 if (!isGV_with_GP(sv))
2336 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2337 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2338 generic_pv_escape(tmpsv, GvNAME(sv),
2342 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %" IVdf "\n", (IV)GvNAMELEN(sv));
2343 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2344 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)GvFLAGS(sv));
2345 Perl_dump_indent(aTHX_ level, file, " GP = 0x%" UVxf "\n", PTR2UV(GvGP(sv)));
2348 Perl_dump_indent(aTHX_ level, file, " SV = 0x%" UVxf "\n", PTR2UV(GvSV(sv)));
2349 Perl_dump_indent(aTHX_ level, file, " REFCNT = %" IVdf "\n", (IV)GvREFCNT(sv));
2350 Perl_dump_indent(aTHX_ level, file, " IO = 0x%" UVxf "\n", PTR2UV(GvIOp(sv)));
2351 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%" UVxf " \n", PTR2UV(GvFORM(sv)));
2352 Perl_dump_indent(aTHX_ level, file, " AV = 0x%" UVxf "\n", PTR2UV(GvAV(sv)));
2353 Perl_dump_indent(aTHX_ level, file, " HV = 0x%" UVxf "\n", PTR2UV(GvHV(sv)));
2354 Perl_dump_indent(aTHX_ level, file, " CV = 0x%" UVxf "\n", PTR2UV(GvCV(sv)));
2355 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%" UVxf "\n", (UV)GvCVGEN(sv));
2356 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%" UVxf
2360 Perl_dump_indent(aTHX_ level, file, " LINE = %" IVdf "\n", (IV)GvLINE(sv));
2361 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2362 do_gv_dump (level, file, " EGV", GvEGV(sv));
2365 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%" UVxf "\n", PTR2UV(IoIFP(sv)));
2366 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%" UVxf "\n", PTR2UV(IoOFP(sv)));
2367 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%" UVxf "\n", PTR2UV(IoDIRP(sv)));
2368 Perl_dump_indent(aTHX_ level, file, " LINES = %" IVdf "\n", (IV)IoLINES(sv));
2369 Perl_dump_indent(aTHX_ level, file, " PAGE = %" IVdf "\n", (IV)IoPAGE(sv));
2370 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %" IVdf "\n", (IV)IoPAGE_LEN(sv));
2371 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %" IVdf "\n", (IV)IoLINES_LEFT(sv));
2373 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2374 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2375 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2377 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%" UVxf "\n",
2378 PTR2UV(IoTOP_GV(sv)));
2379 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2380 maxnest, dumpops, pvlim);
2382 /* Source filters hide things that are not GVs in these three, so let's
2383 be careful out there. */
2385 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2386 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2387 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2389 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%" UVxf "\n",
2390 PTR2UV(IoFMT_GV(sv)));
2391 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2392 maxnest, dumpops, pvlim);
2394 if (IoBOTTOM_NAME(sv))
2395 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2396 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2397 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2399 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%" UVxf "\n",
2400 PTR2UV(IoBOTTOM_GV(sv)));
2401 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2402 maxnest, dumpops, pvlim);
2404 if (isPRINT(IoTYPE(sv)))
2405 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2407 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2408 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)IoFLAGS(sv));
2413 struct regexp * const r = ReANY((REGEXP*)sv);
2415 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2417 append_flags(d, flags, names); \
2418 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2419 SvCUR_set(d, SvCUR(d) - 1); \
2420 SvPVX(d)[SvCUR(d)] = '\0'; \
2423 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2424 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%" UVxf " (%s)\n",
2425 (UV)(r->compflags), SvPVX_const(d));
2427 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2428 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%" UVxf " (%s)\n",
2429 (UV)(r->extflags), SvPVX_const(d));
2431 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%" UVxf " (%s)\n",
2432 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2433 if (r->engine == &PL_core_reg_engine) {
2434 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2435 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf " (%s)\n",
2436 (UV)(r->intflags), SvPVX_const(d));
2438 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "\n",
2441 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2442 Perl_dump_indent(aTHX_ level, file, " NPARENS = %" UVuf "\n",
2444 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %" UVuf "\n",
2445 (UV)(r->lastparen));
2446 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %" UVuf "\n",
2447 (UV)(r->lastcloseparen));
2448 Perl_dump_indent(aTHX_ level, file, " MINLEN = %" IVdf "\n",
2450 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %" IVdf "\n",
2451 (IV)(r->minlenret));
2452 Perl_dump_indent(aTHX_ level, file, " GOFS = %" UVuf "\n",
2454 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %" UVuf "\n",
2455 (UV)(r->pre_prefix));
2456 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %" IVdf "\n",
2458 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %" IVdf "\n",
2459 (IV)(r->suboffset));
2460 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %" IVdf "\n",
2461 (IV)(r->subcoffset));
2463 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%" UVxf " %s\n",
2465 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2467 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2468 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n",
2469 PTR2UV(r->mother_re));
2470 if (nest < maxnest && r->mother_re)
2471 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2472 maxnest, dumpops, pvlim);
2473 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%" UVxf "\n",
2474 PTR2UV(r->paren_names));
2475 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%" UVxf "\n",
2476 PTR2UV(r->substrs));
2477 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%" UVxf "\n",
2478 PTR2UV(r->pprivate));
2479 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%" UVxf "\n",
2481 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%" UVxf "\n",
2482 PTR2UV(r->qr_anoncv));
2484 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%" UVxf "\n",
2485 PTR2UV(r->saved_copy));
2496 Dumps the contents of an SV to the C<STDERR> filehandle.
2498 For an example of its output, see L<Devel::Peek>.
2504 Perl_sv_dump(pTHX_ SV *sv)
2506 if (sv && SvROK(sv))
2507 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2509 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2513 Perl_runops_debug(pTHX)
2515 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2516 SSize_t orig_stack_hwm = PL_curstackinfo->si_stack_hwm;
2518 PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2522 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2525 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2527 #ifdef PERL_TRACE_OPS
2528 ++PL_op_exec_cnt[PL_op->op_type];
2530 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2531 if (PL_curstackinfo->si_stack_hwm < PL_stack_sp - PL_stack_base)
2532 Perl_croak_nocontext(
2533 "panic: previous op failed to extend arg stack: "
2534 "base=%p, sp=%p, hwm=%p\n",
2535 PL_stack_base, PL_stack_sp,
2536 PL_stack_base + PL_curstackinfo->si_stack_hwm);
2537 PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2542 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2543 PerlIO_printf(Perl_debug_log,
2544 "WARNING: %" UVxf " changed from %" UVxf " to %" UVxf "\n",
2545 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2546 PTR2UV(*PL_watchaddr));
2547 if (DEBUG_s_TEST_) {
2548 if (DEBUG_v_TEST_) {
2549 PerlIO_printf(Perl_debug_log, "\n");
2557 if (DEBUG_t_TEST_) debop(PL_op);
2558 if (DEBUG_P_TEST_) debprof(PL_op);
2563 PERL_DTRACE_PROBE_OP(PL_op);
2564 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2565 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2568 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2569 if (PL_curstackinfo->si_stack_hwm < orig_stack_hwm)
2570 PL_curstackinfo->si_stack_hwm = orig_stack_hwm;
2577 /* print the names of the n lexical vars starting at pad offset off */
2580 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2583 CV * const cv = deb_curcv(cxstack_ix);
2584 PADNAMELIST *comppad = NULL;
2588 PADLIST * const padlist = CvPADLIST(cv);
2589 comppad = PadlistNAMES(padlist);
2592 PerlIO_printf(Perl_debug_log, "(");
2593 for (i = 0; i < n; i++) {
2594 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2595 PerlIO_printf(Perl_debug_log, "%" PNf, PNfARG(sv));
2597 PerlIO_printf(Perl_debug_log, "[%" UVuf "]",
2600 PerlIO_printf(Perl_debug_log, ",");
2603 PerlIO_printf(Perl_debug_log, ")");
2607 /* append to the out SV, the name of the lexical at offset off in the CV
2611 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2612 bool paren, bool is_scalar)
2615 PADNAMELIST *namepad = NULL;
2619 PADLIST * const padlist = CvPADLIST(cv);
2620 namepad = PadlistNAMES(padlist);
2624 sv_catpvs_nomg(out, "(");
2625 for (i = 0; i < n; i++) {
2626 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2628 STRLEN cur = SvCUR(out);
2629 Perl_sv_catpvf(aTHX_ out, "[%" UTF8f,
2630 UTF8fARG(1, PadnameLEN(sv) - 1,
2631 PadnamePV(sv) + 1));
2633 SvPVX(out)[cur] = '$';
2636 Perl_sv_catpvf(aTHX_ out, "[%" UVuf "]", (UV)(off+i));
2638 sv_catpvs_nomg(out, ",");
2641 sv_catpvs_nomg(out, "(");
2646 S_append_gv_name(pTHX_ GV *gv, SV *out)
2650 sv_catpvs_nomg(out, "<NULLGV>");
2654 gv_fullname4(sv, gv, NULL, FALSE);
2655 Perl_sv_catpvf(aTHX_ out, "$%" SVf, SVfARG(sv));
2656 SvREFCNT_dec_NN(sv);
2660 # define ITEM_SV(item) (comppad ? \
2661 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2663 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2667 /* return a temporary SV containing a stringified representation of
2668 * the op_aux field of a MULTIDEREF op, associated with CV cv
2672 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2674 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2675 UV actions = items->uv;
2678 bool is_hash = FALSE;
2680 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2685 PADLIST *padlist = CvPADLIST(cv);
2686 comppad = PadlistARRAY(padlist)[1];
2692 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2695 switch (actions & MDEREF_ACTION_MASK) {
2698 actions = (++items)->uv;
2700 NOT_REACHED; /* NOTREACHED */
2702 case MDEREF_HV_padhv_helem:
2705 case MDEREF_AV_padav_aelem:
2707 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2709 NOT_REACHED; /* NOTREACHED */
2711 case MDEREF_HV_gvhv_helem:
2714 case MDEREF_AV_gvav_aelem:
2717 sv = ITEM_SV(items);
2718 S_append_gv_name(aTHX_ (GV*)sv, out);
2720 NOT_REACHED; /* NOTREACHED */
2722 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2725 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2727 sv = ITEM_SV(items);
2728 S_append_gv_name(aTHX_ (GV*)sv, out);
2729 goto do_vivify_rv2xv_elem;
2730 NOT_REACHED; /* NOTREACHED */
2732 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2735 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2736 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2737 goto do_vivify_rv2xv_elem;
2738 NOT_REACHED; /* NOTREACHED */
2740 case MDEREF_HV_pop_rv2hv_helem:
2741 case MDEREF_HV_vivify_rv2hv_helem:
2744 do_vivify_rv2xv_elem:
2745 case MDEREF_AV_pop_rv2av_aelem:
2746 case MDEREF_AV_vivify_rv2av_aelem:
2748 sv_catpvs_nomg(out, "->");
2750 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2751 sv_catpvs_nomg(out, "->");
2756 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2757 switch (actions & MDEREF_INDEX_MASK) {
2758 case MDEREF_INDEX_const:
2761 sv = ITEM_SV(items);
2763 sv_catpvs_nomg(out, "???");
2768 pv_pretty(out, s, cur, 30,
2770 (PERL_PV_PRETTY_NOCLEAR
2771 |PERL_PV_PRETTY_QUOTE
2772 |PERL_PV_PRETTY_ELLIPSES));
2776 Perl_sv_catpvf(aTHX_ out, "%" IVdf, (++items)->iv);
2778 case MDEREF_INDEX_padsv:
2779 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2781 case MDEREF_INDEX_gvsv:
2783 sv = ITEM_SV(items);
2784 S_append_gv_name(aTHX_ (GV*)sv, out);
2787 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2789 if (actions & MDEREF_FLAG_last)
2796 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2797 (int)(actions & MDEREF_ACTION_MASK));
2803 actions >>= MDEREF_SHIFT;
2809 /* Return a temporary SV containing a stringified representation of
2810 * the op_aux field of a MULTICONCAT op. Note that if the aux contains
2811 * both plain and utf8 versions of the const string and indices, only
2812 * the first is displayed.
2816 Perl_multiconcat_stringify(pTHX_ const OP *o)
2818 UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
2819 UNOP_AUX_item *lens;
2823 SV *out = newSVpvn_flags("", 0, SVs_TEMP);
2825 PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY;
2827 nargs = aux[PERL_MULTICONCAT_IX_NARGS].ssize;
2828 s = aux[PERL_MULTICONCAT_IX_PLAIN_PV].pv;
2829 len = aux[PERL_MULTICONCAT_IX_PLAIN_LEN].ssize;
2831 s = aux[PERL_MULTICONCAT_IX_UTF8_PV].pv;
2832 len = aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize;
2833 sv_catpvs(out, "UTF8 ");
2835 pv_pretty(out, s, len, 50,
2837 (PERL_PV_PRETTY_NOCLEAR
2838 |PERL_PV_PRETTY_QUOTE
2839 |PERL_PV_PRETTY_ELLIPSES));
2841 lens = aux + PERL_MULTICONCAT_IX_LENGTHS;
2842 while (nargs-- >= 0) {
2843 Perl_sv_catpvf(aTHX_ out, ",%" IVdf, (IV)lens->ssize);
2851 Perl_debop(pTHX_ const OP *o)
2853 PERL_ARGS_ASSERT_DEBOP;
2855 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2858 Perl_deb(aTHX_ "%s", OP_NAME(o));
2859 switch (o->op_type) {
2862 /* With ITHREADS, consts are stored in the pad, and the right pad
2863 * may not be active here, so check.
2864 * Looks like only during compiling the pads are illegal.
2867 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2869 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2873 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2874 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)));
2881 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2885 S_deb_padvar(aTHX_ o->op_targ,
2886 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2890 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2891 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2894 case OP_MULTICONCAT:
2895 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2896 SVfARG(multiconcat_stringify(o)));
2902 PerlIO_printf(Perl_debug_log, "\n");
2908 =for apidoc op_class
2910 Given an op, determine what type of struct it has been allocated as.
2911 Returns one of the OPclass enums, such as OPclass_LISTOP.
2918 Perl_op_class(pTHX_ const OP *o)
2923 return OPclass_NULL;
2925 if (o->op_type == 0) {
2926 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
2928 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2931 if (o->op_type == OP_SASSIGN)
2932 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPclass_UNOP : OPclass_BINOP);
2934 if (o->op_type == OP_AELEMFAST) {
2936 return OPclass_PADOP;
2938 return OPclass_SVOP;
2943 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
2944 o->op_type == OP_RCATLINE)
2945 return OPclass_PADOP;
2948 if (o->op_type == OP_CUSTOM)
2951 switch (OP_CLASS(o)) {
2953 return OPclass_BASEOP;
2956 return OPclass_UNOP;
2959 return OPclass_BINOP;
2962 return OPclass_LOGOP;
2965 return OPclass_LISTOP;
2968 return OPclass_PMOP;
2971 return OPclass_SVOP;
2974 return OPclass_PADOP;
2976 case OA_PVOP_OR_SVOP:
2978 * Character translations (tr///) are usually a PVOP, keeping a
2979 * pointer to a table of shorts used to look up translations.
2980 * Under utf8, however, a simple table isn't practical; instead,
2981 * the OP is an SVOP (or, under threads, a PADOP),
2982 * and the SV is an AV.
2985 (o->op_private & OPpTRANS_USE_SVOP)
2987 #if defined(USE_ITHREADS)
2988 ? OPclass_PADOP : OPclass_PVOP;
2990 ? OPclass_SVOP : OPclass_PVOP;
2994 return OPclass_LOOP;
2999 case OA_BASEOP_OR_UNOP:
3001 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
3002 * whether parens were seen. perly.y uses OPf_SPECIAL to
3003 * signal whether a BASEOP had empty parens or none.
3004 * Some other UNOPs are created later, though, so the best
3005 * test is OPf_KIDS, which is set in newUNOP.
3007 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
3011 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
3012 * the OPf_REF flag to distinguish between OP types instead of the
3013 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
3014 * return OPclass_UNOP so that walkoptree can find our children. If
3015 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
3016 * (no argument to the operator) it's an OP; with OPf_REF set it's
3017 * an SVOP (and op_sv is the GV for the filehandle argument).
3019 return ((o->op_flags & OPf_KIDS) ? OPclass_UNOP :
3021 (o->op_flags & OPf_REF) ? OPclass_PADOP : OPclass_BASEOP);
3023 (o->op_flags & OPf_REF) ? OPclass_SVOP : OPclass_BASEOP);
3027 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
3028 * label was omitted (in which case it's a BASEOP) or else a term was
3029 * seen. In this last case, all except goto are definitely PVOP but
3030 * goto is either a PVOP (with an ordinary constant label), an UNOP
3031 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
3032 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
3035 if (o->op_flags & OPf_STACKED)
3036 return OPclass_UNOP;
3037 else if (o->op_flags & OPf_SPECIAL)
3038 return OPclass_BASEOP;
3040 return OPclass_PVOP;
3042 return OPclass_METHOP;
3044 return OPclass_UNOP_AUX;
3046 Perl_warn(aTHX_ "Can't determine class of operator %s, assuming BASEOP\n",
3048 return OPclass_BASEOP;
3054 S_deb_curcv(pTHX_ I32 ix)
3056 PERL_SI *si = PL_curstackinfo;
3057 for (; ix >=0; ix--) {
3058 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
3060 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
3061 return cx->blk_sub.cv;
3062 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
3063 return cx->blk_eval.cv;
3064 else if (ix == 0 && si->si_type == PERLSI_MAIN)
3066 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
3067 && si->si_type == PERLSI_SORT)
3069 /* fake sort sub; use CV of caller */
3071 ix = si->si_cxix + 1;
3078 Perl_watch(pTHX_ char **addr)
3080 PERL_ARGS_ASSERT_WATCH;
3082 PL_watchaddr = addr;
3084 PerlIO_printf(Perl_debug_log, "WATCHING, %" UVxf " is currently %" UVxf "\n",
3085 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
3089 S_debprof(pTHX_ const OP *o)
3091 PERL_ARGS_ASSERT_DEBPROF;
3093 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
3095 if (!PL_profiledata)
3096 Newxz(PL_profiledata, MAXO, U32);
3097 ++PL_profiledata[o->op_type];
3101 Perl_debprofdump(pTHX)
3104 if (!PL_profiledata)
3106 for (i = 0; i < MAXO; i++) {
3107 if (PL_profiledata[i])
3108 PerlIO_printf(Perl_debug_log,
3109 "%5lu %s\n", (unsigned long)PL_profiledata[i],
3116 * ex: set ts=8 sts=4 sw=4 et: