This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update ExtUtils-MakeMaker to CPAN version 7.00
[perl5.git] / dump.c
CommitLineData
a0d0e21e 1/* dump.c
a687059c 2 *
1129b882
NC
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
a687059c 5 *
6e21c824
LW
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.
8d063cd8 8 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
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.'
14 *
15 * [p.220 of _The Lord of the Rings_, II/i: "Many Meetings"]
8d063cd8
LW
16 */
17
166f8a29 18/* This file contains utility routines to dump the contents of SV and OP
61296642 19 * structures, as used by command-line options like -Dt and -Dx, and
166f8a29
DM
20 * by Devel::Peek.
21 *
22 * It also holds the debugging version of the runops function.
dcccc8ff
KW
23
24=head1 Display and Dump functions
166f8a29
DM
25 */
26
8d063cd8 27#include "EXTERN.h"
864dbfa3 28#define PERL_IN_DUMP_C
8d063cd8 29#include "perl.h"
f722798b 30#include "regcomp.h"
0bd48802 31
5357ca29
NC
32static const char* const svtypenames[SVt_LAST] = {
33 "NULL",
34 "IV",
b53eecb4 35 "NV",
5357ca29 36 "PV",
e94d9b54 37 "INVLIST",
5357ca29
NC
38 "PVIV",
39 "PVNV",
40 "PVMG",
5c35adbb 41 "REGEXP",
5357ca29
NC
42 "PVGV",
43 "PVLV",
44 "PVAV",
45 "PVHV",
46 "PVCV",
47 "PVFM",
48 "PVIO"
49};
50
51
52static const char* const svshorttypenames[SVt_LAST] = {
53 "UNDEF",
54 "IV",
b53eecb4 55 "NV",
5357ca29 56 "PV",
e94d9b54 57 "INVLST",
5357ca29
NC
58 "PVIV",
59 "PVNV",
60 "PVMG",
5c35adbb 61 "REGEXP",
5357ca29
NC
62 "GV",
63 "PVLV",
64 "AV",
65 "HV",
66 "CV",
67 "FM",
68 "IO"
69};
70
a0c2f4dd
NC
71struct flag_to_name {
72 U32 flag;
73 const char *name;
74};
75
76static void
77S_append_flags(pTHX_ SV *sv, U32 flags, const struct flag_to_name *start,
78 const struct flag_to_name *const end)
79{
80 do {
81 if (flags & start->flag)
82 sv_catpv(sv, start->name);
83 } while (++start < end);
84}
85
86#define append_flags(sv, f, flags) \
cd431fde 87 S_append_flags(aTHX_ (sv), (f), (flags), C_ARRAY_END(flags))
a0c2f4dd 88
0eb335df
BF
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) )
93
3df15adc 94/*
87cea99e 95=for apidoc pv_escape
3df15adc
YO
96
97Escapes at most the first "count" chars of pv and puts the results into
ab3bbdeb 98dsv such that the size of the escaped string will not exceed "max" chars
4420a417
YO
99and will not contain any incomplete escape sequences. The number of bytes
100escaped will be returned in the STRLEN *escaped parameter if it is not null.
101When the dsv parameter is null no escaping actually occurs, but the number
102of bytes that would be escaped were it not null will be calculated.
3df15adc 103
ab3bbdeb
YO
104If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
105will also be escaped.
3df15adc
YO
106
107Normally the SV will be cleared before the escaped string is prepared,
ab3bbdeb
YO
108but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
109
38a44b82 110If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
ab3bbdeb 111if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
38a44b82 112using C<is_utf8_string()> to determine if it is Unicode.
ab3bbdeb
YO
113
114If PERL_PV_ESCAPE_ALL is set then all input chars will be output
681f01c2 115using C<\x01F1> style escapes, otherwise if PERL_PV_ESCAPE_NONASCII is set, only
951cbe24 116non-ASCII chars will be escaped using this style; otherwise, only chars above
681f01c2 117255 will be so escaped; other non printable chars will use octal or
72d33970
FC
118common escaped patterns like C<\n>.
119Otherwise, if PERL_PV_ESCAPE_NOBACKSLASH
681f01c2 120then all chars below 255 will be treated as printable and
ab3bbdeb
YO
121will be output as literals.
122
123If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
72d33970 124string will be escaped, regardless of max. If the output is to be in hex,
c8536afa 125then it will be returned as a plain hex
72d33970 126sequence. Thus the output will either be a single char,
c8536afa 127an octal escape sequence, a special escape like C<\n> or a hex value.
3df15adc 128
44a2ac75 129If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
72d33970 130not a '\\'. This is because regexes very often contain backslashed
44a2ac75
YO
131sequences, whereas '%' is not a particularly common character in patterns.
132
ab3bbdeb 133Returns a pointer to the escaped text as held by dsv.
3df15adc
YO
134
135=cut
136*/
ab3bbdeb 137#define PV_ESCAPE_OCTBUFSIZE 32
ddc5bc0f 138
3967c732 139char *
ddc5bc0f 140Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
ab3bbdeb
YO
141 const STRLEN count, const STRLEN max,
142 STRLEN * const escaped, const U32 flags )
143{
61f9802b
AL
144 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
145 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
44a2ac75 146 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
ab3bbdeb
YO
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 */
38a44b82 150 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
ddc5bc0f 151 const char *pv = str;
61f9802b 152 const char * const end = pv + count; /* end of string */
44a2ac75 153 octbuf[0] = esc;
ab3bbdeb 154
7918f24d
NC
155 PERL_ARGS_ASSERT_PV_ESCAPE;
156
4420a417 157 if (dsv && !(flags & PERL_PV_ESCAPE_NOCLEAR)) {
7fddd944 158 /* This won't alter the UTF-8 flag */
76f68e9b 159 sv_setpvs(dsv, "");
7fddd944 160 }
ab3bbdeb 161
ddc5bc0f 162 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
ab3bbdeb
YO
163 isuni = 1;
164
165 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
4b88fb76 166 const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv;
ab3bbdeb
YO
167 const U8 c = (U8)u & 0xFF;
168
681f01c2
KW
169 if ( ( u > 255 )
170 || (flags & PERL_PV_ESCAPE_ALL)
0eb335df 171 || (( ! isASCII(u) ) && (flags & (PERL_PV_ESCAPE_NONASCII|PERL_PV_ESCAPE_DWIM))))
681f01c2 172 {
ab3bbdeb
YO
173 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
174 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
175 "%"UVxf, u);
176 else
177 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
0eb335df
BF
178 ((flags & PERL_PV_ESCAPE_DWIM) && !isuni)
179 ? "%cx%02"UVxf
180 : "%cx{%02"UVxf"}", esc, u);
181
ab3bbdeb
YO
182 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
183 chsize = 1;
184 } else {
44a2ac75
YO
185 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
186 chsize = 2;
ab3bbdeb 187 switch (c) {
44a2ac75 188
924ba076 189 case '\\' : /* FALLTHROUGH */
44a2ac75
YO
190 case '%' : if ( c == esc ) {
191 octbuf[1] = esc;
192 } else {
193 chsize = 1;
194 }
195 break;
3df15adc
YO
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;
44a2ac75 201 case '"' :
ab3bbdeb 202 if ( dq == '"' )
3df15adc 203 octbuf[1] = '"';
ab3bbdeb
YO
204 else
205 chsize = 1;
44a2ac75 206 break;
3df15adc 207 default:
0eb335df
BF
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,
211 esc, u);
212 }
213 else if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
ab3bbdeb 214 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
44a2ac75
YO
215 "%c%03o", esc, c);
216 else
ab3bbdeb 217 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
44a2ac75 218 "%c%o", esc, c);
ab3bbdeb
YO
219 }
220 } else {
44a2ac75 221 chsize = 1;
ab3bbdeb 222 }
44a2ac75
YO
223 }
224 if ( max && (wrote + chsize > max) ) {
225 break;
ab3bbdeb 226 } else if (chsize > 1) {
4420a417
YO
227 if (dsv)
228 sv_catpvn(dsv, octbuf, chsize);
44a2ac75 229 wrote += chsize;
3df15adc 230 } else {
951cbe24
KW
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
7fddd944
NC
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
951cbe24 236 really an array of octets, not a string. */
4420a417
YO
237 if (dsv)
238 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
3df15adc
YO
239 wrote++;
240 }
ab3bbdeb
YO
241 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
242 break;
3967c732 243 }
ab3bbdeb
YO
244 if (escaped != NULL)
245 *escaped= pv - str;
4420a417 246 return dsv ? SvPVX(dsv) : NULL;
ab3bbdeb
YO
247}
248/*
87cea99e 249=for apidoc pv_pretty
ab3bbdeb
YO
250
251Converts a string into something presentable, handling escaping via
95b611b0 252pv_escape() and supporting quoting and ellipses.
ab3bbdeb
YO
253
254If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
72d33970 255double quoted with any double quotes in the string escaped. Otherwise
ab3bbdeb
YO
256if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
257angle brackets.
6cba11c8 258
95b611b0
RGS
259If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
260string were output then an ellipsis C<...> will be appended to the
72d33970 261string. Note that this happens AFTER it has been quoted.
6cba11c8 262
ab3bbdeb 263If start_color is non-null then it will be inserted after the opening
72d33970 264quote (if there is one) but before the escaped text. If end_color
ab3bbdeb 265is non-null then it will be inserted after the escaped text but before
95b611b0 266any quotes or ellipses.
ab3bbdeb
YO
267
268Returns a pointer to the prettified text as held by dsv.
6cba11c8 269
ab3bbdeb
YO
270=cut
271*/
272
273char *
ddc5bc0f
YO
274Perl_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,
ab3bbdeb
YO
276 const U32 flags )
277{
3602166e
FC
278 const U8 *quotes = (U8*)((flags & PERL_PV_PRETTY_QUOTE) ? "\"\"" :
279 (flags & PERL_PV_PRETTY_LTGT) ? "<>" : NULL);
ab3bbdeb 280 STRLEN escaped;
4420a417
YO
281 STRLEN max_adjust= 0;
282 STRLEN orig_cur;
7918f24d
NC
283
284 PERL_ARGS_ASSERT_PV_PRETTY;
285
881a015e 286 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
4420a417
YO
287 /* This won't alter the UTF-8 flag */
288 sv_setpvs(dsv, "");
881a015e 289 }
4420a417 290 orig_cur= SvCUR(dsv);
881a015e 291
4420a417
YO
292 if ( quotes )
293 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[0]);
ab3bbdeb
YO
294
295 if ( start_color != NULL )
76f68e9b 296 sv_catpv(dsv, start_color);
4420a417
YO
297
298 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
299 if (quotes)
300 max_adjust += 2;
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 ) )
304 max_adjust += 3;
305 assert(max > max_adjust);
306 }
307
308 pv_escape( dsv, str, count, max - max_adjust, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
309
ab3bbdeb 310 if ( end_color != NULL )
76f68e9b 311 sv_catpv(dsv, end_color);
ab3bbdeb 312
4420a417
YO
313 if ( quotes )
314 Perl_sv_catpvf(aTHX_ dsv, "%c", quotes[1]);
ab3bbdeb 315
95b611b0 316 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
76f68e9b 317 sv_catpvs(dsv, "...");
4420a417
YO
318
319 if ((flags & PERL_PV_PRETTY_EXACTSIZE)) {
320 while( SvCUR(dsv) - orig_cur < max )
321 sv_catpvs(dsv," ");
322 }
ab3bbdeb 323
3df15adc
YO
324 return SvPVX(dsv);
325}
326
327/*
328=for apidoc pv_display
329
3df15adc 330Similar to
3967c732 331
3df15adc
YO
332 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
333
334except that an additional "\0" will be appended to the string when
335len > cur and pv[cur] is "\0".
336
337Note that the final string may be up to 7 chars longer than pvlim.
338
339=cut
340*/
341
342char *
343Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
344{
7918f24d
NC
345 PERL_ARGS_ASSERT_PV_DISPLAY;
346
ddc5bc0f 347 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
3df15adc 348 if (len > cur && pv[cur] == '\0')
76f68e9b 349 sv_catpvs( dsv, "\\0");
e6abe6d8
JH
350 return SvPVX(dsv);
351}
352
353char *
864dbfa3 354Perl_sv_peek(pTHX_ SV *sv)
3967c732 355{
27da23d5 356 dVAR;
aec46f14 357 SV * const t = sv_newmortal();
3967c732 358 int unref = 0;
5357ca29 359 U32 type;
3967c732 360
76f68e9b 361 sv_setpvs(t, "");
3967c732
JD
362 retry:
363 if (!sv) {
364 sv_catpv(t, "VOID");
365 goto finish;
366 }
8ee91b45
YO
367 else if (sv == (const SV *)0x55555555 || ((char)SvTYPE(sv)) == 'U') {
368 /* detect data corruption under memory poisoning */
3967c732
JD
369 sv_catpv(t, "WILD");
370 goto finish;
371 }
7996736c 372 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
3967c732
JD
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)) &&
377 SvREADONLY(sv))
378 goto finish;
379 }
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|
385 SVp_POK|SVp_NOK)) &&
386 SvCUR(sv) == 0 &&
659c4b96 387 SvNVX(sv) == 0.0)
3967c732
JD
388 goto finish;
389 }
7996736c 390 else if (sv == &PL_sv_yes) {
3967c732
JD
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|
395 SVp_POK|SVp_NOK)) &&
396 SvCUR(sv) == 1 &&
b15aece3 397 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
659c4b96 398 SvNVX(sv) == 1.0)
3967c732 399 goto finish;
7996736c
MHM
400 }
401 else {
402 sv_catpv(t, "SV_PLACEHOLDER");
403 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
404 SVs_GMG|SVs_SMG|SVs_RMG)) &&
405 SvREADONLY(sv))
406 goto finish;
3967c732
JD
407 }
408 sv_catpv(t, ":");
409 }
410 else if (SvREFCNT(sv) == 0) {
411 sv_catpv(t, "(");
412 unref++;
413 }
a3b4c9c6
DM
414 else if (DEBUG_R_TEST_) {
415 int is_tmp = 0;
e8eb279c 416 SSize_t ix;
a3b4c9c6
DM
417 /* is this SV on the tmps stack? */
418 for (ix=PL_tmps_ix; ix>=0; ix--) {
419 if (PL_tmps_stack[ix] == sv) {
420 is_tmp = 1;
421 break;
422 }
423 }
424 if (SvREFCNT(sv) > 1)
425 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
426 is_tmp ? "T" : "");
427 else if (is_tmp)
428 sv_catpv(t, "<T>");
04932ac8
DM
429 }
430
3967c732
JD
431 if (SvROK(sv)) {
432 sv_catpv(t, "\\");
433 if (SvCUR(t) + unref > 10) {
b162af07 434 SvCUR_set(t, unref + 3);
3967c732
JD
435 *SvEND(t) = '\0';
436 sv_catpv(t, "...");
437 goto finish;
438 }
ad64d0ec 439 sv = SvRV(sv);
3967c732
JD
440 goto retry;
441 }
5357ca29
NC
442 type = SvTYPE(sv);
443 if (type == SVt_PVCV) {
0eb335df
BF
444 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
445 GV* gvcv = CvGV(sv);
c53e4eb5 446 Perl_sv_catpvf(aTHX_ t, "CV(%s)", gvcv
0eb335df
BF
447 ? generic_pv_escape( tmp, GvNAME(gvcv), GvNAMELEN(gvcv), GvNAMEUTF8(gvcv))
448 : "");
3967c732 449 goto finish;
5357ca29
NC
450 } else if (type < SVt_LAST) {
451 sv_catpv(t, svshorttypenames[type]);
3967c732 452
5357ca29
NC
453 if (type == SVt_NULL)
454 goto finish;
455 } else {
456 sv_catpv(t, "FREED");
3967c732 457 goto finish;
3967c732
JD
458 }
459
460 if (SvPOKp(sv)) {
b15aece3 461 if (!SvPVX_const(sv))
3967c732
JD
462 sv_catpv(t, "(null)");
463 else {
17605be7 464 SV * const tmp = newSVpvs("");
3967c732 465 sv_catpv(t, "(");
5115136b
DM
466 if (SvOOK(sv)) {
467 STRLEN delta;
468 SvOOK_offset(sv, delta);
469 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
470 }
b15aece3 471 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
32639b87 472 if (SvUTF8(sv))
b2ff9928 473 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
e9569a7a 474 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
c728cb41 475 UNI_DISPLAY_QQ));
17605be7 476 SvREFCNT_dec_NN(tmp);
3967c732
JD
477 }
478 }
479 else if (SvNOKp(sv)) {
e54dc35b 480 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 481 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
e54dc35b 482 RESTORE_NUMERIC_LOCAL();
3967c732 483 }
57def98f 484 else if (SvIOKp(sv)) {
cf2093f6 485 if (SvIsUV(sv))
57def98f 486 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
cf2093f6 487 else
57def98f 488 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
25da4f38 489 }
3967c732
JD
490 else
491 sv_catpv(t, "()");
2ef28da1 492
3967c732 493 finish:
61f9802b
AL
494 while (unref--)
495 sv_catpv(t, ")");
9adb2837 496 if (TAINTING_get && sv && SvTAINTED(sv))
59b714e2 497 sv_catpv(t, " [tainted]");
8b6b16e7 498 return SvPV_nolen(t);
3967c732
JD
499}
500
36b1c95c
MH
501/*
502=head1 Debugging Utilities
503*/
504
505void
506Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
507{
508 va_list args;
509 PERL_ARGS_ASSERT_DUMP_INDENT;
510 va_start(args, pat);
511 dump_vindent(level, file, pat, &args);
512 va_end(args);
513}
514
515void
516Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
517{
36b1c95c
MH
518 PERL_ARGS_ASSERT_DUMP_VINDENT;
519 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
520 PerlIO_vprintf(file, pat, *args);
521}
522
523/*
524=for apidoc dump_all
525
526Dumps the entire optree of the current program starting at C<PL_main_root> to
72d33970
FC
527C<STDERR>. Also dumps the optrees for all visible subroutines in
528C<PL_defstash>.
36b1c95c
MH
529
530=cut
531*/
532
533void
534Perl_dump_all(pTHX)
535{
536 dump_all_perl(FALSE);
537}
538
539void
540Perl_dump_all_perl(pTHX_ bool justperl)
541{
36b1c95c
MH
542 PerlIO_setlinebuf(Perl_debug_log);
543 if (PL_main_root)
544 op_dump(PL_main_root);
545 dump_packsubs_perl(PL_defstash, justperl);
546}
547
548/*
549=for apidoc dump_packsubs
550
551Dumps the optrees for all visible subroutines in C<stash>.
552
553=cut
554*/
555
556void
557Perl_dump_packsubs(pTHX_ const HV *stash)
558{
559 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
560 dump_packsubs_perl(stash, FALSE);
561}
562
563void
564Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
565{
36b1c95c
MH
566 I32 i;
567
568 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
569
570 if (!HvARRAY(stash))
571 return;
572 for (i = 0; i <= (I32) HvMAX(stash); i++) {
573 const HE *entry;
574 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
575 const GV * const gv = (const GV *)HeVAL(entry);
576 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
577 continue;
578 if (GvCVu(gv))
579 dump_sub_perl(gv, justperl);
580 if (GvFORM(gv))
581 dump_form(gv);
582 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
583 const HV * const hv = GvHV(gv);
584 if (hv && (hv != PL_defstash))
585 dump_packsubs_perl(hv, justperl); /* nested package */
586 }
587 }
588 }
589}
590
591void
592Perl_dump_sub(pTHX_ const GV *gv)
593{
594 PERL_ARGS_ASSERT_DUMP_SUB;
595 dump_sub_perl(gv, FALSE);
596}
597
598void
599Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
600{
0eb335df
BF
601 STRLEN len;
602 SV * const sv = newSVpvs_flags("", SVs_TEMP);
603 SV *tmpsv;
604 const char * name;
36b1c95c
MH
605
606 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
607
608 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
609 return;
610
0eb335df 611 tmpsv = newSVpvs_flags("", SVs_TEMP);
36b1c95c 612 gv_fullname3(sv, gv, NULL);
0eb335df
BF
613 name = SvPV_const(sv, len);
614 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
615 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
36b1c95c
MH
616 if (CvISXSUB(GvCV(gv)))
617 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
618 PTR2UV(CvXSUB(GvCV(gv))),
619 (int)CvXSUBANY(GvCV(gv)).any_i32);
620 else if (CvROOT(GvCV(gv)))
621 op_dump(CvROOT(GvCV(gv)));
622 else
623 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
624}
625
626void
627Perl_dump_form(pTHX_ const GV *gv)
628{
629 SV * const sv = sv_newmortal();
630
631 PERL_ARGS_ASSERT_DUMP_FORM;
632
633 gv_fullname3(sv, gv, NULL);
634 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
635 if (CvROOT(GvFORM(gv)))
636 op_dump(CvROOT(GvFORM(gv)));
637 else
638 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
639}
640
641void
642Perl_dump_eval(pTHX)
643{
36b1c95c
MH
644 op_dump(PL_eval_root);
645}
646
3967c732 647void
6867be6d 648Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
3967c732
JD
649{
650 char ch;
651
7918f24d
NC
652 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
653
3967c732 654 if (!pm) {
cea2e8a9 655 Perl_dump_indent(aTHX_ level, file, "{}\n");
3967c732
JD
656 return;
657 }
cea2e8a9 658 Perl_dump_indent(aTHX_ level, file, "{\n");
3967c732
JD
659 level++;
660 if (pm->op_pmflags & PMf_ONCE)
661 ch = '?';
662 else
663 ch = '/';
aaa362c4 664 if (PM_GETRE(pm))
f87fee25
FC
665 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%.*s%c%s\n",
666 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch,
3967c732
JD
667 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
668 else
cea2e8a9 669 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
20e98b0f 670 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
cea2e8a9 671 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
20e98b0f 672 op_dump(pm->op_pmreplrootu.op_pmreplroot);
3967c732 673 }
68e2671b 674 if (pm->op_code_list) {
867940b8
DM
675 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
676 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
677 do_op_dump(level, file, pm->op_code_list);
678 }
679 else
680 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
681 PTR2UV(pm->op_code_list));
68e2671b 682 }
07bc277f 683 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
4199688e 684 SV * const tmpsv = pm_description(pm);
b15aece3 685 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
5f954473 686 SvREFCNT_dec_NN(tmpsv);
3967c732
JD
687 }
688
cea2e8a9 689 Perl_dump_indent(aTHX_ level-1, file, "}\n");
3967c732
JD
690}
691
a0c2f4dd
NC
692const struct flag_to_name pmflags_flags_names[] = {
693 {PMf_CONST, ",CONST"},
694 {PMf_KEEP, ",KEEP"},
695 {PMf_GLOBAL, ",GLOBAL"},
696 {PMf_CONTINUE, ",CONTINUE"},
697 {PMf_RETAINT, ",RETAINT"},
698 {PMf_EVAL, ",EVAL"},
699 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
d63c20f2 700 {PMf_HAS_CV, ",HAS_CV"},
2a92a973
DM
701 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
702 {PMf_IS_QR, ",IS_QR"}
a0c2f4dd
NC
703};
704
b9ac451d 705static SV *
4199688e
AL
706S_pm_description(pTHX_ const PMOP *pm)
707{
708 SV * const desc = newSVpvs("");
61f9802b 709 const REGEXP * const regex = PM_GETRE(pm);
4199688e
AL
710 const U32 pmflags = pm->op_pmflags;
711
7918f24d
NC
712 PERL_ARGS_ASSERT_PM_DESCRIPTION;
713
4199688e
AL
714 if (pmflags & PMf_ONCE)
715 sv_catpv(desc, ",ONCE");
c737faaf
YO
716#ifdef USE_ITHREADS
717 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
718 sv_catpv(desc, ":USED");
719#else
720 if (pmflags & PMf_USED)
721 sv_catpv(desc, ":USED");
722#endif
c737faaf 723
68d4833d 724 if (regex) {
284167a5 725 if (RX_ISTAINTED(regex))
68d4833d 726 sv_catpv(desc, ",TAINTED");
07bc277f 727 if (RX_CHECK_SUBSTR(regex)) {
e3e400ec 728 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
68d4833d 729 sv_catpv(desc, ",SCANFIRST");
07bc277f 730 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
68d4833d
AB
731 sv_catpv(desc, ",ALL");
732 }
dbc200c5
YO
733 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
734 sv_catpv(desc, ",SKIPWHITE");
4199688e 735 }
68d4833d 736
a0c2f4dd 737 append_flags(desc, pmflags, pmflags_flags_names);
4199688e
AL
738 return desc;
739}
740
3967c732 741void
864dbfa3 742Perl_pmop_dump(pTHX_ PMOP *pm)
3967c732
JD
743{
744 do_pmop_dump(0, Perl_debug_log, pm);
79072805
LW
745}
746
b6f05621
DM
747/* Return a unique integer to represent the address of op o.
748 * If it already exists in PL_op_sequence, just return it;
749 * otherwise add it.
750 * *** Note that this isn't thread-safe */
294b3b39 751
2814eb74 752STATIC UV
0bd48802 753S_sequence_num(pTHX_ const OP *o)
2814eb74 754{
27da23d5 755 dVAR;
2814eb74
PJ
756 SV *op,
757 **seq;
93524f2b 758 const char *key;
2814eb74 759 STRLEN len;
b6f05621
DM
760 if (!o)
761 return 0;
c0fd1b42 762 op = newSVuv(PTR2UV(o));
b6f05621 763 sv_2mortal(op);
93524f2b 764 key = SvPV_const(op, len);
b6f05621
DM
765 if (!PL_op_sequence)
766 PL_op_sequence = newHV();
767 seq = hv_fetch(PL_op_sequence, key, len, 0);
768 if (seq)
769 return SvUV(*seq);
770 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
771 return PL_op_seq;
2814eb74
PJ
772}
773
f3574cc6
DM
774
775
776
777
a0c2f4dd
NC
778const struct flag_to_name op_flags_names[] = {
779 {OPf_KIDS, ",KIDS"},
780 {OPf_PARENS, ",PARENS"},
a0c2f4dd
NC
781 {OPf_REF, ",REF"},
782 {OPf_MOD, ",MOD"},
65cccc5e 783 {OPf_STACKED, ",STACKED"},
a0c2f4dd
NC
784 {OPf_SPECIAL, ",SPECIAL"}
785};
786
75a6ad4a 787
79072805 788void
6867be6d 789Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
79072805 790{
2814eb74 791 UV seq;
e15d5972
AL
792 const OPCODE optype = o->op_type;
793
7918f24d
NC
794 PERL_ARGS_ASSERT_DO_OP_DUMP;
795
cea2e8a9 796 Perl_dump_indent(aTHX_ level, file, "{\n");
3967c732 797 level++;
0bd48802 798 seq = sequence_num(o);
2814eb74 799 if (seq)
f5992bc4 800 PerlIO_printf(file, "%-4"UVuf, seq);
93a17b20 801 else
b6f05621 802 PerlIO_printf(file, "????");
c8db6e60
JH
803 PerlIO_printf(file,
804 "%*sTYPE = %s ===> ",
53e06cf0 805 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
2814eb74 806 if (o->op_next)
b6f05621
DM
807 PerlIO_printf(file,
808 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
666ea192 809 sequence_num(o->op_next));
79072805 810 else
e75ab6ad 811 PerlIO_printf(file, "NULL\n");
11343788 812 if (o->op_targ) {
e15d5972 813 if (optype == OP_NULL) {
cea2e8a9 814 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
e15d5972 815 if (o->op_targ == OP_NEXTSTATE) {
ae7d165c 816 if (CopLINE(cCOPo))
f5992bc4 817 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
9d98dee5 818 (UV)CopLINE(cCOPo));
0eb335df
BF
819 if (CopSTASHPV(cCOPo)) {
820 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
821 HV *stash = CopSTASH(cCOPo);
822 const char * const hvname = HvNAME_get(stash);
823
ae7d165c 824 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
0eb335df
BF
825 generic_pv_escape( tmpsv, hvname, HvNAMELEN(stash), HvNAMEUTF8(stash)));
826 }
827 if (CopLABEL(cCOPo)) {
828 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
829 STRLEN label_len;
830 U32 label_flags;
831 const char *label = CopLABEL_len_flags(cCOPo,
832 &label_len,
833 &label_flags);
ae7d165c 834 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
0eb335df
BF
835 generic_pv_escape( tmpsv, label, label_len,(label_flags & SVf_UTF8)));
836 }
837
ae7d165c
PJ
838 }
839 }
8990e307 840 else
894356b3 841 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
8990e307 842 }
748a9306 843#ifdef DUMPADDR
57def98f 844 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
79072805 845#endif
a7fd8ef6 846
760f8c06
DM
847 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
848 SV * const tmpsv = newSVpvs("");
849 switch (o->op_flags & OPf_WANT) {
850 case OPf_WANT_VOID:
851 sv_catpv(tmpsv, ",VOID");
852 break;
853 case OPf_WANT_SCALAR:
854 sv_catpv(tmpsv, ",SCALAR");
855 break;
856 case OPf_WANT_LIST:
857 sv_catpv(tmpsv, ",LIST");
858 break;
859 default:
860 sv_catpv(tmpsv, ",UNKNOWN");
861 break;
862 }
863 append_flags(tmpsv, o->op_flags, op_flags_names);
864 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
865 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
866 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
867 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
868 if (o->op_lastsib) sv_catpvs(tmpsv, ",LASTSIB");
869 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
870 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
871 }
872
873 if (o->op_private) {
f3574cc6
DM
874 U16 oppriv = o->op_private;
875 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
876 SV * tmpsv = NULL;
877
878 if (op_ix != -1) {
879 U16 stop = 0;
880 tmpsv = newSVpvs("");
881 for (; !stop; op_ix++) {
882 U16 entry = PL_op_private_bitdefs[op_ix];
883 U16 bit = (entry >> 2) & 7;
884 U16 ix = entry >> 5;
885
886 stop = (entry & 1);
887
888 if (entry & 2) {
889 /* bitfield */
890 I16 const *p = &PL_op_private_bitfields[ix];
891 U16 bitmin = (U16) *p++;
892 I16 label = *p++;
893 I16 enum_label;
894 U16 mask = 0;
895 U16 i;
896 U16 val;
897
898 for (i = bitmin; i<= bit; i++)
899 mask |= (1<<i);
900 bit = bitmin;
901 val = (oppriv & mask);
902
903 if ( label != -1
904 && PL_op_private_labels[label] == '-'
905 && PL_op_private_labels[label+1] == '\0'
906 )
907 /* display as raw number */
908 continue;
909
910 oppriv -= val;
911 val >>= bit;
912 enum_label = -1;
913 while (*p != -1) {
914 if (val == *p++) {
915 enum_label = *p;
916 break;
917 }
918 p++;
919 }
920 if (val == 0 && enum_label == -1)
921 /* don't display anonymous zero values */
922 continue;
923
924 sv_catpv(tmpsv, ",");
925 if (label != -1) {
926 sv_catpv(tmpsv, &PL_op_private_labels[label]);
927 sv_catpv(tmpsv, "=");
928 }
929 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
930
931 }
932 else {
933 /* bit flag */
934 if ( oppriv & (1<<bit)
935 && !(PL_op_private_labels[ix] == '-'
936 && PL_op_private_labels[ix+1] == '\0'))
937 {
938 oppriv -= (1<<bit);
939 sv_catpv(tmpsv, ",");
940 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
941 }
760f8c06 942 }
760f8c06 943 }
f3574cc6
DM
944 if (oppriv) {
945 sv_catpv(tmpsv, ",");
946 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)oppriv);
760f8c06
DM
947 }
948 }
f3574cc6 949 if (tmpsv && SvCUR(tmpsv)) {
760f8c06
DM
950 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
951 } else
952 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
953 (UV)oppriv);
954 }
955
e15d5972 956 switch (optype) {
971a9dd3 957 case OP_AELEMFAST:
93a17b20 958 case OP_GVSV:
79072805 959 case OP_GV:
971a9dd3 960#ifdef USE_ITHREADS
c803eecc 961 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
971a9dd3 962#else
1640e9f0 963 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
38c076c7 964 if (cSVOPo->op_sv) {
0eb335df
BF
965 STRLEN len;
966 const char * name;
967 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
968 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
159b6efe 969 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
0eb335df 970 name = SvPV_const(tmpsv, len);
8b6b16e7 971 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
0eb335df 972 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
38c076c7
DM
973 }
974 else
975 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
378cc40b 976 }
971a9dd3 977#endif
79072805
LW
978 break;
979 case OP_CONST:
996c9baa 980 case OP_HINTSEVAL:
f5d5a27c 981 case OP_METHOD_NAMED:
b6a15bc5
DM
982#ifndef USE_ITHREADS
983 /* with ITHREADS, consts are stored in the pad, and the right pad
984 * may not be active here, so skip */
b46e009d 985 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cMETHOPx_meth(o)));
b6a15bc5 986#endif
79072805 987 break;
93a17b20
LW
988 case OP_NEXTSTATE:
989 case OP_DBSTATE:
57843af0 990 if (CopLINE(cCOPo))
f5992bc4 991 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
9d98dee5 992 (UV)CopLINE(cCOPo));
0eb335df
BF
993 if (CopSTASHPV(cCOPo)) {
994 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
995 HV *stash = CopSTASH(cCOPo);
996 const char * const hvname = HvNAME_get(stash);
997
ed094faf 998 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
0eb335df
BF
999 generic_pv_escape(tmpsv, hvname,
1000 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1001 }
1002 if (CopLABEL(cCOPo)) {
1003 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1004 STRLEN label_len;
1005 U32 label_flags;
1006 const char *label = CopLABEL_len_flags(cCOPo,
1007 &label_len, &label_flags);
1008 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1009 generic_pv_escape( tmpsv, label, label_len,
1010 (label_flags & SVf_UTF8)));
1011 }
79072805
LW
1012 break;
1013 case OP_ENTERLOOP:
cea2e8a9 1014 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
11343788 1015 if (cLOOPo->op_redoop)
f5992bc4 1016 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
79072805 1017 else
3967c732 1018 PerlIO_printf(file, "DONE\n");
cea2e8a9 1019 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
11343788 1020 if (cLOOPo->op_nextop)
f5992bc4 1021 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
79072805 1022 else
3967c732 1023 PerlIO_printf(file, "DONE\n");
cea2e8a9 1024 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
11343788 1025 if (cLOOPo->op_lastop)
f5992bc4 1026 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
79072805 1027 else
3967c732 1028 PerlIO_printf(file, "DONE\n");
79072805
LW
1029 break;
1030 case OP_COND_EXPR:
1a67a97c 1031 case OP_RANGE:
a0d0e21e 1032 case OP_MAPWHILE:
79072805
LW
1033 case OP_GREPWHILE:
1034 case OP_OR:
1035 case OP_AND:
cea2e8a9 1036 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
11343788 1037 if (cLOGOPo->op_other)
f5992bc4 1038 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
79072805 1039 else
3967c732 1040 PerlIO_printf(file, "DONE\n");
79072805
LW
1041 break;
1042 case OP_PUSHRE:
1043 case OP_MATCH:
8782bef2 1044 case OP_QR:
79072805 1045 case OP_SUBST:
3967c732 1046 do_pmop_dump(level, file, cPMOPo);
79072805 1047 break;
7934575e
GS
1048 case OP_LEAVE:
1049 case OP_LEAVEEVAL:
1050 case OP_LEAVESUB:
1051 case OP_LEAVESUBLV:
1052 case OP_LEAVEWRITE:
1053 case OP_SCOPE:
1054 if (o->op_private & OPpREFCOUNTED)
1055 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1056 break;
a0d0e21e
LW
1057 default:
1058 break;
79072805 1059 }
11343788 1060 if (o->op_flags & OPf_KIDS) {
79072805 1061 OP *kid;
1ed44841 1062 for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
3967c732 1063 do_op_dump(level, file, kid);
8d063cd8 1064 }
cea2e8a9 1065 Perl_dump_indent(aTHX_ level-1, file, "}\n");
3967c732
JD
1066}
1067
36b1c95c
MH
1068/*
1069=for apidoc op_dump
1070
1071Dumps the optree starting at OP C<o> to C<STDERR>.
1072
1073=cut
1074*/
1075
3967c732 1076void
6867be6d 1077Perl_op_dump(pTHX_ const OP *o)
3967c732 1078{
7918f24d 1079 PERL_ARGS_ASSERT_OP_DUMP;
3967c732 1080 do_op_dump(0, Perl_debug_log, o);
8d063cd8
LW
1081}
1082
8adcabd8 1083void
864dbfa3 1084Perl_gv_dump(pTHX_ GV *gv)
378cc40b 1085{
0eb335df
BF
1086 STRLEN len;
1087 const char* name;
1088 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
1089
378cc40b 1090
7918f24d
NC
1091 PERL_ARGS_ASSERT_GV_DUMP;
1092
79072805 1093 if (!gv) {
760ac839 1094 PerlIO_printf(Perl_debug_log, "{}\n");
378cc40b
LW
1095 return;
1096 }
8990e307 1097 sv = sv_newmortal();
760ac839 1098 PerlIO_printf(Perl_debug_log, "{\n");
bd61b366 1099 gv_fullname3(sv, gv, NULL);
0eb335df
BF
1100 name = SvPV_const(sv, len);
1101 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s",
1102 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
79072805 1103 if (gv != GvEGV(gv)) {
bd61b366 1104 gv_efullname3(sv, GvEGV(gv), NULL);
0eb335df
BF
1105 name = SvPV_const(sv, len);
1106 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s",
1107 generic_pv_escape( tmp, name, len, SvUTF8(sv) ));
8adcabd8 1108 }
3967c732 1109 PerlIO_putc(Perl_debug_log, '\n');
cea2e8a9 1110 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
8d063cd8
LW
1111}
1112
14befaf4 1113
afe38520 1114/* map magic types to the symbolic names
14befaf4
DM
1115 * (with the PERL_MAGIC_ prefixed stripped)
1116 */
1117
27da23d5 1118static const struct { const char type; const char *name; } magic_names[] = {
52f49505 1119#include "mg_names.c"
516a5887 1120 /* this null string terminates the list */
b9ac451d 1121 { 0, NULL },
14befaf4
DM
1122};
1123
8adcabd8 1124void
6867be6d 1125Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
8d063cd8 1126{
7918f24d
NC
1127 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1128
3967c732 1129 for (; mg; mg = mg->mg_moremagic) {
b900a521
JH
1130 Perl_dump_indent(aTHX_ level, file,
1131 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
3967c732 1132 if (mg->mg_virtual) {
bfed75c6 1133 const MGVTBL * const v = mg->mg_virtual;
2d1f1fe5
NC
1134 if (v >= PL_magic_vtables
1135 && v < PL_magic_vtables + magic_vtable_max) {
1136 const U32 i = v - PL_magic_vtables;
1137 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1138 }
3967c732 1139 else
b900a521 1140 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
3967c732
JD
1141 }
1142 else
cea2e8a9 1143 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
8d063cd8 1144
3967c732 1145 if (mg->mg_private)
cea2e8a9 1146 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
3967c732 1147
14befaf4
DM
1148 {
1149 int n;
c445ea15 1150 const char *name = NULL;
27da23d5 1151 for (n = 0; magic_names[n].name; n++) {
14befaf4
DM
1152 if (mg->mg_type == magic_names[n].type) {
1153 name = magic_names[n].name;
1154 break;
1155 }
1156 }
1157 if (name)
1158 Perl_dump_indent(aTHX_ level, file,
1159 " MG_TYPE = PERL_MAGIC_%s\n", name);
1160 else
1161 Perl_dump_indent(aTHX_ level, file,
1162 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1163 }
3967c732
JD
1164
1165 if (mg->mg_flags) {
cea2e8a9 1166 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
cb50f42d
YST
1167 if (mg->mg_type == PERL_MAGIC_envelem &&
1168 mg->mg_flags & MGf_TAINTEDDIR)
cea2e8a9 1169 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
4c02285a
FR
1170 if (mg->mg_type == PERL_MAGIC_regex_global &&
1171 mg->mg_flags & MGf_MINMATCH)
1172 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
3967c732 1173 if (mg->mg_flags & MGf_REFCOUNTED)
cea2e8a9 1174 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
3967c732 1175 if (mg->mg_flags & MGf_GSKIP)
cea2e8a9 1176 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
4c02285a
FR
1177 if (mg->mg_flags & MGf_COPY)
1178 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1179 if (mg->mg_flags & MGf_DUP)
1180 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1181 if (mg->mg_flags & MGf_LOCAL)
1182 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
25fdce4a
FC
1183 if (mg->mg_type == PERL_MAGIC_regex_global &&
1184 mg->mg_flags & MGf_BYTES)
1185 Perl_dump_indent(aTHX_ level, file, " BYTES\n");
3967c732
JD
1186 }
1187 if (mg->mg_obj) {
4c02285a 1188 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
28d8d7f4
YO
1189 PTR2UV(mg->mg_obj));
1190 if (mg->mg_type == PERL_MAGIC_qr) {
07bc277f 1191 REGEXP* const re = (REGEXP *)mg->mg_obj;
61f9802b 1192 SV * const dsv = sv_newmortal();
866c78d1 1193 const char * const s
4c02285a 1194 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
28d8d7f4 1195 60, NULL, NULL,
95b611b0 1196 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
3c8556c3 1197 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
28d8d7f4 1198 );
6483fb35
RGS
1199 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1200 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
07bc277f 1201 (IV)RX_REFCNT(re));
28d8d7f4
YO
1202 }
1203 if (mg->mg_flags & MGf_REFCOUNTED)
3967c732
JD
1204 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1205 }
1206 if (mg->mg_len)
894356b3 1207 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
3967c732 1208 if (mg->mg_ptr) {
b900a521 1209 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
3967c732 1210 if (mg->mg_len >= 0) {
7e8c5dac 1211 if (mg->mg_type != PERL_MAGIC_utf8) {
17605be7 1212 SV * const sv = newSVpvs("");
7e8c5dac 1213 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
17605be7 1214 SvREFCNT_dec_NN(sv);
7e8c5dac 1215 }
3967c732
JD
1216 }
1217 else if (mg->mg_len == HEf_SVKEY) {
1218 PerlIO_puts(file, " => HEf_SVKEY\n");
ad64d0ec
NC
1219 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1220 maxnest, dumpops, pvlim); /* MG is already +1 */
3967c732
JD
1221 continue;
1222 }
866f9d6c 1223 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
3967c732 1224 else
866f9d6c
FC
1225 PerlIO_puts(
1226 file,
1227 " ???? - " __FILE__
1228 " does not know how to handle this MG_LEN"
1229 );
3967c732
JD
1230 PerlIO_putc(file, '\n');
1231 }
7e8c5dac 1232 if (mg->mg_type == PERL_MAGIC_utf8) {
61f9802b 1233 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
7e8c5dac
HS
1234 if (cache) {
1235 IV i;
1236 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1237 Perl_dump_indent(aTHX_ level, file,
1238 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1239 i,
1240 (UV)cache[i * 2],
1241 (UV)cache[i * 2 + 1]);
1242 }
1243 }
378cc40b 1244 }
3967c732
JD
1245}
1246
1247void
6867be6d 1248Perl_magic_dump(pTHX_ const MAGIC *mg)
3967c732 1249{
b9ac451d 1250 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
3967c732
JD
1251}
1252
1253void
e1ec3a88 1254Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
3967c732 1255{
bfcb3514 1256 const char *hvname;
7918f24d
NC
1257
1258 PERL_ARGS_ASSERT_DO_HV_DUMP;
1259
b900a521 1260 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
bfcb3514 1261 if (sv && (hvname = HvNAME_get(sv)))
d7d51f4b
YO
1262 {
1263 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1264 name which quite legally could contain insane things like tabs, newlines, nulls or
1265 other scary crap - this should produce sane results - except maybe for unicode package
1266 names - but we will wait for someone to file a bug on that - demerphq */
0eb335df
BF
1267 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
1268 PerlIO_printf(file, "\t\"%s\"\n",
1269 generic_pv_escape( tmpsv, hvname,
1270 HvNAMELEN(sv), HvNAMEUTF8(sv)));
d7d51f4b 1271 }
79072805 1272 else
3967c732
JD
1273 PerlIO_putc(file, '\n');
1274}
1275
1276void
e1ec3a88 1277Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
3967c732 1278{
7918f24d
NC
1279 PERL_ARGS_ASSERT_DO_GV_DUMP;
1280
b900a521 1281 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
0eb335df
BF
1282 if (sv && GvNAME(sv)) {
1283 SV * const tmpsv = newSVpvs("");
1284 PerlIO_printf(file, "\t\"%s\"\n",
1285 generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) ));
1286 }
c90c0ff4 1287 else
3967c732
JD
1288 PerlIO_putc(file, '\n');
1289}
1290
1291void
e1ec3a88 1292Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
3967c732 1293{
7918f24d
NC
1294 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1295
b900a521 1296 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
3967c732 1297 if (sv && GvNAME(sv)) {
0eb335df 1298 SV *tmp = newSVpvs_flags("", SVs_TEMP);
bfcb3514 1299 const char *hvname;
0eb335df
BF
1300 HV * const stash = GvSTASH(sv);
1301 PerlIO_printf(file, "\t");
1302 /* TODO might have an extra \" here */
1303 if (stash && (hvname = HvNAME_get(stash))) {
1304 PerlIO_printf(file, "\"%s\" :: \"",
1305 generic_pv_escape(tmp, hvname,
1306 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1307 }
1308 PerlIO_printf(file, "%s\"\n",
1309 generic_pv_escape( tmp, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv)));
8d063cd8 1310 }
3967c732
JD
1311 else
1312 PerlIO_putc(file, '\n');
1313}
1314
a0c2f4dd
NC
1315const struct flag_to_name first_sv_flags_names[] = {
1316 {SVs_TEMP, "TEMP,"},
1317 {SVs_OBJECT, "OBJECT,"},
1318 {SVs_GMG, "GMG,"},
1319 {SVs_SMG, "SMG,"},
1320 {SVs_RMG, "RMG,"},
1321 {SVf_IOK, "IOK,"},
1322 {SVf_NOK, "NOK,"},
1323 {SVf_POK, "POK,"}
1324};
1325
1326const struct flag_to_name second_sv_flags_names[] = {
1327 {SVf_OOK, "OOK,"},
1328 {SVf_FAKE, "FAKE,"},
1329 {SVf_READONLY, "READONLY,"},
fd01b4b7 1330 {SVf_PROTECT, "PROTECT,"},
a0c2f4dd 1331 {SVf_BREAK, "BREAK,"},
a0c2f4dd
NC
1332 {SVp_IOK, "pIOK,"},
1333 {SVp_NOK, "pNOK,"},
1334 {SVp_POK, "pPOK,"}
1335};
1336
ae1f06a1
NC
1337const struct flag_to_name cv_flags_names[] = {
1338 {CVf_ANON, "ANON,"},
1339 {CVf_UNIQUE, "UNIQUE,"},
1340 {CVf_CLONE, "CLONE,"},
1341 {CVf_CLONED, "CLONED,"},
1342 {CVf_CONST, "CONST,"},
1343 {CVf_NODEBUG, "NODEBUG,"},
1344 {CVf_LVALUE, "LVALUE,"},
1345 {CVf_METHOD, "METHOD,"},
cfc1e951 1346 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
31d45e0c 1347 {CVf_CVGV_RC, "CVGV_RC,"},
bad4ae38 1348 {CVf_DYNFILE, "DYNFILE,"},
8fa6a409 1349 {CVf_AUTOLOAD, "AUTOLOAD,"},
e4555ecf 1350 {CVf_HASEVAL, "HASEVAL,"},
bfbc3ad9 1351 {CVf_SLABBED, "SLABBED,"},
bf9a4d2d 1352 {CVf_NAMED, "NAMED,"},
82487b59 1353 {CVf_LEXICAL, "LEXICAL,"},
31d45e0c 1354 {CVf_ISXSUB, "ISXSUB,"}
ae1f06a1
NC
1355};
1356
1357const struct flag_to_name hv_flags_names[] = {
1358 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1359 {SVphv_LAZYDEL, "LAZYDEL,"},
1360 {SVphv_HASKFLAGS, "HASKFLAGS,"},
45eaf8af 1361 {SVf_AMAGIC, "OVERLOAD,"},
ae1f06a1
NC
1362 {SVphv_CLONEABLE, "CLONEABLE,"}
1363};
1364
1365const struct flag_to_name gp_flags_names[] = {
1366 {GVf_INTRO, "INTRO,"},
1367 {GVf_MULTI, "MULTI,"},
1368 {GVf_ASSUMECV, "ASSUMECV,"},
ae1f06a1
NC
1369};
1370
1371const struct flag_to_name gp_flags_imported_names[] = {
1372 {GVf_IMPORTED_SV, " SV"},
1373 {GVf_IMPORTED_AV, " AV"},
1374 {GVf_IMPORTED_HV, " HV"},
1375 {GVf_IMPORTED_CV, " CV"},
1376};
1377
0d331aaf
YO
1378/* NOTE: this structure is mostly duplicative of one generated by
1379 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1380 * the two. - Yves */
e3e400ec 1381const struct flag_to_name regexp_extflags_names[] = {
d63e6659
DM
1382 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1383 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1384 {RXf_PMf_FOLD, "PMf_FOLD,"},
1385 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
334afb3e 1386 {RXf_PMf_EXTENDED_MORE, "PMf_EXTENDED_MORE,"},
d63e6659 1387 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
8e1490ee 1388 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
dbc200c5 1389 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
d63e6659 1390 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
d63e6659
DM
1391 {RXf_CHECK_ALL, "CHECK_ALL,"},
1392 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1393 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1394 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1395 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
dbc200c5 1396 {RXf_SPLIT, "SPLIT,"},
d63e6659
DM
1397 {RXf_COPY_DONE, "COPY_DONE,"},
1398 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1399 {RXf_TAINTED, "TAINTED,"},
1400 {RXf_START_ONLY, "START_ONLY,"},
dbc200c5 1401 {RXf_SKIPWHITE, "SKIPWHITE,"},
d63e6659
DM
1402 {RXf_WHITE, "WHITE,"},
1403 {RXf_NULL, "NULL,"},
1404};
1405
0d331aaf
YO
1406/* NOTE: this structure is mostly duplicative of one generated by
1407 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1408 * the two. - Yves */
e3e400ec
YO
1409const struct flag_to_name regexp_core_intflags_names[] = {
1410 {PREGf_SKIP, "SKIP,"},
0d331aaf
YO
1411 {PREGf_IMPLICIT, "IMPLICIT,"},
1412 {PREGf_NAUGHTY, "NAUGHTY,"},
e3e400ec
YO
1413 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1414 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
0d331aaf 1415 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
e3e400ec 1416 {PREGf_NOSCAN, "NOSCAN,"},
0d331aaf 1417 {PREGf_CANY_SEEN, "CANY_SEEN,"},
58430ea8
YO
1418 {PREGf_GPOS_SEEN, "GPOS_SEEN,"},
1419 {PREGf_GPOS_FLOAT, "GPOS_FLOAT,"},
8e1490ee
YO
1420 {PREGf_ANCH_MBOL, "ANCH_MBOL,"},
1421 {PREGf_ANCH_SBOL, "ANCH_SBOL,"},
1422 {PREGf_ANCH_GPOS, "ANCH_GPOS,"},
e3e400ec
YO
1423};
1424
3967c732 1425void
864dbfa3 1426Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
3967c732 1427{
cea89e20 1428 SV *d;
e1ec3a88 1429 const char *s;
3967c732
JD
1430 U32 flags;
1431 U32 type;
1432
7918f24d
NC
1433 PERL_ARGS_ASSERT_DO_SV_DUMP;
1434
3967c732 1435 if (!sv) {
cea2e8a9 1436 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
3967c732 1437 return;
378cc40b 1438 }
2ef28da1 1439
3967c732
JD
1440 flags = SvFLAGS(sv);
1441 type = SvTYPE(sv);
79072805 1442
e0bbf362
DM
1443 /* process general SV flags */
1444
cea89e20 1445 d = Perl_newSVpvf(aTHX_
57def98f 1446 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
56431972 1447 PTR2UV(SvANY(sv)), PTR2UV(sv),
894356b3
GS
1448 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1449 (int)(PL_dumpindent*level), "");
8d063cd8 1450
1979170b
NC
1451 if (!((flags & SVpad_NAME) == SVpad_NAME
1452 && (type == SVt_PVMG || type == SVt_PVNV))) {
145bf8ee 1453 if ((flags & SVs_PADSTALE))
9a214eec 1454 sv_catpv(d, "PADSTALE,");
e604303a 1455 }
1979170b 1456 if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
145bf8ee 1457 if ((flags & SVs_PADTMP))
9a214eec 1458 sv_catpv(d, "PADTMP,");
e604303a 1459 }
a0c2f4dd 1460 append_flags(d, flags, first_sv_flags_names);
810b8aa5
GS
1461 if (flags & SVf_ROK) {
1462 sv_catpv(d, "ROK,");
1463 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1464 }
45eaf8af 1465 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
a0c2f4dd 1466 append_flags(d, flags, second_sv_flags_names);
7db6405c
FC
1467 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1468 && type != SVt_PVAV) {
1ccdb730
NC
1469 if (SvPCS_IMPORTED(sv))
1470 sv_catpv(d, "PCS_IMPORTED,");
1471 else
9660f481 1472 sv_catpv(d, "SCREAM,");
1ccdb730 1473 }
3967c732 1474
e0bbf362
DM
1475 /* process type-specific SV flags */
1476
3967c732
JD
1477 switch (type) {
1478 case SVt_PVCV:
1479 case SVt_PVFM:
ae1f06a1 1480 append_flags(d, CvFLAGS(sv), cv_flags_names);
3967c732
JD
1481 break;
1482 case SVt_PVHV:
ae1f06a1 1483 append_flags(d, flags, hv_flags_names);
3967c732 1484 break;
926fc7b6
DM
1485 case SVt_PVGV:
1486 case SVt_PVLV:
1487 if (isGV_with_GP(sv)) {
ae1f06a1 1488 append_flags(d, GvFLAGS(sv), gp_flags_names);
926fc7b6 1489 }
926fc7b6 1490 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
3967c732
JD
1491 sv_catpv(d, "IMPORT");
1492 if (GvIMPORTED(sv) == GVf_IMPORTED)
1493 sv_catpv(d, "ALL,");
1494 else {
1495 sv_catpv(d, "(");
ae1f06a1 1496 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
3967c732
JD
1497 sv_catpv(d, " ),");
1498 }
1499 }
924ba076 1500 /* FALLTHROUGH */
25da4f38 1501 default:
e604303a 1502 evaled_or_uv:
25da4f38 1503 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
69c678eb 1504 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
25da4f38 1505 break;
addd1794 1506 case SVt_PVMG:
c13a5c80
NC
1507 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1508 if (SvVALID(sv)) sv_catpv(d, "VALID,");
00b1698f 1509 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
e604303a 1510 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
924ba076 1511 /* FALLTHROUGH */
e604303a
NC
1512 case SVt_PVNV:
1513 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1514 goto evaled_or_uv;
11ca45c0 1515 case SVt_PVAV:
7db6405c 1516 if (AvPAD_NAMELIST(sv)) sv_catpvs(d, "NAMELIST,");
11ca45c0 1517 break;
3967c732 1518 }
86f0d186
NC
1519 /* SVphv_SHAREKEYS is also 0x20000000 */
1520 if ((type != SVt_PVHV) && SvUTF8(sv))
9fe74ede 1521 sv_catpv(d, "UTF8");
3967c732 1522
b162af07
SP
1523 if (*(SvEND(d) - 1) == ',') {
1524 SvCUR_set(d, SvCUR(d) - 1);
1525 SvPVX(d)[SvCUR(d)] = '\0';
1526 }
3967c732 1527 sv_catpv(d, ")");
b15aece3 1528 s = SvPVX_const(d);
3967c732 1529
e0bbf362
DM
1530 /* dump initial SV details */
1531
fd0854ff 1532#ifdef DEBUG_LEAKING_SCALARS
cbe56f1d 1533 Perl_dump_indent(aTHX_ level, file,
cd676548 1534 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
fd0854ff
DM
1535 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1536 sv->sv_debug_line,
1537 sv->sv_debug_inpad ? "for" : "by",
1538 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
cd676548 1539 PTR2UV(sv->sv_debug_parent),
cbe56f1d
DM
1540 sv->sv_debug_serial
1541 );
fd0854ff 1542#endif
cea2e8a9 1543 Perl_dump_indent(aTHX_ level, file, "SV = ");
e0bbf362
DM
1544
1545 /* Dump SV type */
1546
5357ca29
NC
1547 if (type < SVt_LAST) {
1548 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1549
1550 if (type == SVt_NULL) {
5f954473 1551 SvREFCNT_dec_NN(d);
5357ca29
NC
1552 return;
1553 }
1554 } else {
faccc32b 1555 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
5f954473 1556 SvREFCNT_dec_NN(d);
3967c732
JD
1557 return;
1558 }
e0bbf362
DM
1559
1560 /* Dump general SV fields */
1561
27bd069f 1562 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
0a0c4b76
NC
1563 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1564 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
4df7f6af 1565 || (type == SVt_IV && !SvROK(sv))) {
765f542d 1566 if (SvIsUV(sv)
f8c7b90f 1567#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
1568 || SvIsCOW(sv)
1569#endif
1570 )
57def98f 1571 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
cf2093f6 1572 else
57def98f 1573 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
f8c7b90f 1574#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
1575 if (SvIsCOW_shared_hash(sv))
1576 PerlIO_printf(file, " (HASH)");
1577 else if (SvIsCOW_normal(sv))
1578 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1579#endif
3967c732
JD
1580 PerlIO_putc(file, '\n');
1581 }
e0bbf362 1582
1979170b
NC
1583 if ((type == SVt_PVNV || type == SVt_PVMG)
1584 && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
0e4c4423
NC
1585 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1586 (UV) COP_SEQ_RANGE_LOW(sv));
1587 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1588 (UV) COP_SEQ_RANGE_HIGH(sv));
1589 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
08e44740 1590 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
c0a413d1 1591 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
0e4c4423 1592 || type == SVt_NV) {
e54dc35b 1593 STORE_NUMERIC_LOCAL_SET_STANDARD();
88cb8500 1594 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
e54dc35b 1595 RESTORE_NUMERIC_LOCAL();
3967c732 1596 }
e0bbf362 1597
3967c732 1598 if (SvROK(sv)) {
57def98f 1599 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
3967c732
JD
1600 if (nest < maxnest)
1601 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
3967c732 1602 }
e0bbf362 1603
cea89e20 1604 if (type < SVt_PV) {
5f954473 1605 SvREFCNT_dec_NN(d);
3967c732 1606 return;
cea89e20 1607 }
e0bbf362 1608
5a3c7349
FC
1609 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1610 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
8d919b0a
FC
1611 const bool re = isREGEXP(sv);
1612 const char * const ptr =
1613 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1614 if (ptr) {
69240efd 1615 STRLEN delta;
7a4bba22 1616 if (SvOOK(sv)) {
69240efd 1617 SvOOK_offset(sv, delta);
7a4bba22 1618 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
5186cc12 1619 (UV) delta);
69240efd
NC
1620 } else {
1621 delta = 0;
7a4bba22 1622 }
8d919b0a 1623 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
7a4bba22
NC
1624 if (SvOOK(sv)) {
1625 PerlIO_printf(file, "( %s . ) ",
8d919b0a 1626 pv_display(d, ptr - delta, delta, 0,
7a4bba22
NC
1627 pvlim));
1628 }
ad3f05ad
KW
1629 if (type == SVt_INVLIST) {
1630 PerlIO_printf(file, "\n");
1631 /* 4 blanks indents 2 beyond the PV, etc */
1632 _invlist_dump(file, level, " ", sv);
1633 }
1634 else {
685bfc3c
KW
1635 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1636 re ? 0 : SvLEN(sv),
1637 pvlim));
1638 if (SvUTF8(sv)) /* the 6? \x{....} */
1639 PerlIO_printf(file, " [UTF8 \"%s\"]",
1640 sv_uni_display(d, sv, 6 * SvCUR(sv),
1641 UNI_DISPLAY_QQ));
1642 PerlIO_printf(file, "\n");
ad3f05ad 1643 }
57def98f 1644 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
8d919b0a
FC
1645 if (!re)
1646 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1647 (IV)SvLEN(sv));
db2c6cb3
FC
1648#ifdef PERL_NEW_COPY_ON_WRITE
1649 if (SvIsCOW(sv) && SvLEN(sv))
1650 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1651 CowREFCNT(sv));
1652#endif
3967c732
JD
1653 }
1654 else
cea2e8a9 1655 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
3967c732 1656 }
e0bbf362 1657
3967c732 1658 if (type >= SVt_PVMG) {
0e4c4423 1659 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
61f9802b 1660 HV * const ost = SvOURSTASH(sv);
38cbaf55
RGS
1661 if (ost)
1662 do_hv_dump(level, file, " OURSTASH", ost);
7db6405c
FC
1663 } else if (SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv)) {
1664 Perl_dump_indent(aTHX_ level, file, " MAXNAMED = %"UVuf"\n",
1665 (UV)PadnamelistMAXNAMED(sv));
0e4c4423
NC
1666 } else {
1667 if (SvMAGIC(sv))
8530ff28 1668 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
0e4c4423 1669 }
3967c732
JD
1670 if (SvSTASH(sv))
1671 do_hv_dump(level, file, " STASH", SvSTASH(sv));
c13a5c80
NC
1672
1673 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
c13a5c80
NC
1674 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1675 }
3967c732 1676 }
e0bbf362
DM
1677
1678 /* Dump type-specific SV fields */
1679
3967c732 1680 switch (type) {
3967c732 1681 case SVt_PVAV:
57def98f 1682 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
3967c732 1683 if (AvARRAY(sv) != AvALLOC(sv)) {
57def98f
JH
1684 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1685 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
3967c732
JD
1686 }
1687 else
1688 PerlIO_putc(file, '\n');
57def98f
JH
1689 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1690 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
7db6405c
FC
1691 /* arylen is stored in magic, and padnamelists use SvMAGIC for
1692 something else. */
1693 if (!AvPAD_NAMELIST(sv))
1694 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n",
1695 SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
76f68e9b 1696 sv_setpvs(d, "");
11ca45c0
NC
1697 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1698 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
b15aece3
SP
1699 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1700 SvCUR(d) ? SvPVX_const(d) + 1 : "");
b9f2b683 1701 if (nest < maxnest && av_tindex(MUTABLE_AV(sv)) >= 0) {
c70927a6 1702 SSize_t count;
b9f2b683 1703 for (count = 0; count <= av_tindex(MUTABLE_AV(sv)) && count < maxnest; count++) {
502c6561 1704 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
3967c732 1705
57def98f 1706 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
2ef28da1 1707 if (elt)
3967c732
JD
1708 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1709 }
1710 }
1711 break;
5d27ee4a
DD
1712 case SVt_PVHV: {
1713 U32 usedkeys;
0c22a733
DM
1714 if (SvOOK(sv)) {
1715 struct xpvhv_aux *const aux = HvAUX(sv);
1716 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %"UVuf"\n",
1717 (UV)aux->xhv_aux_flags);
1718 }
57def98f 1719 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
5d27ee4a
DD
1720 usedkeys = HvUSEDKEYS(sv);
1721 if (HvARRAY(sv) && usedkeys) {
3967c732
JD
1722 /* Show distribution of HEs in the ARRAY */
1723 int freq[200];
c3caa5c3 1724#define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
3967c732
JD
1725 int i;
1726 int max = 0;
5d27ee4a 1727 U32 pow2 = 2, keys = usedkeys;
65202027 1728 NV theoret, sum = 0;
3967c732
JD
1729
1730 PerlIO_printf(file, " (");
1731 Zero(freq, FREQ_MAX + 1, int);
eb160463 1732 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
c445ea15
AL
1733 HE* h;
1734 int count = 0;
3967c732
JD
1735 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1736 count++;
1737 if (count > FREQ_MAX)
1738 count = FREQ_MAX;
1739 freq[count]++;
1740 if (max < count)
1741 max = count;
1742 }
1743 for (i = 0; i <= max; i++) {
1744 if (freq[i]) {
1745 PerlIO_printf(file, "%d%s:%d", i,
1746 (i == FREQ_MAX) ? "+" : "",
1747 freq[i]);
1748 if (i != max)
1749 PerlIO_printf(file, ", ");
1750 }
1751 }
1752 PerlIO_putc(file, ')');
b8fa94d8
MG
1753 /* The "quality" of a hash is defined as the total number of
1754 comparisons needed to access every element once, relative
1755 to the expected number needed for a random hash.
1756
1757 The total number of comparisons is equal to the sum of
e76cd0fa
AMS
1758 the squares of the number of entries in each bucket.
1759 For a random hash of n keys into k buckets, the expected
b8fa94d8
MG
1760 value is
1761 n + n(n-1)/2k
1762 */
1763
3967c732
JD
1764 for (i = max; i > 0; i--) { /* Precision: count down. */
1765 sum += freq[i] * i * i;
1766 }
155aba94 1767 while ((keys = keys >> 1))
3967c732 1768 pow2 = pow2 << 1;
5d27ee4a 1769 theoret = usedkeys;
b8fa94d8 1770 theoret += theoret * (theoret-1)/pow2;
3967c732 1771 PerlIO_putc(file, '\n');
6b4667fc 1772 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
3967c732
JD
1773 }
1774 PerlIO_putc(file, '\n');
5d27ee4a 1775 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)usedkeys);
9faf471a
NC
1776 {
1777 STRLEN count = 0;
1778 HE **ents = HvARRAY(sv);
1779
1780 if (ents) {
1781 HE *const *const last = ents + HvMAX(sv);
1782 count = last + 1 - ents;
1783
1784 do {
1785 if (!*ents)
1786 --count;
1787 } while (++ents <= last);
1788 }
1789
1790 if (SvOOK(sv)) {
1791 struct xpvhv_aux *const aux = HvAUX(sv);
1792 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf
1793 " (cached = %"UVuf")\n",
1794 (UV)count, (UV)aux->xhv_fill_lazy);
1795 } else {
1796 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1797 (UV)count);
1798 }
1799 }
57def98f 1800 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
e1a7ec8d
YO
1801 if (SvOOK(sv)) {
1802 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1803 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
6a5b4183 1804#ifdef PERL_HASH_RANDOMIZE_KEYS
e1a7ec8d
YO
1805 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1806 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
6a5b4183 1807 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
e1a7ec8d 1808 }
6a5b4183
YO
1809#endif
1810 PerlIO_putc(file, '\n');
e1a7ec8d 1811 }
8d2f4536 1812 {
b9ac451d 1813 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
8d2f4536
NC
1814 if (mg && mg->mg_obj) {
1815 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1816 }
1817 }
bfcb3514 1818 {
b9ac451d 1819 const char * const hvname = HvNAME_get(sv);
0eb335df
BF
1820 if (hvname) {
1821 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1822 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1823 generic_pv_escape( tmpsv, hvname,
1824 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1825 }
bfcb3514 1826 }
86f55936 1827 if (SvOOK(sv)) {
ad64d0ec 1828 AV * const backrefs
85fbaab2 1829 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
7d88e6c4 1830 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
67e04715
FC
1831 if (HvAUX(sv)->xhv_name_count)
1832 Perl_dump_indent(aTHX_
7afc2217
FC
1833 level, file, " NAMECOUNT = %"IVdf"\n",
1834 (IV)HvAUX(sv)->xhv_name_count
67e04715 1835 );
15d9236d 1836 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
ec3405c8
NC
1837 const I32 count = HvAUX(sv)->xhv_name_count;
1838 if (count) {
1839 SV * const names = newSVpvs_flags("", SVs_TEMP);
1840 /* The starting point is the first element if count is
1841 positive and the second element if count is negative. */
1842 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1843 + (count < 0 ? 1 : 0);
1844 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1845 + (count < 0 ? -count : count);
1846 while (hekp < endp) {
0eb335df
BF
1847 if (HEK_LEN(*hekp)) {
1848 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1849 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1850 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
ec3405c8
NC
1851 } else {
1852 /* This should never happen. */
1853 sv_catpvs(names, ", (null)");
67e04715 1854 }
ec3405c8
NC
1855 ++hekp;
1856 }
67e04715
FC
1857 Perl_dump_indent(aTHX_
1858 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1859 );
1860 }
0eb335df
BF
1861 else {
1862 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1863 const char *const hvename = HvENAME_get(sv);
67e04715 1864 Perl_dump_indent(aTHX_
0eb335df
BF
1865 level, file, " ENAME = \"%s\"\n",
1866 generic_pv_escape(tmp, hvename,
1867 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1868 }
67e04715 1869 }
86f55936
NC
1870 if (backrefs) {
1871 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1872 PTR2UV(backrefs));
ad64d0ec 1873 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
86f55936
NC
1874 dumpops, pvlim);
1875 }
7d88e6c4 1876 if (meta) {
0eb335df
BF
1877 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1878 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"UVxf")\n",
1879 generic_pv_escape( tmpsv, meta->mro_which->name,
1880 meta->mro_which->length,
1881 (meta->mro_which->kflags & HVhek_UTF8)),
7d88e6c4
NC
1882 PTR2UV(meta->mro_which));
1883 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1884 (UV)meta->cache_gen);
1885 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1886 (UV)meta->pkg_gen);
1887 if (meta->mro_linear_all) {
1888 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1889 PTR2UV(meta->mro_linear_all));
1890 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1891 dumpops, pvlim);
1892 }
1893 if (meta->mro_linear_current) {
1894 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1895 PTR2UV(meta->mro_linear_current));
1896 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1897 dumpops, pvlim);
1898 }
1899 if (meta->mro_nextmethod) {
1900 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1901 PTR2UV(meta->mro_nextmethod));
1902 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1903 dumpops, pvlim);
1904 }
1905 if (meta->isa) {
1906 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1907 PTR2UV(meta->isa));
1908 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1909 dumpops, pvlim);
1910 }
1911 }
86f55936 1912 }
b5698553 1913 if (nest < maxnest) {
cbab3169 1914 HV * const hv = MUTABLE_HV(sv);
b5698553
TH
1915 STRLEN i;
1916 HE *he;
cbab3169 1917
b5698553
TH
1918 if (HvARRAY(hv)) {
1919 int count = maxnest - nest;
1920 for (i=0; i <= HvMAX(hv); i++) {
1921 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1922 U32 hash;
1923 SV * keysv;
1924 const char * keypv;
1925 SV * elt;
7dc86639 1926 STRLEN len;
b5698553
TH
1927
1928 if (count-- <= 0) goto DONEHV;
1929
1930 hash = HeHASH(he);
1931 keysv = hv_iterkeysv(he);
1932 keypv = SvPV_const(keysv, len);
1933 elt = HeVAL(he);
cbab3169 1934
7dc86639
YO
1935 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1936 if (SvUTF8(keysv))
1937 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
b5698553
TH
1938 if (HvEITER_get(hv) == he)
1939 PerlIO_printf(file, "[CURRENT] ");
7dc86639
YO
1940 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1941 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1942 }
b5698553
TH
1943 }
1944 DONEHV:;
1945 }
3967c732
JD
1946 }
1947 break;
5d27ee4a 1948 } /* case SVt_PVHV */
e0bbf362 1949
3967c732 1950 case SVt_PVCV:
8fa6a409 1951 if (CvAUTOLOAD(sv)) {
0eb335df
BF
1952 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1953 STRLEN len;
8fa6a409 1954 const char *const name = SvPV_const(sv, len);
0eb335df
BF
1955 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
1956 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
8fa6a409
FC
1957 }
1958 if (SvPOK(sv)) {
0eb335df
BF
1959 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1960 const char *const proto = CvPROTO(sv);
1961 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
1962 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
1963 SvUTF8(sv)));
cbf82dd0 1964 }
924ba076 1965 /* FALLTHROUGH */
3967c732
JD
1966 case SVt_PVFM:
1967 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
d04ba589
NC
1968 if (!CvISXSUB(sv)) {
1969 if (CvSTART(sv)) {
1970 Perl_dump_indent(aTHX_ level, file,
1971 " START = 0x%"UVxf" ===> %"IVdf"\n",
1972 PTR2UV(CvSTART(sv)),
1973 (IV)sequence_num(CvSTART(sv)));
1974 }
1975 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1976 PTR2UV(CvROOT(sv)));
1977 if (CvROOT(sv) && dumpops) {
1978 do_op_dump(level+1, file, CvROOT(sv));
1979 }
1980 } else {
126f53f3 1981 SV * const constant = cv_const_sv((const CV *)sv);
b1886099 1982
d04ba589 1983 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
b1886099
NC
1984
1985 if (constant) {
1986 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1987 " (CONST SV)\n",
1988 PTR2UV(CvXSUBANY(sv).any_ptr));
1989 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1990 pvlim);
1991 } else {
1992 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1993 (IV)CvXSUBANY(sv).any_i32);
1994 }
1995 }
3610c89f
FC
1996 if (CvNAMED(sv))
1997 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1998 HEK_KEY(CvNAME_HEK((CV *)sv)));
1999 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
57843af0 2000 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
bb02a38f 2001 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
894356b3 2002 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
a3985cdc 2003 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
57def98f 2004 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
dd2155a4
DM
2005 if (nest < maxnest) {
2006 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
3967c732
JD
2007 }
2008 {
b9ac451d 2009 const CV * const outside = CvOUTSIDE(sv);
2ef28da1 2010 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
57def98f 2011 PTR2UV(outside),
cf2093f6
JH
2012 (!outside ? "null"
2013 : CvANON(outside) ? "ANON"
2014 : (outside == PL_main_cv) ? "MAIN"
2015 : CvUNIQUE(outside) ? "UNIQUE"
b24fda9d
BF
2016 : CvGV(outside) ?
2017 generic_pv_escape(
2018 newSVpvs_flags("", SVs_TEMP),
2019 GvNAME(CvGV(outside)),
2020 GvNAMELEN(CvGV(outside)),
2021 GvNAMEUTF8(CvGV(outside)))
2022 : "UNDEFINED"));
3967c732
JD
2023 }
2024 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
ad64d0ec 2025 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
3967c732 2026 break;
e0bbf362 2027
926fc7b6
DM
2028 case SVt_PVGV:
2029 case SVt_PVLV:
b9ac451d
AL
2030 if (type == SVt_PVLV) {
2031 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2032 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2033 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2034 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
83f78d1a 2035 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
305b8651 2036 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
b9ac451d
AL
2037 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2038 dumpops, pvlim);
2039 }
8d919b0a 2040 if (isREGEXP(sv)) goto dumpregexp;
926fc7b6
DM
2041 if (!isGV_with_GP(sv))
2042 break;
0eb335df
BF
2043 {
2044 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2045 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2046 generic_pv_escape(tmpsv, GvNAME(sv),
2047 GvNAMELEN(sv),
2048 GvNAMEUTF8(sv)));
2049 }
57def98f 2050 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
3967c732 2051 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
be108a01 2052 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
57def98f 2053 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
f472eb5c
GS
2054 if (!GvGP(sv))
2055 break;
57def98f
JH
2056 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2057 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2058 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2059 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2060 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2061 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2062 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2063 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
008009b0
FC
2064 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf
2065 " (%s)\n",
2066 (UV)GvGPFLAGS(sv),
2067 GvALIASED_SV(sv) ? "ALIASED_SV" : "");
57def98f 2068 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
b195d487 2069 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
3967c732
JD
2070 do_gv_dump (level, file, " EGV", GvEGV(sv));
2071 break;
2072 case SVt_PVIO:
57def98f
JH
2073 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2074 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2075 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2076 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2077 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2078 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2079 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
27533608 2080 if (IoTOP_NAME(sv))
cea2e8a9 2081 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
9ba1f565
NC
2082 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2083 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2084 else {
2085 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2086 PTR2UV(IoTOP_GV(sv)));
ad64d0ec
NC
2087 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2088 maxnest, dumpops, pvlim);
9ba1f565
NC
2089 }
2090 /* Source filters hide things that are not GVs in these three, so let's
2091 be careful out there. */
27533608 2092 if (IoFMT_NAME(sv))
cea2e8a9 2093 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
9ba1f565
NC
2094 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2095 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2096 else {
2097 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2098 PTR2UV(IoFMT_GV(sv)));
ad64d0ec
NC
2099 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2100 maxnest, dumpops, pvlim);
9ba1f565 2101 }
27533608 2102 if (IoBOTTOM_NAME(sv))
cea2e8a9 2103 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
9ba1f565
NC
2104 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2105 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2106 else {
2107 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2108 PTR2UV(IoBOTTOM_GV(sv)));
ad64d0ec
NC
2109 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2110 maxnest, dumpops, pvlim);
9ba1f565 2111 }
27533608 2112 if (isPRINT(IoTYPE(sv)))
cea2e8a9 2113 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
27533608 2114 else
cea2e8a9 2115 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
57def98f 2116 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
3967c732 2117 break;
206ee256 2118 case SVt_REGEXP:
8d919b0a 2119 dumpregexp:
d63e6659 2120 {
8d919b0a 2121 struct regexp * const r = ReANY((REGEXP*)sv);
e3e400ec
YO
2122
2123#define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
ec16d31f 2124 sv_setpv(d,""); \
e3e400ec 2125 append_flags(d, flags, names); \
ec16d31f
YO
2126 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2127 SvCUR_set(d, SvCUR(d) - 1); \
2128 SvPVX(d)[SvCUR(d)] = '\0'; \
2129 } \
2130} STMT_END
e3e400ec 2131 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
dbc200c5
YO
2132 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2133 (UV)(r->compflags), SvPVX_const(d));
2134
e3e400ec 2135 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
d63e6659 2136 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
dbc200c5
YO
2137 (UV)(r->extflags), SvPVX_const(d));
2138
e3e400ec
YO
2139 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf" (%s)\n",
2140 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2141 if (r->engine == &PL_core_reg_engine) {
2142 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2143 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf" (%s)\n",
2144 (UV)(r->intflags), SvPVX_const(d));
2145 } else {
2146 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
d63e6659 2147 (UV)(r->intflags));
e3e400ec
YO
2148 }
2149#undef SV_SET_STRINGIFY_REGEXP_FLAGS
d63e6659
DM
2150 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2151 (UV)(r->nparens));
2152 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2153 (UV)(r->lastparen));
2154 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2155 (UV)(r->lastcloseparen));
2156 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2157 (IV)(r->minlen));
2158 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2159 (IV)(r->minlenret));
2160 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2161 (UV)(r->gofs));
2162 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2163 (UV)(r->pre_prefix));
d63e6659
DM
2164 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2165 (IV)(r->sublen));
6502e081
DM
2166 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2167 (IV)(r->suboffset));
2168 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2169 (IV)(r->subcoffset));
d63e6659
DM
2170 if (r->subbeg)
2171 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2172 PTR2UV(r->subbeg),
2173 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2174 else
2175 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
d63e6659
DM
2176 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2177 PTR2UV(r->mother_re));
01ffd0f1
FC
2178 if (nest < maxnest && r->mother_re)
2179 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2180 maxnest, dumpops, pvlim);
d63e6659
DM
2181 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2182 PTR2UV(r->paren_names));
2183 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2184 PTR2UV(r->substrs));
2185 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2186 PTR2UV(r->pprivate));
2187 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2188 PTR2UV(r->offs));
d63c20f2
DM
2189 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2190 PTR2UV(r->qr_anoncv));
db2c6cb3 2191#ifdef PERL_ANY_COW
d63e6659
DM
2192 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2193 PTR2UV(r->saved_copy));
2194#endif
2195 }
206ee256 2196 break;
3967c732 2197 }
5f954473 2198 SvREFCNT_dec_NN(d);
3967c732
JD
2199}
2200
36b1c95c
MH
2201/*
2202=for apidoc sv_dump
2203
2204Dumps the contents of an SV to the C<STDERR> filehandle.
2205
2206For an example of its output, see L<Devel::Peek>.
2207
2208=cut
2209*/
2210
3967c732 2211void
864dbfa3 2212Perl_sv_dump(pTHX_ SV *sv)
3967c732 2213{
7918f24d
NC
2214 PERL_ARGS_ASSERT_SV_DUMP;
2215
d1029faa
JP
2216 if (SvROK(sv))
2217 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2218 else
2219 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
8d063cd8 2220}
bd16a5f0
IZ
2221
2222int
2223Perl_runops_debug(pTHX)
2224{
2225 if (!PL_op) {
9b387841 2226 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
bd16a5f0
IZ
2227 return 0;
2228 }
2229
9f3673fb 2230 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
bd16a5f0 2231 do {
75d476e2
S
2232#ifdef PERL_TRACE_OPS
2233 ++PL_op_exec_cnt[PL_op->op_type];
2234#endif
bd16a5f0 2235 if (PL_debug) {
b9ac451d 2236 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
bd16a5f0
IZ
2237 PerlIO_printf(Perl_debug_log,
2238 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2239 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2240 PTR2UV(*PL_watchaddr));
d6721266
DM
2241 if (DEBUG_s_TEST_) {
2242 if (DEBUG_v_TEST_) {
2243 PerlIO_printf(Perl_debug_log, "\n");
2244 deb_stack_all();
2245 }
2246 else
2247 debstack();
2248 }
2249
2250
bd16a5f0
IZ
2251 if (DEBUG_t_TEST_) debop(PL_op);
2252 if (DEBUG_P_TEST_) debprof(PL_op);
2253 }
fe83c362
SM
2254
2255 OP_ENTRY_PROBE(OP_NAME(PL_op));
16c91539 2256 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
9f3673fb 2257 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
47c9d59f 2258 PERL_ASYNC_CHECK();
bd16a5f0
IZ
2259
2260 TAINT_NOT;
2261 return 0;
2262}
2263
2264I32
6867be6d 2265Perl_debop(pTHX_ const OP *o)
bd16a5f0 2266{
81d52ecd 2267 int count;
7918f24d
NC
2268
2269 PERL_ARGS_ASSERT_DEBOP;
2270
1045810a
IZ
2271 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2272 return 0;
2273
bd16a5f0
IZ
2274 Perl_deb(aTHX_ "%s", OP_NAME(o));
2275 switch (o->op_type) {
2276 case OP_CONST:
996c9baa 2277 case OP_HINTSEVAL:
6cefa69e 2278 /* With ITHREADS, consts are stored in the pad, and the right pad
7367e658 2279 * may not be active here, so check.
6cefa69e 2280 * Looks like only during compiling the pads are illegal.
7367e658 2281 */
6cefa69e
RU
2282#ifdef USE_ITHREADS
2283 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2284#endif
7367e658 2285 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
bd16a5f0
IZ
2286 break;
2287 case OP_GVSV:
2288 case OP_GV:
8333ca1a 2289 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
b9ac451d 2290 SV * const sv = newSV(0);
bd61b366 2291 gv_fullname3(sv, cGVOPo_gv, NULL);
93524f2b 2292 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
5f954473 2293 SvREFCNT_dec_NN(sv);
bd16a5f0 2294 }
8333ca1a
FC
2295 else if (cGVOPo_gv) {
2296 SV * const sv = newSV(0);
2297 assert(SvROK(cGVOPo_gv));
2298 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2299 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
ecf05a58 2300 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
8333ca1a
FC
2301 SvREFCNT_dec_NN(sv);
2302 }
bd16a5f0
IZ
2303 else
2304 PerlIO_printf(Perl_debug_log, "(NULL)");
2305 break;
a7fd8ef6 2306
bd16a5f0
IZ
2307 case OP_PADSV:
2308 case OP_PADAV:
2309 case OP_PADHV:
a7fd8ef6
DM
2310 count = 1;
2311 goto dump_padop;
2312 case OP_PADRANGE:
2313 count = o->op_private & OPpPADRANGE_COUNTMASK;
2314 dump_padop:
bd16a5f0 2315 /* print the lexical's name */
a7fd8ef6
DM
2316 {
2317 CV * const cv = deb_curcv(cxstack_ix);
2318 SV *sv;
2319 PAD * comppad = NULL;
2320 int i;
2321
2322 if (cv) {
2323 PADLIST * const padlist = CvPADLIST(cv);
2324 comppad = *PadlistARRAY(padlist);
2325 }
2326 PerlIO_printf(Perl_debug_log, "(");
2327 for (i = 0; i < count; i++) {
2328 if (comppad &&
2329 (sv = *av_fetch(comppad, o->op_targ + i, FALSE)))
2330 PerlIO_printf(Perl_debug_log, "%s", SvPV_nolen_const(sv));
2331 else
2332 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2333 (UV)o->op_targ+i);
2334 if (i < count-1)
2335 PerlIO_printf(Perl_debug_log, ",");
2336 }
2337 PerlIO_printf(Perl_debug_log, ")");
2338 }
bd16a5f0 2339 break;
a7fd8ef6 2340
bd16a5f0 2341 default:
091ab601 2342 break;
bd16a5f0
IZ
2343 }
2344 PerlIO_printf(Perl_debug_log, "\n");
2345 return 0;
2346}
2347
2348STATIC CV*
61f9802b 2349S_deb_curcv(pTHX_ const I32 ix)
bd16a5f0 2350{
b9ac451d 2351 const PERL_CONTEXT * const cx = &cxstack[ix];
bd16a5f0
IZ
2352 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2353 return cx->blk_sub.cv;
2354 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
676a678a 2355 return cx->blk_eval.cv;
bd16a5f0
IZ
2356 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2357 return PL_main_cv;
2358 else if (ix <= 0)
601f1833 2359 return NULL;
bd16a5f0
IZ
2360 else
2361 return deb_curcv(ix - 1);
2362}
2363
2364void
2365Perl_watch(pTHX_ char **addr)
2366{
7918f24d
NC
2367 PERL_ARGS_ASSERT_WATCH;
2368
bd16a5f0
IZ
2369 PL_watchaddr = addr;
2370 PL_watchok = *addr;
2371 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2372 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2373}
2374
2375STATIC void
e1ec3a88 2376S_debprof(pTHX_ const OP *o)
bd16a5f0 2377{
7918f24d
NC
2378 PERL_ARGS_ASSERT_DEBPROF;
2379
61f9802b 2380 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
1045810a 2381 return;
bd16a5f0 2382 if (!PL_profiledata)
a02a5408 2383 Newxz(PL_profiledata, MAXO, U32);
bd16a5f0
IZ
2384 ++PL_profiledata[o->op_type];
2385}
2386
2387void
2388Perl_debprofdump(pTHX)
2389{
2390 unsigned i;
2391 if (!PL_profiledata)
2392 return;
2393 for (i = 0; i < MAXO; i++) {
2394 if (PL_profiledata[i])
2395 PerlIO_printf(Perl_debug_log,
2396 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2397 PL_op_name[i]);
2398 }
2399}
66610fdd 2400
3b721df9 2401
66610fdd
RGS
2402/*
2403 * Local variables:
2404 * c-indentation-style: bsd
2405 * c-basic-offset: 4
14d04a33 2406 * indent-tabs-mode: nil
66610fdd
RGS
2407 * End:
2408 *
14d04a33 2409 * ex: set ts=8 sts=4 sw=4 et:
37442d52 2410 */