3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * 'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and
13 * it has not been hard for me to read your mind and memory.'
15 * [p.220 of _The Lord of the Rings_, II/i: "Many Meetings"]
18 /* This file contains utility routines to dump the contents of SV and OP
19 * structures, as used by command-line options like -Dt and -Dx, and
22 * It also holds the debugging version of the runops function.
24 =head1 Display and Dump functions
28 #define PERL_IN_DUMP_C
32 static const char* const svtypenames[SVt_LAST] = {
52 static const char* const svshorttypenames[SVt_LAST] = {
77 S_append_flags(pTHX_ SV *sv, U32 flags, const struct flag_to_name *start,
78 const struct flag_to_name *const end)
81 if (flags & start->flag)
82 sv_catpv(sv, start->name);
83 } while (++start < end);
86 #define append_flags(sv, f, flags) \
87 S_append_flags(aTHX_ (sv), (f), (flags), C_ARRAY_END(flags))
89 #define generic_pv_escape(sv,s,len,utf8) pv_escape( (sv), (s), (len), \
90 (len) * (4+UTF8_MAXBYTES) + 1, NULL, \
91 PERL_PV_ESCAPE_NONASCII | PERL_PV_ESCAPE_DWIM \
92 | ((utf8) ? PERL_PV_ESCAPE_UNI : 0) )
97 Escapes at most the first C<count> chars of C<pv> and puts the results into
98 C<dsv> such that the size of the escaped string will not exceed C<max> chars
99 and will not contain any incomplete escape sequences. The number of bytes
100 escaped will be returned in the C<STRLEN *escaped> parameter if it is not null.
101 When the C<dsv> parameter is null no escaping actually occurs, but the number
102 of bytes that would be escaped were it not null will be calculated.
104 If flags contains C<PERL_PV_ESCAPE_QUOTE> then any double quotes in the string
105 will also be escaped.
107 Normally the SV will be cleared before the escaped string is prepared,
108 but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
110 If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
111 if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
112 using C<is_utf8_string()> to determine if it is UTF-8.
114 If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
115 using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> is set, only
116 non-ASCII chars will be escaped using this style; otherwise, only chars above
117 255 will be so escaped; other non printable chars will use octal or
118 common escaped patterns like C<\n>.
119 Otherwise, if C<PERL_PV_ESCAPE_NOBACKSLASH>
120 then all chars below 255 will be treated as printable and
121 will be output as literals.
123 If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
124 string will be escaped, regardless of max. If the output is to be in hex,
125 then it will be returned as a plain hex
126 sequence. Thus the output will either be a single char,
127 an octal escape sequence, a special escape like C<\n> or a hex value.
129 If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a C<"%"> and
130 not a C<"\\">. This is because regexes very often contain backslashed
131 sequences, whereas C<"%"> is not a particularly common character in patterns.
133 Returns a pointer to the escaped text as held by C<dsv>.
137 #define PV_ESCAPE_OCTBUFSIZE 32
140 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
141 const STRLEN count, const STRLEN max,
142 STRLEN * const escaped, const U32 flags )
144 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
145 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
146 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
147 STRLEN wrote = 0; /* chars written so far */
148 STRLEN chsize = 0; /* size of data to be written */
149 STRLEN readsize = 1; /* size of data just read */
150 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
151 const char *pv = str;
152 const char * const end = pv + count; /* end of string */
155 PERL_ARGS_ASSERT_PV_ESCAPE;
157 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
158 /* This won't alter the UTF-8 flag */
162 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
165 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
166 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
167 const U8 c = (U8)u & 0xFF;
170 || (flags & PERL_PV_ESCAPE_ALL)
171 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
173 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
174 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
177 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
178 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
180 : "%cx{%02" UVxf "}", esc, u);
182 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
185 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
189 case '\\' : /* FALLTHROUGH */
190 case '%' : if ( c == esc ) {
196 case '\v' : octbuf[1] = 'v'; break;
197 case '\t' : octbuf[1] = 't'; break;
198 case '\r' : octbuf[1] = 'r'; break;
199 case '\n' : octbuf[1] = 'n'; break;
200 case '\f' : octbuf[1] = 'f'; break;
208 if ( (flags & PERL_PV_ESCAPE_DWIM) && c != '\0' ) {
209 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
210 isuni ? "%cx{%02" UVxf "}" : "%cx%02" UVxf,
213 else if ((pv+readsize < end) && isDIGIT((U8)*(pv+readsize)))
214 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
217 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
224 if ( max && (wrote + chsize > max) ) {
226 } else if (chsize > 1) {
228 sv_catpvn(dsv, octbuf, chsize);
231 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
232 can be appended raw to the dsv. If dsv happens to be
233 UTF-8 then we need catpvf to upgrade them for us.
234 Or add a new API call sv_catpvc(). Think about that name, and
235 how to keep it clear that it's unlike the s of catpvs, which is
236 really an array of octets, not a string. */
238 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
241 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
246 return dsv ? SvPVX(dsv) : NULL;
249 =for apidoc pv_pretty
251 Converts a string into something presentable, handling escaping via
252 C<pv_escape()> and supporting quoting and ellipses.
254 If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
255 double quoted with any double quotes in the string escaped. Otherwise
256 if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
259 If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
260 string were output then an ellipsis C<...> will be appended to the
261 string. Note that this happens AFTER it has been quoted.
263 If C<start_color> is non-null then it will be inserted after the opening
264 quote (if there is one) but before the escaped text. If C<end_color>
265 is non-null then it will be inserted after the escaped text but before
266 any quotes or ellipses.
268 Returns a pointer to the prettified text as held by C<dsv>.
274 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
275 const STRLEN max, char const * const start_color, char const * const end_color,
278 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
279 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
281 STRLEN max_adjust= 0;
284 PERL_ARGS_ASSERT_PV_PRETTY;
286 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
287 /* This won't alter the UTF-8 flag */
290 orig_cur= SvCUR(dsv);
293 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
295 if ( start_color != NULL )
296 sv_catpv(dsv, start_color);
298 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
301 assert(max > max_adjust);
302 pv_escape( NULL, str, count, max - max_adjust, &escaped, flags );
303 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
305 assert(max > max_adjust);
308 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
310 if ( end_color != NULL )
311 sv_catpv(dsv, end_color);
314 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
316 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
317 sv_catpvs(dsv, "...");
319 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
320 while( SvCUR(dsv) - orig_cur < max )
328 =for apidoc pv_display
332 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
334 except that an additional "\0" will be appended to the string when
335 len > cur and pv[cur] is "\0".
337 Note that the final string may be up to 7 chars longer than pvlim.
343 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
345 PERL_ARGS_ASSERT_PV_DISPLAY;
347 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
348 if (len > cur && pv[cur] == '\0')
349 sv_catpvs( dsv, "\\0");
354 Perl_sv_peek(pTHX_ SV *sv)
357 SV * const t = sv_newmortal();
367 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
368 /* detect data corruption under memory poisoning */
372 else if ( sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes
373 || sv == &PL_sv_zero || sv == &PL_sv_placeholder)
375 if (sv == &PL_sv_undef) {
376 sv_catpv(t, "SV_UNDEF");
377 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
378 SVs_GMG|SVs_SMG|SVs_RMG)) &&
382 else if (sv == &PL_sv_no) {
383 sv_catpv(t, "SV_NO");
384 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
385 SVs_GMG|SVs_SMG|SVs_RMG)) &&
386 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
392 else if (sv == &PL_sv_yes) {
393 sv_catpv(t, "SV_YES");
394 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
395 SVs_GMG|SVs_SMG|SVs_RMG)) &&
396 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
399 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
403 else if (sv == &PL_sv_zero) {
404 sv_catpv(t, "SV_ZERO");
405 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
406 SVs_GMG|SVs_SMG|SVs_RMG)) &&
407 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
410 SvPVX_const(sv) && *SvPVX_const(sv) == '0' &&
415 sv_catpv(t, "SV_PLACEHOLDER");
416 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
417 SVs_GMG|SVs_SMG|SVs_RMG)) &&
423 else if (SvREFCNT(sv) == 0) {
427 else if (DEBUG_R_TEST_) {
430 /* is this SV on the tmps stack? */
431 for (ix=PL_tmps_ix; ix>=0; ix--) {
432 if (PL_tmps_stack[ix] == sv) {
437 if (is_tmp || SvREFCNT(sv) > 1) {
438 Perl_sv_catpvf(aTHX_ t, "<");
439 if (SvREFCNT(sv) > 1)
440 Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv));
442 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
443 Perl_sv_catpvf(aTHX_ t, ">");
449 if (SvCUR(t) + unref > 10) {
450 SvCUR_set(t, unref + 3);
459 if (type == SVt_PVCV) {
460 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
462 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
463 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
466 } else if (type < SVt_LAST) {
467 sv_catpv(t, svshorttypenames[type]);
469 if (type == SVt_NULL)
472 sv_catpv(t, "FREED");
477 if (!SvPVX_const(sv))
478 sv_catpv(t, "(null)");
480 SV * const tmp = newSVpvs("");
484 SvOOK_offset(sv, delta);
485 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
487 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
489 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
490 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
492 SvREFCNT_dec_NN(tmp);
495 else if (SvNOKp(sv)) {
496 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
497 Perl_sv_catpvf(aTHX_ t, "(%" NVgf ")",SvNVX(sv));
498 RESTORE_LC_NUMERIC_UNDERLYING();
500 else if (SvIOKp(sv)) {
502 Perl_sv_catpvf(aTHX_ t, "(%" UVuf ")", (UV)SvUVX(sv));
504 Perl_sv_catpvf(aTHX_ t, "(%" IVdf ")", (IV)SvIVX(sv));
512 if (TAINTING_get && sv && SvTAINTED(sv))
513 sv_catpv(t, " [tainted]");
514 return SvPV_nolen(t);
518 =head1 Debugging Utilities
522 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
525 PERL_ARGS_ASSERT_DUMP_INDENT;
527 dump_vindent(level, file, pat, &args);
532 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
534 PERL_ARGS_ASSERT_DUMP_VINDENT;
535 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
536 PerlIO_vprintf(file, pat, *args);
540 /* Like Perl_dump_indent(), but specifically for ops: adds a vertical bar
541 * for each indent level as appropriate.
543 * bar contains bits indicating which indent columns should have a
544 * vertical bar displayed. Bit 0 is the RH-most column. If there are more
545 * levels than bits in bar, then the first few indents are displayed
548 * The start of a new op is signalled by passing a value for level which
549 * has been negated and offset by 1 (so that level 0 is passed as -1 and
550 * can thus be distinguished from -0); in this case, emit a suitably
551 * indented blank line, then on the next line, display the op's sequence
552 * number, and make the final indent an '+----'.
556 * | FOO # level = 1, bar = 0b1
557 * | | # level =-2-1, bar = 0b11
559 * | BAZ # level = 2, bar = 0b10
563 S_opdump_indent(pTHX_ const OP *o, I32 level, UV bar, PerlIO *file,
564 const char* pat, ...)
568 bool newop = (level < 0);
572 /* start displaying a new op? */
574 UV seq = sequence_num(o);
578 /* output preceding blank line */
579 PerlIO_puts(file, " ");
580 for (i = level-1; i >= 0; i--)
581 PerlIO_puts(file, ( i == 0
582 || (i < UVSIZE*8 && (bar & ((UV)1 << i)))
585 PerlIO_puts(file, "\n");
587 /* output sequence number */
589 PerlIO_printf(file, "%-4" UVuf " ", seq);
591 PerlIO_puts(file, "???? ");
595 PerlIO_printf(file, " ");
597 for (i = level-1; i >= 0; i--)
599 (i == 0 && newop) ? "+--"
600 : (bar & (1 << i)) ? "| "
602 PerlIO_vprintf(file, pat, args);
607 /* display a link field (e.g. op_next) in the format
608 * ====> sequence_number [opname 0x123456]
612 S_opdump_link(pTHX_ const OP *o, PerlIO *file)
614 PerlIO_puts(file, " ===> ");
616 PerlIO_printf(file, "%" UVuf " [%s 0x%" UVxf "]\n",
617 sequence_num(o), OP_NAME(o), PTR2UV(o));
619 PerlIO_puts(file, "[0x0]\n");
625 Dumps the entire optree of the current program starting at C<PL_main_root> to
626 C<STDERR>. Also dumps the optrees for all visible subroutines in
635 dump_all_perl(FALSE);
639 Perl_dump_all_perl(pTHX_ bool justperl)
641 PerlIO_setlinebuf(Perl_debug_log);
643 op_dump(PL_main_root);
644 dump_packsubs_perl(PL_defstash, justperl);
648 =for apidoc dump_packsubs
650 Dumps the optrees for all visible subroutines in C<stash>.
656 Perl_dump_packsubs(pTHX_ const HV *stash)
658 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
659 dump_packsubs_perl(stash, FALSE);
663 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
667 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
671 for (i = 0; i <= (I32) HvMAX(stash); i++) {
673 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
674 GV * gv = (GV *)HeVAL(entry);
675 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
676 /* unfake a fake GV */
677 (void)CvGV(SvRV(gv));
678 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
681 dump_sub_perl(gv, justperl);
684 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
685 const HV * const hv = GvHV(gv);
686 if (hv && (hv != PL_defstash))
687 dump_packsubs_perl(hv, justperl); /* nested package */
694 Perl_dump_sub(pTHX_ const GV *gv)
696 PERL_ARGS_ASSERT_DUMP_SUB;
697 dump_sub_perl(gv, FALSE);
701 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
705 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
707 cv = isGV_with_GP(gv) ? GvCV(gv) :
708 (assert(SvROK((SV*)gv)), (CV*)SvRV((SV*)gv));
709 if (justperl && (CvISXSUB(cv) || !CvROOT(cv)))
712 if (isGV_with_GP(gv)) {
713 SV * const namesv = newSVpvs_flags("", SVs_TEMP);
714 SV *escsv = newSVpvs_flags("", SVs_TEMP);
717 gv_fullname3(namesv, gv, NULL);
718 namepv = SvPV_const(namesv, namelen);
719 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
720 generic_pv_escape(escsv, namepv, namelen, SvUTF8(namesv)));
722 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB = ");
725 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%" UVxf " %d)\n",
727 (int)CvXSUBANY(cv).any_i32);
731 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
735 Perl_dump_form(pTHX_ const GV *gv)
737 SV * const sv = sv_newmortal();
739 PERL_ARGS_ASSERT_DUMP_FORM;
741 gv_fullname3(sv, gv, NULL);
742 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
743 if (CvROOT(GvFORM(gv)))
744 op_dump(CvROOT(GvFORM(gv)));
746 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
752 op_dump(PL_eval_root);
756 /* returns a temp SV displaying the name of a GV. Handles the case where
757 * a GV is in fact a ref to a CV */
760 S_gv_display(pTHX_ GV *gv)
762 SV * const name = newSVpvs_flags("", SVs_TEMP);
764 SV * const raw = newSVpvs_flags("", SVs_TEMP);
768 if (isGV_with_GP(gv))
769 gv_fullname3(raw, gv, NULL);
772 assert(SvTYPE(SvRV(gv)) == SVt_PVCV);
773 Perl_sv_catpvf(aTHX_ raw, "cv ref: %s",
774 SvPV_nolen_const(cv_name((CV *)SvRV(gv), name, 0)));
776 rawpv = SvPV_const(raw, len);
777 generic_pv_escape(name, rawpv, len, SvUTF8(raw));
780 sv_catpvs(name, "(NULL)");
789 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o);
793 S_do_pmop_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const PMOP *pm)
800 kidbar = ((bar << 1) | cBOOL(pm->op_flags & OPf_KIDS)) << 1;
803 char ch = (pm->op_pmflags & PMf_ONCE) ? '?' : '/';
804 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE %c%.*s%c\n",
805 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch);
808 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE (RUNTIME)\n");
810 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
811 SV * const tmpsv = pm_description(pm);
812 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMFLAGS = (%s)\n",
813 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
814 SvREFCNT_dec_NN(tmpsv);
817 if (pm->op_type == OP_SPLIT)
818 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
819 "TARGOFF/GV = 0x%" UVxf "\n",
820 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
822 if (pm->op_pmreplrootu.op_pmreplroot) {
823 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_REPL =\n");
824 S_do_op_dump_bar(aTHX_ level + 2,
825 (kidbar|cBOOL(OpHAS_SIBLING(pm->op_pmreplrootu.op_pmreplroot))),
826 file, pm->op_pmreplrootu.op_pmreplroot);
830 if (pm->op_code_list) {
831 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
832 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "CODE_LIST =\n");
833 S_do_op_dump_bar(aTHX_ level + 2,
834 (kidbar | cBOOL(OpHAS_SIBLING(pm->op_code_list))),
835 file, pm->op_code_list);
838 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
839 "CODE_LIST = 0x%" UVxf "\n", PTR2UV(pm->op_code_list));
845 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
847 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
848 S_do_pmop_dump_bar(aTHX_ level, 0, file, pm);
852 const struct flag_to_name pmflags_flags_names[] = {
853 {PMf_CONST, ",CONST"},
855 {PMf_GLOBAL, ",GLOBAL"},
856 {PMf_CONTINUE, ",CONTINUE"},
857 {PMf_RETAINT, ",RETAINT"},
859 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
860 {PMf_HAS_CV, ",HAS_CV"},
861 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
862 {PMf_IS_QR, ",IS_QR"}
866 S_pm_description(pTHX_ const PMOP *pm)
868 SV * const desc = newSVpvs("");
869 const REGEXP * const regex = PM_GETRE(pm);
870 const U32 pmflags = pm->op_pmflags;
872 PERL_ARGS_ASSERT_PM_DESCRIPTION;
874 if (pmflags & PMf_ONCE)
875 sv_catpv(desc, ",ONCE");
877 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
878 sv_catpv(desc, ":USED");
880 if (pmflags & PMf_USED)
881 sv_catpv(desc, ":USED");
885 if (RX_ISTAINTED(regex))
886 sv_catpv(desc, ",TAINTED");
887 if (RX_CHECK_SUBSTR(regex)) {
888 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
889 sv_catpv(desc, ",SCANFIRST");
890 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
891 sv_catpv(desc, ",ALL");
893 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
894 sv_catpv(desc, ",SKIPWHITE");
897 append_flags(desc, pmflags, pmflags_flags_names);
902 Perl_pmop_dump(pTHX_ PMOP *pm)
904 do_pmop_dump(0, Perl_debug_log, pm);
907 /* Return a unique integer to represent the address of op o.
908 * If it already exists in PL_op_sequence, just return it;
910 * *** Note that this isn't thread-safe */
913 S_sequence_num(pTHX_ const OP *o)
922 op = newSVuv(PTR2UV(o));
924 key = SvPV_const(op, len);
926 PL_op_sequence = newHV();
927 seq = hv_fetch(PL_op_sequence, key, len, 0);
930 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
938 const struct flag_to_name op_flags_names[] = {
940 {OPf_PARENS, ",PARENS"},
943 {OPf_STACKED, ",STACKED"},
944 {OPf_SPECIAL, ",SPECIAL"}
948 /* indexed by enum OPclass */
949 const char * const op_class_names[] = {
967 /* dump an op and any children. level indicates the initial indent.
968 * The bits of bar indicate which indents should receive a vertical bar.
969 * For example if level == 5 and bar == 0b01101, then the indent prefix
970 * emitted will be (not including the <>'s):
973 * 55554444333322221111
975 * For heavily nested output, the level may exceed the number of bits
976 * in bar; in this case the first few columns in the output will simply
977 * not have a bar, which is harmless.
981 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
983 const OPCODE optype = o->op_type;
985 PERL_ARGS_ASSERT_DO_OP_DUMP;
987 /* print op header line */
989 S_opdump_indent(aTHX_ o, -level-1, bar, file, "%s", OP_NAME(o));
991 if (optype == OP_NULL && o->op_targ)
992 PerlIO_printf(file, " (ex-%s)",PL_op_name[o->op_targ]);
994 PerlIO_printf(file, " %s(0x%" UVxf ")",
995 op_class_names[op_class(o)], PTR2UV(o));
996 S_opdump_link(aTHX_ o->op_next, file);
998 /* print op common fields */
1000 if (o->op_targ && optype != OP_NULL)
1001 S_opdump_indent(aTHX_ o, level, bar, file, "TARG = %ld\n",
1004 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
1005 SV * const tmpsv = newSVpvs("");
1006 switch (o->op_flags & OPf_WANT) {
1008 sv_catpv(tmpsv, ",VOID");
1010 case OPf_WANT_SCALAR:
1011 sv_catpv(tmpsv, ",SCALAR");
1014 sv_catpv(tmpsv, ",LIST");
1017 sv_catpv(tmpsv, ",UNKNOWN");
1020 append_flags(tmpsv, o->op_flags, op_flags_names);
1021 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
1022 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
1023 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
1024 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
1025 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
1026 S_opdump_indent(aTHX_ o, level, bar, file, "FLAGS = (%s)\n",
1027 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
1030 if (o->op_private) {
1031 U16 oppriv = o->op_private;
1032 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
1037 tmpsv = newSVpvs("");
1038 for (; !stop; op_ix++) {
1039 U16 entry = PL_op_private_bitdefs[op_ix];
1040 U16 bit = (entry >> 2) & 7;
1041 U16 ix = entry >> 5;
1047 I16 const *p = &PL_op_private_bitfields[ix];
1048 U16 bitmin = (U16) *p++;
1055 for (i = bitmin; i<= bit; i++)
1058 val = (oppriv & mask);
1061 && PL_op_private_labels[label] == '-'
1062 && PL_op_private_labels[label+1] == '\0'
1064 /* display as raw number */
1077 if (val == 0 && enum_label == -1)
1078 /* don't display anonymous zero values */
1081 sv_catpv(tmpsv, ",");
1083 sv_catpv(tmpsv, &PL_op_private_labels[label]);
1084 sv_catpv(tmpsv, "=");
1086 if (enum_label == -1)
1087 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)val);
1089 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
1094 if ( oppriv & (1<<bit)
1095 && !(PL_op_private_labels[ix] == '-'
1096 && PL_op_private_labels[ix+1] == '\0'))
1099 sv_catpv(tmpsv, ",");
1100 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
1105 sv_catpv(tmpsv, ",");
1106 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)oppriv);
1109 if (tmpsv && SvCUR(tmpsv)) {
1110 S_opdump_indent(aTHX_ o, level, bar, file, "PRIVATE = (%s)\n",
1111 SvPVX_const(tmpsv) + 1);
1113 S_opdump_indent(aTHX_ o, level, bar, file,
1114 "PRIVATE = (0x%" UVxf ")\n", (UV)oppriv);
1122 S_opdump_indent(aTHX_ o, level, bar, file,
1123 "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1125 S_opdump_indent(aTHX_ o, level, bar, file,
1126 "GV = %" SVf " (0x%" UVxf ")\n",
1127 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)), PTR2UV(cGVOPo_gv));
1133 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
1134 UV i, count = items[-1].uv;
1136 S_opdump_indent(aTHX_ o, level, bar, file, "ARGS = \n");
1137 for (i=0; i < count; i++)
1138 S_opdump_indent(aTHX_ o, level+1, (bar << 1), file,
1139 "%" UVuf " => 0x%" UVxf "\n",
1146 case OP_METHOD_NAMED:
1147 case OP_METHOD_SUPER:
1148 case OP_METHOD_REDIR:
1149 case OP_METHOD_REDIR_SUPER:
1150 #ifndef USE_ITHREADS
1151 /* with ITHREADS, consts are stored in the pad, and the right pad
1152 * may not be active here, so skip */
1153 S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n",
1154 SvPEEK(cMETHOPx_meth(o)));
1158 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1164 S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n",
1165 (UV)CopLINE(cCOPo));
1167 if (CopSTASHPV(cCOPo)) {
1168 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1169 HV *stash = CopSTASH(cCOPo);
1170 const char * const hvname = HvNAME_get(stash);
1172 S_opdump_indent(aTHX_ o, level, bar, file, "PACKAGE = \"%s\"\n",
1173 generic_pv_escape(tmpsv, hvname,
1174 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1177 if (CopLABEL(cCOPo)) {
1178 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1181 const char *label = CopLABEL_len_flags(cCOPo,
1182 &label_len, &label_flags);
1183 S_opdump_indent(aTHX_ o, level, bar, file, "LABEL = \"%s\"\n",
1184 generic_pv_escape( tmpsv, label, label_len,
1185 (label_flags & SVf_UTF8)));
1188 S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
1189 (unsigned int)cCOPo->cop_seq);
1194 S_opdump_indent(aTHX_ o, level, bar, file, "REDO");
1195 S_opdump_link(aTHX_ cLOOPo->op_redoop, file);
1196 S_opdump_indent(aTHX_ o, level, bar, file, "NEXT");
1197 S_opdump_link(aTHX_ cLOOPo->op_nextop, file);
1198 S_opdump_indent(aTHX_ o, level, bar, file, "LAST");
1199 S_opdump_link(aTHX_ cLOOPo->op_lastop, file);
1219 S_opdump_indent(aTHX_ o, level, bar, file, "OTHER");
1220 S_opdump_link(aTHX_ cLOGOPo->op_other, file);
1226 S_do_pmop_dump_bar(aTHX_ level, bar, file, cPMOPo);
1234 if (o->op_private & OPpREFCOUNTED)
1235 S_opdump_indent(aTHX_ o, level, bar, file,
1236 "REFCNT = %" UVuf "\n", (UV)o->op_targ);
1244 if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
1247 SV * const label = newSVpvs_flags("", SVs_TEMP);
1248 generic_pv_escape(label, cPVOPo->op_pv, strlen(cPVOPo->op_pv), 0);
1249 S_opdump_indent(aTHX_ o, level, bar, file,
1250 "PV = \"%" SVf "\" (0x%" UVxf ")\n",
1251 SVfARG(label), PTR2UV(cPVOPo->op_pv));
1257 S_opdump_indent(aTHX_ o, level, bar, file,
1258 "PV = 0x%" UVxf "\n",
1259 PTR2UV(cPVOPo->op_pv));
1266 if (o->op_flags & OPf_KIDS) {
1270 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1271 S_do_op_dump_bar(aTHX_ level,
1272 (bar | cBOOL(OpHAS_SIBLING(kid))),
1279 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
1281 S_do_op_dump_bar(aTHX_ level, 0, file, o);
1288 Dumps the optree starting at OP C<o> to C<STDERR>.
1294 Perl_op_dump(pTHX_ const OP *o)
1296 PERL_ARGS_ASSERT_OP_DUMP;
1297 do_op_dump(0, Perl_debug_log, o);
1301 Perl_gv_dump(pTHX_ GV *gv)
1305 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1308 PerlIO_printf(Perl_debug_log, "{}\n");
1311 sv = sv_newmortal();
1312 PerlIO_printf(Perl_debug_log, "{\n");
1313 gv_fullname3(sv, gv, NULL);
1314 name = SvPV_const(sv, len);
1315 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1316 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1317 if (gv != GvEGV(gv)) {
1318 gv_efullname3(sv, GvEGV(gv), NULL);
1319 name = SvPV_const(sv, len);
1320 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1321 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1323 (void)PerlIO_putc(Perl_debug_log, '\n');
1324 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1328 /* map magic types to the symbolic names
1329 * (with the PERL_MAGIC_ prefixed stripped)
1332 static const struct { const char type; const char *name; } magic_names[] = {
1333 #include "mg_names.inc"
1334 /* this null string terminates the list */
1339 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1341 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1343 for (; mg; mg = mg->mg_moremagic) {
1344 Perl_dump_indent(aTHX_ level, file,
1345 " MAGIC = 0x%" UVxf "\n", PTR2UV(mg));
1346 if (mg->mg_virtual) {
1347 const MGVTBL * const v = mg->mg_virtual;
1348 if (v >= PL_magic_vtables
1349 && v < PL_magic_vtables + magic_vtable_max) {
1350 const U32 i = v - PL_magic_vtables;
1351 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1354 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"
1355 UVxf "\n", PTR2UV(v));
1358 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1361 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1365 const char *name = NULL;
1366 for (n = 0; magic_names[n].name; n++) {
1367 if (mg->mg_type == magic_names[n].type) {
1368 name = magic_names[n].name;
1373 Perl_dump_indent(aTHX_ level, file,
1374 " MG_TYPE = PERL_MAGIC_%s\n", name);
1376 Perl_dump_indent(aTHX_ level, file,
1377 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1381 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1382 if (mg->mg_type == PERL_MAGIC_envelem &&
1383 mg->mg_flags & MGf_TAINTEDDIR)
1384 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1385 if (mg->mg_type == PERL_MAGIC_regex_global &&
1386 mg->mg_flags & MGf_MINMATCH)
1387 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1388 if (mg->mg_flags & MGf_REFCOUNTED)
1389 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1390 if (mg->mg_flags & MGf_GSKIP)
1391 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1392 if (mg->mg_flags & MGf_COPY)
1393 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1394 if (mg->mg_flags & MGf_DUP)
1395 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1396 if (mg->mg_flags & MGf_LOCAL)
1397 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1398 if (mg->mg_type == PERL_MAGIC_regex_global &&
1399 mg->mg_flags & MGf_BYTES)
1400 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1403 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%" UVxf "\n",
1404 PTR2UV(mg->mg_obj));
1405 if (mg->mg_type == PERL_MAGIC_qr) {
1406 REGEXP* const re = (REGEXP *)mg->mg_obj;
1407 SV * const dsv = sv_newmortal();
1408 const char * const s
1409 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1411 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1412 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1414 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1415 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %" IVdf "\n",
1418 if (mg->mg_flags & MGf_REFCOUNTED)
1419 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1422 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1424 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%" UVxf, PTR2UV(mg->mg_ptr));
1425 if (mg->mg_len >= 0) {
1426 if (mg->mg_type != PERL_MAGIC_utf8) {
1427 SV * const sv = newSVpvs("");
1428 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1429 SvREFCNT_dec_NN(sv);
1432 else if (mg->mg_len == HEf_SVKEY) {
1433 PerlIO_puts(file, " => HEf_SVKEY\n");
1434 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1435 maxnest, dumpops, pvlim); /* MG is already +1 */
1438 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1443 " does not know how to handle this MG_LEN"
1445 (void)PerlIO_putc(file, '\n');
1447 if (mg->mg_type == PERL_MAGIC_utf8) {
1448 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1451 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1452 Perl_dump_indent(aTHX_ level, file,
1453 " %2" IVdf ": %" UVuf " -> %" UVuf "\n",
1456 (UV)cache[i * 2 + 1]);
1463 Perl_magic_dump(pTHX_ const MAGIC *mg)
1465 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1469 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1473 PERL_ARGS_ASSERT_DO_HV_DUMP;
1475 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1476 if (sv && (hvname = HvNAME_get(sv)))
1478 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1479 name which quite legally could contain insane things like tabs, newlines, nulls or
1480 other scary crap - this should produce sane results - except maybe for unicode package
1481 names - but we will wait for someone to file a bug on that - demerphq */
1482 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1483 PerlIO_printf(file, "\t\"%s\"\n",
1484 generic_pv_escape( tmpsv, hvname,
1485 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1488 (void)PerlIO_putc(file, '\n');
1492 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1494 PERL_ARGS_ASSERT_DO_GV_DUMP;
1496 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1497 if (sv && GvNAME(sv)) {
1498 SV * const tmpsv = newSVpvs("");
1499 PerlIO_printf(file, "\t\"%s\"\n",
1500 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1503 (void)PerlIO_putc(file, '\n');
1507 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1509 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1511 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1512 if (sv && GvNAME(sv)) {
1513 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1515 HV * const stash = GvSTASH(sv);
1516 PerlIO_printf(file, "\t");
1517 /* TODO might have an extra \" here */
1518 if (stash && (hvname = HvNAME_get(stash))) {
1519 PerlIO_printf(file, "\"%s\" :: \"",
1520 generic_pv_escape(tmp, hvname,
1521 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1523 PerlIO_printf(file, "%s\"\n",
1524 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1527 (void)PerlIO_putc(file, '\n');
1530 const struct flag_to_name first_sv_flags_names[] = {
1531 {SVs_TEMP, "TEMP,"},
1532 {SVs_OBJECT, "OBJECT,"},
1541 const struct flag_to_name second_sv_flags_names[] = {
1543 {SVf_FAKE, "FAKE,"},
1544 {SVf_READONLY, "READONLY,"},
1545 {SVf_PROTECT, "PROTECT,"},
1546 {SVf_BREAK, "BREAK,"},
1552 const struct flag_to_name cv_flags_names[] = {
1553 {CVf_ANON, "ANON,"},
1554 {CVf_UNIQUE, "UNIQUE,"},
1555 {CVf_CLONE, "CLONE,"},
1556 {CVf_CLONED, "CLONED,"},
1557 {CVf_CONST, "CONST,"},
1558 {CVf_NODEBUG, "NODEBUG,"},
1559 {CVf_LVALUE, "LVALUE,"},
1560 {CVf_METHOD, "METHOD,"},
1561 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1562 {CVf_CVGV_RC, "CVGV_RC,"},
1563 {CVf_DYNFILE, "DYNFILE,"},
1564 {CVf_AUTOLOAD, "AUTOLOAD,"},
1565 {CVf_HASEVAL, "HASEVAL,"},
1566 {CVf_SLABBED, "SLABBED,"},
1567 {CVf_NAMED, "NAMED,"},
1568 {CVf_LEXICAL, "LEXICAL,"},
1569 {CVf_ISXSUB, "ISXSUB,"}
1572 const struct flag_to_name hv_flags_names[] = {
1573 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1574 {SVphv_LAZYDEL, "LAZYDEL,"},
1575 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1576 {SVf_AMAGIC, "OVERLOAD,"},
1577 {SVphv_CLONEABLE, "CLONEABLE,"}
1580 const struct flag_to_name gp_flags_names[] = {
1581 {GVf_INTRO, "INTRO,"},
1582 {GVf_MULTI, "MULTI,"},
1583 {GVf_ASSUMECV, "ASSUMECV,"},
1586 const struct flag_to_name gp_flags_imported_names[] = {
1587 {GVf_IMPORTED_SV, " SV"},
1588 {GVf_IMPORTED_AV, " AV"},
1589 {GVf_IMPORTED_HV, " HV"},
1590 {GVf_IMPORTED_CV, " CV"},
1593 /* NOTE: this structure is mostly duplicative of one generated by
1594 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1595 * the two. - Yves */
1596 const struct flag_to_name regexp_extflags_names[] = {
1597 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1598 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1599 {RXf_PMf_FOLD, "PMf_FOLD,"},
1600 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1601 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1602 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1603 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1604 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1605 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1606 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1607 {RXf_CHECK_ALL, "CHECK_ALL,"},
1608 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1609 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1610 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1611 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1612 {RXf_SPLIT, "SPLIT,"},
1613 {RXf_COPY_DONE, "COPY_DONE,"},
1614 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1615 {RXf_TAINTED, "TAINTED,"},
1616 {RXf_START_ONLY, "START_ONLY,"},
1617 {RXf_SKIPWHITE, "SKIPWHITE,"},
1618 {RXf_WHITE, "WHITE,"},
1619 {RXf_NULL, "NULL,"},
1622 /* NOTE: this structure is mostly duplicative of one generated by
1623 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1624 * the two. - Yves */
1625 const struct flag_to_name regexp_core_intflags_names[] = {
1626 {PREGf_SKIP, "SKIP,"},
1627 {PREGf_IMPLICIT, "IMPLICIT,"},
1628 {PREGf_NAUGHTY, "NAUGHTY,"},
1629 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1630 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1631 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1632 {PREGf_NOSCAN, "NOSCAN,"},
1633 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1634 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1635 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1636 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1637 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1640 /* Perl_do_sv_dump():
1642 * level: amount to indent the output
1643 * sv: the object to dump
1644 * nest: the current level of recursion
1645 * maxnest: the maximum allowed level of recursion
1646 * dumpops: if true, also dump the ops associated with a CV
1647 * pvlim: limit on the length of any strings that are output
1651 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1658 PERL_ARGS_ASSERT_DO_SV_DUMP;
1661 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1665 flags = SvFLAGS(sv);
1668 /* process general SV flags */
1670 d = Perl_newSVpvf(aTHX_
1671 "(0x%" UVxf ") at 0x%" UVxf "\n%*s REFCNT = %" IVdf "\n%*s FLAGS = (",
1672 PTR2UV(SvANY(sv)), PTR2UV(sv),
1673 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1674 (int)(PL_dumpindent*level), "");
1676 if ((flags & SVs_PADSTALE))
1677 sv_catpv(d, "PADSTALE,");
1678 if ((flags & SVs_PADTMP))
1679 sv_catpv(d, "PADTMP,");
1680 append_flags(d, flags, first_sv_flags_names);
1681 if (flags & SVf_ROK) {
1682 sv_catpv(d, "ROK,");
1683 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1685 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1686 append_flags(d, flags, second_sv_flags_names);
1687 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1688 && type != SVt_PVAV) {
1689 if (SvPCS_IMPORTED(sv))
1690 sv_catpv(d, "PCS_IMPORTED,");
1692 sv_catpv(d, "SCREAM,");
1695 /* process type-specific SV flags */
1700 append_flags(d, CvFLAGS(sv), cv_flags_names);
1703 append_flags(d, flags, hv_flags_names);
1707 if (isGV_with_GP(sv)) {
1708 append_flags(d, GvFLAGS(sv), gp_flags_names);
1710 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1711 sv_catpv(d, "IMPORT");
1712 if (GvIMPORTED(sv) == GVf_IMPORTED)
1713 sv_catpv(d, "ALL,");
1716 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1723 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1729 /* SVphv_SHAREKEYS is also 0x20000000 */
1730 if ((type != SVt_PVHV) && SvUTF8(sv))
1731 sv_catpv(d, "UTF8");
1733 if (*(SvEND(d) - 1) == ',') {
1734 SvCUR_set(d, SvCUR(d) - 1);
1735 SvPVX(d)[SvCUR(d)] = '\0';
1740 /* dump initial SV details */
1742 #ifdef DEBUG_LEAKING_SCALARS
1743 Perl_dump_indent(aTHX_ level, file,
1744 "ALLOCATED at %s:%d %s %s (parent 0x%" UVxf "); serial %" UVuf "\n",
1745 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1747 sv->sv_debug_inpad ? "for" : "by",
1748 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1749 PTR2UV(sv->sv_debug_parent),
1753 Perl_dump_indent(aTHX_ level, file, "SV = ");
1757 if (type < SVt_LAST) {
1758 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1760 if (type == SVt_NULL) {
1765 PerlIO_printf(file, "UNKNOWN(0x%" UVxf ") %s\n", (UV)type, s);
1770 /* Dump general SV fields */
1772 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1773 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1774 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1775 || (type == SVt_IV && !SvROK(sv))) {
1778 Perl_dump_indent(aTHX_ level, file, " UV = %" UVuf, (UV)SvUVX(sv));
1780 Perl_dump_indent(aTHX_ level, file, " IV = %" IVdf, (IV)SvIVX(sv));
1781 (void)PerlIO_putc(file, '\n');
1784 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1785 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1786 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1787 || type == SVt_NV) {
1788 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1789 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1790 RESTORE_LC_NUMERIC_UNDERLYING();
1794 Perl_dump_indent(aTHX_ level, file, " RV = 0x%" UVxf "\n",
1797 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1800 if (type < SVt_PV) {
1805 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1806 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1807 const bool re = isREGEXP(sv);
1808 const char * const ptr =
1809 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1813 SvOOK_offset(sv, delta);
1814 Perl_dump_indent(aTHX_ level, file," OFFSET = %" UVuf "\n",
1819 Perl_dump_indent(aTHX_ level, file," PV = 0x%" UVxf " ",
1822 PerlIO_printf(file, "( %s . ) ",
1823 pv_display(d, ptr - delta, delta, 0,
1826 if (type == SVt_INVLIST) {
1827 PerlIO_printf(file, "\n");
1828 /* 4 blanks indents 2 beyond the PV, etc */
1829 _invlist_dump(file, level, " ", sv);
1832 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1835 if (SvUTF8(sv)) /* the 6? \x{....} */
1836 PerlIO_printf(file, " [UTF8 \"%s\"]",
1837 sv_uni_display(d, sv, 6 * SvCUR(sv),
1839 PerlIO_printf(file, "\n");
1841 Perl_dump_indent(aTHX_ level, file, " CUR = %" IVdf "\n", (IV)SvCUR(sv));
1842 if (re && type == SVt_PVLV)
1843 /* LV-as-REGEXP usurps len field to store pointer to
1845 Perl_dump_indent(aTHX_ level, file, " REGEXP = 0x%" UVxf "\n",
1846 PTR2UV(((XPV*)SvANY(sv))->xpv_len_u.xpvlenu_rx));
1848 Perl_dump_indent(aTHX_ level, file, " LEN = %" IVdf "\n",
1850 #ifdef PERL_COPY_ON_WRITE
1851 if (SvIsCOW(sv) && SvLEN(sv))
1852 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1857 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1860 if (type >= SVt_PVMG) {
1862 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1864 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1866 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1867 Perl_dump_indent(aTHX_ level, file, " USEFUL = %" IVdf "\n",
1872 /* Dump type-specific SV fields */
1876 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf,
1877 PTR2UV(AvARRAY(sv)));
1878 if (AvARRAY(sv) != AvALLOC(sv)) {
1879 PerlIO_printf(file, " (offset=%" IVdf ")\n",
1880 (IV)(AvARRAY(sv) - AvALLOC(sv)));
1881 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%" UVxf "\n",
1882 PTR2UV(AvALLOC(sv)));
1885 (void)PerlIO_putc(file, '\n');
1886 Perl_dump_indent(aTHX_ level, file, " FILL = %" IVdf "\n",
1888 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1891 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1892 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1893 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1894 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1895 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1897 SV **svp = AvARRAY(MUTABLE_AV(sv));
1899 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1902 SV* const elt = *svp;
1903 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %" IVdf "\n",
1905 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1912 struct xpvhv_aux *const aux = HvAUX(sv);
1913 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n",
1914 (UV)aux->xhv_aux_flags);
1916 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
1917 usedkeys = HvUSEDKEYS(MUTABLE_HV(sv));
1918 if (HvARRAY(sv) && usedkeys) {
1919 /* Show distribution of HEs in the ARRAY */
1921 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1924 U32 pow2 = 2, keys = usedkeys;
1925 NV theoret, sum = 0;
1927 PerlIO_printf(file, " (");
1928 Zero(freq, FREQ_MAX + 1, int);
1929 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1932 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1934 if (count > FREQ_MAX)
1940 for (i = 0; i <= max; i++) {
1942 PerlIO_printf(file, "%d%s:%d", i,
1943 (i == FREQ_MAX) ? "+" : "",
1946 PerlIO_printf(file, ", ");
1949 (void)PerlIO_putc(file, ')');
1950 /* The "quality" of a hash is defined as the total number of
1951 comparisons needed to access every element once, relative
1952 to the expected number needed for a random hash.
1954 The total number of comparisons is equal to the sum of
1955 the squares of the number of entries in each bucket.
1956 For a random hash of n keys into k buckets, the expected
1961 for (i = max; i > 0; i--) { /* Precision: count down. */
1962 sum += freq[i] * i * i;
1964 while ((keys = keys >> 1))
1967 theoret += theoret * (theoret-1)/pow2;
1968 (void)PerlIO_putc(file, '\n');
1969 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"
1970 NVff "%%", theoret/sum*100);
1972 (void)PerlIO_putc(file, '\n');
1973 Perl_dump_indent(aTHX_ level, file, " KEYS = %" IVdf "\n",
1977 HE **ents = HvARRAY(sv);
1980 HE *const *const last = ents + HvMAX(sv);
1981 count = last + 1 - ents;
1986 } while (++ents <= last);
1989 Perl_dump_indent(aTHX_ level, file, " FILL = %" UVuf "\n",
1992 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1995 Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n",
1996 (IV)HvRITER_get(sv));
1997 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n",
1998 PTR2UV(HvEITER_get(sv)));
1999 #ifdef PERL_HASH_RANDOMIZE_KEYS
2000 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%" UVxf,
2001 (UV)HvRAND_get(sv));
2002 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
2003 PerlIO_printf(file, " (LAST = 0x%" UVxf ")",
2004 (UV)HvLASTRAND_get(sv));
2007 (void)PerlIO_putc(file, '\n');
2010 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
2011 if (mg && mg->mg_obj) {
2012 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%" UVxf "\n", PTR2UV(mg->mg_obj));
2016 const char * const hvname = HvNAME_get(sv);
2018 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2019 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2020 generic_pv_escape( tmpsv, hvname,
2021 HvNAMELEN(sv), HvNAMEUTF8(sv)));
2026 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
2027 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
2028 if (HvAUX(sv)->xhv_name_count)
2029 Perl_dump_indent(aTHX_
2030 level, file, " NAMECOUNT = %" IVdf "\n",
2031 (IV)HvAUX(sv)->xhv_name_count
2033 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
2034 const I32 count = HvAUX(sv)->xhv_name_count;
2036 SV * const names = newSVpvs_flags("", SVs_TEMP);
2037 /* The starting point is the first element if count is
2038 positive and the second element if count is negative. */
2039 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2040 + (count < 0 ? 1 : 0);
2041 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
2042 + (count < 0 ? -count : count);
2043 while (hekp < endp) {
2045 SV *tmp = newSVpvs_flags("", SVs_TEMP);
2046 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
2047 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
2049 /* This should never happen. */
2050 sv_catpvs(names, ", (null)");
2054 Perl_dump_indent(aTHX_
2055 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
2059 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
2060 const char *const hvename = HvENAME_get(sv);
2061 Perl_dump_indent(aTHX_
2062 level, file, " ENAME = \"%s\"\n",
2063 generic_pv_escape(tmp, hvename,
2064 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
2068 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%" UVxf "\n",
2070 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
2074 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2075 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"
2077 generic_pv_escape( tmpsv, meta->mro_which->name,
2078 meta->mro_which->length,
2079 (meta->mro_which->kflags & HVhek_UTF8)),
2080 PTR2UV(meta->mro_which));
2081 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"
2083 (UV)meta->cache_gen);
2084 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%" UVxf "\n",
2086 if (meta->mro_linear_all) {
2087 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"
2089 PTR2UV(meta->mro_linear_all));
2090 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
2093 if (meta->mro_linear_current) {
2094 Perl_dump_indent(aTHX_ level, file,
2095 " MRO_LINEAR_CURRENT = 0x%" UVxf "\n",
2096 PTR2UV(meta->mro_linear_current));
2097 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
2100 if (meta->mro_nextmethod) {
2101 Perl_dump_indent(aTHX_ level, file,
2102 " MRO_NEXTMETHOD = 0x%" UVxf "\n",
2103 PTR2UV(meta->mro_nextmethod));
2104 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
2108 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%" UVxf "\n",
2110 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
2115 if (nest < maxnest) {
2116 HV * const hv = MUTABLE_HV(sv);
2121 int count = maxnest - nest;
2122 for (i=0; i <= HvMAX(hv); i++) {
2123 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2130 if (count-- <= 0) goto DONEHV;
2133 keysv = hv_iterkeysv(he);
2134 keypv = SvPV_const(keysv, len);
2137 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
2139 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2140 if (HvEITER_get(hv) == he)
2141 PerlIO_printf(file, "[CURRENT] ");
2142 PerlIO_printf(file, "HASH = 0x%" UVxf "\n", (UV) hash);
2143 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2150 } /* case SVt_PVHV */
2153 if (CvAUTOLOAD(sv)) {
2154 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2156 const char *const name = SvPV_const(sv, len);
2157 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
2158 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
2161 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2162 const char *const proto = CvPROTO(sv);
2163 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
2164 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
2169 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
2170 if (!CvISXSUB(sv)) {
2173 Perl_dump_indent(aTHX_ level, file,
2174 " SLAB = 0x%" UVxf "\n",
2175 PTR2UV(CvSTART(sv)));
2177 Perl_dump_indent(aTHX_ level, file,
2178 " START = 0x%" UVxf " ===> %" IVdf "\n",
2179 PTR2UV(CvSTART(sv)),
2180 (IV)sequence_num(CvSTART(sv)));
2182 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%" UVxf "\n",
2183 PTR2UV(CvROOT(sv)));
2184 if (CvROOT(sv) && dumpops) {
2185 do_op_dump(level+1, file, CvROOT(sv));
2188 SV * const constant = cv_const_sv((const CV *)sv);
2190 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%" UVxf "\n", PTR2UV(CvXSUB(sv)));
2193 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%" UVxf
2195 PTR2UV(CvXSUBANY(sv).any_ptr));
2196 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2199 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %" IVdf "\n",
2200 (IV)CvXSUBANY(sv).any_i32);
2204 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2205 HEK_KEY(CvNAME_HEK((CV *)sv)));
2206 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
2207 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
2208 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"
2209 IVdf "\n", (IV)CvDEPTH(sv));
2210 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n",
2212 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %" UVuf "\n", (UV)CvOUTSIDE_SEQ(sv));
2213 if (!CvISXSUB(sv)) {
2214 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%" UVxf "\n", PTR2UV(CvPADLIST(sv)));
2215 if (nest < maxnest) {
2216 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2220 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
2222 const CV * const outside = CvOUTSIDE(sv);
2223 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%" UVxf " (%s)\n",
2226 : CvANON(outside) ? "ANON"
2227 : (outside == PL_main_cv) ? "MAIN"
2228 : CvUNIQUE(outside) ? "UNIQUE"
2231 newSVpvs_flags("", SVs_TEMP),
2232 GvNAME(CvGV(outside)),
2233 GvNAMELEN(CvGV(outside)),
2234 GvNAMEUTF8(CvGV(outside)))
2238 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2239 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2244 if (type == SVt_PVLV) {
2245 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2246 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %" IVdf "\n", (IV)LvTARGOFF(sv));
2247 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %" IVdf "\n", (IV)LvTARGLEN(sv));
2248 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%" UVxf "\n", PTR2UV(LvTARG(sv)));
2249 Perl_dump_indent(aTHX_ level, file, " FLAGS = %" IVdf "\n", (IV)LvFLAGS(sv));
2250 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2251 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2254 if (isREGEXP(sv)) goto dumpregexp;
2255 if (!isGV_with_GP(sv))
2258 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2259 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2260 generic_pv_escape(tmpsv, GvNAME(sv),
2264 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %" IVdf "\n", (IV)GvNAMELEN(sv));
2265 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2266 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)GvFLAGS(sv));
2267 Perl_dump_indent(aTHX_ level, file, " GP = 0x%" UVxf "\n", PTR2UV(GvGP(sv)));
2270 Perl_dump_indent(aTHX_ level, file, " SV = 0x%" UVxf "\n", PTR2UV(GvSV(sv)));
2271 Perl_dump_indent(aTHX_ level, file, " REFCNT = %" IVdf "\n", (IV)GvREFCNT(sv));
2272 Perl_dump_indent(aTHX_ level, file, " IO = 0x%" UVxf "\n", PTR2UV(GvIOp(sv)));
2273 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%" UVxf " \n", PTR2UV(GvFORM(sv)));
2274 Perl_dump_indent(aTHX_ level, file, " AV = 0x%" UVxf "\n", PTR2UV(GvAV(sv)));
2275 Perl_dump_indent(aTHX_ level, file, " HV = 0x%" UVxf "\n", PTR2UV(GvHV(sv)));
2276 Perl_dump_indent(aTHX_ level, file, " CV = 0x%" UVxf "\n", PTR2UV(GvCV(sv)));
2277 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%" UVxf "\n", (UV)GvCVGEN(sv));
2278 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%" UVxf
2282 Perl_dump_indent(aTHX_ level, file, " LINE = %" IVdf "\n", (IV)GvLINE(sv));
2283 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2284 do_gv_dump (level, file, " EGV", GvEGV(sv));
2287 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%" UVxf "\n", PTR2UV(IoIFP(sv)));
2288 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%" UVxf "\n", PTR2UV(IoOFP(sv)));
2289 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%" UVxf "\n", PTR2UV(IoDIRP(sv)));
2290 Perl_dump_indent(aTHX_ level, file, " LINES = %" IVdf "\n", (IV)IoLINES(sv));
2291 Perl_dump_indent(aTHX_ level, file, " PAGE = %" IVdf "\n", (IV)IoPAGE(sv));
2292 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %" IVdf "\n", (IV)IoPAGE_LEN(sv));
2293 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %" IVdf "\n", (IV)IoLINES_LEFT(sv));
2295 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2296 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2297 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2299 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%" UVxf "\n",
2300 PTR2UV(IoTOP_GV(sv)));
2301 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2302 maxnest, dumpops, pvlim);
2304 /* Source filters hide things that are not GVs in these three, so let's
2305 be careful out there. */
2307 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2308 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2309 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2311 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%" UVxf "\n",
2312 PTR2UV(IoFMT_GV(sv)));
2313 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2314 maxnest, dumpops, pvlim);
2316 if (IoBOTTOM_NAME(sv))
2317 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2318 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2319 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2321 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%" UVxf "\n",
2322 PTR2UV(IoBOTTOM_GV(sv)));
2323 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2324 maxnest, dumpops, pvlim);
2326 if (isPRINT(IoTYPE(sv)))
2327 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2329 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2330 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)IoFLAGS(sv));
2335 struct regexp * const r = ReANY((REGEXP*)sv);
2337 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2339 append_flags(d, flags, names); \
2340 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2341 SvCUR_set(d, SvCUR(d) - 1); \
2342 SvPVX(d)[SvCUR(d)] = '\0'; \
2345 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2346 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%" UVxf " (%s)\n",
2347 (UV)(r->compflags), SvPVX_const(d));
2349 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2350 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%" UVxf " (%s)\n",
2351 (UV)(r->extflags), SvPVX_const(d));
2353 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%" UVxf " (%s)\n",
2354 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2355 if (r->engine == &PL_core_reg_engine) {
2356 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2357 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf " (%s)\n",
2358 (UV)(r->intflags), SvPVX_const(d));
2360 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "\n",
2363 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2364 Perl_dump_indent(aTHX_ level, file, " NPARENS = %" UVuf "\n",
2366 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %" UVuf "\n",
2367 (UV)(r->lastparen));
2368 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %" UVuf "\n",
2369 (UV)(r->lastcloseparen));
2370 Perl_dump_indent(aTHX_ level, file, " MINLEN = %" IVdf "\n",
2372 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %" IVdf "\n",
2373 (IV)(r->minlenret));
2374 Perl_dump_indent(aTHX_ level, file, " GOFS = %" UVuf "\n",
2376 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %" UVuf "\n",
2377 (UV)(r->pre_prefix));
2378 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %" IVdf "\n",
2380 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %" IVdf "\n",
2381 (IV)(r->suboffset));
2382 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %" IVdf "\n",
2383 (IV)(r->subcoffset));
2385 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%" UVxf " %s\n",
2387 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2389 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2390 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n",
2391 PTR2UV(r->mother_re));
2392 if (nest < maxnest && r->mother_re)
2393 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2394 maxnest, dumpops, pvlim);
2395 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%" UVxf "\n",
2396 PTR2UV(r->paren_names));
2397 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%" UVxf "\n",
2398 PTR2UV(r->substrs));
2399 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%" UVxf "\n",
2400 PTR2UV(r->pprivate));
2401 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%" UVxf "\n",
2403 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%" UVxf "\n",
2404 PTR2UV(r->qr_anoncv));
2406 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%" UVxf "\n",
2407 PTR2UV(r->saved_copy));
2418 Dumps the contents of an SV to the C<STDERR> filehandle.
2420 For an example of its output, see L<Devel::Peek>.
2426 Perl_sv_dump(pTHX_ SV *sv)
2428 if (sv && SvROK(sv))
2429 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2431 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2435 Perl_runops_debug(pTHX)
2437 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2438 SSize_t orig_stack_hwm = PL_curstackinfo->si_stack_hwm;
2440 PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2444 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2447 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2449 #ifdef PERL_TRACE_OPS
2450 ++PL_op_exec_cnt[PL_op->op_type];
2452 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2453 if (PL_curstackinfo->si_stack_hwm < PL_stack_sp - PL_stack_base)
2454 Perl_croak_nocontext(
2455 "panic: previous op failed to extend arg stack: "
2456 "base=%p, sp=%p, hwm=%p\n",
2457 PL_stack_base, PL_stack_sp,
2458 PL_stack_base + PL_curstackinfo->si_stack_hwm);
2459 PL_curstackinfo->si_stack_hwm = PL_stack_sp - PL_stack_base;
2464 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2465 PerlIO_printf(Perl_debug_log,
2466 "WARNING: %" UVxf " changed from %" UVxf " to %" UVxf "\n",
2467 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2468 PTR2UV(*PL_watchaddr));
2469 if (DEBUG_s_TEST_) {
2470 if (DEBUG_v_TEST_) {
2471 PerlIO_printf(Perl_debug_log, "\n");
2479 if (DEBUG_t_TEST_) debop(PL_op);
2480 if (DEBUG_P_TEST_) debprof(PL_op);
2485 PERL_DTRACE_PROBE_OP(PL_op);
2486 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2487 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2490 #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY
2491 if (PL_curstackinfo->si_stack_hwm < orig_stack_hwm)
2492 PL_curstackinfo->si_stack_hwm = orig_stack_hwm;
2499 /* print the names of the n lexical vars starting at pad offset off */
2502 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2505 CV * const cv = deb_curcv(cxstack_ix);
2506 PADNAMELIST *comppad = NULL;
2510 PADLIST * const padlist = CvPADLIST(cv);
2511 comppad = PadlistNAMES(padlist);
2514 PerlIO_printf(Perl_debug_log, "(");
2515 for (i = 0; i < n; i++) {
2516 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2517 PerlIO_printf(Perl_debug_log, "%" PNf, PNfARG(sv));
2519 PerlIO_printf(Perl_debug_log, "[%" UVuf "]",
2522 PerlIO_printf(Perl_debug_log, ",");
2525 PerlIO_printf(Perl_debug_log, ")");
2529 /* append to the out SV, the name of the lexical at offset off in the CV
2533 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2534 bool paren, bool is_scalar)
2537 PADNAMELIST *namepad = NULL;
2541 PADLIST * const padlist = CvPADLIST(cv);
2542 namepad = PadlistNAMES(padlist);
2546 sv_catpvs_nomg(out, "(");
2547 for (i = 0; i < n; i++) {
2548 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2550 STRLEN cur = SvCUR(out);
2551 Perl_sv_catpvf(aTHX_ out, "[%" UTF8f,
2552 UTF8fARG(1, PadnameLEN(sv) - 1,
2553 PadnamePV(sv) + 1));
2555 SvPVX(out)[cur] = '$';
2558 Perl_sv_catpvf(aTHX_ out, "[%" UVuf "]", (UV)(off+i));
2560 sv_catpvs_nomg(out, ",");
2563 sv_catpvs_nomg(out, "(");
2568 S_append_gv_name(pTHX_ GV *gv, SV *out)
2572 sv_catpvs_nomg(out, "<NULLGV>");
2576 gv_fullname4(sv, gv, NULL, FALSE);
2577 Perl_sv_catpvf(aTHX_ out, "$%" SVf, SVfARG(sv));
2578 SvREFCNT_dec_NN(sv);
2582 # define ITEM_SV(item) (comppad ? \
2583 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2585 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2589 /* return a temporary SV containing a stringified representation of
2590 * the op_aux field of a MULTIDEREF op, associated with CV cv
2594 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2596 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2597 UV actions = items->uv;
2600 bool is_hash = FALSE;
2602 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2607 PADLIST *padlist = CvPADLIST(cv);
2608 comppad = PadlistARRAY(padlist)[1];
2614 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2617 switch (actions & MDEREF_ACTION_MASK) {
2620 actions = (++items)->uv;
2622 NOT_REACHED; /* NOTREACHED */
2624 case MDEREF_HV_padhv_helem:
2627 case MDEREF_AV_padav_aelem:
2629 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2631 NOT_REACHED; /* NOTREACHED */
2633 case MDEREF_HV_gvhv_helem:
2636 case MDEREF_AV_gvav_aelem:
2639 sv = ITEM_SV(items);
2640 S_append_gv_name(aTHX_ (GV*)sv, out);
2642 NOT_REACHED; /* NOTREACHED */
2644 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2647 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2649 sv = ITEM_SV(items);
2650 S_append_gv_name(aTHX_ (GV*)sv, out);
2651 goto do_vivify_rv2xv_elem;
2652 NOT_REACHED; /* NOTREACHED */
2654 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2657 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2658 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2659 goto do_vivify_rv2xv_elem;
2660 NOT_REACHED; /* NOTREACHED */
2662 case MDEREF_HV_pop_rv2hv_helem:
2663 case MDEREF_HV_vivify_rv2hv_helem:
2666 do_vivify_rv2xv_elem:
2667 case MDEREF_AV_pop_rv2av_aelem:
2668 case MDEREF_AV_vivify_rv2av_aelem:
2670 sv_catpvs_nomg(out, "->");
2672 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2673 sv_catpvs_nomg(out, "->");
2678 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2679 switch (actions & MDEREF_INDEX_MASK) {
2680 case MDEREF_INDEX_const:
2683 sv = ITEM_SV(items);
2685 sv_catpvs_nomg(out, "???");
2690 pv_pretty(out, s, cur, 30,
2692 (PERL_PV_PRETTY_NOCLEAR
2693 |PERL_PV_PRETTY_QUOTE
2694 |PERL_PV_PRETTY_ELLIPSES));
2698 Perl_sv_catpvf(aTHX_ out, "%" IVdf, (++items)->iv);
2700 case MDEREF_INDEX_padsv:
2701 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2703 case MDEREF_INDEX_gvsv:
2705 sv = ITEM_SV(items);
2706 S_append_gv_name(aTHX_ (GV*)sv, out);
2709 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2711 if (actions & MDEREF_FLAG_last)
2718 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2719 (int)(actions & MDEREF_ACTION_MASK));
2725 actions >>= MDEREF_SHIFT;
2732 Perl_debop(pTHX_ const OP *o)
2734 PERL_ARGS_ASSERT_DEBOP;
2736 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2739 Perl_deb(aTHX_ "%s", OP_NAME(o));
2740 switch (o->op_type) {
2743 /* With ITHREADS, consts are stored in the pad, and the right pad
2744 * may not be active here, so check.
2745 * Looks like only during compiling the pads are illegal.
2748 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2750 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2754 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2755 SVfARG(S_gv_display(aTHX_ cGVOPo_gv)));
2762 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2766 S_deb_padvar(aTHX_ o->op_targ,
2767 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2771 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2772 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2778 PerlIO_printf(Perl_debug_log, "\n");
2784 =for apidoc op_class
2786 Given an op, determine what type of struct it has been allocated as.
2787 Returns one of the OPclass enums, such as OPclass_LISTOP.
2794 Perl_op_class(pTHX_ const OP *o)
2799 return OPclass_NULL;
2801 if (o->op_type == 0) {
2802 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
2804 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2807 if (o->op_type == OP_SASSIGN)
2808 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPclass_UNOP : OPclass_BINOP);
2810 if (o->op_type == OP_AELEMFAST) {
2812 return OPclass_PADOP;
2814 return OPclass_SVOP;
2819 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
2820 o->op_type == OP_RCATLINE)
2821 return OPclass_PADOP;
2824 if (o->op_type == OP_CUSTOM)
2827 switch (OP_CLASS(o)) {
2829 return OPclass_BASEOP;
2832 return OPclass_UNOP;
2835 return OPclass_BINOP;
2838 return OPclass_LOGOP;
2841 return OPclass_LISTOP;
2844 return OPclass_PMOP;
2847 return OPclass_SVOP;
2850 return OPclass_PADOP;
2852 case OA_PVOP_OR_SVOP:
2854 * Character translations (tr///) are usually a PVOP, keeping a
2855 * pointer to a table of shorts used to look up translations.
2856 * Under utf8, however, a simple table isn't practical; instead,
2857 * the OP is an SVOP (or, under threads, a PADOP),
2858 * and the SV is a reference to a swash
2859 * (i.e., an RV pointing to an HV).
2862 (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
2864 #if defined(USE_ITHREADS)
2865 ? OPclass_PADOP : OPclass_PVOP;
2867 ? OPclass_SVOP : OPclass_PVOP;
2871 return OPclass_LOOP;
2876 case OA_BASEOP_OR_UNOP:
2878 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
2879 * whether parens were seen. perly.y uses OPf_SPECIAL to
2880 * signal whether a BASEOP had empty parens or none.
2881 * Some other UNOPs are created later, though, so the best
2882 * test is OPf_KIDS, which is set in newUNOP.
2884 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2888 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
2889 * the OPf_REF flag to distinguish between OP types instead of the
2890 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
2891 * return OPclass_UNOP so that walkoptree can find our children. If
2892 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
2893 * (no argument to the operator) it's an OP; with OPf_REF set it's
2894 * an SVOP (and op_sv is the GV for the filehandle argument).
2896 return ((o->op_flags & OPf_KIDS) ? OPclass_UNOP :
2898 (o->op_flags & OPf_REF) ? OPclass_PADOP : OPclass_BASEOP);
2900 (o->op_flags & OPf_REF) ? OPclass_SVOP : OPclass_BASEOP);
2904 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
2905 * label was omitted (in which case it's a BASEOP) or else a term was
2906 * seen. In this last case, all except goto are definitely PVOP but
2907 * goto is either a PVOP (with an ordinary constant label), an UNOP
2908 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
2909 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
2912 if (o->op_flags & OPf_STACKED)
2913 return OPclass_UNOP;
2914 else if (o->op_flags & OPf_SPECIAL)
2915 return OPclass_BASEOP;
2917 return OPclass_PVOP;
2919 return OPclass_METHOP;
2921 return OPclass_UNOP_AUX;
2923 Perl_warn(aTHX_ "Can't determine class of operator %s, assuming BASEOP\n",
2925 return OPclass_BASEOP;
2931 S_deb_curcv(pTHX_ I32 ix)
2933 PERL_SI *si = PL_curstackinfo;
2934 for (; ix >=0; ix--) {
2935 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2937 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2938 return cx->blk_sub.cv;
2939 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2940 return cx->blk_eval.cv;
2941 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2943 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2944 && si->si_type == PERLSI_SORT)
2946 /* fake sort sub; use CV of caller */
2948 ix = si->si_cxix + 1;
2955 Perl_watch(pTHX_ char **addr)
2957 PERL_ARGS_ASSERT_WATCH;
2959 PL_watchaddr = addr;
2961 PerlIO_printf(Perl_debug_log, "WATCHING, %" UVxf " is currently %" UVxf "\n",
2962 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2966 S_debprof(pTHX_ const OP *o)
2968 PERL_ARGS_ASSERT_DEBPROF;
2970 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2972 if (!PL_profiledata)
2973 Newxz(PL_profiledata, MAXO, U32);
2974 ++PL_profiledata[o->op_type];
2978 Perl_debprofdump(pTHX)
2981 if (!PL_profiledata)
2983 for (i = 0; i < MAXO; i++) {
2984 if (PL_profiledata[i])
2985 PerlIO_printf(Perl_debug_log,
2986 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2993 * ex: set ts=8 sts=4 sw=4 et: