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 ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
1077 if (cSVOPo->op_sv) {
1080 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1081 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");
1095 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
1096 UV i, count = items[-1].uv;
1098 S_opdump_indent(aTHX_ o, level, bar, file, "ARGS = \n");
1099 for (i=0; i < count; i++)
1100 S_opdump_indent(aTHX_ o, level+1, (bar << 1), file,
1101 "%" UVuf " => 0x%" UVxf "\n",
1108 case OP_METHOD_NAMED:
1109 case OP_METHOD_SUPER:
1110 case OP_METHOD_REDIR:
1111 case OP_METHOD_REDIR_SUPER:
1112 #ifndef USE_ITHREADS
1113 /* with ITHREADS, consts are stored in the pad, and the right pad
1114 * may not be active here, so skip */
1115 S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n",
1116 SvPEEK(cMETHOPx_meth(o)));
1120 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
1126 S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n",
1127 (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)));
1137 if (CopLABEL(cCOPo)) {
1138 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1141 const char *label = CopLABEL_len_flags(cCOPo,
1142 &label_len, &label_flags);
1143 S_opdump_indent(aTHX_ o, level, bar, file, "LABEL = \"%s\"\n",
1144 generic_pv_escape( tmpsv, label, label_len,
1145 (label_flags & SVf_UTF8)));
1147 S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n",
1148 (unsigned int)cCOPo->cop_seq);
1153 S_opdump_indent(aTHX_ o, level, bar, file, "REDO");
1154 S_opdump_link(aTHX_ cLOOPo->op_redoop, file);
1155 S_opdump_indent(aTHX_ o, level, bar, file, "NEXT");
1156 S_opdump_link(aTHX_ cLOOPo->op_nextop, file);
1157 S_opdump_indent(aTHX_ o, level, bar, file, "LAST");
1158 S_opdump_link(aTHX_ cLOOPo->op_lastop, file);
1178 S_opdump_indent(aTHX_ o, level, bar, file, "OTHER");
1179 S_opdump_link(aTHX_ cLOGOPo->op_other, file);
1185 S_do_pmop_dump_bar(aTHX_ level, bar, file, cPMOPo);
1193 if (o->op_private & OPpREFCOUNTED)
1194 S_opdump_indent(aTHX_ o, level, bar, file,
1195 "REFCNT = %" UVuf "\n", (UV)o->op_targ);
1200 if (o->op_flags & OPf_KIDS) {
1204 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
1205 S_do_op_dump_bar(aTHX_ level,
1206 (bar | cBOOL(OpHAS_SIBLING(kid))),
1213 Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
1215 S_do_op_dump_bar(aTHX_ level, 0, file, o);
1222 Dumps the optree starting at OP C<o> to C<STDERR>.
1228 Perl_op_dump(pTHX_ const OP *o)
1230 PERL_ARGS_ASSERT_OP_DUMP;
1231 do_op_dump(0, Perl_debug_log, o);
1235 Perl_gv_dump(pTHX_ GV *gv)
1239 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1242 PerlIO_printf(Perl_debug_log, "{}\n");
1245 sv = sv_newmortal();
1246 PerlIO_printf(Perl_debug_log, "{\n");
1247 gv_fullname3(sv, gv, NULL);
1248 name = SvPV_const(sv, len);
1249 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1250 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1251 if (gv != GvEGV(gv)) {
1252 gv_efullname3(sv, GvEGV(gv), NULL);
1253 name = SvPV_const(sv, len);
1254 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1255 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
1257 (void)PerlIO_putc(Perl_debug_log, '\n');
1258 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
1262 /* map magic types to the symbolic names
1263 * (with the PERL_MAGIC_ prefixed stripped)
1266 static const struct { const char type; const char *name; } magic_names[] = {
1267 #include "mg_names.inc"
1268 /* this null string terminates the list */
1273 Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1275 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1277 for (; mg; mg = mg->mg_moremagic) {
1278 Perl_dump_indent(aTHX_ level, file,
1279 " MAGIC = 0x%" UVxf "\n", PTR2UV(mg));
1280 if (mg->mg_virtual) {
1281 const MGVTBL * const v = mg->mg_virtual;
1282 if (v >= PL_magic_vtables
1283 && v < PL_magic_vtables + magic_vtable_max) {
1284 const U32 i = v - PL_magic_vtables;
1285 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1288 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"
1289 UVxf "\n", PTR2UV(v));
1292 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
1295 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
1299 const char *name = NULL;
1300 for (n = 0; magic_names[n].name; n++) {
1301 if (mg->mg_type == magic_names[n].type) {
1302 name = magic_names[n].name;
1307 Perl_dump_indent(aTHX_ level, file,
1308 " MG_TYPE = PERL_MAGIC_%s\n", name);
1310 Perl_dump_indent(aTHX_ level, file,
1311 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1315 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
1316 if (mg->mg_type == PERL_MAGIC_envelem &&
1317 mg->mg_flags & MGf_TAINTEDDIR)
1318 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
1319 if (mg->mg_type == PERL_MAGIC_regex_global &&
1320 mg->mg_flags & MGf_MINMATCH)
1321 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
1322 if (mg->mg_flags & MGf_REFCOUNTED)
1323 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
1324 if (mg->mg_flags & MGf_GSKIP)
1325 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
1326 if (mg->mg_flags & MGf_COPY)
1327 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1328 if (mg->mg_flags & MGf_DUP)
1329 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1330 if (mg->mg_flags & MGf_LOCAL)
1331 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
1332 if (mg->mg_type == PERL_MAGIC_regex_global &&
1333 mg->mg_flags & MGf_BYTES)
1334 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
1337 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%" UVxf "\n",
1338 PTR2UV(mg->mg_obj));
1339 if (mg->mg_type == PERL_MAGIC_qr) {
1340 REGEXP* const re = (REGEXP *)mg->mg_obj;
1341 SV * const dsv = sv_newmortal();
1342 const char * const s
1343 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
1345 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
1346 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
1348 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1349 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %" IVdf "\n",
1352 if (mg->mg_flags & MGf_REFCOUNTED)
1353 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1356 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
1358 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%" UVxf, PTR2UV(mg->mg_ptr));
1359 if (mg->mg_len >= 0) {
1360 if (mg->mg_type != PERL_MAGIC_utf8) {
1361 SV * const sv = newSVpvs("");
1362 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1363 SvREFCNT_dec_NN(sv);
1366 else if (mg->mg_len == HEf_SVKEY) {
1367 PerlIO_puts(file, " => HEf_SVKEY\n");
1368 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1369 maxnest, dumpops, pvlim); /* MG is already +1 */
1372 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
1377 " does not know how to handle this MG_LEN"
1379 (void)PerlIO_putc(file, '\n');
1381 if (mg->mg_type == PERL_MAGIC_utf8) {
1382 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
1385 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1386 Perl_dump_indent(aTHX_ level, file,
1387 " %2" IVdf ": %" UVuf " -> %" UVuf "\n",
1390 (UV)cache[i * 2 + 1]);
1397 Perl_magic_dump(pTHX_ const MAGIC *mg)
1399 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
1403 Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
1407 PERL_ARGS_ASSERT_DO_HV_DUMP;
1409 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1410 if (sv && (hvname = HvNAME_get(sv)))
1412 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1413 name which quite legally could contain insane things like tabs, newlines, nulls or
1414 other scary crap - this should produce sane results - except maybe for unicode package
1415 names - but we will wait for someone to file a bug on that - demerphq */
1416 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1417 PerlIO_printf(file, "\t\"%s\"\n",
1418 generic_pv_escape( tmpsv, hvname,
1419 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1422 (void)PerlIO_putc(file, '\n');
1426 Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1428 PERL_ARGS_ASSERT_DO_GV_DUMP;
1430 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1431 if (sv && GvNAME(sv)) {
1432 SV * const tmpsv = newSVpvs("");
1433 PerlIO_printf(file, "\t\"%s\"\n",
1434 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1437 (void)PerlIO_putc(file, '\n');
1441 Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
1443 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1445 Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv));
1446 if (sv && GvNAME(sv)) {
1447 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1449 HV * const stash = GvSTASH(sv);
1450 PerlIO_printf(file, "\t");
1451 /* TODO might have an extra \" here */
1452 if (stash && (hvname = HvNAME_get(stash))) {
1453 PerlIO_printf(file, "\"%s\" :: \"",
1454 generic_pv_escape(tmp, hvname,
1455 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1457 PerlIO_printf(file, "%s\"\n",
1458 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
1461 (void)PerlIO_putc(file, '\n');
1464 const struct flag_to_name first_sv_flags_names[] = {
1465 {SVs_TEMP, "TEMP,"},
1466 {SVs_OBJECT, "OBJECT,"},
1475 const struct flag_to_name second_sv_flags_names[] = {
1477 {SVf_FAKE, "FAKE,"},
1478 {SVf_READONLY, "READONLY,"},
1479 {SVf_PROTECT, "PROTECT,"},
1480 {SVf_BREAK, "BREAK,"},
1486 const struct flag_to_name cv_flags_names[] = {
1487 {CVf_ANON, "ANON,"},
1488 {CVf_UNIQUE, "UNIQUE,"},
1489 {CVf_CLONE, "CLONE,"},
1490 {CVf_CLONED, "CLONED,"},
1491 {CVf_CONST, "CONST,"},
1492 {CVf_NODEBUG, "NODEBUG,"},
1493 {CVf_LVALUE, "LVALUE,"},
1494 {CVf_METHOD, "METHOD,"},
1495 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
1496 {CVf_CVGV_RC, "CVGV_RC,"},
1497 {CVf_DYNFILE, "DYNFILE,"},
1498 {CVf_AUTOLOAD, "AUTOLOAD,"},
1499 {CVf_HASEVAL, "HASEVAL,"},
1500 {CVf_SLABBED, "SLABBED,"},
1501 {CVf_NAMED, "NAMED,"},
1502 {CVf_LEXICAL, "LEXICAL,"},
1503 {CVf_ISXSUB, "ISXSUB,"}
1506 const struct flag_to_name hv_flags_names[] = {
1507 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1508 {SVphv_LAZYDEL, "LAZYDEL,"},
1509 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1510 {SVf_AMAGIC, "OVERLOAD,"},
1511 {SVphv_CLONEABLE, "CLONEABLE,"}
1514 const struct flag_to_name gp_flags_names[] = {
1515 {GVf_INTRO, "INTRO,"},
1516 {GVf_MULTI, "MULTI,"},
1517 {GVf_ASSUMECV, "ASSUMECV,"},
1520 const struct flag_to_name gp_flags_imported_names[] = {
1521 {GVf_IMPORTED_SV, " SV"},
1522 {GVf_IMPORTED_AV, " AV"},
1523 {GVf_IMPORTED_HV, " HV"},
1524 {GVf_IMPORTED_CV, " CV"},
1527 /* NOTE: this structure is mostly duplicative of one generated by
1528 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1529 * the two. - Yves */
1530 const struct flag_to_name regexp_extflags_names[] = {
1531 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1532 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1533 {RXf_PMf_FOLD, "PMf_FOLD,"},
1534 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1535 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
1536 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1537 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
1538 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
1539 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
1540 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1541 {RXf_CHECK_ALL, "CHECK_ALL,"},
1542 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1543 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1544 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1545 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1546 {RXf_SPLIT, "SPLIT,"},
1547 {RXf_COPY_DONE, "COPY_DONE,"},
1548 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1549 {RXf_TAINTED, "TAINTED,"},
1550 {RXf_START_ONLY, "START_ONLY,"},
1551 {RXf_SKIPWHITE, "SKIPWHITE,"},
1552 {RXf_WHITE, "WHITE,"},
1553 {RXf_NULL, "NULL,"},
1556 /* NOTE: this structure is mostly duplicative of one generated by
1557 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1558 * the two. - Yves */
1559 const struct flag_to_name regexp_core_intflags_names[] = {
1560 {PREGf_SKIP, "SKIP,"},
1561 {PREGf_IMPLICIT, "IMPLICIT,"},
1562 {PREGf_NAUGHTY, "NAUGHTY,"},
1563 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1564 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
1565 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
1566 {PREGf_NOSCAN, "NOSCAN,"},
1567 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1568 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
1569 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1570 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1571 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
1574 /* Perl_do_sv_dump():
1576 * level: amount to indent the output
1577 * sv: the object to dump
1578 * nest: the current level of recursion
1579 * maxnest: the maximum allowed level of recursion
1580 * dumpops: if true, also dump the ops associated with a CV
1581 * pvlim: limit on the length of any strings that are output
1585 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
1592 PERL_ARGS_ASSERT_DO_SV_DUMP;
1595 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
1599 flags = SvFLAGS(sv);
1602 /* process general SV flags */
1604 d = Perl_newSVpvf(aTHX_
1605 "(0x%" UVxf ") at 0x%" UVxf "\n%*s REFCNT = %" IVdf "\n%*s FLAGS = (",
1606 PTR2UV(SvANY(sv)), PTR2UV(sv),
1607 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1608 (int)(PL_dumpindent*level), "");
1610 if ((flags & SVs_PADSTALE))
1611 sv_catpv(d, "PADSTALE,");
1612 if ((flags & SVs_PADTMP))
1613 sv_catpv(d, "PADTMP,");
1614 append_flags(d, flags, first_sv_flags_names);
1615 if (flags & SVf_ROK) {
1616 sv_catpv(d, "ROK,");
1617 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1619 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
1620 append_flags(d, flags, second_sv_flags_names);
1621 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1622 && type != SVt_PVAV) {
1623 if (SvPCS_IMPORTED(sv))
1624 sv_catpv(d, "PCS_IMPORTED,");
1626 sv_catpv(d, "SCREAM,");
1629 /* process type-specific SV flags */
1634 append_flags(d, CvFLAGS(sv), cv_flags_names);
1637 append_flags(d, flags, hv_flags_names);
1641 if (isGV_with_GP(sv)) {
1642 append_flags(d, GvFLAGS(sv), gp_flags_names);
1644 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
1645 sv_catpv(d, "IMPORT");
1646 if (GvIMPORTED(sv) == GVf_IMPORTED)
1647 sv_catpv(d, "ALL,");
1650 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
1657 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
1663 /* SVphv_SHAREKEYS is also 0x20000000 */
1664 if ((type != SVt_PVHV) && SvUTF8(sv))
1665 sv_catpv(d, "UTF8");
1667 if (*(SvEND(d) - 1) == ',') {
1668 SvCUR_set(d, SvCUR(d) - 1);
1669 SvPVX(d)[SvCUR(d)] = '\0';
1674 /* dump initial SV details */
1676 #ifdef DEBUG_LEAKING_SCALARS
1677 Perl_dump_indent(aTHX_ level, file,
1678 "ALLOCATED at %s:%d %s %s (parent 0x%" UVxf "); serial %" UVuf "\n",
1679 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1681 sv->sv_debug_inpad ? "for" : "by",
1682 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
1683 PTR2UV(sv->sv_debug_parent),
1687 Perl_dump_indent(aTHX_ level, file, "SV = ");
1691 if (type < SVt_LAST) {
1692 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1694 if (type == SVt_NULL) {
1699 PerlIO_printf(file, "UNKNOWN(0x%" UVxf ") %s\n", (UV)type, s);
1704 /* Dump general SV fields */
1706 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
1707 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1708 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
1709 || (type == SVt_IV && !SvROK(sv))) {
1712 Perl_dump_indent(aTHX_ level, file, " UV = %" UVuf, (UV)SvUVX(sv));
1714 Perl_dump_indent(aTHX_ level, file, " IV = %" IVdf, (IV)SvIVX(sv));
1715 (void)PerlIO_putc(file, '\n');
1718 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
1719 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
1720 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
1721 || type == SVt_NV) {
1722 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1723 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
1724 RESTORE_LC_NUMERIC_UNDERLYING();
1728 Perl_dump_indent(aTHX_ level, file, " RV = 0x%" UVxf "\n",
1731 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
1734 if (type < SVt_PV) {
1739 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1740 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
1741 const bool re = isREGEXP(sv);
1742 const char * const ptr =
1743 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1747 SvOOK_offset(sv, delta);
1748 Perl_dump_indent(aTHX_ level, file," OFFSET = %" UVuf "\n",
1753 Perl_dump_indent(aTHX_ level, file," PV = 0x%" UVxf " ",
1756 PerlIO_printf(file, "( %s . ) ",
1757 pv_display(d, ptr - delta, delta, 0,
1760 if (type == SVt_INVLIST) {
1761 PerlIO_printf(file, "\n");
1762 /* 4 blanks indents 2 beyond the PV, etc */
1763 _invlist_dump(file, level, " ", sv);
1766 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1769 if (SvUTF8(sv)) /* the 6? \x{....} */
1770 PerlIO_printf(file, " [UTF8 \"%s\"]",
1771 sv_uni_display(d, sv, 6 * SvCUR(sv),
1773 PerlIO_printf(file, "\n");
1775 Perl_dump_indent(aTHX_ level, file, " CUR = %" IVdf "\n", (IV)SvCUR(sv));
1777 Perl_dump_indent(aTHX_ level, file, " LEN = %" IVdf "\n",
1779 #ifdef PERL_COPY_ON_WRITE
1780 if (SvIsCOW(sv) && SvLEN(sv))
1781 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1786 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
1789 if (type >= SVt_PVMG) {
1791 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
1793 do_hv_dump(level, file, " STASH", SvSTASH(sv));
1795 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1796 Perl_dump_indent(aTHX_ level, file, " USEFUL = %" IVdf "\n",
1801 /* Dump type-specific SV fields */
1805 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf,
1806 PTR2UV(AvARRAY(sv)));
1807 if (AvARRAY(sv) != AvALLOC(sv)) {
1808 PerlIO_printf(file, " (offset=%" IVdf ")\n",
1809 (IV)(AvARRAY(sv) - AvALLOC(sv)));
1810 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%" UVxf "\n",
1811 PTR2UV(AvALLOC(sv)));
1814 (void)PerlIO_putc(file, '\n');
1815 Perl_dump_indent(aTHX_ level, file, " FILL = %" IVdf "\n",
1817 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1820 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1821 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
1822 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1823 SvCUR(d) ? SvPVX_const(d) + 1 : "");
1824 if (nest < maxnest && AvARRAY(MUTABLE_AV(sv))) {
1826 SV **svp = AvARRAY(MUTABLE_AV(sv));
1828 count <= AvFILLp(MUTABLE_AV(sv)) && count < maxnest;
1831 SV* const elt = *svp;
1832 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %" IVdf "\n",
1834 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1841 struct xpvhv_aux *const aux = HvAUX(sv);
1842 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n",
1843 (UV)aux->xhv_aux_flags);
1845 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
1846 usedkeys = HvUSEDKEYS(sv);
1847 if (HvARRAY(sv) && usedkeys) {
1848 /* Show distribution of HEs in the ARRAY */
1850 #define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
1853 U32 pow2 = 2, keys = usedkeys;
1854 NV theoret, sum = 0;
1856 PerlIO_printf(file, " (");
1857 Zero(freq, FREQ_MAX + 1, int);
1858 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
1861 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1863 if (count > FREQ_MAX)
1869 for (i = 0; i <= max; i++) {
1871 PerlIO_printf(file, "%d%s:%d", i,
1872 (i == FREQ_MAX) ? "+" : "",
1875 PerlIO_printf(file, ", ");
1878 (void)PerlIO_putc(file, ')');
1879 /* The "quality" of a hash is defined as the total number of
1880 comparisons needed to access every element once, relative
1881 to the expected number needed for a random hash.
1883 The total number of comparisons is equal to the sum of
1884 the squares of the number of entries in each bucket.
1885 For a random hash of n keys into k buckets, the expected
1890 for (i = max; i > 0; i--) { /* Precision: count down. */
1891 sum += freq[i] * i * i;
1893 while ((keys = keys >> 1))
1896 theoret += theoret * (theoret-1)/pow2;
1897 (void)PerlIO_putc(file, '\n');
1898 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"
1899 NVff "%%", theoret/sum*100);
1901 (void)PerlIO_putc(file, '\n');
1902 Perl_dump_indent(aTHX_ level, file, " KEYS = %" IVdf "\n",
1906 HE **ents = HvARRAY(sv);
1909 HE *const *const last = ents + HvMAX(sv);
1910 count = last + 1 - ents;
1915 } while (++ents <= last);
1918 Perl_dump_indent(aTHX_ level, file, " FILL = %" UVuf "\n",
1921 Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n",
1924 Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n",
1925 (IV)HvRITER_get(sv));
1926 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n",
1927 PTR2UV(HvEITER_get(sv)));
1928 #ifdef PERL_HASH_RANDOMIZE_KEYS
1929 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%" UVxf,
1930 (UV)HvRAND_get(sv));
1931 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
1932 PerlIO_printf(file, " (LAST = 0x%" UVxf ")",
1933 (UV)HvLASTRAND_get(sv));
1936 (void)PerlIO_putc(file, '\n');
1939 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
1940 if (mg && mg->mg_obj) {
1941 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%" UVxf "\n", PTR2UV(mg->mg_obj));
1945 const char * const hvname = HvNAME_get(sv);
1947 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1948 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1949 generic_pv_escape( tmpsv, hvname,
1950 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1955 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
1956 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
1957 if (HvAUX(sv)->xhv_name_count)
1958 Perl_dump_indent(aTHX_
1959 level, file, " NAMECOUNT = %" IVdf "\n",
1960 (IV)HvAUX(sv)->xhv_name_count
1962 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
1963 const I32 count = HvAUX(sv)->xhv_name_count;
1965 SV * const names = newSVpvs_flags("", SVs_TEMP);
1966 /* The starting point is the first element if count is
1967 positive and the second element if count is negative. */
1968 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1969 + (count < 0 ? 1 : 0);
1970 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1971 + (count < 0 ? -count : count);
1972 while (hekp < endp) {
1974 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1975 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1976 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
1978 /* This should never happen. */
1979 sv_catpvs(names, ", (null)");
1983 Perl_dump_indent(aTHX_
1984 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1988 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1989 const char *const hvename = HvENAME_get(sv);
1990 Perl_dump_indent(aTHX_
1991 level, file, " ENAME = \"%s\"\n",
1992 generic_pv_escape(tmp, hvename,
1993 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1997 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%" UVxf "\n",
1999 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
2003 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2004 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"
2006 generic_pv_escape( tmpsv, meta->mro_which->name,
2007 meta->mro_which->length,
2008 (meta->mro_which->kflags & HVhek_UTF8)),
2009 PTR2UV(meta->mro_which));
2010 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"
2012 (UV)meta->cache_gen);
2013 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%" UVxf "\n",
2015 if (meta->mro_linear_all) {
2016 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"
2018 PTR2UV(meta->mro_linear_all));
2019 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
2022 if (meta->mro_linear_current) {
2023 Perl_dump_indent(aTHX_ level, file,
2024 " MRO_LINEAR_CURRENT = 0x%" UVxf "\n",
2025 PTR2UV(meta->mro_linear_current));
2026 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
2029 if (meta->mro_nextmethod) {
2030 Perl_dump_indent(aTHX_ level, file,
2031 " MRO_NEXTMETHOD = 0x%" UVxf "\n",
2032 PTR2UV(meta->mro_nextmethod));
2033 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
2037 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%" UVxf "\n",
2039 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
2044 if (nest < maxnest) {
2045 HV * const hv = MUTABLE_HV(sv);
2050 int count = maxnest - nest;
2051 for (i=0; i <= HvMAX(hv); i++) {
2052 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
2059 if (count-- <= 0) goto DONEHV;
2062 keysv = hv_iterkeysv(he);
2063 keypv = SvPV_const(keysv, len);
2066 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
2068 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
2069 if (HvEITER_get(hv) == he)
2070 PerlIO_printf(file, "[CURRENT] ");
2071 PerlIO_printf(file, "HASH = 0x%" UVxf "\n", (UV) hash);
2072 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
2079 } /* case SVt_PVHV */
2082 if (CvAUTOLOAD(sv)) {
2083 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2085 const char *const name = SvPV_const(sv, len);
2086 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
2087 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
2090 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2091 const char *const proto = CvPROTO(sv);
2092 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
2093 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
2098 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
2099 if (!CvISXSUB(sv)) {
2102 Perl_dump_indent(aTHX_ level, file,
2103 " SLAB = 0x%" UVxf "\n",
2104 PTR2UV(CvSTART(sv)));
2106 Perl_dump_indent(aTHX_ level, file,
2107 " START = 0x%" UVxf " ===> %" IVdf "\n",
2108 PTR2UV(CvSTART(sv)),
2109 (IV)sequence_num(CvSTART(sv)));
2111 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%" UVxf "\n",
2112 PTR2UV(CvROOT(sv)));
2113 if (CvROOT(sv) && dumpops) {
2114 do_op_dump(level+1, file, CvROOT(sv));
2117 SV * const constant = cv_const_sv((const CV *)sv);
2119 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%" UVxf "\n", PTR2UV(CvXSUB(sv)));
2122 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%" UVxf
2124 PTR2UV(CvXSUBANY(sv).any_ptr));
2125 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
2128 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %" IVdf "\n",
2129 (IV)CvXSUBANY(sv).any_i32);
2133 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2134 HEK_KEY(CvNAME_HEK((CV *)sv)));
2135 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
2136 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
2137 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"
2138 IVdf "\n", (IV)CvDEPTH(sv));
2139 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n",
2141 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %" UVuf "\n", (UV)CvOUTSIDE_SEQ(sv));
2142 if (!CvISXSUB(sv)) {
2143 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%" UVxf "\n", PTR2UV(CvPADLIST(sv)));
2144 if (nest < maxnest) {
2145 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
2149 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
2151 const CV * const outside = CvOUTSIDE(sv);
2152 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%" UVxf " (%s)\n",
2155 : CvANON(outside) ? "ANON"
2156 : (outside == PL_main_cv) ? "MAIN"
2157 : CvUNIQUE(outside) ? "UNIQUE"
2160 newSVpvs_flags("", SVs_TEMP),
2161 GvNAME(CvGV(outside)),
2162 GvNAMELEN(CvGV(outside)),
2163 GvNAMEUTF8(CvGV(outside)))
2167 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
2168 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
2173 if (type == SVt_PVLV) {
2174 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2175 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %" IVdf "\n", (IV)LvTARGOFF(sv));
2176 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %" IVdf "\n", (IV)LvTARGLEN(sv));
2177 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%" UVxf "\n", PTR2UV(LvTARG(sv)));
2178 Perl_dump_indent(aTHX_ level, file, " FLAGS = %" IVdf "\n", (IV)LvFLAGS(sv));
2179 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
2180 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2183 if (isREGEXP(sv)) goto dumpregexp;
2184 if (!isGV_with_GP(sv))
2187 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2188 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2189 generic_pv_escape(tmpsv, GvNAME(sv),
2193 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %" IVdf "\n", (IV)GvNAMELEN(sv));
2194 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
2195 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)GvFLAGS(sv));
2196 Perl_dump_indent(aTHX_ level, file, " GP = 0x%" UVxf "\n", PTR2UV(GvGP(sv)));
2199 Perl_dump_indent(aTHX_ level, file, " SV = 0x%" UVxf "\n", PTR2UV(GvSV(sv)));
2200 Perl_dump_indent(aTHX_ level, file, " REFCNT = %" IVdf "\n", (IV)GvREFCNT(sv));
2201 Perl_dump_indent(aTHX_ level, file, " IO = 0x%" UVxf "\n", PTR2UV(GvIOp(sv)));
2202 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%" UVxf " \n", PTR2UV(GvFORM(sv)));
2203 Perl_dump_indent(aTHX_ level, file, " AV = 0x%" UVxf "\n", PTR2UV(GvAV(sv)));
2204 Perl_dump_indent(aTHX_ level, file, " HV = 0x%" UVxf "\n", PTR2UV(GvHV(sv)));
2205 Perl_dump_indent(aTHX_ level, file, " CV = 0x%" UVxf "\n", PTR2UV(GvCV(sv)));
2206 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%" UVxf "\n", (UV)GvCVGEN(sv));
2207 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%" UVxf
2211 Perl_dump_indent(aTHX_ level, file, " LINE = %" IVdf "\n", (IV)GvLINE(sv));
2212 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
2213 do_gv_dump (level, file, " EGV", GvEGV(sv));
2216 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%" UVxf "\n", PTR2UV(IoIFP(sv)));
2217 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%" UVxf "\n", PTR2UV(IoOFP(sv)));
2218 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%" UVxf "\n", PTR2UV(IoDIRP(sv)));
2219 Perl_dump_indent(aTHX_ level, file, " LINES = %" IVdf "\n", (IV)IoLINES(sv));
2220 Perl_dump_indent(aTHX_ level, file, " PAGE = %" IVdf "\n", (IV)IoPAGE(sv));
2221 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %" IVdf "\n", (IV)IoPAGE_LEN(sv));
2222 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %" IVdf "\n", (IV)IoLINES_LEFT(sv));
2224 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
2225 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2226 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2228 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%" UVxf "\n",
2229 PTR2UV(IoTOP_GV(sv)));
2230 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2231 maxnest, dumpops, pvlim);
2233 /* Source filters hide things that are not GVs in these three, so let's
2234 be careful out there. */
2236 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
2237 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2238 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2240 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%" UVxf "\n",
2241 PTR2UV(IoFMT_GV(sv)));
2242 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2243 maxnest, dumpops, pvlim);
2245 if (IoBOTTOM_NAME(sv))
2246 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
2247 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2248 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2250 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%" UVxf "\n",
2251 PTR2UV(IoBOTTOM_GV(sv)));
2252 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2253 maxnest, dumpops, pvlim);
2255 if (isPRINT(IoTYPE(sv)))
2256 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
2258 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
2259 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%" UVxf "\n", (UV)IoFLAGS(sv));
2264 struct regexp * const r = ReANY((REGEXP*)sv);
2266 #define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
2268 append_flags(d, flags, names); \
2269 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2270 SvCUR_set(d, SvCUR(d) - 1); \
2271 SvPVX(d)[SvCUR(d)] = '\0'; \
2274 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
2275 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%" UVxf " (%s)\n",
2276 (UV)(r->compflags), SvPVX_const(d));
2278 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
2279 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%" UVxf " (%s)\n",
2280 (UV)(r->extflags), SvPVX_const(d));
2282 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%" UVxf " (%s)\n",
2283 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2284 if (r->engine == &PL_core_reg_engine) {
2285 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2286 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf " (%s)\n",
2287 (UV)(r->intflags), SvPVX_const(d));
2289 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "\n",
2292 #undef SV_SET_STRINGIFY_REGEXP_FLAGS
2293 Perl_dump_indent(aTHX_ level, file, " NPARENS = %" UVuf "\n",
2295 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %" UVuf "\n",
2296 (UV)(r->lastparen));
2297 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %" UVuf "\n",
2298 (UV)(r->lastcloseparen));
2299 Perl_dump_indent(aTHX_ level, file, " MINLEN = %" IVdf "\n",
2301 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %" IVdf "\n",
2302 (IV)(r->minlenret));
2303 Perl_dump_indent(aTHX_ level, file, " GOFS = %" UVuf "\n",
2305 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %" UVuf "\n",
2306 (UV)(r->pre_prefix));
2307 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %" IVdf "\n",
2309 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %" IVdf "\n",
2310 (IV)(r->suboffset));
2311 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %" IVdf "\n",
2312 (IV)(r->subcoffset));
2314 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%" UVxf " %s\n",
2316 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2318 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2319 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n",
2320 PTR2UV(r->mother_re));
2321 if (nest < maxnest && r->mother_re)
2322 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2323 maxnest, dumpops, pvlim);
2324 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%" UVxf "\n",
2325 PTR2UV(r->paren_names));
2326 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%" UVxf "\n",
2327 PTR2UV(r->substrs));
2328 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%" UVxf "\n",
2329 PTR2UV(r->pprivate));
2330 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%" UVxf "\n",
2332 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%" UVxf "\n",
2333 PTR2UV(r->qr_anoncv));
2335 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%" UVxf "\n",
2336 PTR2UV(r->saved_copy));
2347 Dumps the contents of an SV to the C<STDERR> filehandle.
2349 For an example of its output, see L<Devel::Peek>.
2355 Perl_sv_dump(pTHX_ SV *sv)
2357 PERL_ARGS_ASSERT_SV_DUMP;
2360 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2362 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
2366 Perl_runops_debug(pTHX)
2369 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
2373 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
2375 #ifdef PERL_TRACE_OPS
2376 ++PL_op_exec_cnt[PL_op->op_type];
2381 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
2382 PerlIO_printf(Perl_debug_log,
2383 "WARNING: %" UVxf " changed from %" UVxf " to %" UVxf "\n",
2384 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2385 PTR2UV(*PL_watchaddr));
2386 if (DEBUG_s_TEST_) {
2387 if (DEBUG_v_TEST_) {
2388 PerlIO_printf(Perl_debug_log, "\n");
2396 if (DEBUG_t_TEST_) debop(PL_op);
2397 if (DEBUG_P_TEST_) debprof(PL_op);
2402 PERL_DTRACE_PROBE_OP(PL_op);
2403 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
2404 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
2412 /* print the names of the n lexical vars starting at pad offset off */
2415 S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2418 CV * const cv = deb_curcv(cxstack_ix);
2419 PADNAMELIST *comppad = NULL;
2423 PADLIST * const padlist = CvPADLIST(cv);
2424 comppad = PadlistNAMES(padlist);
2427 PerlIO_printf(Perl_debug_log, "(");
2428 for (i = 0; i < n; i++) {
2429 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2430 PerlIO_printf(Perl_debug_log, "%" PNf, PNfARG(sv));
2432 PerlIO_printf(Perl_debug_log, "[%" UVuf "]",
2435 PerlIO_printf(Perl_debug_log, ",");
2438 PerlIO_printf(Perl_debug_log, ")");
2442 /* append to the out SV, the name of the lexical at offset off in the CV
2446 S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2447 bool paren, bool is_scalar)
2450 PADNAMELIST *namepad = NULL;
2454 PADLIST * const padlist = CvPADLIST(cv);
2455 namepad = PadlistNAMES(padlist);
2459 sv_catpvs_nomg(out, "(");
2460 for (i = 0; i < n; i++) {
2461 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2463 STRLEN cur = SvCUR(out);
2464 Perl_sv_catpvf(aTHX_ out, "[%" UTF8f,
2465 UTF8fARG(1, PadnameLEN(sv) - 1,
2466 PadnamePV(sv) + 1));
2468 SvPVX(out)[cur] = '$';
2471 Perl_sv_catpvf(aTHX_ out, "[%" UVuf "]", (UV)(off+i));
2473 sv_catpvs_nomg(out, ",");
2476 sv_catpvs_nomg(out, "(");
2481 S_append_gv_name(pTHX_ GV *gv, SV *out)
2485 sv_catpvs_nomg(out, "<NULLGV>");
2489 gv_fullname4(sv, gv, NULL, FALSE);
2490 Perl_sv_catpvf(aTHX_ out, "$%" SVf, SVfARG(sv));
2491 SvREFCNT_dec_NN(sv);
2495 # define ITEM_SV(item) (comppad ? \
2496 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
2498 # define ITEM_SV(item) UNOP_AUX_item_sv(item)
2502 /* return a temporary SV containing a stringified representation of
2503 * the op_aux field of a MULTIDEREF op, associated with CV cv
2507 Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
2509 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2510 UV actions = items->uv;
2513 bool is_hash = FALSE;
2515 SV *out = newSVpvn_flags("",0,SVs_TEMP);
2520 PADLIST *padlist = CvPADLIST(cv);
2521 comppad = PadlistARRAY(padlist)[1];
2527 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
2530 switch (actions & MDEREF_ACTION_MASK) {
2533 actions = (++items)->uv;
2535 NOT_REACHED; /* NOTREACHED */
2537 case MDEREF_HV_padhv_helem:
2540 case MDEREF_AV_padav_aelem:
2542 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2544 NOT_REACHED; /* NOTREACHED */
2546 case MDEREF_HV_gvhv_helem:
2549 case MDEREF_AV_gvav_aelem:
2552 sv = ITEM_SV(items);
2553 S_append_gv_name(aTHX_ (GV*)sv, out);
2555 NOT_REACHED; /* NOTREACHED */
2557 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2560 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
2562 sv = ITEM_SV(items);
2563 S_append_gv_name(aTHX_ (GV*)sv, out);
2564 goto do_vivify_rv2xv_elem;
2565 NOT_REACHED; /* NOTREACHED */
2567 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2570 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2571 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2572 goto do_vivify_rv2xv_elem;
2573 NOT_REACHED; /* NOTREACHED */
2575 case MDEREF_HV_pop_rv2hv_helem:
2576 case MDEREF_HV_vivify_rv2hv_helem:
2579 do_vivify_rv2xv_elem:
2580 case MDEREF_AV_pop_rv2av_aelem:
2581 case MDEREF_AV_vivify_rv2av_aelem:
2583 sv_catpvs_nomg(out, "->");
2585 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2586 sv_catpvs_nomg(out, "->");
2591 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2592 switch (actions & MDEREF_INDEX_MASK) {
2593 case MDEREF_INDEX_const:
2596 sv = ITEM_SV(items);
2598 sv_catpvs_nomg(out, "???");
2603 pv_pretty(out, s, cur, 30,
2605 (PERL_PV_PRETTY_NOCLEAR
2606 |PERL_PV_PRETTY_QUOTE
2607 |PERL_PV_PRETTY_ELLIPSES));
2611 Perl_sv_catpvf(aTHX_ out, "%" IVdf, (++items)->iv);
2613 case MDEREF_INDEX_padsv:
2614 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2616 case MDEREF_INDEX_gvsv:
2618 sv = ITEM_SV(items);
2619 S_append_gv_name(aTHX_ (GV*)sv, out);
2622 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2624 if (actions & MDEREF_FLAG_last)
2631 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2632 (int)(actions & MDEREF_ACTION_MASK));
2638 actions >>= MDEREF_SHIFT;
2645 Perl_debop(pTHX_ const OP *o)
2647 PERL_ARGS_ASSERT_DEBOP;
2649 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2652 Perl_deb(aTHX_ "%s", OP_NAME(o));
2653 switch (o->op_type) {
2656 /* With ITHREADS, consts are stored in the pad, and the right pad
2657 * may not be active here, so check.
2658 * Looks like only during compiling the pads are illegal.
2661 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2663 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
2667 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
2668 SV * const sv = newSV(0);
2669 gv_fullname3(sv, cGVOPo_gv, NULL);
2670 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
2671 SvREFCNT_dec_NN(sv);
2673 else if (cGVOPo_gv) {
2674 SV * const sv = newSV(0);
2675 assert(SvROK(cGVOPo_gv));
2676 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2677 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
2678 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
2679 SvREFCNT_dec_NN(sv);
2682 PerlIO_printf(Perl_debug_log, "(NULL)");
2689 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2693 S_deb_padvar(aTHX_ o->op_targ,
2694 o->op_private & OPpPADRANGE_COUNTMASK, 1);
2698 PerlIO_printf(Perl_debug_log, "(%" SVf ")",
2699 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
2705 PerlIO_printf(Perl_debug_log, "\n");
2711 =for apidoc op_class
2713 Given an op, determine what type of struct it has been allocated as.
2714 Returns one of the OPclass enums, such as OPclass_LISTOP.
2721 Perl_op_class(pTHX_ const OP *o)
2726 return OPclass_NULL;
2728 if (o->op_type == 0) {
2729 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
2731 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2734 if (o->op_type == OP_SASSIGN)
2735 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPclass_UNOP : OPclass_BINOP);
2737 if (o->op_type == OP_AELEMFAST) {
2739 return OPclass_PADOP;
2741 return OPclass_SVOP;
2746 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
2747 o->op_type == OP_RCATLINE)
2748 return OPclass_PADOP;
2751 if (o->op_type == OP_CUSTOM)
2754 switch (OP_CLASS(o)) {
2756 return OPclass_BASEOP;
2759 return OPclass_UNOP;
2762 return OPclass_BINOP;
2765 return OPclass_LOGOP;
2768 return OPclass_LISTOP;
2771 return OPclass_PMOP;
2774 return OPclass_SVOP;
2777 return OPclass_PADOP;
2779 case OA_PVOP_OR_SVOP:
2781 * Character translations (tr///) are usually a PVOP, keeping a
2782 * pointer to a table of shorts used to look up translations.
2783 * Under utf8, however, a simple table isn't practical; instead,
2784 * the OP is an SVOP (or, under threads, a PADOP),
2785 * and the SV is a reference to a swash
2786 * (i.e., an RV pointing to an HV).
2789 (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
2791 #if defined(USE_ITHREADS)
2792 ? OPclass_PADOP : OPclass_PVOP;
2794 ? OPclass_SVOP : OPclass_PVOP;
2798 return OPclass_LOOP;
2803 case OA_BASEOP_OR_UNOP:
2805 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
2806 * whether parens were seen. perly.y uses OPf_SPECIAL to
2807 * signal whether a BASEOP had empty parens or none.
2808 * Some other UNOPs are created later, though, so the best
2809 * test is OPf_KIDS, which is set in newUNOP.
2811 return (o->op_flags & OPf_KIDS) ? OPclass_UNOP : OPclass_BASEOP;
2815 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
2816 * the OPf_REF flag to distinguish between OP types instead of the
2817 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
2818 * return OPclass_UNOP so that walkoptree can find our children. If
2819 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
2820 * (no argument to the operator) it's an OP; with OPf_REF set it's
2821 * an SVOP (and op_sv is the GV for the filehandle argument).
2823 return ((o->op_flags & OPf_KIDS) ? OPclass_UNOP :
2825 (o->op_flags & OPf_REF) ? OPclass_PADOP : OPclass_BASEOP);
2827 (o->op_flags & OPf_REF) ? OPclass_SVOP : OPclass_BASEOP);
2831 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
2832 * label was omitted (in which case it's a BASEOP) or else a term was
2833 * seen. In this last case, all except goto are definitely PVOP but
2834 * goto is either a PVOP (with an ordinary constant label), an UNOP
2835 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
2836 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
2839 if (o->op_flags & OPf_STACKED)
2840 return OPclass_UNOP;
2841 else if (o->op_flags & OPf_SPECIAL)
2842 return OPclass_BASEOP;
2844 return OPclass_PVOP;
2846 return OPclass_METHOP;
2848 return OPclass_UNOP_AUX;
2850 Perl_warn(aTHX_ "Can't determine class of operator %s, assuming BASEOP\n",
2852 return OPclass_BASEOP;
2858 S_deb_curcv(pTHX_ I32 ix)
2860 PERL_SI *si = PL_curstackinfo;
2861 for (; ix >=0; ix--) {
2862 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2864 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2865 return cx->blk_sub.cv;
2866 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2867 return cx->blk_eval.cv;
2868 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2870 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2871 && si->si_type == PERLSI_SORT)
2873 /* fake sort sub; use CV of caller */
2875 ix = si->si_cxix + 1;
2882 Perl_watch(pTHX_ char **addr)
2884 PERL_ARGS_ASSERT_WATCH;
2886 PL_watchaddr = addr;
2888 PerlIO_printf(Perl_debug_log, "WATCHING, %" UVxf " is currently %" UVxf "\n",
2889 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2893 S_debprof(pTHX_ const OP *o)
2895 PERL_ARGS_ASSERT_DEBPROF;
2897 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
2899 if (!PL_profiledata)
2900 Newxz(PL_profiledata, MAXO, U32);
2901 ++PL_profiledata[o->op_type];
2905 Perl_debprofdump(pTHX)
2908 if (!PL_profiledata)
2910 for (i = 0; i < MAXO; i++) {
2911 if (PL_profiledata[i])
2912 PerlIO_printf(Perl_debug_log,
2913 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2920 * ex: set ts=8 sts=4 sw=4 et: