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
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) )
94 #define _pv_display_for_dump(dsv, pv, cur, len, pvlim) \
95 _pv_display_flags(aTHX_ dsv, pv, cur, len, pvlim, PERL_PV_ESCAPE_DWIM_ALL_HEX)
100 Escapes at most the first C<count> chars of C<pv> and puts the results into
101 C<dsv> such that the size of the escaped string will not exceed C<max> chars
102 and will not contain any incomplete escape sequences. The number of bytes
103 escaped will be returned in the C<STRLEN *escaped> parameter if it is not null.
104 When the C<dsv> parameter is null no escaping actually occurs, but the number
105 of bytes that would be escaped were it not null will be calculated.
107 If flags contains C<PERL_PV_ESCAPE_QUOTE> then any double quotes in the string
108 will also be escaped.
110 Normally the SV will be cleared before the escaped string is prepared,
111 but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
113 If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8.
114 If C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
115 using C<is_utf8_string()> to determine if it is UTF-8.
117 If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
118 using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII>
119 is set, only non-ASCII chars will be escaped using this style;
120 otherwise, only chars above 255 will be so escaped; other non printable
121 chars will use octal or common escaped patterns like C<\n>. Otherwise,
122 if C<PERL_PV_ESCAPE_NOBACKSLASH> then all chars below 255 will be
123 treated as printable and will be output as literals. The
124 C<PERL_PV_ESCAPE_NON_WC> modifies the previous rules to cause word
125 chars, unicode or otherwise, to be output as literals, note this uses
126 the *unicode* rules for deciding on word characters.
128 If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
129 string will be escaped, regardless of max. If the output is to be in
130 hex, then it will be returned as a plain hex sequence. Thus the output
131 will either be a single char, an octal escape sequence, a special escape
132 like C<\n> or a hex value.
134 If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a
135 C<"%"> and not a C<"\\">. This is because regexes very often contain
136 backslashed sequences, whereas C<"%"> is not a particularly common
137 character in patterns.
139 Returns a pointer to the escaped text as held by C<dsv>.
141 =for apidoc Amnh||PERL_PV_ESCAPE_ALL
142 =for apidoc Amnh||PERL_PV_ESCAPE_FIRSTCHAR
143 =for apidoc Amnh||PERL_PV_ESCAPE_NOBACKSLASH
144 =for apidoc Amnh||PERL_PV_ESCAPE_NOCLEAR
145 =for apidoc Amnh||PERL_PV_ESCAPE_NONASCII
146 =for apidoc Amnh||PERL_PV_ESCAPE_QUOTE
147 =for apidoc Amnh||PERL_PV_ESCAPE_RE
148 =for apidoc Amnh||PERL_PV_ESCAPE_UNI
149 =for apidoc Amnh||PERL_PV_ESCAPE_UNI_DETECT
150 =for apidoc Amnh||PERL_PV_ESCAPE_NON_WC
154 Unused or not for public use
155 =for apidoc Cmnh||PERL_PV_PRETTY_REGPROP
156 =for apidoc Cmnh||PERL_PV_PRETTY_DUMP
157 =for apidoc Cmnh||PERL_PV_PRETTY_NOCLEAR
161 #define PV_ESCAPE_OCTBUFSIZE 32
163 #define PV_BYTE_HEX_UC "x%02" UVXf
164 #define PV_BYTE_HEX_LC "x%02" UVxf
167 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
168 const STRLEN count, STRLEN max,
169 STRLEN * const escaped, U32 flags )
172 bool use_uc_hex = false;
173 if (flags & PERL_PV_ESCAPE_DWIM_ALL_HEX) {
175 flags |= PERL_PV_ESCAPE_DWIM;
178 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
179 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
183 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
184 STRLEN wrote = 0; /* chars written so far */
185 STRLEN chsize = 0; /* size of data to be written */
186 STRLEN readsize = 1; /* size of data just read */
187 bool isuni= (flags & PERL_PV_ESCAPE_UNI)
188 ? TRUE : FALSE; /* is this UTF-8 */
189 const char *pv = str;
190 const char * const end = pv + count; /* end of string */
191 const char *restart = NULL;
192 STRLEN extra_len = 0;
194 if ((flags & PERL_PV_ESCAPE_TRUNC_MIDDLE) && max > 3) {
195 if (flags & PERL_PV_ESCAPE_QUOTE) {
198 } else if (flags & PERL_PV_PRETTY_LTGT) {
207 restart = isuni ? (char *)utf8_hop_back((U8*)end,-tail,(U8*)pv) : end - tail;
221 PERL_ARGS_ASSERT_PV_ESCAPE;
223 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
224 /* This won't alter the UTF-8 flag */
228 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
231 for ( ; pv < end ; pv += readsize ) {
232 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
234 const char *source_buf = octbuf;
237 || (flags & PERL_PV_ESCAPE_ALL)
238 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
240 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
241 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
244 if ((flags & PERL_PV_ESCAPE_NON_WC) && isWORDCHAR_uvchr(u)) {
249 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
250 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
251 ? ( use_uc_hex ? ("%c" PV_BYTE_HEX_UC) : ("%c" PV_BYTE_HEX_LC) )
252 : "%cx{%02" UVxf "}", esc, u);
254 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
257 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
261 case '\\' : /* FALLTHROUGH */
262 case '%' : if ( c == esc ) {
268 case '\v' : octbuf[1] = 'v'; break;
269 case '\t' : octbuf[1] = 't'; break;
270 case '\r' : octbuf[1] = 'r'; break;
271 case '\n' : octbuf[1] = 'n'; break;
272 case '\f' : octbuf[1] = 'f'; break;
280 if ( (flags & PERL_PV_ESCAPE_DWIM_ALL_HEX) || ((flags & PERL_PV_ESCAPE_DWIM) && c != '\0') ) {
281 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
282 isuni ? "%cx{%02" UVxf "}" : ( use_uc_hex ? ("%c" PV_BYTE_HEX_UC) : ("%c" PV_BYTE_HEX_LC) ),
285 else if ((pv+readsize < end) && isDIGIT((U8)*(pv+readsize)))
286 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
289 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
296 if (max && (wrote + chsize > max)) {
298 /* this only happens with PERL_PV_ESCAPE_TRUNC_MIDDLE */
300 Perl_sv_catpvf( aTHX_ dsv,"%s...%s", qe, qs);
309 } else if (chsize > 1) {
311 sv_catpvn(dsv, source_buf, chsize);
314 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
315 can be appended raw to the dsv. If dsv happens to be
316 UTF-8 then we need catpvf to upgrade them for us.
317 Or add a new API call sv_catpvc(). Think about that name, and
318 how to keep it clear that it's unlike the s of catpvs, which is
319 really an array of octets, not a string. */
321 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
324 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
329 return dsv ? SvPVX(dsv) : NULL;
332 =for apidoc pv_pretty
334 Converts a string into something presentable, handling escaping via
335 C<pv_escape()> and supporting quoting and ellipses.
337 If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
338 double quoted with any double quotes in the string escaped. Otherwise
339 if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
342 If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
343 string were output then an ellipsis C<...> will be appended to the
344 string. Note that this happens AFTER it has been quoted.
346 If C<start_color> is non-null then it will be inserted after the opening
347 quote (if there is one) but before the escaped text. If C<end_color>
348 is non-null then it will be inserted after the escaped text but before
349 any quotes or ellipses.
351 Returns a pointer to the prettified text as held by C<dsv>.
353 =for apidoc Amnh||PERL_PV_PRETTY_QUOTE
354 =for apidoc Amnh||PERL_PV_PRETTY_LTGT
355 =for apidoc Amnh||PERL_PV_PRETTY_ELLIPSES
361 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
362 const STRLEN max, char const * const start_color, char const * const end_color,
365 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
366 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
368 STRLEN max_adjust= 0;
371 PERL_ARGS_ASSERT_PV_PRETTY;
373 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
374 /* This won't alter the UTF-8 flag */
377 orig_cur= SvCUR(dsv);
380 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
382 if ( start_color != NULL )
383 sv_catpv(dsv, start_color);
385 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
388 assert(max > max_adjust);
389 pv_escape( NULL, str, count, max - max_adjust, &escaped, flags );
390 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
392 assert(max > max_adjust);
395 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
397 if ( end_color != NULL )
398 sv_catpv(dsv, end_color);
401 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
403 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
404 sv_catpvs(dsv, "...");
406 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
407 while( SvCUR(dsv) - orig_cur < max )
415 _pv_display_flags(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim, I32 pretty_flags)
417 PERL_ARGS_ASSERT_PV_DISPLAY;
419 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP | pretty_flags );
420 if (len > cur && pv[cur] == '\0')
421 sv_catpvs( dsv, "\\0");
426 =for apidoc pv_display
430 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
432 except that an additional "\0" will be appended to the string when
433 len > cur and pv[cur] is "\0".
435 Note that the final string may be up to 7 chars longer than pvlim.
441 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
443 return _pv_display_flags(aTHX_ dsv, pv, cur, len, pvlim, 0);
455 Perl_sv_peek(pTHX_ SV *sv)
457 SV * const t = sv_newmortal();
464 sv_catpvs(t, "VOID");
467 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
468 /* detect data corruption under memory poisoning */
469 sv_catpvs(t, "WILD");
472 else if ( sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes
473 || sv == &PL_sv_zero || sv == &PL_sv_placeholder)
475 if (sv == &PL_sv_undef) {
476 sv_catpvs(t, "SV_UNDEF");
477 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
478 SVs_GMG|SVs_SMG|SVs_RMG)) &&
482 else if (sv == &PL_sv_no) {
483 sv_catpvs(t, "SV_NO");
484 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
485 SVs_GMG|SVs_SMG|SVs_RMG)) &&
486 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
492 else if (sv == &PL_sv_yes) {
493 sv_catpvs(t, "SV_YES");
494 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
495 SVs_GMG|SVs_SMG|SVs_RMG)) &&
496 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
499 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
503 else if (sv == &PL_sv_zero) {
504 sv_catpvs(t, "SV_ZERO");
505 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
506 SVs_GMG|SVs_SMG|SVs_RMG)) &&
507 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
510 SvPVX_const(sv) && *SvPVX_const(sv) == '0' &&
515 sv_catpvs(t, "SV_PLACEHOLDER");
516 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
517 SVs_GMG|SVs_SMG|SVs_RMG)) &&
523 else if (SvREFCNT(sv) == 0) {
527 else if (DEBUG_R_TEST_) {
530 /* is this SV on the tmps stack? */
531 for (ix=PL_tmps_ix; ix>=0; ix--) {
532 if (PL_tmps_stack[ix] == sv) {
537 if (is_tmp || SvREFCNT(sv) > 1) {
538 Perl_sv_catpvf(aTHX_ t, "<");
539 if (SvREFCNT(sv) > 1)
540 Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv));
542 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
543 Perl_sv_catpvf(aTHX_ t, ">");
549 if (SvCUR(t) + unref > 10) {
550 SvCUR_set(t, unref + 3);
559 if (type == SVt_PVCV) {
560 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
562 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
563 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
566 } else if (type < SVt_LAST) {
567 sv_catpv(t, svshorttypenames[type]);
569 if (type == SVt_NULL)
572 sv_catpvs(t, "FREED");
577 if (!SvPVX_const(sv))
578 sv_catpvs(t, "(null)");
580 SV * const tmp = newSVpvs("");
584 SvOOK_offset(sv, delta);
585 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
587 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
589 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
590 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
592 SvREFCNT_dec_NN(tmp);
595 else if (SvNOKp(sv)) {
596 DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
597 STORE_LC_NUMERIC_SET_STANDARD();
598 Perl_sv_catpvf(aTHX_ t, "(%" NVgf ")",SvNVX(sv));
599 RESTORE_LC_NUMERIC();
601 else if (SvIOKp(sv)) {
603 Perl_sv_catpvf(aTHX_ t, "(%" UVuf ")", (UV)SvUVX(sv));
605 Perl_sv_catpvf(aTHX_ t, "(%" IVdf ")", (IV)SvIVX(sv));
613 if (TAINTING_get && sv && SvTAINTED(sv))
614 sv_catpvs(t, " [tainted]");
615 return SvPV_nolen(t);
619 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
622 PERL_ARGS_ASSERT_DUMP_INDENT;
624 dump_vindent(level, file, pat, &args);
629 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
631 PERL_ARGS_ASSERT_DUMP_VINDENT;
632 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
633 PerlIO_vprintf(file, pat, *args);
637 /* Like Perl_dump_indent(), but specifically for ops: adds a vertical bar
638 * for each indent level as appropriate.
640 * bar contains bits indicating which indent columns should have a
641 * vertical bar displayed. Bit 0 is the RH-most column. If there are more
642 * levels than bits in bar, then the first few indents are displayed
645 * The start of a new op is signalled by passing a value for level which
646 * has been negated and offset by 1 (so that level 0 is passed as -1 and
647 * can thus be distinguished from -0); in this case, emit a suitably
648 * indented blank line, then on the next line, display the op's sequence
649 * number, and make the final indent an '+----'.
653 * | FOO # level = 1, bar = 0b1
654 * | | # level =-2-1, bar = 0b11
656 * | BAZ # level = 2, bar = 0b10
660 S_opdump_indent(pTHX_ const OP *o, I32 level, UV bar, PerlIO *file,
661 const char* pat, ...)
665 bool newop = (level < 0);
669 /* start displaying a new op? */
671 UV seq = sequence_num(o);
675 /* output preceding blank line */
676 PerlIO_puts(file, " ");
677 for (i = level-1; i >= 0; i--)
678 PerlIO_puts(file, ( i == 0
679 || (i < UVSIZE*8 && (bar & ((UV)1 << i)))
682 PerlIO_puts(file, "\n");
684 /* output sequence number */
686 PerlIO_printf(file, "%-4" UVuf " ", seq);
688 PerlIO_puts(file, "???? ");
692 PerlIO_printf(file, " ");
694 for (i = level-1; i >= 0; i--)
696 (i == 0 && newop) ? "+--"
697 : (bar & (1 << i)) ? "| "
699 PerlIO_vprintf(file, pat, args);
704 /* display a link field (e.g. op_next) in the format
705 * ====> sequence_number [opname 0x123456]
709 S_opdump_link(pTHX_ const OP *base, const OP *o, PerlIO *file)
711 PerlIO_puts(file, " ===> ");
713 PerlIO_puts(file, "[SELF]\n");
715 PerlIO_printf(file, "%" UVuf " [%s 0x%" UVxf "]\n",
716 sequence_num(o), OP_NAME(o), PTR2UV(o));
718 PerlIO_puts(file, "[0x0]\n");
722 =for apidoc_section $debugging
725 Dumps the entire optree of the current program starting at C<PL_main_root> to
726 C<STDERR>. Also dumps the optrees for all visible subroutines in
735 dump_all_perl(FALSE);
739 Perl_dump_all_perl(pTHX_ bool justperl)
741 PerlIO_setlinebuf(Perl_debug_log);
743 op_dump(PL_main_root);
744 dump_packsubs_perl(PL_defstash, justperl);
748 =for apidoc dump_packsubs
750 Dumps the optrees for all visible subroutines in C<stash>.
756 Perl_dump_packsubs(pTHX_ const HV *stash)
758 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
759 dump_packsubs_perl(stash, FALSE);
763 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
767 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
769 if (!HvTOTALKEYS(stash))
771 for (i = 0; i <= (I32) HvMAX(stash); i++) {
773 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
774 GV * gv = (GV *)HeVAL(entry);
775 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
776 /* unfake a fake GV */
777 (void)CvGV(SvRV(gv));
778 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
781 dump_sub_perl(gv, justperl);
784 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
785 const HV * const hv = GvHV(gv);
786 if (hv && (hv != PL_defstash))
787 dump_packsubs_perl(hv, justperl); /* nested package */
794 Perl_dump_sub(pTHX_ const GV *gv)
796 PERL_ARGS_ASSERT_DUMP_SUB;
797 dump_sub_perl(gv, FALSE);
801 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
805 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
807 cv = isGV_with_GP(gv) ? GvCV(gv) : CV_FROM_REF((SV*)gv);
808 if (justperl && (CvISXSUB(cv) || !CvROOT(cv)))
811 if (isGV_with_GP(gv)) {
812 SV * const namesv = newSVpvs_flags("", SVs_TEMP);
813 SV *escsv = newSVpvs_flags("", SVs_TEMP);
816 gv_fullname3(namesv, gv, NULL);
817 namepv = SvPV_const(namesv, namelen);
818 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
819 generic_pv_escape(escsv, namepv, namelen, SvUTF8(namesv)));
821 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB = ");
824 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%" UVxf " %d)\n",
826 (int)CvXSUBANY(cv).any_i32);
830 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
834 =for apidoc dump_form
836 Dumps the contents of the format contained in the GV C<gv> to C<STDERR>, or a
837 message that one doesn't exist.
843 Perl_dump_form(pTHX_ const GV *gv)
845 SV * const sv = sv_newmortal();
847 PERL_ARGS_ASSERT_DUMP_FORM;
849 gv_fullname3(sv, gv, NULL);
850 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
851 if (CvROOT(GvFORM(gv)))
852 op_dump(CvROOT(GvFORM(gv)));
854 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
860 op_dump(PL_eval_root);
864 /* returns a temp SV displaying the name of a GV. Handles the case where
865 * a GV is in fact a ref to a CV */
868 S_gv_display(pTHX_ GV *gv)
870 SV * const name = newSVpvs_flags("", SVs_TEMP);
872 SV * const raw = newSVpvs_flags("", SVs_TEMP);
876 if (isGV_with_GP(gv))
877 gv_fullname3(raw, gv, NULL);
879 Perl_sv_catpvf(aTHX_ raw, "cv ref: %s",
880 SvPV_nolen_const(cv_name(CV_FROM_REF((SV*)gv), name, 0)));
882 rawpv = SvPV_const(raw, len);
883 generic_pv_escape(name, rawpv, len, SvUTF8(raw));
886 sv_catpvs(name, "(NULL)");
895 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o);
899 S_do_pmop_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const PMOP *pm)
906 kidbar = ((bar << 1) | cBOOL(pm->op_flags & OPf_KIDS)) << 1;
909 char ch = (pm->op_pmflags & PMf_ONCE) ? '?' : '/';
910 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE %c%.*s%c\n",
911 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch);
914 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE (RUNTIME)\n");
916 if (pm->op_pmflags || PM_GETRE(pm)) {
917 SV * const tmpsv = pm_description(pm);
918 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMFLAGS = (%s)\n",
919 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
920 SvREFCNT_dec_NN(tmpsv);
923 if (pm->op_type == OP_SPLIT)
924 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
925 "TARGOFF/GV = 0x%" UVxf "\n",
926 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
928 if (pm->op_pmreplrootu.op_pmreplroot) {
929 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_REPL =\n");
930 S_do_op_dump_bar(aTHX_ level + 2,
931 (kidbar|cBOOL(OpHAS_SIBLING(pm->op_pmreplrootu.op_pmreplroot))),
932 file, pm->op_pmreplrootu.op_pmreplroot);
936 if (pm->op_code_list) {
937 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
938 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "CODE_LIST =\n");
939 S_do_op_dump_bar(aTHX_ level + 2,
940 (kidbar | cBOOL(OpHAS_SIBLING(pm->op_code_list))),
941 file, pm->op_code_list);
944 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
945 "CODE_LIST = 0x%" UVxf "\n", PTR2UV(pm->op_code_list));
951 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
953 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
954 S_do_pmop_dump_bar(aTHX_ level, 0, file, pm);
958 const struct flag_to_name pmflags_flags_names[] = {
959 {PMf_CONST, ",CONST"},
961 {PMf_GLOBAL, ",GLOBAL"},
962 {PMf_CONTINUE, ",CONTINUE"},
963 {PMf_RETAINT, ",RETAINT"},
965 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
966 {PMf_HAS_CV, ",HAS_CV"},
967 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
968 {PMf_IS_QR, ",IS_QR"}
972 S_pm_description(pTHX_ const PMOP *pm)
974 SV * const desc = newSVpvs("");
975 const REGEXP * const regex = PM_GETRE(pm);
976 const U32 pmflags = pm->op_pmflags;
978 PERL_ARGS_ASSERT_PM_DESCRIPTION;
980 if (pmflags & PMf_ONCE)
981 sv_catpvs(desc, ",ONCE");
983 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
984 sv_catpvs(desc, ":USED");
986 if (pmflags & PMf_USED)
987 sv_catpvs(desc, ":USED");
991 if (RX_ISTAINTED(regex))
992 sv_catpvs(desc, ",TAINTED");
993 if (RX_CHECK_SUBSTR(regex)) {
994 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
995 sv_catpvs(desc, ",SCANFIRST");
996 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
997 sv_catpvs(desc, ",ALL");
999 if (RX_EXTFLAGS(regex) & RXf_START_ONLY)
1000 sv_catpvs(desc, ",START_ONLY");
1001 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
1002 sv_catpvs(desc, ",SKIPWHITE");
1003 if (RX_EXTFLAGS(regex) & RXf_WHITE)
1004 sv_catpvs(desc, ",WHITE");
1005 if (RX_EXTFLAGS(regex) & RXf_NULL)
1006 sv_catpvs(desc, ",NULL");
1009 append_flags(desc, pmflags, pmflags_flags_names);
1014 =for apidoc pmop_dump
1016 Dump an OP that is related to Pattern Matching, such as C<s/foo/bar/>; these require
1023 Perl_pmop_dump(pTHX_ PMOP *pm)
1025 do_pmop_dump(0, Perl_debug_log, pm);
1028 /* Return a unique integer to represent the address of op o.
1029 * If it already exists in PL_op_sequence, just return it;
1031 * *** Note that this isn't thread-safe */
1034 S_sequence_num(pTHX_ const OP *o)
1042 op = newSVuv(PTR2UV(o));
1044 key = SvPV_const(op, len);
1045 if (!PL_op_sequence)
1046 PL_op_sequence = newHV();
1047 seq = hv_fetch(PL_op_sequence, key, len, TRUE);
1050 sv_setuv(*seq, ++PL_op_seq);
1058 const struct flag_to_name op_flags_names[] = {
1059 {OPf_KIDS, ",KIDS"},
1060 {OPf_PARENS, ",PARENS"},
1063 {OPf_STACKED, ",STACKED"},
1064 {OPf_SPECIAL, ",SPECIAL"}
1068 /* indexed by enum OPclass */
1069 const char * const op_class_names[] = {
1087 /* dump an op and any children. level indicates the initial indent.
1088 * The bits of bar indicate which indents should receive a vertical bar.
1089 * For example if level == 5 and bar == 0b01101, then the indent prefix
1090 * emitted will be (not including the <>'s):
1093 * 55554444333322221111
1095 * For heavily nested output, the level may exceed the number of bits
1096 * in bar; in this case the first few columns in the output will simply
1097 * not have a bar, which is harmless.
1101 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
1103 const OPCODE optype = o->op_type;
1105 PERL_ARGS_ASSERT_DO_OP_DUMP;
1107 /* print op header line */
1109 S_opdump_indent(aTHX_ o, -level-1, bar, file, "%s", OP_NAME(o));
1111 if (optype == OP_NULL && o->op_targ)
1112 PerlIO_printf(file, " (ex-%s)",PL_op_name[o->op_targ]);
1114 PerlIO_printf(file, " %s(0x%" UVxf ")",
1115 op_class_names[op_class(o)], PTR2UV(o));
1116 S_opdump_link(aTHX_ o, o->op_next, file);
1118 /* print op common fields */
1121 S_opdump_indent(aTHX_ o, level, bar, file, "PARENT");
1122 S_opdump_link(aTHX_ o, op_parent((OP*)o), file);
1124 else if (!OpHAS_SIBLING(o)) {
1126 OP *p = o->op_sibparent;
1127 if (!p || !(p->op_flags & OPf_KIDS))
1130 OP *kid = cUNOPx(p)->op_first;
1132 kid = OpSIBLING(kid);
1140 S_opdump_indent(aTHX_ o, level, bar, file,
1141 "*** WILD PARENT 0x%p\n", p);
1145 if (o->op_targ && optype != OP_NULL)
1146 S_opdump_indent(aTHX_ o, level, bar, file, "TARG = %ld\n",
1149 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
1150 SV * const tmpsv = newSVpvs("");
1151 switch (o->op_flags & OPf_WANT) {
1153 sv_catpvs(tmpsv, ",VOID");
1155 case OPf_WANT_SCALAR:
1156 sv_catpvs(tmpsv, ",SCALAR");
1159 sv_catpvs(tmpsv, ",LIST");
1162 sv_catpvs(tmpsv, ",UNKNOWN");
1165 append_flags(tmpsv, o->op_flags, op_flags_names);
1166 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
1167 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
1168 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
1169 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
1170 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
1171 S_opdump_indent(aTHX_ o, level, bar, file, "FLAGS = (%s)\n",
1172 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
1175 if (o->op_private) {
1176 U16 oppriv = o->op_private;
1177 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
1182 tmpsv = newSVpvs("");
1183 for (; !stop; op_ix++) {
1184 U16 entry = PL_op_private_bitdefs[op_ix];
1185 U16 bit = (entry >> 2) & 7;
1186 U16 ix = entry >> 5;
1192 I16 const *p = &PL_op_private_bitfields[ix];
1193 U16 bitmin = (U16) *p++;
1200 for (i = bitmin; i<= bit; i++)
1203 val = (oppriv & mask);
1206 && PL_op_private_labels[label] == '-'
1207 && PL_op_private_labels[label+1] == '\0'
1209 /* display as raw number */
1222 if (val == 0 && enum_label == -1)
1223 /* don't display anonymous zero values */
1226 sv_catpvs(tmpsv, ",");
1228 sv_catpv(tmpsv, &PL_op_private_labels[label]);
1229 sv_catpvs(tmpsv, "=");
1231 if (enum_label == -1)
1232 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)val);
1234 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
1239 if ( oppriv & (1<<bit)
1240 && !(PL_op_private_labels[ix] == '-'
1241 && PL_op_private_labels[ix+1] == '\0'))
1244 sv_catpvs(tmpsv, ",");
1245 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
1250 sv_catpvs(tmpsv, ",");
1251 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)oppriv);
1254 if (tmpsv && SvCUR(tmpsv)) {
1255 S_opdump_indent(aTHX_ o, level, bar, file, "PRIVATE = (%s)\n",
1256 SvPVX_const(tmpsv) + 1);
1258 S_opdump_indent(aTHX_ o, level, bar, file,
1259 "PRIVATE = (0x%" UVxf ")\n", (UV)oppriv);
1267 S_opdump_indent(aTHX_ o, level, bar, file,
1268 "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1270 S_opdump_indent(aTHX_ o, level, bar, file,
1271 "GV = %" SVf " (0x%" UVxf ")\n",
1272 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)), PTR2UV(cGVOPo_gv));
1278 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
1279 UV i, count = items[-1].uv;
1281 S_opdump_indent(aTHX_ o, level, bar, file, "ARGS = \n");
1282 for (i=0; i < count; i++)
1283 S_opdump_indent(aTHX_ o, level+1, (bar << 1), file,
1284 "%" UVuf " => 0x%" UVxf "\n",
1289 case OP_MULTICONCAT:
1290 S_opdump_indent(aTHX_ o, level, bar, file, "NARGS = %" IVdf "\n",
1291 (IV)cUNOP_AUXo->op_aux[PERL_MULTICONCAT_IX_NARGS].ssize);
1292 /* XXX really ought to dump each field individually,
1293 * but that's too much like hard work */
1294 S_opdump_indent(aTHX_ o, level, bar, file, "CONSTS = (%" SVf ")\n",
1295 SVfARG(multiconcat_stringify(o)));
1300 case OP_METHOD_NAMED:
1301 case OP_METHOD_SUPER:
1302 case OP_METHOD_REDIR:
1303 case OP_METHOD_REDIR_SUPER:
1304 #ifndef USE_ITHREADS
1305 /* with ITHREADS, consts are 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, "SV = %s\n",
1308 SvPEEK(cMETHOPo_meth));
1312 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1318 S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" LINE_Tf "\n",
1321 if (CopSTASHPV(cCOPo)) {
1322 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1323 HV *stash = CopSTASH(cCOPo);
1324 const char * const hvname = HvNAME_get(stash);
1326 S_opdump_indent(aTHX_ o, level, bar, file, "PACKAGE = \"%s\"\n",
1327 generic_pv_escape(tmpsv, hvname,
1328 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1331 if (CopLABEL(cCOPo)) {
1332 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1335 const char *label = CopLABEL_len_flags(cCOPo,
1336 &label_len, &label_flags);
1337 S_opdump_indent(aTHX_ o, level, bar, file, "LABEL = \"%s\"\n",
1338 generic_pv_escape( tmpsv, label, label_len,
1339 (label_flags & SVf_UTF8)));
1341 /* add hints and features if set */
1342 if (cCOPo->cop_hints)
1343 S_opdump_indent(aTHX_ o, level, bar, file, "HINTS = %08x\n",cCOPo->cop_hints);
1344 if (cCOPo->cop_features)
1345 S_opdump_indent(aTHX_ o, level, bar, file, "FEATS = %08x\n",cCOPo->cop_features);
1347 S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
1348 (unsigned int)cCOPo->cop_seq);
1353 S_opdump_indent(aTHX_ o, level, bar, file, "REDO");
1354 S_opdump_link(aTHX_ o, cLOOPo->op_redoop, file);
1355 S_opdump_indent(aTHX_ o, level, bar, file, "NEXT");
1356 S_opdump_link(aTHX_ o, cLOOPo->op_nextop, file);
1357 S_opdump_indent(aTHX_ o, level, bar, file, "LAST");
1358 S_opdump_link(aTHX_ o, cLOOPo->op_lastop, file);
1378 S_opdump_indent(aTHX_ o, level, bar, file, "OTHER");
1379 S_opdump_link(aTHX_ o, cLOGOPo->op_other, file);
1385 S_do_pmop_dump_bar(aTHX_ level, bar, file, cPMOPo);
1393 if (o->op_private & OPpREFCOUNTED)
1394 S_opdump_indent(aTHX_ o, level, bar, file,
1395 "REFCNT = %" UVuf "\n", (UV)o->op_targ);
1403 if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
1406 SV * const label = newSVpvs_flags("", SVs_TEMP);
1407 generic_pv_escape(label, cPVOPo->op_pv, strlen(cPVOPo->op_pv), 0);
1408 S_opdump_indent(aTHX_ o, level, bar, file,
1409 "PV = \"%" SVf "\" (0x%" UVxf ")\n",
1410 SVfARG(label), PTR2UV(cPVOPo->op_pv));
1416 if (o->op_private & OPpTRANS_USE_SVOP) {
1417 /* utf8: table stored as an inversion map */
1418 #ifndef USE_ITHREADS
1419 /* with ITHREADS, it is stored in the pad, and the right pad
1420 * may not be active here, so skip */
1421 S_opdump_indent(aTHX_ o, level, bar, file,
1422 "INVMAP = 0x%" UVxf "\n",
1423 PTR2UV(MUTABLE_SV(cSVOPo->op_sv)));
1427 const OPtrans_map * const tbl = (OPtrans_map*)cPVOPo->op_pv;
1428 SSize_t i, size = tbl->size;
1430 S_opdump_indent(aTHX_ o, level, bar, file,
1431 "TABLE = 0x%" UVxf "\n",
1433 S_opdump_indent(aTHX_ o, level, bar, file,
1434 " SIZE: 0x%" UVxf "\n", (UV)size);
1436 /* dump size+1 values, to include the extra slot at the end */
1437 for (i = 0; i <= size; i++) {
1438 short val = tbl->map[i];
1440 S_opdump_indent(aTHX_ o, level, bar, file,
1441 " %4" UVxf ":", (UV)i);
1443 PerlIO_printf(file, " %2" IVdf, (IV)val);
1445 PerlIO_printf(file, " %02" UVxf, (UV)val);
1447 if ( i == size || (i & 0xf) == 0xf)
1448 PerlIO_printf(file, "\n");
1457 if (o->op_flags & OPf_KIDS) {
1461 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1462 S_do_op_dump_bar(aTHX_ level,
1463 (bar | cBOOL(OpHAS_SIBLING(kid))),
1470 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
1472 S_do_op_dump_bar(aTHX_ level, 0, file, o);
1479 Dumps the optree starting at OP C<o> to C<STDERR>.
1485 Perl_op_dump(pTHX_ const OP *o)
1487 PERL_ARGS_ASSERT_OP_DUMP;
1488 do_op_dump(0, Perl_debug_log, o);
1494 Dump the name and, if they differ, the effective name of the GV C<gv> to
1501 Perl_gv_dump(pTHX_ GV *gv)
1505 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1508 PerlIO_printf(Perl_debug_log, "{}\n");
1511 sv = sv_newmortal();
1512 PerlIO_printf(Perl_debug_log, "{\n");
1513 gv_fullname3(sv, gv, NULL);
1514 name = SvPV_const(sv, len);
1515 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1516 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1517 if (gv != GvEGV(gv)) {
1518 gv_efullname3(sv, GvEGV(gv), NULL);
1519 name = SvPV_const(sv, len);
1520 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1521 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1523 (void)PerlIO_putc(Perl_debug_log, '\n');
1524 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1528 /* map magic types to the symbolic names
1529 * (with the PERL_MAGIC_ prefixed stripped)
1532 static const struct { const char type; const char *name; } magic_names[] = {
1533 #include "mg_names.inc"
1534 /* this null string terminates the list */
1539 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1541 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1543 for (; mg; mg = mg->mg_moremagic) {
1544 Perl_dump_indent(aTHX_ level, file,
1545 " MAGIC = 0x%" UVxf "\n", PTR2UV(mg));
1546 if (mg->mg_virtual) {
1547 const MGVTBL * const v = mg->mg_virtual;
1548 if (v >= PL_magic_vtables
1549 && v < PL_magic_vtables + magic_vtable_max) {
1550 const U32 i = v - PL_magic_vtables;
1551 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1554 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"
1555 UVxf "\n", PTR2UV(v));
1558 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1561 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1565 const char *name = NULL;
1566 for (n = 0; magic_names[n].name; n++) {
1567 if (mg->mg_type == magic_names[n].type) {
1568 name = magic_names[n].name;
1573 Perl_dump_indent(aTHX_ level, file,
1574 " MG_TYPE = PERL_MAGIC_%s\n", name);
1576 Perl_dump_indent(aTHX_ level, file,
1577 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1581 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1582 if (mg->mg_type == PERL_MAGIC_envelem &&
1583 mg->mg_flags & MGf_TAINTEDDIR)
1584 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1585 if (mg->mg_type == PERL_MAGIC_regex_global &&
1586 mg->mg_flags & MGf_MINMATCH)
1587 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1588 if (mg->mg_flags & MGf_REFCOUNTED)
1589 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1590 if (mg->mg_flags & MGf_GSKIP)
1591 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1592 if (mg->mg_flags & MGf_COPY)
1593 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1594 if (mg->mg_flags & MGf_DUP)
1595 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1596 if (mg->mg_flags & MGf_LOCAL)
1597 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1598 if (mg->mg_type == PERL_MAGIC_regex_global &&
1599 mg->mg_flags & MGf_BYTES)
1600 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1603 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%" UVxf "\n",
1604 PTR2UV(mg->mg_obj));
1605 if (mg->mg_type == PERL_MAGIC_qr) {
1606 REGEXP* const re = (REGEXP *)mg->mg_obj;
1607 SV * const dsv = sv_newmortal();
1608 const char * const s
1609 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1611 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1612 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1614 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1615 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %" IVdf "\n",
1618 if (mg->mg_flags & MGf_REFCOUNTED)
1619 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1622 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1624 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%" UVxf, PTR2UV(mg->mg_ptr));
1625 if (mg->mg_len >= 0) {
1626 if (mg->mg_type != PERL_MAGIC_utf8) {
1627 SV * const sv = newSVpvs("");
1628 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1629 SvREFCNT_dec_NN(sv);
1632 else if (mg->mg_len == HEf_SVKEY) {
1633 PerlIO_puts(file, " => HEf_SVKEY\n");
1634 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1635 maxnest, dumpops, pvlim); /* MG is already +1 */
1638 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1643 " does not know how to handle this MG_LEN"
1645 (void)PerlIO_putc(file, '\n');
1647 if (mg->mg_type == PERL_MAGIC_utf8) {
1648 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1651 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1652 Perl_dump_indent(aTHX_ level, file,
1653 " %2" IVdf ": %" UVuf " -> %" UVuf "\n",
1656 (UV)cache[i * 2 + 1]);
1663 =for apidoc magic_dump
1665 Dumps the contents of the MAGIC C<mg> to C<STDERR>.
1671 Perl_magic_dump(pTHX_ const MAGIC *mg)
1673 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1677 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1681 PERL_ARGS_ASSERT_DO_HV_DUMP;
1683 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1684 if (sv && (hvname = HvNAME_get(sv)))
1686 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1687 name which quite legally could contain insane things like tabs, newlines, nulls or
1688 other scary crap - this should produce sane results - except maybe for unicode package
1689 names - but we will wait for someone to file a bug on that - demerphq */
1690 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1691 PerlIO_printf(file, "\t\"%s\"\n",
1692 generic_pv_escape( tmpsv, hvname,
1693 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1696 (void)PerlIO_putc(file, '\n');
1700 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1702 PERL_ARGS_ASSERT_DO_GV_DUMP;
1704 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1706 SV * const tmpsv = newSVpvs("");
1707 PerlIO_printf(file, "\t\"%s\"\n",
1708 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1711 (void)PerlIO_putc(file, '\n');
1715 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1717 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1719 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1721 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1723 HV * const stash = GvSTASH(sv);
1724 PerlIO_printf(file, "\t");
1725 /* TODO might have an extra \" here */
1726 if (stash && (hvname = HvNAME_get(stash))) {
1727 PerlIO_printf(file, "\"%s\" :: \"",
1728 generic_pv_escape(tmp, hvname,
1729 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1731 PerlIO_printf(file, "%s\"\n",
1732 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1735 (void)PerlIO_putc(file, '\n');
1738 const struct flag_to_name first_sv_flags_names[] = {
1739 {SVs_TEMP, "TEMP,"},
1740 {SVs_OBJECT, "OBJECT,"},
1749 const struct flag_to_name second_sv_flags_names[] = {
1751 {SVf_FAKE, "FAKE,"},
1752 {SVf_READONLY, "READONLY,"},
1753 {SVf_PROTECT, "PROTECT,"},
1754 {SVf_BREAK, "BREAK,"},
1760 const struct flag_to_name cv_flags_names[] = {
1761 {CVf_ANON, "ANON,"},
1762 {CVf_UNIQUE, "UNIQUE,"},
1763 {CVf_CLONE, "CLONE,"},
1764 {CVf_CLONED, "CLONED,"},
1765 {CVf_CONST, "CONST,"},
1766 {CVf_NODEBUG, "NODEBUG,"},
1767 {CVf_LVALUE, "LVALUE,"},
1768 {CVf_NOWARN_AMBIGUOUS, "NOWARN_AMBIGUOUS,"},
1769 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1770 {CVf_CVGV_RC, "CVGV_RC,"},
1771 {CVf_DYNFILE, "DYNFILE,"},
1772 {CVf_AUTOLOAD, "AUTOLOAD,"},
1773 {CVf_HASEVAL, "HASEVAL,"},
1774 {CVf_SLABBED, "SLABBED,"},
1775 {CVf_NAMED, "NAMED,"},
1776 {CVf_LEXICAL, "LEXICAL,"},
1777 {CVf_ISXSUB, "ISXSUB,"}
1780 const struct flag_to_name hv_flags_names[] = {
1781 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1782 {SVphv_LAZYDEL, "LAZYDEL,"},
1783 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1784 {SVf_AMAGIC, "OVERLOAD,"},
1785 {SVphv_CLONEABLE, "CLONEABLE,"}
1788 const struct flag_to_name gp_flags_names[] = {
1789 {GVf_INTRO, "INTRO,"},
1790 {GVf_MULTI, "MULTI,"},
1791 {GVf_ASSUMECV, "ASSUMECV,"},
1794 const struct flag_to_name gp_flags_imported_names[] = {
1795 {GVf_IMPORTED_SV, " SV"},
1796 {GVf_IMPORTED_AV, " AV"},
1797 {GVf_IMPORTED_HV, " HV"},
1798 {GVf_IMPORTED_CV, " CV"},
1801 /* NOTE: this structure is mostly duplicative of one generated by
1802 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1803 * the two. - Yves */
1804 const struct flag_to_name regexp_extflags_names[] = {
1805 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1806 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1807 {RXf_PMf_FOLD, "PMf_FOLD,"},
1808 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1809 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1810 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1811 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1812 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1813 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1814 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1815 {RXf_CHECK_ALL, "CHECK_ALL,"},
1816 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1817 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1818 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1819 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1820 {RXf_SPLIT, "SPLIT,"},
1821 {RXf_COPY_DONE, "COPY_DONE,"},
1822 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1823 {RXf_TAINTED, "TAINTED,"},
1824 {RXf_START_ONLY, "START_ONLY,"},
1825 {RXf_SKIPWHITE, "SKIPWHITE,"},
1826 {RXf_WHITE, "WHITE,"},
1827 {RXf_NULL, "NULL,"},
1830 /* NOTE: this structure is mostly duplicative of one generated by
1831 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1832 * the two. - Yves */
1833 const struct flag_to_name regexp_core_intflags_names[] = {
1834 {PREGf_SKIP, "SKIP,"},
1835 {PREGf_IMPLICIT, "IMPLICIT,"},
1836 {PREGf_NAUGHTY, "NAUGHTY,"},
1837 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1838 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1839 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1840 {PREGf_NOSCAN, "NOSCAN,"},
1841 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1842 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1843 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1844 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1845 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1848 /* Minimum number of decimal digits to preserve the significand of NV. */
1849 #ifdef USE_LONG_DOUBLE
1850 # ifdef LDBL_DECIMAL_DIG
1851 # define NV_DECIMAL_DIG LDBL_DECIMAL_DIG
1853 #elif defined(USE_QUADMATH) && defined(I_QUADMATH)
1854 # ifdef FLT128_DECIMAL_DIG
1855 # define NV_DECIMAL_DIG FLT128_DECIMAL_DIG
1857 #else /* NV is double */
1858 # ifdef DBL_DECIMAL_DIG
1859 # define NV_DECIMAL_DIG DBL_DECIMAL_DIG
1863 #ifndef NV_DECIMAL_DIG
1864 # if defined(NV_MANT_DIG) && FLT_RADIX == 2
1865 /* NV_DECIMAL_DIG = ceil(1 + NV_MANT_DIG * log10(2)), where log10(2) is
1866 approx. 146/485. This is precise enough up to 2620 bits */
1867 # define NV_DECIMAL_DIG (1 + (NV_MANT_DIG * 146 + 484) / 485)
1871 #ifndef NV_DECIMAL_DIG
1872 # define NV_DECIMAL_DIG (NV_DIG + 3) /* last resort */
1875 /* Perl_do_sv_dump():
1877 * level: amount to indent the output
1878 * sv: the object to dump
1879 * nest: the current level of recursion
1880 * maxnest: the maximum allowed level of recursion
1881 * dumpops: if true, also dump the ops associated with a CV
1882 * pvlim: limit on the length of any strings that are output
1886 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1893 PERL_ARGS_ASSERT_DO_SV_DUMP;
1896 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1900 flags = SvFLAGS(sv);
1903 /* process general SV flags */
1905 d = Perl_newSVpvf(aTHX_
1906 "(0x%" UVxf ") at 0x%" UVxf "\n%*s REFCNT = %" IVdf "\n%*s FLAGS = (",
1907 PTR2UV(SvANY(sv)), PTR2UV(sv),
1908 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1909 (int)(PL_dumpindent*level), "");
1911 if ((flags & SVs_PADSTALE))
1912 sv_catpvs(d, "PADSTALE,");
1913 if ((flags & SVs_PADTMP))
1914 sv_catpvs(d, "PADTMP,");
1915 append_flags(d, flags, first_sv_flags_names);
1916 if (flags & SVf_ROK) {
1917 sv_catpvs(d, "ROK,");
1918 if (SvWEAKREF(sv)) sv_catpvs(d, "WEAKREF,");
1920 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1921 append_flags(d, flags, second_sv_flags_names);
1922 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1923 && type != SVt_PVAV) {
1924 if (SvPCS_IMPORTED(sv))
1925 sv_catpvs(d, "PCS_IMPORTED,");
1927 sv_catpvs(d, "SCREAM,");
1930 /* process type-specific SV flags */
1935 append_flags(d, CvFLAGS(sv), cv_flags_names);
1938 append_flags(d, flags, hv_flags_names);
1942 if (isGV_with_GP(sv)) {
1943 append_flags(d, GvFLAGS(sv), gp_flags_names);
1945 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1946 sv_catpvs(d, "IMPORT");
1947 if (GvIMPORTED(sv) == GVf_IMPORTED)
1948 sv_catpvs(d, "ALL,");
1951 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1952 sv_catpvs(d, " ),");
1958 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpvs(d, "IsUV,");
1964 /* SVphv_SHAREKEYS is also 0x20000000 */
1965 if ((type != SVt_PVHV) && SvUTF8(sv))
1966 sv_catpvs(d, "UTF8");
1968 if (*(SvEND(d) - 1) == ',') {
1969 SvCUR_set(d, SvCUR(d) - 1);
1970 SvPVX(d)[SvCUR(d)] = '\0';
1975 /* dump initial SV details */
1977 #ifdef DEBUG_LEAKING_SCALARS
1978 Perl_dump_indent(aTHX_ level, file,
1979 "ALLOCATED at %s:%d %s %s (parent 0x%" UVxf "); serial %" UVuf "\n",
1980 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1982 sv->sv_debug_inpad ? "for" : "by",
1983 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1984 PTR2UV(sv->sv_debug_parent),
1988 Perl_dump_indent(aTHX_ level, file, "SV = ");
1992 if (type < SVt_LAST) {
1993 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1995 if (type == SVt_NULL) {
2000 PerlIO_printf(file, "UNKNOWN(0x%" UVxf ") %s\n", (UV)type, s);
2005 /* Dump general SV fields */
2007 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
2008 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
2009 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
2010 || (type == SVt_IV && !SvROK(sv))) {
2013 Perl_dump_indent(aTHX_ level, file, " UV = %" UVuf, (UV)SvUVX(sv));
2015 Perl_dump_indent(aTHX_ level, file, " IV = %" IVdf, (IV)SvIVX(sv));
2016 (void)PerlIO_putc(file, '\n');
2019 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
2020 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
2021 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
2022 || type == SVt_NV) {
2023 DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
2024 STORE_LC_NUMERIC_SET_STANDARD();
2025 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DECIMAL_DIG, SvNVX(sv));
2026 RESTORE_LC_NUMERIC();
2030 Perl_dump_indent(aTHX_ level, file, " RV = 0x%" UVxf "\n",
2033 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
2036 if (type < SVt_PV) {
2041 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
2042 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
2043 const bool re = isREGEXP(sv);
2044 const char * const ptr =
2045 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
2049 SvOOK_offset(sv, delta);
2050 Perl_dump_indent(aTHX_ level, file," OFFSET = %" UVuf "\n",
2055 Perl_dump_indent(aTHX_ level, file," PV = 0x%" UVxf " ",
2058 PerlIO_printf(file, "( %s . ) ",
2059 _pv_display_for_dump(d, ptr - delta, delta, 0,
2062 if (type == SVt_INVLIST) {
2063 PerlIO_printf(file, "\n");
2064 /* 4 blanks indents 2 beyond the PV, etc */
2065 _invlist_dump(file, level, " ", sv);
2068 PerlIO_printf(file, "%s", _pv_display_for_dump(d, ptr, SvCUR(sv),
2071 if (SvUTF8(sv)) /* the 6? \x{....} */
2072 PerlIO_printf(file, " [UTF8 \"%s\"]",
2073 sv_uni_display(d, sv, 6 * SvCUR(sv),
2076 PerlIO_printf(file, " [BOOL %s]", ptr == PL_Yes ? "PL_Yes" : "PL_No");
2077 PerlIO_printf(file, "\n");
2079 Perl_dump_indent(aTHX_ level, file, " CUR = %" IVdf "\n", (IV)SvCUR(sv));
2080 if (re && type == SVt_PVLV)
2081 /* LV-as-REGEXP usurps len field to store pointer to
2083 Perl_dump_indent(aTHX_ level, file, " REGEXP = 0x%" UVxf "\n",
2084 PTR2UV(((XPV*)SvANY(sv))->xpv_len_u.xpvlenu_rx));
2086 Perl_dump_indent(aTHX_ level, file, " LEN = %" IVdf "\n",
2088 #ifdef PERL_COPY_ON_WRITE
2089 if (SvIsCOW(sv) && SvLEN(sv))
2090 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
2095 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
2098 if (type >= SVt_PVMG) {
2100 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
2102 do_hv_dump(level, file, " STASH", SvSTASH(sv));
2104 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
2105 Perl_dump_indent(aTHX_ level, file, " USEFUL = %" IVdf "\n",
2110 /* Dump type-specific SV fields */
2114 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf,
2115 PTR2UV(AvARRAY(sv)));
2116 if (AvARRAY(sv) != AvALLOC(sv)) {
2117 PerlIO_printf(file, " (offset=%" IVdf ")\n",
2118 (IV)(AvARRAY(sv) - AvALLOC(sv)));
2119 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%" UVxf "\n",
2120 PTR2UV(AvALLOC(sv)));
2123 (void)PerlIO_putc(file, '\n');
2124 Perl_dump_indent(aTHX_ level, file, " FILL = %" IVdf "\n",
2126 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
2129 if (AvREAL(sv)) sv_catpvs(d, ",REAL");
2130 if (AvREIFY(sv)) sv_catpvs(d, ",REIFY");
2131 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
2132 SvCUR(d) ? SvPVX_const(d) + 1 : "");
2133 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
2135 SV **svp = AvARRAY(MUTABLE_AV(sv));
2137 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
2140 SV* const elt = *svp;
2141 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %" IVdf "\n",
2143 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2150 struct xpvhv_aux *const aux = HvAUX(sv);
2151 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n",
2152 (UV)aux->xhv_aux_flags);
2154 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
2155 totalkeys = HvTOTALKEYS(MUTABLE_HV(sv));
2157 /* Show distribution of HEs in the ARRAY */
2159 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
2163 U32 keys = totalkeys;
2164 NV theoret, sum = 0;
2166 PerlIO_printf(file, " (");
2167 Zero(freq, FREQ_MAX + 1, int);
2168 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
2171 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
2173 if (count > FREQ_MAX)
2179 for (i = 0; i <= max; i++) {
2181 PerlIO_printf(file, "%d%s:%d", i,
2182 (i == FREQ_MAX) ? "+" : "",
2185 PerlIO_printf(file, ", ");
2188 (void)PerlIO_putc(file, ')');
2189 /* The "quality" of a hash is defined as the total number of
2190 comparisons needed to access every element once, relative
2191 to the expected number needed for a random hash.
2193 The total number of comparisons is equal to the sum of
2194 the squares of the number of entries in each bucket.
2195 For a random hash of n keys into k buckets, the expected
2200 for (i = max; i > 0; i--) { /* Precision: count down. */
2201 sum += freq[i] * i * i;
2203 while ((keys = keys >> 1))
2205 theoret = totalkeys;
2206 theoret += theoret * (theoret-1)/pow2;
2207 (void)PerlIO_putc(file, '\n');
2208 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"
2209 NVff "%%", theoret/sum*100);
2211 (void)PerlIO_putc(file, '\n');
2212 Perl_dump_indent(aTHX_ level, file, " KEYS = %" IVdf "\n",
2216 HE **ents = HvARRAY(sv);
2219 HE *const *const last = ents + HvMAX(sv);
2220 count = last + 1 - ents;
2225 } while (++ents <= last);
2228 Perl_dump_indent(aTHX_ level, file, " FILL = %" UVuf "\n",
2231 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
2234 Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n",
2235 (IV)HvRITER_get(sv));
2236 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n",
2237 PTR2UV(HvEITER_get(sv)));
2238 #ifdef PERL_HASH_RANDOMIZE_KEYS
2239 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%" UVxf,
2240 (UV)HvRAND_get(sv));
2241 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
2242 PerlIO_printf(file, " (LAST = 0x%" UVxf ")",
2243 (UV)HvLASTRAND_get(sv));
2246 (void)PerlIO_putc(file, '\n');
2249 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
2250 if (mg && mg->mg_obj) {
2251 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%" UVxf "\n", PTR2UV(mg->mg_obj));
2255 const char * const hvname = HvNAME_get(sv);
2257 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2258 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2259 generic_pv_escape( tmpsv, hvname,
2260 HvNAMELEN(sv), HvNAMEUTF8(sv)));
2265 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
2266 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
2267 if (HvAUX(sv)->xhv_name_count)
2268 Perl_dump_indent(aTHX_
2269 level, file, " NAMECOUNT = %" IVdf "\n",
2270 (IV)HvAUX(sv)->xhv_name_count
2272 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
2273 const I32 count = HvAUX(sv)->xhv_name_count;
2275 SV * const names = newSVpvs_flags("", SVs_TEMP);
2276 /* The starting point is the first element if count is
2277 positive and the second element if count is negative. */
2278 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2279 + (count < 0 ? 1 : 0);
2280 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2281 + (count < 0 ? -count : count);
2282 while (hekp < endp) {
2284 SV *tmp = newSVpvs_flags("", SVs_TEMP);
2285 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
2286 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
2288 /* This should never happen. */
2289 sv_catpvs(names, ", (null)");
2293 Perl_dump_indent(aTHX_
2294 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
2298 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
2299 const char *const hvename = HvENAME_get(sv);
2300 Perl_dump_indent(aTHX_
2301 level, file, " ENAME = \"%s\"\n",
2302 generic_pv_escape(tmp, hvename,
2303 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
2307 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%" UVxf "\n",
2309 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
2313 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2314 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"
2316 generic_pv_escape( tmpsv, meta->mro_which->name,
2317 meta->mro_which->length,
2318 (meta->mro_which->kflags & HVhek_UTF8)),
2319 PTR2UV(meta->mro_which));
2320 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"
2322 (UV)meta->cache_gen);
2323 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%" UVxf "\n",
2325 if (meta->mro_linear_all) {
2326 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"
2328 PTR2UV(meta->mro_linear_all));
2329 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
2332 if (meta->mro_linear_current) {
2333 Perl_dump_indent(aTHX_ level, file,
2334 " MRO_LINEAR_CURRENT = 0x%" UVxf "\n",
2335 PTR2UV(meta->mro_linear_current));
2336 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
2339 if (meta->mro_nextmethod) {
2340 Perl_dump_indent(aTHX_ level, file,
2341 " MRO_NEXTMETHOD = 0x%" UVxf "\n",
2342 PTR2UV(meta->mro_nextmethod));
2343 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
2347 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%" UVxf "\n",
2349 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
2354 if (nest < maxnest) {
2355 HV * const hv = MUTABLE_HV(sv);
2357 if (HvTOTALKEYS(hv)) {
2359 int count = maxnest - nest;
2360 for (i=0; i <= HvMAX(hv); i++) {
2362 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2369 if (count-- <= 0) goto DONEHV;
2372 keysv = hv_iterkeysv(he);
2373 keypv = SvPV_const(keysv, len);
2376 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", _pv_display_for_dump(d, keypv, len, 0, pvlim));
2378 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2379 if (HvEITER_get(hv) == he)
2380 PerlIO_printf(file, "[CURRENT] ");
2381 PerlIO_printf(file, "HASH = 0x%" UVxf, (UV) hash);
2383 if (sv == (SV*)PL_strtab)
2384 PerlIO_printf(file, " REFCNT = 0x%" UVxf "\n",
2385 (UV)he->he_valu.hent_refcount );
2387 (void)PerlIO_putc(file, '\n');
2388 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2396 } /* case SVt_PVHV */
2399 if (CvAUTOLOAD(sv)) {
2400 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2402 const char *const name = SvPV_const(sv, len);
2403 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
2404 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
2407 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2408 const char *const proto = CvPROTO(sv);
2409 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
2410 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
2415 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
2416 if (!CvISXSUB(sv)) {
2419 Perl_dump_indent(aTHX_ level, file,
2420 " SLAB = 0x%" UVxf "\n",
2421 PTR2UV(CvSTART(sv)));
2423 Perl_dump_indent(aTHX_ level, file,
2424 " START = 0x%" UVxf " ===> %" IVdf "\n",
2425 PTR2UV(CvSTART(sv)),
2426 (IV)sequence_num(CvSTART(sv)));
2428 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%" UVxf "\n",
2429 PTR2UV(CvROOT(sv)));
2430 if (CvROOT(sv) && dumpops) {
2431 do_op_dump(level+1, file, CvROOT(sv));
2434 SV * const constant = cv_const_sv((const CV *)sv);
2436 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%" UVxf "\n", PTR2UV(CvXSUB(sv)));
2439 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%" UVxf
2441 PTR2UV(CvXSUBANY(sv).any_ptr));
2442 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2445 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %" IVdf "\n",
2446 (IV)CvXSUBANY(sv).any_i32);
2450 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2451 HEK_KEY(CvNAME_HEK((CV *)sv)));
2452 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
2453 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
2454 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"
2455 IVdf "\n", (IV)CvDEPTH(sv));
2456 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n",
2458 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %" UVuf "\n", (UV)CvOUTSIDE_SEQ(sv));
2459 if (!CvISXSUB(sv)) {
2460 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%" UVxf "\n", PTR2UV(CvPADLIST(sv)));
2461 if (nest < maxnest) {
2462 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2466 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
2468 const CV * const outside = CvOUTSIDE(sv);
2469 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%" UVxf " (%s)\n",
2472 : CvANON(outside) ? "ANON"
2473 : (outside == PL_main_cv) ? "MAIN"
2474 : CvUNIQUE(outside) ? "UNIQUE"
2477 newSVpvs_flags("", SVs_TEMP),
2478 GvNAME(CvGV(outside)),
2479 GvNAMELEN(CvGV(outside)),
2480 GvNAMEUTF8(CvGV(outside)))
2484 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2485 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2490 if (type == SVt_PVLV) {
2491 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2492 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %" IVdf "\n", (IV)LvTARGOFF(sv));
2493 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %" IVdf "\n", (IV)LvTARGLEN(sv));
2494 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%" UVxf "\n", PTR2UV(LvTARG(sv)));
2495 Perl_dump_indent(aTHX_ level, file, " FLAGS = %" IVdf "\n", (IV)LvFLAGS(sv));
2496 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2497 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2500 if (isREGEXP(sv)) goto dumpregexp;
2501 if (!isGV_with_GP(sv))
2504 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2505 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2506 generic_pv_escape(tmpsv, GvNAME(sv),
2510 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %" IVdf "\n", (IV)GvNAMELEN(sv));
2511 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2512 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)GvFLAGS(sv));
2513 Perl_dump_indent(aTHX_ level, file, " GP = 0x%" UVxf "\n", PTR2UV(GvGP(sv)));
2516 Perl_dump_indent(aTHX_ level, file, " SV = 0x%" UVxf "\n", PTR2UV(GvSV(sv)));
2517 Perl_dump_indent(aTHX_ level, file, " REFCNT = %" IVdf "\n", (IV)GvREFCNT(sv));
2518 Perl_dump_indent(aTHX_ level, file, " IO = 0x%" UVxf "\n", PTR2UV(GvIOp(sv)));
2519 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%" UVxf " \n", PTR2UV(GvFORM(sv)));
2520 Perl_dump_indent(aTHX_ level, file, " AV = 0x%" UVxf "\n", PTR2UV(GvAV(sv)));
2521 Perl_dump_indent(aTHX_ level, file, " HV = 0x%" UVxf "\n", PTR2UV(GvHV(sv)));
2522 Perl_dump_indent(aTHX_ level, file, " CV = 0x%" UVxf "\n", PTR2UV(GvCV(sv)));
2523 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%" UVxf "\n", (UV)GvCVGEN(sv));
2524 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%" UVxf
2528 Perl_dump_indent(aTHX_ level, file, " LINE = %" LINE_Tf "\n", (line_t)GvLINE(sv));
2529 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2530 do_gv_dump (level, file, " EGV", GvEGV(sv));
2533 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%" UVxf "\n", PTR2UV(IoIFP(sv)));
2534 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%" UVxf "\n", PTR2UV(IoOFP(sv)));
2535 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%" UVxf "\n", PTR2UV(IoDIRP(sv)));
2536 Perl_dump_indent(aTHX_ level, file, " LINES = %" IVdf "\n", (IV)IoLINES(sv));
2537 Perl_dump_indent(aTHX_ level, file, " PAGE = %" IVdf "\n", (IV)IoPAGE(sv));
2538 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %" IVdf "\n", (IV)IoPAGE_LEN(sv));
2539 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %" IVdf "\n", (IV)IoLINES_LEFT(sv));
2541 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2542 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2543 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2545 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%" UVxf "\n",
2546 PTR2UV(IoTOP_GV(sv)));
2547 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2548 maxnest, dumpops, pvlim);
2550 /* Source filters hide things that are not GVs in these three, so let's
2551 be careful out there. */
2553 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2554 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2555 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2557 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%" UVxf "\n",
2558 PTR2UV(IoFMT_GV(sv)));
2559 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2560 maxnest, dumpops, pvlim);
2562 if (IoBOTTOM_NAME(sv))
2563 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2564 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2565 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2567 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%" UVxf "\n",
2568 PTR2UV(IoBOTTOM_GV(sv)));
2569 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2570 maxnest, dumpops, pvlim);
2572 if (isPRINT(IoTYPE(sv)))
2573 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2575 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2576 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)IoFLAGS(sv));
2581 struct regexp * const r = ReANY((REGEXP*)sv);
2583 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2585 append_flags(d, flags, names); \
2586 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2587 SvCUR_set(d, SvCUR(d) - 1); \
2588 SvPVX(d)[SvCUR(d)] = '\0'; \
2591 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2592 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%" UVxf " (%s)\n",
2593 (UV)(r->compflags), SvPVX_const(d));
2595 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2596 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%" UVxf " (%s)\n",
2597 (UV)(r->extflags), SvPVX_const(d));
2599 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%" UVxf " (%s)\n",
2600 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2601 if (r->engine == &PL_core_reg_engine) {
2602 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2603 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf " (%s)\n",
2604 (UV)(r->intflags), SvPVX_const(d));
2606 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "(Plug in)\n",
2609 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2610 Perl_dump_indent(aTHX_ level, file, " NPARENS = %" UVuf "\n",
2612 Perl_dump_indent(aTHX_ level, file, " LOGICAL_NPARENS = %" UVuf "\n",
2613 (UV)(r->logical_nparens));
2615 #define SV_SET_STRINGIFY_I32_PAREN_ARRAY(d,count,ary) \
2619 /* 0 element is irrelevant */ \
2620 for(n=0; n <= count; n++) \
2621 sv_catpvf(d,"%" IVdf "%s", \
2623 n == count ? "" : ", "); \
2624 sv_catpvs(d," }\n"); \
2627 Perl_dump_indent(aTHX_ level, file, " LOGICAL_TO_PARNO = 0x%" UVxf "\n",
2628 PTR2UV(r->logical_to_parno));
2629 if (r->logical_to_parno) {
2630 SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->logical_nparens, r->logical_to_parno);
2631 Perl_dump_indent(aTHX_ level, file, " %" SVf, d);
2633 Perl_dump_indent(aTHX_ level, file, " PARNO_TO_LOGICAL = 0x%" UVxf "\n",
2634 PTR2UV(r->parno_to_logical));
2635 if (r->parno_to_logical) {
2636 SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->nparens, r->parno_to_logical);
2637 Perl_dump_indent(aTHX_ level, file, " %" SVf, d);
2640 Perl_dump_indent(aTHX_ level, file, " PARNO_TO_LOGICAL_NEXT = 0x%" UVxf "\n",
2641 PTR2UV(r->parno_to_logical_next));
2642 if (r->parno_to_logical_next) {
2643 SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->nparens, r->parno_to_logical_next);
2644 Perl_dump_indent(aTHX_ level, file, " %" SVf, d);
2646 #undef SV_SET_STRINGIFY_I32_ARRAY
2648 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %" UVuf "\n",
2649 (UV)(r->lastparen));
2650 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %" UVuf "\n",
2651 (UV)(r->lastcloseparen));
2652 Perl_dump_indent(aTHX_ level, file, " MINLEN = %" IVdf "\n",
2654 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %" IVdf "\n",
2655 (IV)(r->minlenret));
2656 Perl_dump_indent(aTHX_ level, file, " GOFS = %" UVuf "\n",
2658 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %" UVuf "\n",
2659 (UV)(r->pre_prefix));
2660 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %" IVdf "\n",
2662 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %" IVdf "\n",
2663 (IV)(r->suboffset));
2664 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %" IVdf "\n",
2665 (IV)(r->subcoffset));
2667 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%" UVxf " %s\n",
2669 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2671 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2672 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%" UVxf "\n",
2673 PTR2UV(r->paren_names));
2674 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%" UVxf "\n",
2675 PTR2UV(r->substrs));
2676 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%" UVxf "\n",
2677 PTR2UV(r->pprivate));
2678 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%" UVxf "\n",
2683 /* note offs[0] is for the whole match, and
2684 * the data for $1 is in offs[1]. Thus we have to
2685 * show one more than we have nparens. */
2686 for(n = 0; n <= r->nparens; n++) {
2687 sv_catpvf(d,"%" IVdf ":%" IVdf "%s",
2688 r->offs[n].start, r->offs[n].end,
2689 n+1 > r->nparens ? " ]\n" : ", ");
2691 Perl_dump_indent(aTHX_ level, file, " %" SVf, d);
2693 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%" UVxf "\n",
2694 PTR2UV(r->qr_anoncv));
2696 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%" UVxf "\n",
2697 PTR2UV(r->saved_copy));
2699 /* this should go LAST or the output gets really confusing */
2700 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n",
2701 PTR2UV(r->mother_re));
2702 if (nest < maxnest && r->mother_re)
2703 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2704 maxnest, dumpops, pvlim);
2714 Dumps the contents of an SV to the C<STDERR> filehandle.
2716 For an example of its output, see L<Devel::Peek>. If
2717 the item is an SvROK it will dump items to a depth of 4,
2718 otherwise it will dump only the top level item, which
2719 means that it will not dump the contents of an AV * or
2720 HV *. For that use C<av_dump()> or C<hv_dump()>.
2722 =for apidoc sv_dump_depth
2724 Dumps the contents of an SV to the C<STDERR> filehandle
2725 to the depth requested. This function can be used on any
2726 SV derived type (GV, HV, AV) with an appropriate cast.
2727 This is a more flexible variant of sv_dump(). For example
2730 sv_dump_depth((SV*)hv, 2);
2732 would dump the hv, its keys and values, but would not recurse
2737 Dumps the contents of an AV to the C<STDERR> filehandle,
2738 Similar to using Devel::Peek on an arrayref but does not
2739 expect an RV wrapper. Dumps contents to a depth of 3 levels
2744 Dumps the contents of an HV to the C<STDERR> filehandle.
2745 Similar to using Devel::Peek on an hashref but does not
2746 expect an RV wrapper. Dumps contents to a depth of 3 levels
2753 Perl_sv_dump(pTHX_ SV *sv)
2755 if (sv && SvROK(sv))
2756 sv_dump_depth(sv, 4);
2758 sv_dump_depth(sv, 0);
2762 Perl_sv_dump_depth(pTHX_ SV *sv, I32 depth)
2764 do_sv_dump(0, Perl_debug_log, sv, 0, depth, 0, 0);
2768 Perl_av_dump(pTHX_ AV *av)
2770 sv_dump_depth((SV*)av, 3);
2774 Perl_hv_dump(pTHX_ HV *hv)
2776 sv_dump_depth((SV*)hv, 3);
2780 Perl_runops_debug(pTHX)
2782 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2783 SSize_t orig_stack_hwm = PL_curstackinfo->si_stack_hwm;
2785 PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2789 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2792 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2794 #ifdef PERL_TRACE_OPS
2795 ++PL_op_exec_cnt[PL_op->op_type];
2797 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2798 if (PL_curstackinfo->si_stack_hwm < PL_stack_sp - PL_stack_base)
2799 Perl_croak_nocontext(
2800 "panic: previous op failed to extend arg stack: "
2801 "base=%p, sp=%p, hwm=%p\n",
2802 PL_stack_base, PL_stack_sp,
2803 PL_stack_base + PL_curstackinfo->si_stack_hwm);
2804 PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2809 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2810 PerlIO_printf(Perl_debug_log,
2811 "WARNING: %" UVxf " changed from %" UVxf " to %" UVxf "\n",
2812 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2813 PTR2UV(*PL_watchaddr));
2814 if (DEBUG_s_TEST_) {
2815 if (DEBUG_v_TEST_) {
2816 PerlIO_printf(Perl_debug_log, "\n");
2824 if (DEBUG_t_TEST_) debop(PL_op);
2825 if (DEBUG_P_TEST_) debprof(PL_op);
2830 PERL_DTRACE_PROBE_OP(PL_op);
2831 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2832 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2835 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2836 if (PL_curstackinfo->si_stack_hwm < orig_stack_hwm)
2837 PL_curstackinfo->si_stack_hwm = orig_stack_hwm;
2844 /* print the names of the n lexical vars starting at pad offset off */
2847 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2850 CV * const cv = deb_curcv(cxstack_ix);
2851 PADNAMELIST *comppad = NULL;
2855 PADLIST * const padlist = CvPADLIST(cv);
2856 comppad = PadlistNAMES(padlist);
2859 PerlIO_printf(Perl_debug_log, "(");
2860 for (i = 0; i < n; i++) {
2861 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2862 PerlIO_printf(Perl_debug_log, "%" PNf, PNfARG(sv));
2864 PerlIO_printf(Perl_debug_log, "[%" UVuf "]",
2867 PerlIO_printf(Perl_debug_log, ",");
2870 PerlIO_printf(Perl_debug_log, ")");
2874 /* append to the out SV, the name of the lexical at offset off in the CV
2878 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2879 bool paren, bool is_scalar)
2882 PADNAMELIST *namepad = NULL;
2886 PADLIST * const padlist = CvPADLIST(cv);
2887 namepad = PadlistNAMES(padlist);
2891 sv_catpvs_nomg(out, "(");
2892 for (i = 0; i < n; i++) {
2893 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2895 STRLEN cur = SvCUR(out);
2896 Perl_sv_catpvf(aTHX_ out, "[%" UTF8f,
2897 UTF8fARG(1, PadnameLEN(sv) - 1,
2898 PadnamePV(sv) + 1));
2900 SvPVX(out)[cur] = '$';
2903 Perl_sv_catpvf(aTHX_ out, "[%" UVuf "]", (UV)(off+i));
2905 sv_catpvs_nomg(out, ",");
2908 sv_catpvs_nomg(out, "(");
2913 S_append_gv_name(pTHX_ GV *gv, SV *out)
2917 sv_catpvs_nomg(out, "<NULLGV>");
2920 sv = newSV_type(SVt_NULL);
2921 gv_fullname4(sv, gv, NULL, FALSE);
2922 Perl_sv_catpvf(aTHX_ out, "$%" SVf, SVfARG(sv));
2923 SvREFCNT_dec_NN(sv);
2927 # define ITEM_SV(item) (comppad ? \
2928 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2930 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2934 /* return a temporary SV containing a stringified representation of
2935 * the op_aux field of a MULTIDEREF op, associated with CV cv
2939 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2941 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2942 UV actions = items->uv;
2945 bool is_hash = FALSE;
2947 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2952 PADLIST *padlist = CvPADLIST(cv);
2953 comppad = PadlistARRAY(padlist)[1];
2959 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2962 switch (actions & MDEREF_ACTION_MASK) {
2965 actions = (++items)->uv;
2967 NOT_REACHED; /* NOTREACHED */
2969 case MDEREF_HV_padhv_helem:
2972 case MDEREF_AV_padav_aelem:
2974 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2976 NOT_REACHED; /* NOTREACHED */
2978 case MDEREF_HV_gvhv_helem:
2981 case MDEREF_AV_gvav_aelem:
2984 sv = ITEM_SV(items);
2985 S_append_gv_name(aTHX_ (GV*)sv, out);
2987 NOT_REACHED; /* NOTREACHED */
2989 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2992 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2994 sv = ITEM_SV(items);
2995 S_append_gv_name(aTHX_ (GV*)sv, out);
2996 goto do_vivify_rv2xv_elem;
2997 NOT_REACHED; /* NOTREACHED */
2999 case MDEREF_HV_padsv_vivify_rv2hv_helem:
3002 case MDEREF_AV_padsv_vivify_rv2av_aelem:
3003 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
3004 goto do_vivify_rv2xv_elem;
3005 NOT_REACHED; /* NOTREACHED */
3007 case MDEREF_HV_pop_rv2hv_helem:
3008 case MDEREF_HV_vivify_rv2hv_helem:
3011 do_vivify_rv2xv_elem:
3012 case MDEREF_AV_pop_rv2av_aelem:
3013 case MDEREF_AV_vivify_rv2av_aelem:
3015 sv_catpvs_nomg(out, "->");
3017 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
3018 sv_catpvs_nomg(out, "->");
3023 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
3024 switch (actions & MDEREF_INDEX_MASK) {
3025 case MDEREF_INDEX_const:
3028 sv = ITEM_SV(items);
3030 sv_catpvs_nomg(out, "???");
3035 pv_pretty(out, s, cur, 30,
3037 (PERL_PV_PRETTY_NOCLEAR
3038 |PERL_PV_PRETTY_QUOTE
3039 |PERL_PV_PRETTY_ELLIPSES));
3043 Perl_sv_catpvf(aTHX_ out, "%" IVdf, (++items)->iv);
3045 case MDEREF_INDEX_padsv:
3046 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
3048 case MDEREF_INDEX_gvsv:
3050 sv = ITEM_SV(items);
3051 S_append_gv_name(aTHX_ (GV*)sv, out);
3054 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
3056 if (actions & MDEREF_FLAG_last)
3063 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
3064 (int)(actions & MDEREF_ACTION_MASK));
3070 actions >>= MDEREF_SHIFT;
3076 /* Return a temporary SV containing a stringified representation of
3077 * the op_aux field of a MULTICONCAT op. Note that if the aux contains
3078 * both plain and utf8 versions of the const string and indices, only
3079 * the first is displayed.
3083 Perl_multiconcat_stringify(pTHX_ const OP *o)
3085 UNOP_AUX_item *aux = cUNOP_AUXo->op_aux;
3086 UNOP_AUX_item *lens;
3090 SV *out = newSVpvn_flags("", 0, SVs_TEMP);
3092 PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY;
3094 nargs = aux[PERL_MULTICONCAT_IX_NARGS].ssize;
3095 s = aux[PERL_MULTICONCAT_IX_PLAIN_PV].pv;
3096 len = aux[PERL_MULTICONCAT_IX_PLAIN_LEN].ssize;
3098 s = aux[PERL_MULTICONCAT_IX_UTF8_PV].pv;
3099 len = aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize;
3100 sv_catpvs(out, "UTF8 ");
3102 pv_pretty(out, s, len, 50,
3104 (PERL_PV_PRETTY_NOCLEAR
3105 |PERL_PV_PRETTY_QUOTE
3106 |PERL_PV_PRETTY_ELLIPSES));
3108 lens = aux + PERL_MULTICONCAT_IX_LENGTHS;
3109 while (nargs-- >= 0) {
3110 Perl_sv_catpvf(aTHX_ out, ",%" IVdf, (IV)lens->ssize);
3120 Implements B<-Dt> perl command line option on OP C<o>.
3126 Perl_debop(pTHX_ const OP *o)
3128 PERL_ARGS_ASSERT_DEBOP;
3130 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
3133 Perl_deb(aTHX_ "%s", OP_NAME(o));
3134 switch (o->op_type) {
3137 /* With ITHREADS, consts are stored in the pad, and the right pad
3138 * may not be active here, so check.
3139 * Looks like only during compiling the pads are illegal.
3142 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
3144 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
3148 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
3149 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)));
3156 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
3160 S_deb_padvar(aTHX_ o->op_targ,
3161 o->op_private & OPpPADRANGE_COUNTMASK, 1);
3165 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
3166 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
3169 case OP_MULTICONCAT:
3170 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
3171 SVfARG(multiconcat_stringify(o)));
3177 PerlIO_printf(Perl_debug_log, "\n");
3183 =for apidoc op_class
3185 Given an op, determine what type of struct it has been allocated as.
3186 Returns one of the OPclass enums, such as OPclass_LISTOP.
3193 Perl_op_class(pTHX_ const OP *o)
3198 return OPclass_NULL;
3200 if (o->op_type == 0) {
3201 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
3203 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
3206 if (o->op_type == OP_SASSIGN)
3207 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPclass_UNOP : OPclass_BINOP);
3209 if (o->op_type == OP_AELEMFAST) {
3211 return OPclass_PADOP;
3213 return OPclass_SVOP;
3218 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
3219 o->op_type == OP_RCATLINE)
3220 return OPclass_PADOP;
3223 if (o->op_type == OP_CUSTOM)
3226 switch (OP_CLASS(o)) {
3228 return OPclass_BASEOP;
3231 return OPclass_UNOP;
3234 return OPclass_BINOP;
3237 return OPclass_LOGOP;
3240 return OPclass_LISTOP;
3243 return OPclass_PMOP;
3246 return OPclass_SVOP;
3249 return OPclass_PADOP;
3251 case OA_PVOP_OR_SVOP:
3253 * Character translations (tr///) are usually a PVOP, keeping a
3254 * pointer to a table of shorts used to look up translations.
3255 * Under utf8, however, a simple table isn't practical; instead,
3256 * the OP is an SVOP (or, under threads, a PADOP),
3257 * and the SV is an AV.
3260 (o->op_private & OPpTRANS_USE_SVOP)
3262 #if defined(USE_ITHREADS)
3263 ? OPclass_PADOP : OPclass_PVOP;
3265 ? OPclass_SVOP : OPclass_PVOP;
3269 return OPclass_LOOP;
3274 case OA_BASEOP_OR_UNOP:
3276 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
3277 * whether parens were seen. perly.y uses OPf_SPECIAL to
3278 * signal whether a BASEOP had empty parens or none.
3279 * Some other UNOPs are created later, though, so the best
3280 * test is OPf_KIDS, which is set in newUNOP.
3282 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
3286 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
3287 * the OPf_REF flag to distinguish between OP types instead of the
3288 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
3289 * return OPclass_UNOP so that walkoptree can find our children. If
3290 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
3291 * (no argument to the operator) it's an OP; with OPf_REF set it's
3292 * an SVOP (and op_sv is the GV for the filehandle argument).
3294 return ((o->op_flags & OPf_KIDS) ? OPclass_UNOP :
3296 (o->op_flags & OPf_REF) ? OPclass_PADOP : OPclass_BASEOP);
3298 (o->op_flags & OPf_REF) ? OPclass_SVOP : OPclass_BASEOP);
3302 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
3303 * label was omitted (in which case it's a BASEOP) or else a term was
3304 * seen. In this last case, all except goto are definitely PVOP but
3305 * goto is either a PVOP (with an ordinary constant label), an UNOP
3306 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
3307 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
3310 if (o->op_flags & OPf_STACKED)
3311 return OPclass_UNOP;
3312 else if (o->op_flags & OPf_SPECIAL)
3313 return OPclass_BASEOP;
3315 return OPclass_PVOP;
3317 return OPclass_METHOP;
3319 return OPclass_UNOP_AUX;
3321 Perl_warn(aTHX_ "Can't determine class of operator %s, assuming BASEOP\n",
3323 return OPclass_BASEOP;
3329 S_deb_curcv(pTHX_ I32 ix)
3331 PERL_SI *si = PL_curstackinfo;
3332 for (; ix >=0; ix--) {
3333 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
3335 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
3336 return cx->blk_sub.cv;
3337 else if (CxTYPE(cx) == CXt_EVAL && !CxEVALBLOCK(cx))
3338 return cx->blk_eval.cv;
3339 else if (ix == 0 && si->si_type == PERLSI_MAIN)
3341 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
3342 && si->si_type == PERLSI_SORT)
3344 /* fake sort sub; use CV of caller */
3346 ix = si->si_cxix + 1;
3353 Perl_watch(pTHX_ char **addr)
3355 PERL_ARGS_ASSERT_WATCH;
3357 PL_watchaddr = addr;
3359 PerlIO_printf(Perl_debug_log, "WATCHING, %" UVxf " is currently %" UVxf "\n",
3360 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
3366 Called to indicate that C<o> was executed, for profiling purposes under the
3367 C<-DP> command line option.
3373 S_debprof(pTHX_ const OP *o)
3375 PERL_ARGS_ASSERT_DEBPROF;
3377 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
3379 if (!PL_profiledata)
3380 Newxz(PL_profiledata, MAXO, U32);
3381 ++PL_profiledata[o->op_type];
3385 =for apidoc debprofdump
3387 Dumps the contents of the data collected by the C<-DP> perl command line
3394 Perl_debprofdump(pTHX)
3397 if (!PL_profiledata)
3399 for (i = 0; i < MAXO; i++) {
3400 if (PL_profiledata[i])
3401 PerlIO_printf(Perl_debug_log,
3402 "%5lu %s\n", (unsigned long)PL_profiledata[i],
3409 * ex: set ts=8 sts=4 sw=4 et: