3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * 'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and
13 * it has not been hard for me to read your mind and memory.'
15 * [p.220 of _The Lord of the Rings_, II/i: "Many Meetings"]
18 /* This file contains utility routines to dump the contents of SV and OP
19 * structures, as used by command-line options like -Dt and -Dx, and
22 * It also holds the debugging version of the runops function.
24 =head1 Display and Dump functions
28 #define PERL_IN_DUMP_C
32 static const char* const svtypenames[SVt_LAST] = {
52 static const char* const svshorttypenames[SVt_LAST] = {
77 S_append_flags(pTHX_ SV *sv, U32 flags, const struct flag_to_name *start,
78 const struct flag_to_name *const end)
81 if (flags & start->flag)
82 sv_catpv(sv, start->name);
83 } while (++start < end);
86 #define append_flags(sv, f, flags) \
87 S_append_flags(aTHX_ (sv), (f), (flags), C_ARRAY_END(flags))
89 #define generic_pv_escape(sv,s,len,utf8) pv_escape( (sv), (s), (len), \
90 (len) * (4+UTF8_MAXBYTES) + 1, NULL, \
91 PERL_PV_ESCAPE_NONASCII | PERL_PV_ESCAPE_DWIM \
92 | ((utf8) ? PERL_PV_ESCAPE_UNI : 0) )
97 Escapes at most the first C<count> chars of C<pv> and puts the results into
98 C<dsv> such that the size of the escaped string will not exceed C<max> chars
99 and will not contain any incomplete escape sequences. The number of bytes
100 escaped will be returned in the C<STRLEN *escaped> parameter if it is not null.
101 When the C<dsv> parameter is null no escaping actually occurs, but the number
102 of bytes that would be escaped were it not null will be calculated.
104 If flags contains C<PERL_PV_ESCAPE_QUOTE> then any double quotes in the string
105 will also be escaped.
107 Normally the SV will be cleared before the escaped string is prepared,
108 but when C<PERL_PV_ESCAPE_NOCLEAR> is set this will not occur.
110 If C<PERL_PV_ESCAPE_UNI> is set then the input string is treated as UTF-8
111 if C<PERL_PV_ESCAPE_UNI_DETECT> is set then the input string is scanned
112 using C<is_utf8_string()> to determine if it is UTF-8.
114 If C<PERL_PV_ESCAPE_ALL> is set then all input chars will be output
115 using C<\x01F1> style escapes, otherwise if C<PERL_PV_ESCAPE_NONASCII> is set, only
116 non-ASCII chars will be escaped using this style; otherwise, only chars above
117 255 will be so escaped; other non printable chars will use octal or
118 common escaped patterns like C<\n>.
119 Otherwise, if C<PERL_PV_ESCAPE_NOBACKSLASH>
120 then all chars below 255 will be treated as printable and
121 will be output as literals.
123 If C<PERL_PV_ESCAPE_FIRSTCHAR> is set then only the first char of the
124 string will be escaped, regardless of max. If the output is to be in hex,
125 then it will be returned as a plain hex
126 sequence. Thus the output will either be a single char,
127 an octal escape sequence, a special escape like C<\n> or a hex value.
129 If C<PERL_PV_ESCAPE_RE> is set then the escape char used will be a C<"%"> and
130 not a C<"\\">. This is because regexes very often contain backslashed
131 sequences, whereas C<"%"> is not a particularly common character in patterns.
133 Returns a pointer to the escaped text as held by C<dsv>.
137 #define PV_ESCAPE_OCTBUFSIZE 32
140 Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
141 const STRLEN count, const STRLEN max,
142 STRLEN * const escaped, const U32 flags )
144 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
145 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
146 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
147 STRLEN wrote = 0; /* chars written so far */
148 STRLEN chsize = 0; /* size of data to be written */
149 STRLEN readsize = 1; /* size of data just read */
150 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
151 const char *pv = str;
152 const char * const end = pv + count; /* end of string */
155 PERL_ARGS_ASSERT_PV_ESCAPE;
157 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
158 /* This won't alter the UTF-8 flag */
162 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
165 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
166 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
167 const U8 c = (U8)u & 0xFF;
170 || (flags & PERL_PV_ESCAPE_ALL)
171 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
173 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
174 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
177 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
178 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
180 : "%cx{%02" UVxf "}", esc, u);
182 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
185 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
189 case '\\' : /* FALLTHROUGH */
190 case '%' : if ( c == esc ) {
196 case '\v' : octbuf[1] = 'v'; break;
197 case '\t' : octbuf[1] = 't'; break;
198 case '\r' : octbuf[1] = 'r'; break;
199 case '\n' : octbuf[1] = 'n'; break;
200 case '\f' : octbuf[1] = 'f'; break;
208 if ( (flags & PERL_PV_ESCAPE_DWIM) && c != '\0' ) {
209 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
210 isuni ? "%cx{%02" UVxf "}" : "%cx%02" UVxf,
213 else if ((pv+readsize < end) && isDIGIT((U8)*(pv+readsize)))
214 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
217 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
224 if ( max && (wrote + chsize > max) ) {
226 } else if (chsize > 1) {
228 sv_catpvn(dsv, octbuf, chsize);
231 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes
232 can be appended raw to the dsv. If dsv happens to be
233 UTF-8 then we need catpvf to upgrade them for us.
234 Or add a new API call sv_catpvc(). Think about that name, and
235 how to keep it clear that it's unlike the s of catpvs, which is
236 really an array of octets, not a string. */
238 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
241 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
246 return dsv ? SvPVX(dsv) : NULL;
249 =for apidoc pv_pretty
251 Converts a string into something presentable, handling escaping via
252 C<pv_escape()> and supporting quoting and ellipses.
254 If the C<PERL_PV_PRETTY_QUOTE> flag is set then the result will be
255 double quoted with any double quotes in the string escaped. Otherwise
256 if the C<PERL_PV_PRETTY_LTGT> flag is set then the result be wrapped in
259 If the C<PERL_PV_PRETTY_ELLIPSES> flag is set and not all characters in
260 string were output then an ellipsis C<...> will be appended to the
261 string. Note that this happens AFTER it has been quoted.
263 If C<start_color> is non-null then it will be inserted after the opening
264 quote (if there is one) but before the escaped text. If C<end_color>
265 is non-null then it will be inserted after the escaped text but before
266 any quotes or ellipses.
268 Returns a pointer to the prettified text as held by C<dsv>.
274 Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
275 const STRLEN max, char const * const start_color, char const * const end_color,
278 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
279 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
281 STRLEN max_adjust= 0;
284 PERL_ARGS_ASSERT_PV_PRETTY;
286 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
287 /* This won't alter the UTF-8 flag */
290 orig_cur= SvCUR(dsv);
293 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
295 if ( start_color != NULL )
296 sv_catpv(dsv, start_color);
298 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
301 assert(max > max_adjust);
302 pv_escape( NULL, str, count, max - max_adjust, &escaped, flags );
303 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
305 assert(max > max_adjust);
308 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
310 if ( end_color != NULL )
311 sv_catpv(dsv, end_color);
314 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
316 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
317 sv_catpvs(dsv, "...");
319 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
320 while( SvCUR(dsv) - orig_cur < max )
328 =for apidoc pv_display
332 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
334 except that an additional "\0" will be appended to the string when
335 len > cur and pv[cur] is "\0".
337 Note that the final string may be up to 7 chars longer than pvlim.
343 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
345 PERL_ARGS_ASSERT_PV_DISPLAY;
347 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
348 if (len > cur && pv[cur] == '\0')
349 sv_catpvs( dsv, "\\0");
354 Perl_sv_peek(pTHX_ SV *sv)
357 SV * const t = sv_newmortal();
367 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
368 /* detect data corruption under memory poisoning */
372 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
373 if (sv == &PL_sv_undef) {
374 sv_catpv(t, "SV_UNDEF");
375 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
376 SVs_GMG|SVs_SMG|SVs_RMG)) &&
380 else if (sv == &PL_sv_no) {
381 sv_catpv(t, "SV_NO");
382 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
383 SVs_GMG|SVs_SMG|SVs_RMG)) &&
384 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
390 else if (sv == &PL_sv_yes) {
391 sv_catpv(t, "SV_YES");
392 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
393 SVs_GMG|SVs_SMG|SVs_RMG)) &&
394 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
397 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
402 sv_catpv(t, "SV_PLACEHOLDER");
403 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
404 SVs_GMG|SVs_SMG|SVs_RMG)) &&
410 else if (SvREFCNT(sv) == 0) {
414 else if (DEBUG_R_TEST_) {
417 /* is this SV on the tmps stack? */
418 for (ix=PL_tmps_ix; ix>=0; ix--) {
419 if (PL_tmps_stack[ix] == sv) {
424 if (is_tmp || SvREFCNT(sv) > 1) {
425 Perl_sv_catpvf(aTHX_ t, "<");
426 if (SvREFCNT(sv) > 1)
427 Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv));
429 Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t");
430 Perl_sv_catpvf(aTHX_ t, ">");
436 if (SvCUR(t) + unref > 10) {
437 SvCUR_set(t, unref + 3);
446 if (type == SVt_PVCV) {
447 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
449 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
450 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
453 } else if (type < SVt_LAST) {
454 sv_catpv(t, svshorttypenames[type]);
456 if (type == SVt_NULL)
459 sv_catpv(t, "FREED");
464 if (!SvPVX_const(sv))
465 sv_catpv(t, "(null)");
467 SV * const tmp = newSVpvs("");
471 SvOOK_offset(sv, delta);
472 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
474 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
476 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
477 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
479 SvREFCNT_dec_NN(tmp);
482 else if (SvNOKp(sv)) {
483 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
484 Perl_sv_catpvf(aTHX_ t, "(%" NVgf ")",SvNVX(sv));
485 RESTORE_LC_NUMERIC_UNDERLYING();
487 else if (SvIOKp(sv)) {
489 Perl_sv_catpvf(aTHX_ t, "(%" UVuf ")", (UV)SvUVX(sv));
491 Perl_sv_catpvf(aTHX_ t, "(%" IVdf ")", (IV)SvIVX(sv));
499 if (TAINTING_get && sv && SvTAINTED(sv))
500 sv_catpv(t, " [tainted]");
501 return SvPV_nolen(t);
505 =head1 Debugging Utilities
509 Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
512 PERL_ARGS_ASSERT_DUMP_INDENT;
514 dump_vindent(level, file, pat, &args);
519 Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
521 PERL_ARGS_ASSERT_DUMP_VINDENT;
522 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
523 PerlIO_vprintf(file, pat, *args);
527 /* Like Perl_dump_indent(), but specifically for ops: adds a vertical bar
528 * for each indent level as appropriate.
530 * bar contains bits indicating which indent columns should have a
531 * vertical bar displayed. Bit 0 is the RH-most column. If there are more
532 * levels than bits in bar, then the first few indents are displayed
535 * The start of a new op is signalled by passing a value for level which
536 * has been negated and offset by 1 (so that level 0 is passed as -1 and
537 * can thus be distinguished from -0); in this case, emit a suitably
538 * indented blank line, then on the next line, display the op's sequence
539 * number, and make the final indent an '+----'.
543 * | FOO # level = 1, bar = 0b1
544 * | | # level =-2-1, bar = 0b11
546 * | BAZ # level = 2, bar = 0b10
550 S_opdump_indent(pTHX_ const OP *o, I32 level, UV bar, PerlIO *file,
551 const char* pat, ...)
555 bool newop = (level < 0);
559 /* start displaying a new op? */
561 UV seq = sequence_num(o);
565 /* output preceding blank line */
566 PerlIO_puts(file, " ");
567 for (i = level-1; i >= 0; i--)
568 PerlIO_puts(file, i == 0 || (bar & (1 << i)) ? "| " : " ");
569 PerlIO_puts(file, "\n");
571 /* output sequence number */
573 PerlIO_printf(file, "%-4" UVuf " ", seq);
575 PerlIO_puts(file, "???? ");
579 PerlIO_printf(file, " ");
581 for (i = level-1; i >= 0; i--)
583 (i == 0 && newop) ? "+--"
584 : (bar & (1 << i)) ? "| "
586 PerlIO_vprintf(file, pat, args);
591 /* display a link field (e.g. op_next) in the format
592 * ====> sequence_number [opname 0x123456]
596 S_opdump_link(pTHX_ const OP *o, PerlIO *file)
598 PerlIO_puts(file, " ===> ");
600 PerlIO_printf(file, "%" UVuf " [%s 0x%" UVxf "]\n",
601 sequence_num(o), OP_NAME(o), PTR2UV(o));
603 PerlIO_puts(file, "[0x0]\n");
609 Dumps the entire optree of the current program starting at C<PL_main_root> to
610 C<STDERR>. Also dumps the optrees for all visible subroutines in
619 dump_all_perl(FALSE);
623 Perl_dump_all_perl(pTHX_ bool justperl)
625 PerlIO_setlinebuf(Perl_debug_log);
627 op_dump(PL_main_root);
628 dump_packsubs_perl(PL_defstash, justperl);
632 =for apidoc dump_packsubs
634 Dumps the optrees for all visible subroutines in C<stash>.
640 Perl_dump_packsubs(pTHX_ const HV *stash)
642 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
643 dump_packsubs_perl(stash, FALSE);
647 Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
651 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
655 for (i = 0; i <= (I32) HvMAX(stash); i++) {
657 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
658 GV * gv = (GV *)HeVAL(entry);
659 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
660 /* unfake a fake GV */
661 (void)CvGV(SvRV(gv));
662 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
665 dump_sub_perl(gv, justperl);
668 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
669 const HV * const hv = GvHV(gv);
670 if (hv && (hv != PL_defstash))
671 dump_packsubs_perl(hv, justperl); /* nested package */
678 Perl_dump_sub(pTHX_ const GV *gv)
680 PERL_ARGS_ASSERT_DUMP_SUB;
681 dump_sub_perl(gv, FALSE);
685 Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
688 SV * const sv = newSVpvs_flags("", SVs_TEMP);
692 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
694 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
697 tmpsv = newSVpvs_flags("", SVs_TEMP);
698 gv_fullname3(sv, gv, NULL);
699 name = SvPV_const(sv, len);
700 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
701 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
702 if (CvISXSUB(GvCV(gv)))
703 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%" UVxf " %d)\n",
704 PTR2UV(CvXSUB(GvCV(gv))),
705 (int)CvXSUBANY(GvCV(gv)).any_i32);
706 else if (CvROOT(GvCV(gv)))
707 op_dump(CvROOT(GvCV(gv)));
709 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
713 Perl_dump_form(pTHX_ const GV *gv)
715 SV * const sv = sv_newmortal();
717 PERL_ARGS_ASSERT_DUMP_FORM;
719 gv_fullname3(sv, gv, NULL);
720 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
721 if (CvROOT(GvFORM(gv)))
722 op_dump(CvROOT(GvFORM(gv)));
724 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
730 op_dump(PL_eval_root);
736 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o);
740 S_do_pmop_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const PMOP *pm)
748 kidbar = ((bar << 1) | cBOOL(pm->op_flags & OPf_KIDS)) << 1;
750 if (pm->op_pmflags & PMf_ONCE)
756 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE %c%.*s%c\n",
757 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch);
759 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_PRE (RUNTIME)\n");
761 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
762 SV * const tmpsv = pm_description(pm);
763 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMFLAGS = (%s)\n",
764 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
765 SvREFCNT_dec_NN(tmpsv);
768 if (pm->op_type == OP_SPLIT)
769 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
770 "TARGOFF/GV = 0x%" UVxf "\n",
771 PTR2UV(pm->op_pmreplrootu.op_pmtargetgv));
773 if (pm->op_pmreplrootu.op_pmreplroot) {
774 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "PMf_REPL =\n");
775 S_do_op_dump_bar(aTHX_ level + 2,
776 (kidbar|cBOOL(OpHAS_SIBLING(pm->op_pmreplrootu.op_pmreplroot))),
777 file, pm->op_pmreplrootu.op_pmreplroot);
781 if (pm->op_code_list) {
782 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
783 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file, "CODE_LIST =\n");
784 S_do_op_dump_bar(aTHX_ level + 2,
785 (kidbar | cBOOL(OpHAS_SIBLING(pm->op_code_list))),
786 file, pm->op_code_list);
789 S_opdump_indent(aTHX_ (OP*)pm, level, bar, file,
790 "CODE_LIST = 0x%" UVxf "\n", PTR2UV(pm->op_code_list));
796 Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
798 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
799 S_do_pmop_dump_bar(aTHX_ level, 0, file, pm);
803 const struct flag_to_name pmflags_flags_names[] = {
804 {PMf_CONST, ",CONST"},
806 {PMf_GLOBAL, ",GLOBAL"},
807 {PMf_CONTINUE, ",CONTINUE"},
808 {PMf_RETAINT, ",RETAINT"},
810 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
811 {PMf_HAS_CV, ",HAS_CV"},
812 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
813 {PMf_IS_QR, ",IS_QR"}
817 S_pm_description(pTHX_ const PMOP *pm)
819 SV * const desc = newSVpvs("");
820 const REGEXP * const regex = PM_GETRE(pm);
821 const U32 pmflags = pm->op_pmflags;
823 PERL_ARGS_ASSERT_PM_DESCRIPTION;
825 if (pmflags & PMf_ONCE)
826 sv_catpv(desc, ",ONCE");
828 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
829 sv_catpv(desc, ":USED");
831 if (pmflags & PMf_USED)
832 sv_catpv(desc, ":USED");
836 if (RX_ISTAINTED(regex))
837 sv_catpv(desc, ",TAINTED");
838 if (RX_CHECK_SUBSTR(regex)) {
839 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
840 sv_catpv(desc, ",SCANFIRST");
841 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
842 sv_catpv(desc, ",ALL");
844 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
845 sv_catpv(desc, ",SKIPWHITE");
848 append_flags(desc, pmflags, pmflags_flags_names);
853 Perl_pmop_dump(pTHX_ PMOP *pm)
855 do_pmop_dump(0, Perl_debug_log, pm);
858 /* Return a unique integer to represent the address of op o.
859 * If it already exists in PL_op_sequence, just return it;
861 * *** Note that this isn't thread-safe */
864 S_sequence_num(pTHX_ const OP *o)
873 op = newSVuv(PTR2UV(o));
875 key = SvPV_const(op, len);
877 PL_op_sequence = newHV();
878 seq = hv_fetch(PL_op_sequence, key, len, 0);
881 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
889 const struct flag_to_name op_flags_names[] = {
891 {OPf_PARENS, ",PARENS"},
894 {OPf_STACKED, ",STACKED"},
895 {OPf_SPECIAL, ",SPECIAL"}
899 /* indexed by enum OPclass */
900 const char * op_class_names[] = {
918 /* dump an op and any children. level indicates the initial indent.
919 * The bits of bar indicate which indents should receive a vertical bar.
920 * For example if level == 5 and bar == 0b01101, then the indent prefix
921 * emitted will be (not including the <>'s):
924 * 55554444333322221111
926 * For heavily nested output, the level may exceed the number of bits
927 * in bar; in this case the first few columns in the output will simply
928 * not have a bar, which is harmless.
932 S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o)
934 const OPCODE optype = o->op_type;
936 PERL_ARGS_ASSERT_DO_OP_DUMP;
938 /* print op header line */
940 S_opdump_indent(aTHX_ o, -level-1, bar, file, "%s", OP_NAME(o));
942 if (optype == OP_NULL && o->op_targ)
943 PerlIO_printf(file, " (ex-%s)",PL_op_name[o->op_targ]);
945 PerlIO_printf(file, " %s(0x%" UVxf ")",
946 op_class_names[op_class(o)], PTR2UV(o));
947 S_opdump_link(aTHX_ o->op_next, file);
949 /* print op common fields */
951 if (o->op_targ && optype != OP_NULL)
952 S_opdump_indent(aTHX_ o, level, bar, file, "TARG = %ld\n",
955 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
956 SV * const tmpsv = newSVpvs("");
957 switch (o->op_flags & OPf_WANT) {
959 sv_catpv(tmpsv, ",VOID");
961 case OPf_WANT_SCALAR:
962 sv_catpv(tmpsv, ",SCALAR");
965 sv_catpv(tmpsv, ",LIST");
968 sv_catpv(tmpsv, ",UNKNOWN");
971 append_flags(tmpsv, o->op_flags, op_flags_names);
972 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
973 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
974 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
975 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
976 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
977 S_opdump_indent(aTHX_ o, level, bar, file, "FLAGS = (%s)\n",
978 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
982 U16 oppriv = o->op_private;
983 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
988 tmpsv = newSVpvs("");
989 for (; !stop; op_ix++) {
990 U16 entry = PL_op_private_bitdefs[op_ix];
991 U16 bit = (entry >> 2) & 7;
998 I16 const *p = &PL_op_private_bitfields[ix];
999 U16 bitmin = (U16) *p++;
1006 for (i = bitmin; i<= bit; i++)
1009 val = (oppriv & mask);
1012 && PL_op_private_labels[label] == '-'
1013 && PL_op_private_labels[label+1] == '\0'
1015 /* display as raw number */
1028 if (val == 0 && enum_label == -1)
1029 /* don't display anonymous zero values */
1032 sv_catpv(tmpsv, ",");
1034 sv_catpv(tmpsv, &PL_op_private_labels[label]);
1035 sv_catpv(tmpsv, "=");
1037 if (enum_label == -1)
1038 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)val);
1040 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
1045 if ( oppriv & (1<<bit)
1046 && !(PL_op_private_labels[ix] == '-'
1047 && PL_op_private_labels[ix+1] == '\0'))
1050 sv_catpv(tmpsv, ",");
1051 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
1056 sv_catpv(tmpsv, ",");
1057 Perl_sv_catpvf(aTHX_ tmpsv, "0x%" UVxf, (UV)oppriv);
1060 if (tmpsv && SvCUR(tmpsv)) {
1061 S_opdump_indent(aTHX_ o, level, bar, file, "PRIVATE = (%s)\n",
1062 SvPVX_const(tmpsv) + 1);
1064 S_opdump_indent(aTHX_ o, level, bar, file,
1065 "PRIVATE = (0x%" UVxf ")\n", (UV)oppriv);
1073 S_opdump_indent(aTHX_ o, level, bar, file,
1074 "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
1076 if (cSVOPo->op_sv) {
1079 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1080 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
1082 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
1083 name = SvPV_const(tmpsv, len);
1084 S_opdump_indent(aTHX_ o, level, bar, file, "GV = %s\n",
1085 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
1088 S_opdump_indent(aTHX_ o, level, bar, file, "GV = NULL\n");
1094 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
1095 UV i, count = items[-1].uv;
1097 S_opdump_indent(aTHX_ o, level, bar, file, "ARGS = \n");
1098 for (i=0; i < count; i++)
1099 S_opdump_indent(aTHX_ o, level+1, (bar << 1), file,
1100 "%" UVuf " => 0x%" UVxf "\n",
1107 case OP_METHOD_NAMED:
1108 case OP_METHOD_SUPER:
1109 case OP_METHOD_REDIR:
1110 case OP_METHOD_REDIR_SUPER:
1111 #ifndef USE_ITHREADS
1112 /* with ITHREADS, consts are stored in the pad, and the right pad
1113 * may not be active here, so skip */
1114 S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n",
1115 SvPEEK(cMETHOPx_meth(o)));
1119 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1125 S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n",
1126 (UV)CopLINE(cCOPo));
1128 if (CopSTASHPV(cCOPo)) {
1129 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1130 HV *stash = CopSTASH(cCOPo);
1131 const char * const hvname = HvNAME_get(stash);
1133 S_opdump_indent(aTHX_ o, level, bar, file, "PACKAGE = \"%s\"\n",
1134 generic_pv_escape(tmpsv, hvname,
1135 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1138 if (CopLABEL(cCOPo)) {
1139 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1142 const char *label = CopLABEL_len_flags(cCOPo,
1143 &label_len, &label_flags);
1144 S_opdump_indent(aTHX_ o, level, bar, file, "LABEL = \"%s\"\n",
1145 generic_pv_escape( tmpsv, label, label_len,
1146 (label_flags & SVf_UTF8)));
1149 S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
1150 (unsigned int)cCOPo->cop_seq);
1155 S_opdump_indent(aTHX_ o, level, bar, file, "REDO");
1156 S_opdump_link(aTHX_ cLOOPo->op_redoop, file);
1157 S_opdump_indent(aTHX_ o, level, bar, file, "NEXT");
1158 S_opdump_link(aTHX_ cLOOPo->op_nextop, file);
1159 S_opdump_indent(aTHX_ o, level, bar, file, "LAST");
1160 S_opdump_link(aTHX_ cLOOPo->op_lastop, file);
1180 S_opdump_indent(aTHX_ o, level, bar, file, "OTHER");
1181 S_opdump_link(aTHX_ cLOGOPo->op_other, file);
1187 S_do_pmop_dump_bar(aTHX_ level, bar, file, cPMOPo);
1195 if (o->op_private & OPpREFCOUNTED)
1196 S_opdump_indent(aTHX_ o, level, bar, file,
1197 "REFCNT = %" UVuf "\n", (UV)o->op_targ);
1202 if (o->op_flags & OPf_KIDS) {
1206 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1207 S_do_op_dump_bar(aTHX_ level,
1208 (bar | cBOOL(OpHAS_SIBLING(kid))),
1215 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
1217 S_do_op_dump_bar(aTHX_ level, 0, file, o);
1224 Dumps the optree starting at OP C<o> to C<STDERR>.
1230 Perl_op_dump(pTHX_ const OP *o)
1232 PERL_ARGS_ASSERT_OP_DUMP;
1233 do_op_dump(0, Perl_debug_log, o);
1237 Perl_gv_dump(pTHX_ GV *gv)
1241 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1244 PerlIO_printf(Perl_debug_log, "{}\n");
1247 sv = sv_newmortal();
1248 PerlIO_printf(Perl_debug_log, "{\n");
1249 gv_fullname3(sv, gv, NULL);
1250 name = SvPV_const(sv, len);
1251 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1252 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1253 if (gv != GvEGV(gv)) {
1254 gv_efullname3(sv, GvEGV(gv), NULL);
1255 name = SvPV_const(sv, len);
1256 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1257 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1259 (void)PerlIO_putc(Perl_debug_log, '\n');
1260 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1264 /* map magic types to the symbolic names
1265 * (with the PERL_MAGIC_ prefixed stripped)
1268 static const struct { const char type; const char *name; } magic_names[] = {
1269 #include "mg_names.inc"
1270 /* this null string terminates the list */
1275 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1277 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1279 for (; mg; mg = mg->mg_moremagic) {
1280 Perl_dump_indent(aTHX_ level, file,
1281 " MAGIC = 0x%" UVxf "\n", PTR2UV(mg));
1282 if (mg->mg_virtual) {
1283 const MGVTBL * const v = mg->mg_virtual;
1284 if (v >= PL_magic_vtables
1285 && v < PL_magic_vtables + magic_vtable_max) {
1286 const U32 i = v - PL_magic_vtables;
1287 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1290 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"
1291 UVxf "\n", PTR2UV(v));
1294 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1297 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1301 const char *name = NULL;
1302 for (n = 0; magic_names[n].name; n++) {
1303 if (mg->mg_type == magic_names[n].type) {
1304 name = magic_names[n].name;
1309 Perl_dump_indent(aTHX_ level, file,
1310 " MG_TYPE = PERL_MAGIC_%s\n", name);
1312 Perl_dump_indent(aTHX_ level, file,
1313 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1317 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1318 if (mg->mg_type == PERL_MAGIC_envelem &&
1319 mg->mg_flags & MGf_TAINTEDDIR)
1320 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1321 if (mg->mg_type == PERL_MAGIC_regex_global &&
1322 mg->mg_flags & MGf_MINMATCH)
1323 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1324 if (mg->mg_flags & MGf_REFCOUNTED)
1325 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1326 if (mg->mg_flags & MGf_GSKIP)
1327 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1328 if (mg->mg_flags & MGf_COPY)
1329 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1330 if (mg->mg_flags & MGf_DUP)
1331 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1332 if (mg->mg_flags & MGf_LOCAL)
1333 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1334 if (mg->mg_type == PERL_MAGIC_regex_global &&
1335 mg->mg_flags & MGf_BYTES)
1336 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1339 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%" UVxf "\n",
1340 PTR2UV(mg->mg_obj));
1341 if (mg->mg_type == PERL_MAGIC_qr) {
1342 REGEXP* const re = (REGEXP *)mg->mg_obj;
1343 SV * const dsv = sv_newmortal();
1344 const char * const s
1345 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1347 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1348 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1350 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1351 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %" IVdf "\n",
1354 if (mg->mg_flags & MGf_REFCOUNTED)
1355 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1358 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1360 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%" UVxf, PTR2UV(mg->mg_ptr));
1361 if (mg->mg_len >= 0) {
1362 if (mg->mg_type != PERL_MAGIC_utf8) {
1363 SV * const sv = newSVpvs("");
1364 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1365 SvREFCNT_dec_NN(sv);
1368 else if (mg->mg_len == HEf_SVKEY) {
1369 PerlIO_puts(file, " => HEf_SVKEY\n");
1370 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1371 maxnest, dumpops, pvlim); /* MG is already +1 */
1374 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1379 " does not know how to handle this MG_LEN"
1381 (void)PerlIO_putc(file, '\n');
1383 if (mg->mg_type == PERL_MAGIC_utf8) {
1384 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1387 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1388 Perl_dump_indent(aTHX_ level, file,
1389 " %2" IVdf ": %" UVuf " -> %" UVuf "\n",
1392 (UV)cache[i * 2 + 1]);
1399 Perl_magic_dump(pTHX_ const MAGIC *mg)
1401 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1405 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1409 PERL_ARGS_ASSERT_DO_HV_DUMP;
1411 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1412 if (sv && (hvname = HvNAME_get(sv)))
1414 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1415 name which quite legally could contain insane things like tabs, newlines, nulls or
1416 other scary crap - this should produce sane results - except maybe for unicode package
1417 names - but we will wait for someone to file a bug on that - demerphq */
1418 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1419 PerlIO_printf(file, "\t\"%s\"\n",
1420 generic_pv_escape( tmpsv, hvname,
1421 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1424 (void)PerlIO_putc(file, '\n');
1428 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1430 PERL_ARGS_ASSERT_DO_GV_DUMP;
1432 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1433 if (sv && GvNAME(sv)) {
1434 SV * const tmpsv = newSVpvs("");
1435 PerlIO_printf(file, "\t\"%s\"\n",
1436 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1439 (void)PerlIO_putc(file, '\n');
1443 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1445 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1447 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1448 if (sv && GvNAME(sv)) {
1449 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1451 HV * const stash = GvSTASH(sv);
1452 PerlIO_printf(file, "\t");
1453 /* TODO might have an extra \" here */
1454 if (stash && (hvname = HvNAME_get(stash))) {
1455 PerlIO_printf(file, "\"%s\" :: \"",
1456 generic_pv_escape(tmp, hvname,
1457 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1459 PerlIO_printf(file, "%s\"\n",
1460 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1463 (void)PerlIO_putc(file, '\n');
1466 const struct flag_to_name first_sv_flags_names[] = {
1467 {SVs_TEMP, "TEMP,"},
1468 {SVs_OBJECT, "OBJECT,"},
1477 const struct flag_to_name second_sv_flags_names[] = {
1479 {SVf_FAKE, "FAKE,"},
1480 {SVf_READONLY, "READONLY,"},
1481 {SVf_PROTECT, "PROTECT,"},
1482 {SVf_BREAK, "BREAK,"},
1488 const struct flag_to_name cv_flags_names[] = {
1489 {CVf_ANON, "ANON,"},
1490 {CVf_UNIQUE, "UNIQUE,"},
1491 {CVf_CLONE, "CLONE,"},
1492 {CVf_CLONED, "CLONED,"},
1493 {CVf_CONST, "CONST,"},
1494 {CVf_NODEBUG, "NODEBUG,"},
1495 {CVf_LVALUE, "LVALUE,"},
1496 {CVf_METHOD, "METHOD,"},
1497 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1498 {CVf_CVGV_RC, "CVGV_RC,"},
1499 {CVf_DYNFILE, "DYNFILE,"},
1500 {CVf_AUTOLOAD, "AUTOLOAD,"},
1501 {CVf_HASEVAL, "HASEVAL,"},
1502 {CVf_SLABBED, "SLABBED,"},
1503 {CVf_NAMED, "NAMED,"},
1504 {CVf_LEXICAL, "LEXICAL,"},
1505 {CVf_ISXSUB, "ISXSUB,"}
1508 const struct flag_to_name hv_flags_names[] = {
1509 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1510 {SVphv_LAZYDEL, "LAZYDEL,"},
1511 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1512 {SVf_AMAGIC, "OVERLOAD,"},
1513 {SVphv_CLONEABLE, "CLONEABLE,"}
1516 const struct flag_to_name gp_flags_names[] = {
1517 {GVf_INTRO, "INTRO,"},
1518 {GVf_MULTI, "MULTI,"},
1519 {GVf_ASSUMECV, "ASSUMECV,"},
1522 const struct flag_to_name gp_flags_imported_names[] = {
1523 {GVf_IMPORTED_SV, " SV"},
1524 {GVf_IMPORTED_AV, " AV"},
1525 {GVf_IMPORTED_HV, " HV"},
1526 {GVf_IMPORTED_CV, " CV"},
1529 /* NOTE: this structure is mostly duplicative of one generated by
1530 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1531 * the two. - Yves */
1532 const struct flag_to_name regexp_extflags_names[] = {
1533 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1534 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1535 {RXf_PMf_FOLD, "PMf_FOLD,"},
1536 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1537 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1538 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1539 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1540 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1541 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1542 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1543 {RXf_CHECK_ALL, "CHECK_ALL,"},
1544 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1545 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1546 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1547 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1548 {RXf_SPLIT, "SPLIT,"},
1549 {RXf_COPY_DONE, "COPY_DONE,"},
1550 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1551 {RXf_TAINTED, "TAINTED,"},
1552 {RXf_START_ONLY, "START_ONLY,"},
1553 {RXf_SKIPWHITE, "SKIPWHITE,"},
1554 {RXf_WHITE, "WHITE,"},
1555 {RXf_NULL, "NULL,"},
1558 /* NOTE: this structure is mostly duplicative of one generated by
1559 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1560 * the two. - Yves */
1561 const struct flag_to_name regexp_core_intflags_names[] = {
1562 {PREGf_SKIP, "SKIP,"},
1563 {PREGf_IMPLICIT, "IMPLICIT,"},
1564 {PREGf_NAUGHTY, "NAUGHTY,"},
1565 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1566 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1567 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1568 {PREGf_NOSCAN, "NOSCAN,"},
1569 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1570 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1571 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1572 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1573 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1576 /* Perl_do_sv_dump():
1578 * level: amount to indent the output
1579 * sv: the object to dump
1580 * nest: the current level of recursion
1581 * maxnest: the maximum allowed level of recursion
1582 * dumpops: if true, also dump the ops associated with a CV
1583 * pvlim: limit on the length of any strings that are output
1587 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1594 PERL_ARGS_ASSERT_DO_SV_DUMP;
1597 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1601 flags = SvFLAGS(sv);
1604 /* process general SV flags */
1606 d = Perl_newSVpvf(aTHX_
1607 "(0x%" UVxf ") at 0x%" UVxf "\n%*s REFCNT = %" IVdf "\n%*s FLAGS = (",
1608 PTR2UV(SvANY(sv)), PTR2UV(sv),
1609 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1610 (int)(PL_dumpindent*level), "");
1612 if ((flags & SVs_PADSTALE))
1613 sv_catpv(d, "PADSTALE,");
1614 if ((flags & SVs_PADTMP))
1615 sv_catpv(d, "PADTMP,");
1616 append_flags(d, flags, first_sv_flags_names);
1617 if (flags & SVf_ROK) {
1618 sv_catpv(d, "ROK,");
1619 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1621 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1622 append_flags(d, flags, second_sv_flags_names);
1623 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1624 && type != SVt_PVAV) {
1625 if (SvPCS_IMPORTED(sv))
1626 sv_catpv(d, "PCS_IMPORTED,");
1628 sv_catpv(d, "SCREAM,");
1631 /* process type-specific SV flags */
1636 append_flags(d, CvFLAGS(sv), cv_flags_names);
1639 append_flags(d, flags, hv_flags_names);
1643 if (isGV_with_GP(sv)) {
1644 append_flags(d, GvFLAGS(sv), gp_flags_names);
1646 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1647 sv_catpv(d, "IMPORT");
1648 if (GvIMPORTED(sv) == GVf_IMPORTED)
1649 sv_catpv(d, "ALL,");
1652 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1659 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1665 /* SVphv_SHAREKEYS is also 0x20000000 */
1666 if ((type != SVt_PVHV) && SvUTF8(sv))
1667 sv_catpv(d, "UTF8");
1669 if (*(SvEND(d) - 1) == ',') {
1670 SvCUR_set(d, SvCUR(d) - 1);
1671 SvPVX(d)[SvCUR(d)] = '\0';
1676 /* dump initial SV details */
1678 #ifdef DEBUG_LEAKING_SCALARS
1679 Perl_dump_indent(aTHX_ level, file,
1680 "ALLOCATED at %s:%d %s %s (parent 0x%" UVxf "); serial %" UVuf "\n",
1681 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1683 sv->sv_debug_inpad ? "for" : "by",
1684 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1685 PTR2UV(sv->sv_debug_parent),
1689 Perl_dump_indent(aTHX_ level, file, "SV = ");
1693 if (type < SVt_LAST) {
1694 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1696 if (type == SVt_NULL) {
1701 PerlIO_printf(file, "UNKNOWN(0x%" UVxf ") %s\n", (UV)type, s);
1706 /* Dump general SV fields */
1708 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1709 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1710 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1711 || (type == SVt_IV && !SvROK(sv))) {
1714 Perl_dump_indent(aTHX_ level, file, " UV = %" UVuf, (UV)SvUVX(sv));
1716 Perl_dump_indent(aTHX_ level, file, " IV = %" IVdf, (IV)SvIVX(sv));
1717 (void)PerlIO_putc(file, '\n');
1720 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1721 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1722 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1723 || type == SVt_NV) {
1724 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1725 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1726 RESTORE_LC_NUMERIC_UNDERLYING();
1730 Perl_dump_indent(aTHX_ level, file, " RV = 0x%" UVxf "\n",
1733 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1736 if (type < SVt_PV) {
1741 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1742 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1743 const bool re = isREGEXP(sv);
1744 const char * const ptr =
1745 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1749 SvOOK_offset(sv, delta);
1750 Perl_dump_indent(aTHX_ level, file," OFFSET = %" UVuf "\n",
1755 Perl_dump_indent(aTHX_ level, file," PV = 0x%" UVxf " ",
1758 PerlIO_printf(file, "( %s . ) ",
1759 pv_display(d, ptr - delta, delta, 0,
1762 if (type == SVt_INVLIST) {
1763 PerlIO_printf(file, "\n");
1764 /* 4 blanks indents 2 beyond the PV, etc */
1765 _invlist_dump(file, level, " ", sv);
1768 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1771 if (SvUTF8(sv)) /* the 6? \x{....} */
1772 PerlIO_printf(file, " [UTF8 \"%s\"]",
1773 sv_uni_display(d, sv, 6 * SvCUR(sv),
1775 PerlIO_printf(file, "\n");
1777 Perl_dump_indent(aTHX_ level, file, " CUR = %" IVdf "\n", (IV)SvCUR(sv));
1779 Perl_dump_indent(aTHX_ level, file, " LEN = %" IVdf "\n",
1781 #ifdef PERL_COPY_ON_WRITE
1782 if (SvIsCOW(sv) && SvLEN(sv))
1783 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1788 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1791 if (type >= SVt_PVMG) {
1793 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1795 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1797 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1798 Perl_dump_indent(aTHX_ level, file, " USEFUL = %" IVdf "\n",
1803 /* Dump type-specific SV fields */
1807 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf,
1808 PTR2UV(AvARRAY(sv)));
1809 if (AvARRAY(sv) != AvALLOC(sv)) {
1810 PerlIO_printf(file, " (offset=%" IVdf ")\n",
1811 (IV)(AvARRAY(sv) - AvALLOC(sv)));
1812 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%" UVxf "\n",
1813 PTR2UV(AvALLOC(sv)));
1816 (void)PerlIO_putc(file, '\n');
1817 Perl_dump_indent(aTHX_ level, file, " FILL = %" IVdf "\n",
1819 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1822 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1823 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1824 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1825 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1826 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1828 SV **svp = AvARRAY(MUTABLE_AV(sv));
1830 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1833 SV* const elt = *svp;
1834 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %" IVdf "\n",
1836 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1843 struct xpvhv_aux *const aux = HvAUX(sv);
1844 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n",
1845 (UV)aux->xhv_aux_flags);
1847 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
1848 usedkeys = HvUSEDKEYS(sv);
1849 if (HvARRAY(sv) && usedkeys) {
1850 /* Show distribution of HEs in the ARRAY */
1852 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1855 U32 pow2 = 2, keys = usedkeys;
1856 NV theoret, sum = 0;
1858 PerlIO_printf(file, " (");
1859 Zero(freq, FREQ_MAX + 1, int);
1860 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1863 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1865 if (count > FREQ_MAX)
1871 for (i = 0; i <= max; i++) {
1873 PerlIO_printf(file, "%d%s:%d", i,
1874 (i == FREQ_MAX) ? "+" : "",
1877 PerlIO_printf(file, ", ");
1880 (void)PerlIO_putc(file, ')');
1881 /* The "quality" of a hash is defined as the total number of
1882 comparisons needed to access every element once, relative
1883 to the expected number needed for a random hash.
1885 The total number of comparisons is equal to the sum of
1886 the squares of the number of entries in each bucket.
1887 For a random hash of n keys into k buckets, the expected
1892 for (i = max; i > 0; i--) { /* Precision: count down. */
1893 sum += freq[i] * i * i;
1895 while ((keys = keys >> 1))
1898 theoret += theoret * (theoret-1)/pow2;
1899 (void)PerlIO_putc(file, '\n');
1900 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"
1901 NVff "%%", theoret/sum*100);
1903 (void)PerlIO_putc(file, '\n');
1904 Perl_dump_indent(aTHX_ level, file, " KEYS = %" IVdf "\n",
1908 HE **ents = HvARRAY(sv);
1911 HE *const *const last = ents + HvMAX(sv);
1912 count = last + 1 - ents;
1917 } while (++ents <= last);
1920 Perl_dump_indent(aTHX_ level, file, " FILL = %" UVuf "\n",
1923 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1926 Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n",
1927 (IV)HvRITER_get(sv));
1928 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n",
1929 PTR2UV(HvEITER_get(sv)));
1930 #ifdef PERL_HASH_RANDOMIZE_KEYS
1931 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%" UVxf,
1932 (UV)HvRAND_get(sv));
1933 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1934 PerlIO_printf(file, " (LAST = 0x%" UVxf ")",
1935 (UV)HvLASTRAND_get(sv));
1938 (void)PerlIO_putc(file, '\n');
1941 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1942 if (mg && mg->mg_obj) {
1943 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%" UVxf "\n", PTR2UV(mg->mg_obj));
1947 const char * const hvname = HvNAME_get(sv);
1949 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1950 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1951 generic_pv_escape( tmpsv, hvname,
1952 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1957 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1958 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1959 if (HvAUX(sv)->xhv_name_count)
1960 Perl_dump_indent(aTHX_
1961 level, file, " NAMECOUNT = %" IVdf "\n",
1962 (IV)HvAUX(sv)->xhv_name_count
1964 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1965 const I32 count = HvAUX(sv)->xhv_name_count;
1967 SV * const names = newSVpvs_flags("", SVs_TEMP);
1968 /* The starting point is the first element if count is
1969 positive and the second element if count is negative. */
1970 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1971 + (count < 0 ? 1 : 0);
1972 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1973 + (count < 0 ? -count : count);
1974 while (hekp < endp) {
1976 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1977 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1978 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
1980 /* This should never happen. */
1981 sv_catpvs(names, ", (null)");
1985 Perl_dump_indent(aTHX_
1986 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1990 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1991 const char *const hvename = HvENAME_get(sv);
1992 Perl_dump_indent(aTHX_
1993 level, file, " ENAME = \"%s\"\n",
1994 generic_pv_escape(tmp, hvename,
1995 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1999 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%" UVxf "\n",
2001 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
2005 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2006 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"
2008 generic_pv_escape( tmpsv, meta->mro_which->name,
2009 meta->mro_which->length,
2010 (meta->mro_which->kflags & HVhek_UTF8)),
2011 PTR2UV(meta->mro_which));
2012 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"
2014 (UV)meta->cache_gen);
2015 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%" UVxf "\n",
2017 if (meta->mro_linear_all) {
2018 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"
2020 PTR2UV(meta->mro_linear_all));
2021 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
2024 if (meta->mro_linear_current) {
2025 Perl_dump_indent(aTHX_ level, file,
2026 " MRO_LINEAR_CURRENT = 0x%" UVxf "\n",
2027 PTR2UV(meta->mro_linear_current));
2028 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
2031 if (meta->mro_nextmethod) {
2032 Perl_dump_indent(aTHX_ level, file,
2033 " MRO_NEXTMETHOD = 0x%" UVxf "\n",
2034 PTR2UV(meta->mro_nextmethod));
2035 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
2039 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%" UVxf "\n",
2041 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
2046 if (nest < maxnest) {
2047 HV * const hv = MUTABLE_HV(sv);
2052 int count = maxnest - nest;
2053 for (i=0; i <= HvMAX(hv); i++) {
2054 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2061 if (count-- <= 0) goto DONEHV;
2064 keysv = hv_iterkeysv(he);
2065 keypv = SvPV_const(keysv, len);
2068 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
2070 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2071 if (HvEITER_get(hv) == he)
2072 PerlIO_printf(file, "[CURRENT] ");
2073 PerlIO_printf(file, "HASH = 0x%" UVxf "\n", (UV) hash);
2074 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2081 } /* case SVt_PVHV */
2084 if (CvAUTOLOAD(sv)) {
2085 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2087 const char *const name = SvPV_const(sv, len);
2088 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
2089 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
2092 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2093 const char *const proto = CvPROTO(sv);
2094 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
2095 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
2100 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
2101 if (!CvISXSUB(sv)) {
2104 Perl_dump_indent(aTHX_ level, file,
2105 " SLAB = 0x%" UVxf "\n",
2106 PTR2UV(CvSTART(sv)));
2108 Perl_dump_indent(aTHX_ level, file,
2109 " START = 0x%" UVxf " ===> %" IVdf "\n",
2110 PTR2UV(CvSTART(sv)),
2111 (IV)sequence_num(CvSTART(sv)));
2113 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%" UVxf "\n",
2114 PTR2UV(CvROOT(sv)));
2115 if (CvROOT(sv) && dumpops) {
2116 do_op_dump(level+1, file, CvROOT(sv));
2119 SV * const constant = cv_const_sv((const CV *)sv);
2121 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%" UVxf "\n", PTR2UV(CvXSUB(sv)));
2124 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%" UVxf
2126 PTR2UV(CvXSUBANY(sv).any_ptr));
2127 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2130 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %" IVdf "\n",
2131 (IV)CvXSUBANY(sv).any_i32);
2135 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2136 HEK_KEY(CvNAME_HEK((CV *)sv)));
2137 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
2138 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
2139 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"
2140 IVdf "\n", (IV)CvDEPTH(sv));
2141 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n",
2143 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %" UVuf "\n", (UV)CvOUTSIDE_SEQ(sv));
2144 if (!CvISXSUB(sv)) {
2145 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%" UVxf "\n", PTR2UV(CvPADLIST(sv)));
2146 if (nest < maxnest) {
2147 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2151 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
2153 const CV * const outside = CvOUTSIDE(sv);
2154 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%" UVxf " (%s)\n",
2157 : CvANON(outside) ? "ANON"
2158 : (outside == PL_main_cv) ? "MAIN"
2159 : CvUNIQUE(outside) ? "UNIQUE"
2162 newSVpvs_flags("", SVs_TEMP),
2163 GvNAME(CvGV(outside)),
2164 GvNAMELEN(CvGV(outside)),
2165 GvNAMEUTF8(CvGV(outside)))
2169 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2170 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2175 if (type == SVt_PVLV) {
2176 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2177 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %" IVdf "\n", (IV)LvTARGOFF(sv));
2178 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %" IVdf "\n", (IV)LvTARGLEN(sv));
2179 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%" UVxf "\n", PTR2UV(LvTARG(sv)));
2180 Perl_dump_indent(aTHX_ level, file, " FLAGS = %" IVdf "\n", (IV)LvFLAGS(sv));
2181 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2182 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2185 if (isREGEXP(sv)) goto dumpregexp;
2186 if (!isGV_with_GP(sv))
2189 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2190 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2191 generic_pv_escape(tmpsv, GvNAME(sv),
2195 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %" IVdf "\n", (IV)GvNAMELEN(sv));
2196 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2197 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)GvFLAGS(sv));
2198 Perl_dump_indent(aTHX_ level, file, " GP = 0x%" UVxf "\n", PTR2UV(GvGP(sv)));
2201 Perl_dump_indent(aTHX_ level, file, " SV = 0x%" UVxf "\n", PTR2UV(GvSV(sv)));
2202 Perl_dump_indent(aTHX_ level, file, " REFCNT = %" IVdf "\n", (IV)GvREFCNT(sv));
2203 Perl_dump_indent(aTHX_ level, file, " IO = 0x%" UVxf "\n", PTR2UV(GvIOp(sv)));
2204 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%" UVxf " \n", PTR2UV(GvFORM(sv)));
2205 Perl_dump_indent(aTHX_ level, file, " AV = 0x%" UVxf "\n", PTR2UV(GvAV(sv)));
2206 Perl_dump_indent(aTHX_ level, file, " HV = 0x%" UVxf "\n", PTR2UV(GvHV(sv)));
2207 Perl_dump_indent(aTHX_ level, file, " CV = 0x%" UVxf "\n", PTR2UV(GvCV(sv)));
2208 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%" UVxf "\n", (UV)GvCVGEN(sv));
2209 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%" UVxf
2213 Perl_dump_indent(aTHX_ level, file, " LINE = %" IVdf "\n", (IV)GvLINE(sv));
2214 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2215 do_gv_dump (level, file, " EGV", GvEGV(sv));
2218 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%" UVxf "\n", PTR2UV(IoIFP(sv)));
2219 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%" UVxf "\n", PTR2UV(IoOFP(sv)));
2220 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%" UVxf "\n", PTR2UV(IoDIRP(sv)));
2221 Perl_dump_indent(aTHX_ level, file, " LINES = %" IVdf "\n", (IV)IoLINES(sv));
2222 Perl_dump_indent(aTHX_ level, file, " PAGE = %" IVdf "\n", (IV)IoPAGE(sv));
2223 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %" IVdf "\n", (IV)IoPAGE_LEN(sv));
2224 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %" IVdf "\n", (IV)IoLINES_LEFT(sv));
2226 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2227 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2228 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2230 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%" UVxf "\n",
2231 PTR2UV(IoTOP_GV(sv)));
2232 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2233 maxnest, dumpops, pvlim);
2235 /* Source filters hide things that are not GVs in these three, so let's
2236 be careful out there. */
2238 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2239 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2240 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2242 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%" UVxf "\n",
2243 PTR2UV(IoFMT_GV(sv)));
2244 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2245 maxnest, dumpops, pvlim);
2247 if (IoBOTTOM_NAME(sv))
2248 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2249 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2250 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2252 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%" UVxf "\n",
2253 PTR2UV(IoBOTTOM_GV(sv)));
2254 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2255 maxnest, dumpops, pvlim);
2257 if (isPRINT(IoTYPE(sv)))
2258 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2260 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2261 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)IoFLAGS(sv));
2266 struct regexp * const r = ReANY((REGEXP*)sv);
2268 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2270 append_flags(d, flags, names); \
2271 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2272 SvCUR_set(d, SvCUR(d) - 1); \
2273 SvPVX(d)[SvCUR(d)] = '\0'; \
2276 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2277 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%" UVxf " (%s)\n",
2278 (UV)(r->compflags), SvPVX_const(d));
2280 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2281 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%" UVxf " (%s)\n",
2282 (UV)(r->extflags), SvPVX_const(d));
2284 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%" UVxf " (%s)\n",
2285 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2286 if (r->engine == &PL_core_reg_engine) {
2287 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2288 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf " (%s)\n",
2289 (UV)(r->intflags), SvPVX_const(d));
2291 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "\n",
2294 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2295 Perl_dump_indent(aTHX_ level, file, " NPARENS = %" UVuf "\n",
2297 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %" UVuf "\n",
2298 (UV)(r->lastparen));
2299 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %" UVuf "\n",
2300 (UV)(r->lastcloseparen));
2301 Perl_dump_indent(aTHX_ level, file, " MINLEN = %" IVdf "\n",
2303 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %" IVdf "\n",
2304 (IV)(r->minlenret));
2305 Perl_dump_indent(aTHX_ level, file, " GOFS = %" UVuf "\n",
2307 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %" UVuf "\n",
2308 (UV)(r->pre_prefix));
2309 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %" IVdf "\n",
2311 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %" IVdf "\n",
2312 (IV)(r->suboffset));
2313 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %" IVdf "\n",
2314 (IV)(r->subcoffset));
2316 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%" UVxf " %s\n",
2318 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2320 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2321 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n",
2322 PTR2UV(r->mother_re));
2323 if (nest < maxnest && r->mother_re)
2324 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2325 maxnest, dumpops, pvlim);
2326 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%" UVxf "\n",
2327 PTR2UV(r->paren_names));
2328 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%" UVxf "\n",
2329 PTR2UV(r->substrs));
2330 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%" UVxf "\n",
2331 PTR2UV(r->pprivate));
2332 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%" UVxf "\n",
2334 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%" UVxf "\n",
2335 PTR2UV(r->qr_anoncv));
2337 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%" UVxf "\n",
2338 PTR2UV(r->saved_copy));
2349 Dumps the contents of an SV to the C<STDERR> filehandle.
2351 For an example of its output, see L<Devel::Peek>.
2357 Perl_sv_dump(pTHX_ SV *sv)
2359 PERL_ARGS_ASSERT_SV_DUMP;
2362 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2364 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2368 Perl_runops_debug(pTHX)
2371 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2375 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2377 #ifdef PERL_TRACE_OPS
2378 ++PL_op_exec_cnt[PL_op->op_type];
2383 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2384 PerlIO_printf(Perl_debug_log,
2385 "WARNING: %" UVxf " changed from %" UVxf " to %" UVxf "\n",
2386 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2387 PTR2UV(*PL_watchaddr));
2388 if (DEBUG_s_TEST_) {
2389 if (DEBUG_v_TEST_) {
2390 PerlIO_printf(Perl_debug_log, "\n");
2398 if (DEBUG_t_TEST_) debop(PL_op);
2399 if (DEBUG_P_TEST_) debprof(PL_op);
2404 PERL_DTRACE_PROBE_OP(PL_op);
2405 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2406 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2414 /* print the names of the n lexical vars starting at pad offset off */
2417 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2420 CV * const cv = deb_curcv(cxstack_ix);
2421 PADNAMELIST *comppad = NULL;
2425 PADLIST * const padlist = CvPADLIST(cv);
2426 comppad = PadlistNAMES(padlist);
2429 PerlIO_printf(Perl_debug_log, "(");
2430 for (i = 0; i < n; i++) {
2431 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2432 PerlIO_printf(Perl_debug_log, "%" PNf, PNfARG(sv));
2434 PerlIO_printf(Perl_debug_log, "[%" UVuf "]",
2437 PerlIO_printf(Perl_debug_log, ",");
2440 PerlIO_printf(Perl_debug_log, ")");
2444 /* append to the out SV, the name of the lexical at offset off in the CV
2448 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2449 bool paren, bool is_scalar)
2452 PADNAMELIST *namepad = NULL;
2456 PADLIST * const padlist = CvPADLIST(cv);
2457 namepad = PadlistNAMES(padlist);
2461 sv_catpvs_nomg(out, "(");
2462 for (i = 0; i < n; i++) {
2463 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2465 STRLEN cur = SvCUR(out);
2466 Perl_sv_catpvf(aTHX_ out, "[%" UTF8f,
2467 UTF8fARG(1, PadnameLEN(sv) - 1,
2468 PadnamePV(sv) + 1));
2470 SvPVX(out)[cur] = '$';
2473 Perl_sv_catpvf(aTHX_ out, "[%" UVuf "]", (UV)(off+i));
2475 sv_catpvs_nomg(out, ",");
2478 sv_catpvs_nomg(out, "(");
2483 S_append_gv_name(pTHX_ GV *gv, SV *out)
2487 sv_catpvs_nomg(out, "<NULLGV>");
2491 gv_fullname4(sv, gv, NULL, FALSE);
2492 Perl_sv_catpvf(aTHX_ out, "$%" SVf, SVfARG(sv));
2493 SvREFCNT_dec_NN(sv);
2497 # define ITEM_SV(item) (comppad ? \
2498 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2500 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2504 /* return a temporary SV containing a stringified representation of
2505 * the op_aux field of a MULTIDEREF op, associated with CV cv
2509 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2511 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2512 UV actions = items->uv;
2515 bool is_hash = FALSE;
2517 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2522 PADLIST *padlist = CvPADLIST(cv);
2523 comppad = PadlistARRAY(padlist)[1];
2529 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2532 switch (actions & MDEREF_ACTION_MASK) {
2535 actions = (++items)->uv;
2537 NOT_REACHED; /* NOTREACHED */
2539 case MDEREF_HV_padhv_helem:
2542 case MDEREF_AV_padav_aelem:
2544 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2546 NOT_REACHED; /* NOTREACHED */
2548 case MDEREF_HV_gvhv_helem:
2551 case MDEREF_AV_gvav_aelem:
2554 sv = ITEM_SV(items);
2555 S_append_gv_name(aTHX_ (GV*)sv, out);
2557 NOT_REACHED; /* NOTREACHED */
2559 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2562 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2564 sv = ITEM_SV(items);
2565 S_append_gv_name(aTHX_ (GV*)sv, out);
2566 goto do_vivify_rv2xv_elem;
2567 NOT_REACHED; /* NOTREACHED */
2569 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2572 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2573 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2574 goto do_vivify_rv2xv_elem;
2575 NOT_REACHED; /* NOTREACHED */
2577 case MDEREF_HV_pop_rv2hv_helem:
2578 case MDEREF_HV_vivify_rv2hv_helem:
2581 do_vivify_rv2xv_elem:
2582 case MDEREF_AV_pop_rv2av_aelem:
2583 case MDEREF_AV_vivify_rv2av_aelem:
2585 sv_catpvs_nomg(out, "->");
2587 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2588 sv_catpvs_nomg(out, "->");
2593 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2594 switch (actions & MDEREF_INDEX_MASK) {
2595 case MDEREF_INDEX_const:
2598 sv = ITEM_SV(items);
2600 sv_catpvs_nomg(out, "???");
2605 pv_pretty(out, s, cur, 30,
2607 (PERL_PV_PRETTY_NOCLEAR
2608 |PERL_PV_PRETTY_QUOTE
2609 |PERL_PV_PRETTY_ELLIPSES));
2613 Perl_sv_catpvf(aTHX_ out, "%" IVdf, (++items)->iv);
2615 case MDEREF_INDEX_padsv:
2616 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2618 case MDEREF_INDEX_gvsv:
2620 sv = ITEM_SV(items);
2621 S_append_gv_name(aTHX_ (GV*)sv, out);
2624 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2626 if (actions & MDEREF_FLAG_last)
2633 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2634 (int)(actions & MDEREF_ACTION_MASK));
2640 actions >>= MDEREF_SHIFT;
2647 Perl_debop(pTHX_ const OP *o)
2649 PERL_ARGS_ASSERT_DEBOP;
2651 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2654 Perl_deb(aTHX_ "%s", OP_NAME(o));
2655 switch (o->op_type) {
2658 /* With ITHREADS, consts are stored in the pad, and the right pad
2659 * may not be active here, so check.
2660 * Looks like only during compiling the pads are illegal.
2663 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2665 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2669 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
2670 SV * const sv = newSV(0);
2671 gv_fullname3(sv, cGVOPo_gv, NULL);
2672 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2673 SvREFCNT_dec_NN(sv);
2675 else if (cGVOPo_gv) {
2676 SV * const sv = newSV(0);
2677 assert(SvROK(cGVOPo_gv));
2678 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2679 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
2680 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
2681 SvREFCNT_dec_NN(sv);
2684 PerlIO_printf(Perl_debug_log, "(NULL)");
2691 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2695 S_deb_padvar(aTHX_ o->op_targ,
2696 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2700 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2701 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2707 PerlIO_printf(Perl_debug_log, "\n");
2713 =for apidoc op_class
2715 Given an op, determine what type of struct it has been allocated as.
2716 Returns one of the OPclass enums, such as OPclass_LISTOP.
2723 Perl_op_class(pTHX_ const OP *o)
2728 return OPclass_NULL;
2730 if (o->op_type == 0) {
2731 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
2733 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2736 if (o->op_type == OP_SASSIGN)
2737 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPclass_UNOP : OPclass_BINOP);
2739 if (o->op_type == OP_AELEMFAST) {
2741 return OPclass_PADOP;
2743 return OPclass_SVOP;
2748 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
2749 o->op_type == OP_RCATLINE)
2750 return OPclass_PADOP;
2753 if (o->op_type == OP_CUSTOM)
2756 switch (OP_CLASS(o)) {
2758 return OPclass_BASEOP;
2761 return OPclass_UNOP;
2764 return OPclass_BINOP;
2767 return OPclass_LOGOP;
2770 return OPclass_LISTOP;
2773 return OPclass_PMOP;
2776 return OPclass_SVOP;
2779 return OPclass_PADOP;
2781 case OA_PVOP_OR_SVOP:
2783 * Character translations (tr///) are usually a PVOP, keeping a
2784 * pointer to a table of shorts used to look up translations.
2785 * Under utf8, however, a simple table isn't practical; instead,
2786 * the OP is an SVOP (or, under threads, a PADOP),
2787 * and the SV is a reference to a swash
2788 * (i.e., an RV pointing to an HV).
2791 (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
2793 #if defined(USE_ITHREADS)
2794 ? OPclass_PADOP : OPclass_PVOP;
2796 ? OPclass_SVOP : OPclass_PVOP;
2800 return OPclass_LOOP;
2805 case OA_BASEOP_OR_UNOP:
2807 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
2808 * whether parens were seen. perly.y uses OPf_SPECIAL to
2809 * signal whether a BASEOP had empty parens or none.
2810 * Some other UNOPs are created later, though, so the best
2811 * test is OPf_KIDS, which is set in newUNOP.
2813 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2817 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
2818 * the OPf_REF flag to distinguish between OP types instead of the
2819 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
2820 * return OPclass_UNOP so that walkoptree can find our children. If
2821 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
2822 * (no argument to the operator) it's an OP; with OPf_REF set it's
2823 * an SVOP (and op_sv is the GV for the filehandle argument).
2825 return ((o->op_flags & OPf_KIDS) ? OPclass_UNOP :
2827 (o->op_flags & OPf_REF) ? OPclass_PADOP : OPclass_BASEOP);
2829 (o->op_flags & OPf_REF) ? OPclass_SVOP : OPclass_BASEOP);
2833 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
2834 * label was omitted (in which case it's a BASEOP) or else a term was
2835 * seen. In this last case, all except goto are definitely PVOP but
2836 * goto is either a PVOP (with an ordinary constant label), an UNOP
2837 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
2838 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
2841 if (o->op_flags & OPf_STACKED)
2842 return OPclass_UNOP;
2843 else if (o->op_flags & OPf_SPECIAL)
2844 return OPclass_BASEOP;
2846 return OPclass_PVOP;
2848 return OPclass_METHOP;
2850 return OPclass_UNOP_AUX;
2852 Perl_warn(aTHX_ "Can't determine class of operator %s, assuming BASEOP\n",
2854 return OPclass_BASEOP;
2860 S_deb_curcv(pTHX_ I32 ix)
2862 PERL_SI *si = PL_curstackinfo;
2863 for (; ix >=0; ix--) {
2864 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2866 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2867 return cx->blk_sub.cv;
2868 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2869 return cx->blk_eval.cv;
2870 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2872 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2873 && si->si_type == PERLSI_SORT)
2875 /* fake sort sub; use CV of caller */
2877 ix = si->si_cxix + 1;
2884 Perl_watch(pTHX_ char **addr)
2886 PERL_ARGS_ASSERT_WATCH;
2888 PL_watchaddr = addr;
2890 PerlIO_printf(Perl_debug_log, "WATCHING, %" UVxf " is currently %" UVxf "\n",
2891 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2895 S_debprof(pTHX_ const OP *o)
2897 PERL_ARGS_ASSERT_DEBPROF;
2899 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2901 if (!PL_profiledata)
2902 Newxz(PL_profiledata, MAXO, U32);
2903 ++PL_profiledata[o->op_type];
2907 Perl_debprofdump(pTHX)
2910 if (!PL_profiledata)
2912 for (i = 0; i < MAXO; i++) {
2913 if (PL_profiledata[i])
2914 PerlIO_printf(Perl_debug_log,
2915 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2922 * ex: set ts=8 sts=4 sw=4 et: