This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
silence some gcc -pendantic warnings
[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
9a63e366 99and will not contain any incomplete escape sequences. The number of bytes
4420a417
YO
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
e5860534 110If PERL_PV_ESCAPE_UNI is set then the input string is treated as UTF-8
ab3bbdeb 111if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
e5860534 112using C<is_utf8_string()> to determine if it is UTF-8.
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 */
e5860534 150 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */
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)) {
67d796ae 480 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
1779d84d 481 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
67d796ae 482 RESTORE_LC_NUMERIC_UNDERLYING();
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)) {
66103581
DM
575 GV * gv = (GV *)HeVAL(entry);
576 if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV)
577 /* unfake a fake GV */
578 (void)CvGV(SvRV(gv));
36b1c95c
MH
579 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
580 continue;
581 if (GvCVu(gv))
582 dump_sub_perl(gv, justperl);
583 if (GvFORM(gv))
584 dump_form(gv);
585 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
586 const HV * const hv = GvHV(gv);
587 if (hv && (hv != PL_defstash))
588 dump_packsubs_perl(hv, justperl); /* nested package */
589 }
590 }
591 }
592}
593
594void
595Perl_dump_sub(pTHX_ const GV *gv)
596{
597 PERL_ARGS_ASSERT_DUMP_SUB;
598 dump_sub_perl(gv, FALSE);
599}
600
601void
602Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
603{
0eb335df
BF
604 STRLEN len;
605 SV * const sv = newSVpvs_flags("", SVs_TEMP);
606 SV *tmpsv;
607 const char * name;
36b1c95c
MH
608
609 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
610
611 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
612 return;
613
0eb335df 614 tmpsv = newSVpvs_flags("", SVs_TEMP);
36b1c95c 615 gv_fullname3(sv, gv, NULL);
0eb335df
BF
616 name = SvPV_const(sv, len);
617 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ",
618 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
36b1c95c
MH
619 if (CvISXSUB(GvCV(gv)))
620 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
621 PTR2UV(CvXSUB(GvCV(gv))),
622 (int)CvXSUBANY(GvCV(gv)).any_i32);
623 else if (CvROOT(GvCV(gv)))
624 op_dump(CvROOT(GvCV(gv)));
625 else
626 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
627}
628
629void
630Perl_dump_form(pTHX_ const GV *gv)
631{
632 SV * const sv = sv_newmortal();
633
634 PERL_ARGS_ASSERT_DUMP_FORM;
635
636 gv_fullname3(sv, gv, NULL);
637 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
638 if (CvROOT(GvFORM(gv)))
639 op_dump(CvROOT(GvFORM(gv)));
640 else
641 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
642}
643
644void
645Perl_dump_eval(pTHX)
646{
36b1c95c
MH
647 op_dump(PL_eval_root);
648}
649
3967c732 650void
6867be6d 651Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
3967c732
JD
652{
653 char ch;
654
7918f24d
NC
655 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
656
3967c732 657 if (!pm) {
cea2e8a9 658 Perl_dump_indent(aTHX_ level, file, "{}\n");
3967c732
JD
659 return;
660 }
cea2e8a9 661 Perl_dump_indent(aTHX_ level, file, "{\n");
3967c732
JD
662 level++;
663 if (pm->op_pmflags & PMf_ONCE)
664 ch = '?';
665 else
666 ch = '/';
aaa362c4 667 if (PM_GETRE(pm))
f87fee25
FC
668 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%.*s%c%s\n",
669 ch,(int)RX_PRELEN(PM_GETRE(pm)), RX_PRECOMP(PM_GETRE(pm)), ch,
3967c732
JD
670 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
671 else
cea2e8a9 672 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
20e98b0f 673 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
cea2e8a9 674 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
20e98b0f 675 op_dump(pm->op_pmreplrootu.op_pmreplroot);
3967c732 676 }
68e2671b 677 if (pm->op_code_list) {
867940b8
DM
678 if (pm->op_pmflags & PMf_CODELIST_PRIVATE) {
679 Perl_dump_indent(aTHX_ level, file, "CODE_LIST =\n");
680 do_op_dump(level, file, pm->op_code_list);
681 }
682 else
683 Perl_dump_indent(aTHX_ level, file, "CODE_LIST = 0x%"UVxf"\n",
684 PTR2UV(pm->op_code_list));
68e2671b 685 }
07bc277f 686 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
4199688e 687 SV * const tmpsv = pm_description(pm);
b15aece3 688 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
5f954473 689 SvREFCNT_dec_NN(tmpsv);
3967c732
JD
690 }
691
cea2e8a9 692 Perl_dump_indent(aTHX_ level-1, file, "}\n");
3967c732
JD
693}
694
a0c2f4dd
NC
695const struct flag_to_name pmflags_flags_names[] = {
696 {PMf_CONST, ",CONST"},
697 {PMf_KEEP, ",KEEP"},
698 {PMf_GLOBAL, ",GLOBAL"},
699 {PMf_CONTINUE, ",CONTINUE"},
700 {PMf_RETAINT, ",RETAINT"},
701 {PMf_EVAL, ",EVAL"},
702 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
d63c20f2 703 {PMf_HAS_CV, ",HAS_CV"},
2a92a973
DM
704 {PMf_CODELIST_PRIVATE, ",CODELIST_PRIVATE"},
705 {PMf_IS_QR, ",IS_QR"}
a0c2f4dd
NC
706};
707
b9ac451d 708static SV *
4199688e
AL
709S_pm_description(pTHX_ const PMOP *pm)
710{
711 SV * const desc = newSVpvs("");
61f9802b 712 const REGEXP * const regex = PM_GETRE(pm);
4199688e
AL
713 const U32 pmflags = pm->op_pmflags;
714
7918f24d
NC
715 PERL_ARGS_ASSERT_PM_DESCRIPTION;
716
4199688e
AL
717 if (pmflags & PMf_ONCE)
718 sv_catpv(desc, ",ONCE");
c737faaf
YO
719#ifdef USE_ITHREADS
720 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
721 sv_catpv(desc, ":USED");
722#else
723 if (pmflags & PMf_USED)
724 sv_catpv(desc, ":USED");
725#endif
c737faaf 726
68d4833d 727 if (regex) {
284167a5 728 if (RX_ISTAINTED(regex))
68d4833d 729 sv_catpv(desc, ",TAINTED");
07bc277f 730 if (RX_CHECK_SUBSTR(regex)) {
e3e400ec 731 if (!(RX_INTFLAGS(regex) & PREGf_NOSCAN))
68d4833d 732 sv_catpv(desc, ",SCANFIRST");
07bc277f 733 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
68d4833d
AB
734 sv_catpv(desc, ",ALL");
735 }
dbc200c5
YO
736 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
737 sv_catpv(desc, ",SKIPWHITE");
4199688e 738 }
68d4833d 739
a0c2f4dd 740 append_flags(desc, pmflags, pmflags_flags_names);
4199688e
AL
741 return desc;
742}
743
3967c732 744void
864dbfa3 745Perl_pmop_dump(pTHX_ PMOP *pm)
3967c732
JD
746{
747 do_pmop_dump(0, Perl_debug_log, pm);
79072805
LW
748}
749
b6f05621
DM
750/* Return a unique integer to represent the address of op o.
751 * If it already exists in PL_op_sequence, just return it;
752 * otherwise add it.
753 * *** Note that this isn't thread-safe */
294b3b39 754
2814eb74 755STATIC UV
0bd48802 756S_sequence_num(pTHX_ const OP *o)
2814eb74 757{
27da23d5 758 dVAR;
2814eb74
PJ
759 SV *op,
760 **seq;
93524f2b 761 const char *key;
2814eb74 762 STRLEN len;
b6f05621
DM
763 if (!o)
764 return 0;
c0fd1b42 765 op = newSVuv(PTR2UV(o));
b6f05621 766 sv_2mortal(op);
93524f2b 767 key = SvPV_const(op, len);
b6f05621
DM
768 if (!PL_op_sequence)
769 PL_op_sequence = newHV();
770 seq = hv_fetch(PL_op_sequence, key, len, 0);
771 if (seq)
772 return SvUV(*seq);
773 (void)hv_store(PL_op_sequence, key, len, newSVuv(++PL_op_seq), 0);
774 return PL_op_seq;
2814eb74
PJ
775}
776
f3574cc6
DM
777
778
779
780
a0c2f4dd
NC
781const struct flag_to_name op_flags_names[] = {
782 {OPf_KIDS, ",KIDS"},
783 {OPf_PARENS, ",PARENS"},
a0c2f4dd
NC
784 {OPf_REF, ",REF"},
785 {OPf_MOD, ",MOD"},
65cccc5e 786 {OPf_STACKED, ",STACKED"},
a0c2f4dd
NC
787 {OPf_SPECIAL, ",SPECIAL"}
788};
789
75a6ad4a 790
79072805 791void
6867be6d 792Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
79072805 793{
2814eb74 794 UV seq;
e15d5972
AL
795 const OPCODE optype = o->op_type;
796
7918f24d
NC
797 PERL_ARGS_ASSERT_DO_OP_DUMP;
798
cea2e8a9 799 Perl_dump_indent(aTHX_ level, file, "{\n");
3967c732 800 level++;
0bd48802 801 seq = sequence_num(o);
2814eb74 802 if (seq)
f5992bc4 803 PerlIO_printf(file, "%-4"UVuf, seq);
93a17b20 804 else
b6f05621 805 PerlIO_printf(file, "????");
c8db6e60
JH
806 PerlIO_printf(file,
807 "%*sTYPE = %s ===> ",
53e06cf0 808 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
2814eb74 809 if (o->op_next)
b6f05621
DM
810 PerlIO_printf(file,
811 o->op_type == OP_NULL ? "(%"UVuf")\n" : "%"UVuf"\n",
666ea192 812 sequence_num(o->op_next));
79072805 813 else
e75ab6ad 814 PerlIO_printf(file, "NULL\n");
11343788 815 if (o->op_targ) {
e15d5972 816 if (optype == OP_NULL) {
cea2e8a9 817 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
ae7d165c 818 }
8990e307 819 else
894356b3 820 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
8990e307 821 }
748a9306 822#ifdef DUMPADDR
57def98f 823 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
79072805 824#endif
a7fd8ef6 825
760f8c06
DM
826 if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
827 SV * const tmpsv = newSVpvs("");
828 switch (o->op_flags & OPf_WANT) {
829 case OPf_WANT_VOID:
830 sv_catpv(tmpsv, ",VOID");
831 break;
832 case OPf_WANT_SCALAR:
833 sv_catpv(tmpsv, ",SCALAR");
834 break;
835 case OPf_WANT_LIST:
836 sv_catpv(tmpsv, ",LIST");
837 break;
838 default:
839 sv_catpv(tmpsv, ",UNKNOWN");
840 break;
841 }
842 append_flags(tmpsv, o->op_flags, op_flags_names);
843 if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
844 if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
845 if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
846 if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
87b5a8b9 847 if (o->op_moresib) sv_catpvs(tmpsv, ",MORESIB");
760f8c06
DM
848 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
849 SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
850 }
851
852 if (o->op_private) {
f3574cc6
DM
853 U16 oppriv = o->op_private;
854 I16 op_ix = PL_op_private_bitdef_ix[o->op_type];
855 SV * tmpsv = NULL;
856
857 if (op_ix != -1) {
858 U16 stop = 0;
859 tmpsv = newSVpvs("");
860 for (; !stop; op_ix++) {
861 U16 entry = PL_op_private_bitdefs[op_ix];
862 U16 bit = (entry >> 2) & 7;
863 U16 ix = entry >> 5;
864
865 stop = (entry & 1);
866
867 if (entry & 2) {
868 /* bitfield */
869 I16 const *p = &PL_op_private_bitfields[ix];
870 U16 bitmin = (U16) *p++;
871 I16 label = *p++;
872 I16 enum_label;
873 U16 mask = 0;
874 U16 i;
875 U16 val;
876
877 for (i = bitmin; i<= bit; i++)
878 mask |= (1<<i);
879 bit = bitmin;
880 val = (oppriv & mask);
881
882 if ( label != -1
883 && PL_op_private_labels[label] == '-'
884 && PL_op_private_labels[label+1] == '\0'
885 )
886 /* display as raw number */
887 continue;
888
889 oppriv -= val;
890 val >>= bit;
891 enum_label = -1;
892 while (*p != -1) {
893 if (val == *p++) {
894 enum_label = *p;
895 break;
896 }
897 p++;
898 }
899 if (val == 0 && enum_label == -1)
900 /* don't display anonymous zero values */
901 continue;
902
903 sv_catpv(tmpsv, ",");
904 if (label != -1) {
905 sv_catpv(tmpsv, &PL_op_private_labels[label]);
906 sv_catpv(tmpsv, "=");
907 }
95268469
DM
908 if (enum_label == -1)
909 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)val);
910 else
911 sv_catpv(tmpsv, &PL_op_private_labels[enum_label]);
f3574cc6
DM
912
913 }
914 else {
915 /* bit flag */
916 if ( oppriv & (1<<bit)
917 && !(PL_op_private_labels[ix] == '-'
918 && PL_op_private_labels[ix+1] == '\0'))
919 {
920 oppriv -= (1<<bit);
921 sv_catpv(tmpsv, ",");
922 sv_catpv(tmpsv, &PL_op_private_labels[ix]);
923 }
760f8c06 924 }
760f8c06 925 }
f3574cc6
DM
926 if (oppriv) {
927 sv_catpv(tmpsv, ",");
928 Perl_sv_catpvf(aTHX_ tmpsv, "0x%"UVxf, (UV)oppriv);
760f8c06
DM
929 }
930 }
f3574cc6 931 if (tmpsv && SvCUR(tmpsv)) {
760f8c06
DM
932 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
933 } else
934 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
935 (UV)oppriv);
936 }
937
e15d5972 938 switch (optype) {
971a9dd3 939 case OP_AELEMFAST:
93a17b20 940 case OP_GVSV:
79072805 941 case OP_GV:
971a9dd3 942#ifdef USE_ITHREADS
c803eecc 943 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
971a9dd3 944#else
1640e9f0 945 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
38c076c7 946 if (cSVOPo->op_sv) {
0eb335df
BF
947 STRLEN len;
948 const char * name;
949 SV * const tmpsv = newSVpvs_flags("", SVs_TEMP);
950 SV * const tmpsv2 = newSVpvs_flags("", SVs_TEMP);
159b6efe 951 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
0eb335df 952 name = SvPV_const(tmpsv, len);
8b6b16e7 953 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
0eb335df 954 generic_pv_escape( tmpsv2, name, len, SvUTF8(tmpsv)));
38c076c7
DM
955 }
956 else
957 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
378cc40b 958 }
971a9dd3 959#endif
79072805 960 break;
fedf30e1
DM
961
962 case OP_MULTIDEREF:
963 {
964 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
965 UV i, count = items[-1].uv;
966
967 Perl_dump_indent(aTHX_ level, file, "ARGS = \n");
968 for (i=0; i < count; i++)
969 Perl_dump_indent(aTHX_ level+1, file, "%"UVuf" => 0x%"UVxf"\n",
970 i, items[i].uv);
971 }
972
79072805 973 case OP_CONST:
996c9baa 974 case OP_HINTSEVAL:
f5d5a27c 975 case OP_METHOD_NAMED:
7d6c333c 976 case OP_METHOD_SUPER:
810bd8b7 977 case OP_METHOD_REDIR:
978 case OP_METHOD_REDIR_SUPER:
b6a15bc5
DM
979#ifndef USE_ITHREADS
980 /* with ITHREADS, consts are stored in the pad, and the right pad
981 * may not be active here, so skip */
b46e009d 982 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cMETHOPx_meth(o)));
b6a15bc5 983#endif
79072805 984 break;
5e412b02
FC
985 case OP_NULL:
986 if (o->op_targ != OP_NEXTSTATE && o->op_targ != OP_DBSTATE)
987 break;
988 /* FALLTHROUGH */
93a17b20
LW
989 case OP_NEXTSTATE:
990 case OP_DBSTATE:
57843af0 991 if (CopLINE(cCOPo))
f5992bc4 992 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
9d98dee5 993 (UV)CopLINE(cCOPo));
0eb335df
BF
994 if (CopSTASHPV(cCOPo)) {
995 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
996 HV *stash = CopSTASH(cCOPo);
997 const char * const hvname = HvNAME_get(stash);
998
ed094faf 999 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
0eb335df
BF
1000 generic_pv_escape(tmpsv, hvname,
1001 HvNAMELEN(stash), HvNAMEUTF8(stash)));
1002 }
1003 if (CopLABEL(cCOPo)) {
1004 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1005 STRLEN label_len;
1006 U32 label_flags;
1007 const char *label = CopLABEL_len_flags(cCOPo,
1008 &label_len, &label_flags);
1009 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
1010 generic_pv_escape( tmpsv, label, label_len,
1011 (label_flags & SVf_UTF8)));
1012 }
7fa99c80 1013 Perl_dump_indent(aTHX_ level, file, "SEQ = %u\n",
947a9e0f 1014 (unsigned int)cCOPo->cop_seq);
79072805
LW
1015 break;
1016 case OP_ENTERLOOP:
cea2e8a9 1017 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
11343788 1018 if (cLOOPo->op_redoop)
f5992bc4 1019 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
79072805 1020 else
3967c732 1021 PerlIO_printf(file, "DONE\n");
cea2e8a9 1022 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
11343788 1023 if (cLOOPo->op_nextop)
f5992bc4 1024 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
79072805 1025 else
3967c732 1026 PerlIO_printf(file, "DONE\n");
cea2e8a9 1027 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
11343788 1028 if (cLOOPo->op_lastop)
f5992bc4 1029 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
79072805 1030 else
3967c732 1031 PerlIO_printf(file, "DONE\n");
79072805
LW
1032 break;
1033 case OP_COND_EXPR:
1a67a97c 1034 case OP_RANGE:
a0d0e21e 1035 case OP_MAPWHILE:
79072805
LW
1036 case OP_GREPWHILE:
1037 case OP_OR:
1038 case OP_AND:
cea2e8a9 1039 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
11343788 1040 if (cLOGOPo->op_other)
f5992bc4 1041 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
79072805 1042 else
3967c732 1043 PerlIO_printf(file, "DONE\n");
79072805
LW
1044 break;
1045 case OP_PUSHRE:
1046 case OP_MATCH:
8782bef2 1047 case OP_QR:
79072805 1048 case OP_SUBST:
3967c732 1049 do_pmop_dump(level, file, cPMOPo);
79072805 1050 break;
7934575e
GS
1051 case OP_LEAVE:
1052 case OP_LEAVEEVAL:
1053 case OP_LEAVESUB:
1054 case OP_LEAVESUBLV:
1055 case OP_LEAVEWRITE:
1056 case OP_SCOPE:
1057 if (o->op_private & OPpREFCOUNTED)
1058 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1059 break;
a0d0e21e
LW
1060 default:
1061 break;
79072805 1062 }
11343788 1063 if (o->op_flags & OPf_KIDS) {
79072805 1064 OP *kid;
e6dae479 1065 for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
3967c732 1066 do_op_dump(level, file, kid);
8d063cd8 1067 }
cea2e8a9 1068 Perl_dump_indent(aTHX_ level-1, file, "}\n");
3967c732
JD
1069}
1070
36b1c95c
MH
1071/*
1072=for apidoc op_dump
1073
1074Dumps the optree starting at OP C<o> to C<STDERR>.
1075
1076=cut
1077*/
1078
3967c732 1079void
6867be6d 1080Perl_op_dump(pTHX_ const OP *o)
3967c732 1081{
7918f24d 1082 PERL_ARGS_ASSERT_OP_DUMP;
3967c732 1083 do_op_dump(0, Perl_debug_log, o);
8d063cd8
LW
1084}
1085
8adcabd8 1086void
864dbfa3 1087Perl_gv_dump(pTHX_ GV *gv)
378cc40b 1088{
0eb335df
BF
1089 STRLEN len;
1090 const char* name;
1091 SV *sv, *tmp = newSVpvs_flags("", SVs_TEMP);
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,"},
41d7c59e 1388 {RXf_PMf_NOCAPTURE, "PMf_NOCAPURE,"},
8e1490ee 1389 {RXf_IS_ANCHORED, "IS_ANCHORED,"},
dbc200c5 1390 {RXf_NO_INPLACE_SUBST, "NO_INPLACE_SUBST,"},
d63e6659 1391 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
d63e6659
DM
1392 {RXf_CHECK_ALL, "CHECK_ALL,"},
1393 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1394 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1395 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1396 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
dbc200c5 1397 {RXf_SPLIT, "SPLIT,"},
d63e6659
DM
1398 {RXf_COPY_DONE, "COPY_DONE,"},
1399 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1400 {RXf_TAINTED, "TAINTED,"},
1401 {RXf_START_ONLY, "START_ONLY,"},
dbc200c5 1402 {RXf_SKIPWHITE, "SKIPWHITE,"},
d63e6659
DM
1403 {RXf_WHITE, "WHITE,"},
1404 {RXf_NULL, "NULL,"},
1405};
1406
0d331aaf
YO
1407/* NOTE: this structure is mostly duplicative of one generated by
1408 * 'make regen' in regnodes.h - perhaps we should somehow integrate
1409 * the two. - Yves */
e3e400ec
YO
1410const struct flag_to_name regexp_core_intflags_names[] = {
1411 {PREGf_SKIP, "SKIP,"},
0d331aaf
YO
1412 {PREGf_IMPLICIT, "IMPLICIT,"},
1413 {PREGf_NAUGHTY, "NAUGHTY,"},
e3e400ec
YO
1414 {PREGf_VERBARG_SEEN, "VERBARG_SEEN,"},
1415 {PREGf_CUTGROUP_SEEN, "CUTGROUP_SEEN,"},
0d331aaf 1416 {PREGf_USE_RE_EVAL, "USE_RE_EVAL,"},
e3e400ec 1417 {PREGf_NOSCAN, "NOSCAN,"},
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
0f94cb1f 1451 if ((flags & SVs_PADSTALE))
9a214eec 1452 sv_catpv(d, "PADSTALE,");
0f94cb1f 1453 if ((flags & SVs_PADTMP))
9a214eec 1454 sv_catpv(d, "PADTMP,");
a0c2f4dd 1455 append_flags(d, flags, first_sv_flags_names);
810b8aa5
GS
1456 if (flags & SVf_ROK) {
1457 sv_catpv(d, "ROK,");
1458 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1459 }
45eaf8af 1460 if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
a0c2f4dd 1461 append_flags(d, flags, second_sv_flags_names);
7db6405c
FC
1462 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
1463 && type != SVt_PVAV) {
1ccdb730
NC
1464 if (SvPCS_IMPORTED(sv))
1465 sv_catpv(d, "PCS_IMPORTED,");
1466 else
9660f481 1467 sv_catpv(d, "SCREAM,");
1ccdb730 1468 }
3967c732 1469
e0bbf362
DM
1470 /* process type-specific SV flags */
1471
3967c732
JD
1472 switch (type) {
1473 case SVt_PVCV:
1474 case SVt_PVFM:
ae1f06a1 1475 append_flags(d, CvFLAGS(sv), cv_flags_names);
3967c732
JD
1476 break;
1477 case SVt_PVHV:
ae1f06a1 1478 append_flags(d, flags, hv_flags_names);
3967c732 1479 break;
926fc7b6
DM
1480 case SVt_PVGV:
1481 case SVt_PVLV:
1482 if (isGV_with_GP(sv)) {
ae1f06a1 1483 append_flags(d, GvFLAGS(sv), gp_flags_names);
926fc7b6 1484 }
926fc7b6 1485 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
3967c732
JD
1486 sv_catpv(d, "IMPORT");
1487 if (GvIMPORTED(sv) == GVf_IMPORTED)
1488 sv_catpv(d, "ALL,");
1489 else {
1490 sv_catpv(d, "(");
ae1f06a1 1491 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
3967c732
JD
1492 sv_catpv(d, " ),");
1493 }
1494 }
924ba076 1495 /* FALLTHROUGH */
25da4f38 1496 default:
e604303a 1497 evaled_or_uv:
25da4f38 1498 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
69c678eb 1499 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
25da4f38 1500 break;
addd1794 1501 case SVt_PVMG:
c13a5c80
NC
1502 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1503 if (SvVALID(sv)) sv_catpv(d, "VALID,");
924ba076 1504 /* FALLTHROUGH */
e604303a 1505 goto evaled_or_uv;
11ca45c0
NC
1506 case SVt_PVAV:
1507 break;
3967c732 1508 }
86f0d186
NC
1509 /* SVphv_SHAREKEYS is also 0x20000000 */
1510 if ((type != SVt_PVHV) && SvUTF8(sv))
9fe74ede 1511 sv_catpv(d, "UTF8");
3967c732 1512
b162af07
SP
1513 if (*(SvEND(d) - 1) == ',') {
1514 SvCUR_set(d, SvCUR(d) - 1);
1515 SvPVX(d)[SvCUR(d)] = '\0';
1516 }
3967c732 1517 sv_catpv(d, ")");
b15aece3 1518 s = SvPVX_const(d);
3967c732 1519
e0bbf362
DM
1520 /* dump initial SV details */
1521
fd0854ff 1522#ifdef DEBUG_LEAKING_SCALARS
cbe56f1d 1523 Perl_dump_indent(aTHX_ level, file,
cd676548 1524 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
fd0854ff
DM
1525 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1526 sv->sv_debug_line,
1527 sv->sv_debug_inpad ? "for" : "by",
1528 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
cd676548 1529 PTR2UV(sv->sv_debug_parent),
cbe56f1d
DM
1530 sv->sv_debug_serial
1531 );
fd0854ff 1532#endif
cea2e8a9 1533 Perl_dump_indent(aTHX_ level, file, "SV = ");
e0bbf362
DM
1534
1535 /* Dump SV type */
1536
5357ca29
NC
1537 if (type < SVt_LAST) {
1538 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1539
1540 if (type == SVt_NULL) {
5f954473 1541 SvREFCNT_dec_NN(d);
5357ca29
NC
1542 return;
1543 }
1544 } else {
faccc32b 1545 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
5f954473 1546 SvREFCNT_dec_NN(d);
3967c732
JD
1547 return;
1548 }
e0bbf362
DM
1549
1550 /* Dump general SV fields */
1551
27bd069f 1552 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
0a0c4b76
NC
1553 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1554 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
4df7f6af 1555 || (type == SVt_IV && !SvROK(sv))) {
765f542d 1556 if (SvIsUV(sv)
f8c7b90f 1557#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
1558 || SvIsCOW(sv)
1559#endif
1560 )
57def98f 1561 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
cf2093f6 1562 else
57def98f 1563 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
f8c7b90f 1564#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
1565 if (SvIsCOW_shared_hash(sv))
1566 PerlIO_printf(file, " (HASH)");
1567 else if (SvIsCOW_normal(sv))
1568 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1569#endif
3967c732
JD
1570 PerlIO_putc(file, '\n');
1571 }
e0bbf362 1572
0f94cb1f 1573 if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
08e44740 1574 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
c0a413d1 1575 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
0e4c4423 1576 || type == SVt_NV) {
67d796ae 1577 STORE_LC_NUMERIC_UNDERLYING_SET_STANDARD();
88cb8500 1578 Perl_dump_indent(aTHX_ level, file, " NV = %.*" NVgf "\n", NV_DIG, SvNVX(sv));
67d796ae 1579 RESTORE_LC_NUMERIC_UNDERLYING();
3967c732 1580 }
e0bbf362 1581
3967c732 1582 if (SvROK(sv)) {
57def98f 1583 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
3967c732
JD
1584 if (nest < maxnest)
1585 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
3967c732 1586 }
e0bbf362 1587
cea89e20 1588 if (type < SVt_PV) {
5f954473 1589 SvREFCNT_dec_NN(d);
3967c732 1590 return;
cea89e20 1591 }
e0bbf362 1592
5a3c7349
FC
1593 if ((type <= SVt_PVLV && !isGV_with_GP(sv))
1594 || (type == SVt_PVIO && IoFLAGS(sv) & IOf_FAKE_DIRP)) {
8d919b0a
FC
1595 const bool re = isREGEXP(sv);
1596 const char * const ptr =
1597 re ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
1598 if (ptr) {
69240efd 1599 STRLEN delta;
7a4bba22 1600 if (SvOOK(sv)) {
69240efd 1601 SvOOK_offset(sv, delta);
7a4bba22 1602 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
5186cc12 1603 (UV) delta);
69240efd
NC
1604 } else {
1605 delta = 0;
7a4bba22 1606 }
8d919b0a 1607 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(ptr));
7a4bba22
NC
1608 if (SvOOK(sv)) {
1609 PerlIO_printf(file, "( %s . ) ",
8d919b0a 1610 pv_display(d, ptr - delta, delta, 0,
7a4bba22
NC
1611 pvlim));
1612 }
ad3f05ad
KW
1613 if (type == SVt_INVLIST) {
1614 PerlIO_printf(file, "\n");
1615 /* 4 blanks indents 2 beyond the PV, etc */
1616 _invlist_dump(file, level, " ", sv);
1617 }
1618 else {
685bfc3c
KW
1619 PerlIO_printf(file, "%s", pv_display(d, ptr, SvCUR(sv),
1620 re ? 0 : SvLEN(sv),
1621 pvlim));
1622 if (SvUTF8(sv)) /* the 6? \x{....} */
1623 PerlIO_printf(file, " [UTF8 \"%s\"]",
1624 sv_uni_display(d, sv, 6 * SvCUR(sv),
1625 UNI_DISPLAY_QQ));
1626 PerlIO_printf(file, "\n");
ad3f05ad 1627 }
57def98f 1628 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
8d919b0a
FC
1629 if (!re)
1630 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n",
1631 (IV)SvLEN(sv));
db2c6cb3
FC
1632#ifdef PERL_NEW_COPY_ON_WRITE
1633 if (SvIsCOW(sv) && SvLEN(sv))
1634 Perl_dump_indent(aTHX_ level, file, " COW_REFCNT = %d\n",
1635 CowREFCNT(sv));
1636#endif
3967c732
JD
1637 }
1638 else
cea2e8a9 1639 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
3967c732 1640 }
e0bbf362 1641
3967c732 1642 if (type >= SVt_PVMG) {
0f94cb1f 1643 if (SvMAGIC(sv))
8530ff28 1644 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
3967c732
JD
1645 if (SvSTASH(sv))
1646 do_hv_dump(level, file, " STASH", SvSTASH(sv));
c13a5c80
NC
1647
1648 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
c13a5c80
NC
1649 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1650 }
3967c732 1651 }
e0bbf362
DM
1652
1653 /* Dump type-specific SV fields */
1654
3967c732 1655 switch (type) {
3967c732 1656 case SVt_PVAV:
57def98f 1657 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
3967c732 1658 if (AvARRAY(sv) != AvALLOC(sv)) {
57def98f
JH
1659 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1660 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
3967c732
JD
1661 }
1662 else
1663 PerlIO_putc(file, '\n');
57def98f
JH
1664 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1665 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
9b7476d7 1666 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n",
7db6405c 1667 SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
76f68e9b 1668 sv_setpvs(d, "");
11ca45c0
NC
1669 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1670 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
b15aece3
SP
1671 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1672 SvCUR(d) ? SvPVX_const(d) + 1 : "");
b9f2b683 1673 if (nest < maxnest && av_tindex(MUTABLE_AV(sv)) >= 0) {
c70927a6 1674 SSize_t count;
b9f2b683 1675 for (count = 0; count <= av_tindex(MUTABLE_AV(sv)) && count < maxnest; count++) {
502c6561 1676 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
3967c732 1677
57def98f 1678 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
2ef28da1 1679 if (elt)
3967c732
JD
1680 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1681 }
1682 }
1683 break;
5d27ee4a
DD
1684 case SVt_PVHV: {
1685 U32 usedkeys;
0c22a733
DM
1686 if (SvOOK(sv)) {
1687 struct xpvhv_aux *const aux = HvAUX(sv);
1688 Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %"UVuf"\n",
1689 (UV)aux->xhv_aux_flags);
1690 }
57def98f 1691 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
5d27ee4a
DD
1692 usedkeys = HvUSEDKEYS(sv);
1693 if (HvARRAY(sv) && usedkeys) {
3967c732
JD
1694 /* Show distribution of HEs in the ARRAY */
1695 int freq[200];
c3caa5c3 1696#define FREQ_MAX ((int)(C_ARRAY_LENGTH(freq) - 1))
3967c732
JD
1697 int i;
1698 int max = 0;
5d27ee4a 1699 U32 pow2 = 2, keys = usedkeys;
65202027 1700 NV theoret, sum = 0;
3967c732
JD
1701
1702 PerlIO_printf(file, " (");
1703 Zero(freq, FREQ_MAX + 1, int);
eb160463 1704 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
c445ea15
AL
1705 HE* h;
1706 int count = 0;
3967c732
JD
1707 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1708 count++;
1709 if (count > FREQ_MAX)
1710 count = FREQ_MAX;
1711 freq[count]++;
1712 if (max < count)
1713 max = count;
1714 }
1715 for (i = 0; i <= max; i++) {
1716 if (freq[i]) {
1717 PerlIO_printf(file, "%d%s:%d", i,
1718 (i == FREQ_MAX) ? "+" : "",
1719 freq[i]);
1720 if (i != max)
1721 PerlIO_printf(file, ", ");
1722 }
1723 }
1724 PerlIO_putc(file, ')');
b8fa94d8
MG
1725 /* The "quality" of a hash is defined as the total number of
1726 comparisons needed to access every element once, relative
1727 to the expected number needed for a random hash.
1728
1729 The total number of comparisons is equal to the sum of
e76cd0fa
AMS
1730 the squares of the number of entries in each bucket.
1731 For a random hash of n keys into k buckets, the expected
b8fa94d8
MG
1732 value is
1733 n + n(n-1)/2k
1734 */
1735
3967c732
JD
1736 for (i = max; i > 0; i--) { /* Precision: count down. */
1737 sum += freq[i] * i * i;
1738 }
155aba94 1739 while ((keys = keys >> 1))
3967c732 1740 pow2 = pow2 << 1;
5d27ee4a 1741 theoret = usedkeys;
b8fa94d8 1742 theoret += theoret * (theoret-1)/pow2;
3967c732 1743 PerlIO_putc(file, '\n');
6b4667fc 1744 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
3967c732
JD
1745 }
1746 PerlIO_putc(file, '\n');
5d27ee4a 1747 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)usedkeys);
9faf471a
NC
1748 {
1749 STRLEN count = 0;
1750 HE **ents = HvARRAY(sv);
1751
1752 if (ents) {
1753 HE *const *const last = ents + HvMAX(sv);
1754 count = last + 1 - ents;
1755
1756 do {
1757 if (!*ents)
1758 --count;
1759 } while (++ents <= last);
1760 }
1761
1762 if (SvOOK(sv)) {
1763 struct xpvhv_aux *const aux = HvAUX(sv);
1764 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf
1765 " (cached = %"UVuf")\n",
1766 (UV)count, (UV)aux->xhv_fill_lazy);
1767 } else {
1768 Perl_dump_indent(aTHX_ level, file, " FILL = %"UVuf"\n",
1769 (UV)count);
1770 }
1771 }
57def98f 1772 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
e1a7ec8d
YO
1773 if (SvOOK(sv)) {
1774 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1775 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
6a5b4183 1776#ifdef PERL_HASH_RANDOMIZE_KEYS
e1a7ec8d
YO
1777 Perl_dump_indent(aTHX_ level, file, " RAND = 0x%"UVxf, (UV)HvRAND_get(sv));
1778 if (HvRAND_get(sv) != HvLASTRAND_get(sv) && HvRITER_get(sv) != -1 ) {
6a5b4183 1779 PerlIO_printf(file, " (LAST = 0x%"UVxf")", (UV)HvLASTRAND_get(sv));
e1a7ec8d 1780 }
6a5b4183
YO
1781#endif
1782 PerlIO_putc(file, '\n');
e1a7ec8d 1783 }
8d2f4536 1784 {
b9ac451d 1785 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
8d2f4536
NC
1786 if (mg && mg->mg_obj) {
1787 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1788 }
1789 }
bfcb3514 1790 {
b9ac451d 1791 const char * const hvname = HvNAME_get(sv);
0eb335df
BF
1792 if (hvname) {
1793 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1794 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1795 generic_pv_escape( tmpsv, hvname,
1796 HvNAMELEN(sv), HvNAMEUTF8(sv)));
1797 }
bfcb3514 1798 }
86f55936 1799 if (SvOOK(sv)) {
ad64d0ec 1800 AV * const backrefs
85fbaab2 1801 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
7d88e6c4 1802 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
67e04715
FC
1803 if (HvAUX(sv)->xhv_name_count)
1804 Perl_dump_indent(aTHX_
7afc2217
FC
1805 level, file, " NAMECOUNT = %"IVdf"\n",
1806 (IV)HvAUX(sv)->xhv_name_count
67e04715 1807 );
15d9236d 1808 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
ec3405c8
NC
1809 const I32 count = HvAUX(sv)->xhv_name_count;
1810 if (count) {
1811 SV * const names = newSVpvs_flags("", SVs_TEMP);
1812 /* The starting point is the first element if count is
1813 positive and the second element if count is negative. */
1814 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1815 + (count < 0 ? 1 : 0);
1816 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1817 + (count < 0 ? -count : count);
1818 while (hekp < endp) {
0eb335df
BF
1819 if (HEK_LEN(*hekp)) {
1820 SV *tmp = newSVpvs_flags("", SVs_TEMP);
1821 Perl_sv_catpvf(aTHX_ names, ", \"%s\"",
1822 generic_pv_escape(tmp, HEK_KEY(*hekp), HEK_LEN(*hekp), HEK_UTF8(*hekp)));
ec3405c8
NC
1823 } else {
1824 /* This should never happen. */
1825 sv_catpvs(names, ", (null)");
67e04715 1826 }
ec3405c8
NC
1827 ++hekp;
1828 }
67e04715
FC
1829 Perl_dump_indent(aTHX_
1830 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1831 );
1832 }
0eb335df
BF
1833 else {
1834 SV * const tmp = newSVpvs_flags("", SVs_TEMP);
1835 const char *const hvename = HvENAME_get(sv);
67e04715 1836 Perl_dump_indent(aTHX_
0eb335df
BF
1837 level, file, " ENAME = \"%s\"\n",
1838 generic_pv_escape(tmp, hvename,
1839 HvENAMELEN_get(sv), HvENAMEUTF8(sv)));
1840 }
67e04715 1841 }
86f55936
NC
1842 if (backrefs) {
1843 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1844 PTR2UV(backrefs));
ad64d0ec 1845 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
86f55936
NC
1846 dumpops, pvlim);
1847 }
7d88e6c4 1848 if (meta) {
0eb335df
BF
1849 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1850 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%s\" (0x%"UVxf")\n",
1851 generic_pv_escape( tmpsv, meta->mro_which->name,
1852 meta->mro_which->length,
1853 (meta->mro_which->kflags & HVhek_UTF8)),
7d88e6c4
NC
1854 PTR2UV(meta->mro_which));
1855 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1856 (UV)meta->cache_gen);
1857 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1858 (UV)meta->pkg_gen);
1859 if (meta->mro_linear_all) {
1860 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1861 PTR2UV(meta->mro_linear_all));
1862 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1863 dumpops, pvlim);
1864 }
1865 if (meta->mro_linear_current) {
1866 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1867 PTR2UV(meta->mro_linear_current));
1868 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1869 dumpops, pvlim);
1870 }
1871 if (meta->mro_nextmethod) {
1872 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1873 PTR2UV(meta->mro_nextmethod));
1874 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1875 dumpops, pvlim);
1876 }
1877 if (meta->isa) {
1878 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1879 PTR2UV(meta->isa));
1880 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1881 dumpops, pvlim);
1882 }
1883 }
86f55936 1884 }
b5698553 1885 if (nest < maxnest) {
cbab3169 1886 HV * const hv = MUTABLE_HV(sv);
b5698553
TH
1887 STRLEN i;
1888 HE *he;
cbab3169 1889
b5698553
TH
1890 if (HvARRAY(hv)) {
1891 int count = maxnest - nest;
1892 for (i=0; i <= HvMAX(hv); i++) {
1893 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1894 U32 hash;
1895 SV * keysv;
1896 const char * keypv;
1897 SV * elt;
7dc86639 1898 STRLEN len;
b5698553
TH
1899
1900 if (count-- <= 0) goto DONEHV;
1901
1902 hash = HeHASH(he);
1903 keysv = hv_iterkeysv(he);
1904 keypv = SvPV_const(keysv, len);
1905 elt = HeVAL(he);
cbab3169 1906
7dc86639
YO
1907 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1908 if (SvUTF8(keysv))
1909 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
b5698553
TH
1910 if (HvEITER_get(hv) == he)
1911 PerlIO_printf(file, "[CURRENT] ");
7dc86639
YO
1912 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
1913 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
1914 }
b5698553
TH
1915 }
1916 DONEHV:;
1917 }
3967c732
JD
1918 }
1919 break;
5d27ee4a 1920 } /* case SVt_PVHV */
e0bbf362 1921
3967c732 1922 case SVt_PVCV:
8fa6a409 1923 if (CvAUTOLOAD(sv)) {
0eb335df
BF
1924 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1925 STRLEN len;
8fa6a409 1926 const char *const name = SvPV_const(sv, len);
0eb335df
BF
1927 Perl_dump_indent(aTHX_ level, file, " AUTOLOAD = \"%s\"\n",
1928 generic_pv_escape(tmpsv, name, len, SvUTF8(sv)));
8fa6a409
FC
1929 }
1930 if (SvPOK(sv)) {
0eb335df
BF
1931 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
1932 const char *const proto = CvPROTO(sv);
1933 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n",
1934 generic_pv_escape(tmpsv, proto, CvPROTOLEN(sv),
1935 SvUTF8(sv)));
cbf82dd0 1936 }
924ba076 1937 /* FALLTHROUGH */
3967c732
JD
1938 case SVt_PVFM:
1939 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
d04ba589
NC
1940 if (!CvISXSUB(sv)) {
1941 if (CvSTART(sv)) {
1942 Perl_dump_indent(aTHX_ level, file,
1943 " START = 0x%"UVxf" ===> %"IVdf"\n",
1944 PTR2UV(CvSTART(sv)),
1945 (IV)sequence_num(CvSTART(sv)));
1946 }
1947 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1948 PTR2UV(CvROOT(sv)));
1949 if (CvROOT(sv) && dumpops) {
1950 do_op_dump(level+1, file, CvROOT(sv));
1951 }
1952 } else {
126f53f3 1953 SV * const constant = cv_const_sv((const CV *)sv);
b1886099 1954
d04ba589 1955 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
b1886099
NC
1956
1957 if (constant) {
1958 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1959 " (CONST SV)\n",
1960 PTR2UV(CvXSUBANY(sv).any_ptr));
1961 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1962 pvlim);
1963 } else {
1964 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1965 (IV)CvXSUBANY(sv).any_i32);
1966 }
1967 }
3610c89f
FC
1968 if (CvNAMED(sv))
1969 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
1970 HEK_KEY(CvNAME_HEK((CV *)sv)));
1971 else do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
57843af0 1972 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
bb02a38f 1973 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
894356b3 1974 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
a3985cdc 1975 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
eacbb379
DD
1976 if (!CvISXSUB(sv)) {
1977 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
1978 if (nest < maxnest) {
1979 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
1980 }
3967c732 1981 }
eacbb379 1982 else
db6e00bd 1983 Perl_dump_indent(aTHX_ level, file, " HSCXT = 0x%p\n", CvHSCXT(sv));
3967c732 1984 {
b9ac451d 1985 const CV * const outside = CvOUTSIDE(sv);
2ef28da1 1986 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
57def98f 1987 PTR2UV(outside),
cf2093f6
JH
1988 (!outside ? "null"
1989 : CvANON(outside) ? "ANON"
1990 : (outside == PL_main_cv) ? "MAIN"
1991 : CvUNIQUE(outside) ? "UNIQUE"
b24fda9d
BF
1992 : CvGV(outside) ?
1993 generic_pv_escape(
1994 newSVpvs_flags("", SVs_TEMP),
1995 GvNAME(CvGV(outside)),
1996 GvNAMELEN(CvGV(outside)),
1997 GvNAMEUTF8(CvGV(outside)))
1998 : "UNDEFINED"));
3967c732 1999 }
704b97aa
FC
2000 if (CvOUTSIDE(sv)
2001 && (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))))
ad64d0ec 2002 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
3967c732 2003 break;
e0bbf362 2004
926fc7b6
DM
2005 case SVt_PVGV:
2006 case SVt_PVLV:
b9ac451d
AL
2007 if (type == SVt_PVLV) {
2008 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2009 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2010 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2011 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
83f78d1a 2012 Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
305b8651 2013 if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
b9ac451d
AL
2014 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2015 dumpops, pvlim);
2016 }
8d919b0a 2017 if (isREGEXP(sv)) goto dumpregexp;
926fc7b6
DM
2018 if (!isGV_with_GP(sv))
2019 break;
0eb335df
BF
2020 {
2021 SV* tmpsv = newSVpvs_flags("", SVs_TEMP);
2022 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n",
2023 generic_pv_escape(tmpsv, GvNAME(sv),
2024 GvNAMELEN(sv),
2025 GvNAMEUTF8(sv)));
2026 }
57def98f 2027 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
3967c732 2028 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
be108a01 2029 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
57def98f 2030 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
f472eb5c
GS
2031 if (!GvGP(sv))
2032 break;
57def98f
JH
2033 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2034 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2035 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2036 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2037 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2038 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2039 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2040 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(sv));
008009b0
FC
2041 Perl_dump_indent(aTHX_ level, file, " GPFLAGS = 0x%"UVxf
2042 " (%s)\n",
2043 (UV)GvGPFLAGS(sv),
2044 GvALIASED_SV(sv) ? "ALIASED_SV" : "");
57def98f 2045 Perl_dump_indent(aTHX_ level, file, " LINE = %"IVdf"\n", (IV)GvLINE(sv));
b195d487 2046 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv));
3967c732
JD
2047 do_gv_dump (level, file, " EGV", GvEGV(sv));
2048 break;
2049 case SVt_PVIO:
57def98f
JH
2050 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2051 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2052 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2053 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2054 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2055 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2056 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
27533608 2057 if (IoTOP_NAME(sv))
cea2e8a9 2058 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
9ba1f565
NC
2059 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2060 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2061 else {
2062 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2063 PTR2UV(IoTOP_GV(sv)));
ad64d0ec
NC
2064 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2065 maxnest, dumpops, pvlim);
9ba1f565
NC
2066 }
2067 /* Source filters hide things that are not GVs in these three, so let's
2068 be careful out there. */
27533608 2069 if (IoFMT_NAME(sv))
cea2e8a9 2070 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
9ba1f565
NC
2071 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2072 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2073 else {
2074 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2075 PTR2UV(IoFMT_GV(sv)));
ad64d0ec
NC
2076 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2077 maxnest, dumpops, pvlim);
9ba1f565 2078 }
27533608 2079 if (IoBOTTOM_NAME(sv))
cea2e8a9 2080 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
9ba1f565
NC
2081 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2082 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2083 else {
2084 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2085 PTR2UV(IoBOTTOM_GV(sv)));
ad64d0ec
NC
2086 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2087 maxnest, dumpops, pvlim);
9ba1f565 2088 }
27533608 2089 if (isPRINT(IoTYPE(sv)))
cea2e8a9 2090 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
27533608 2091 else
cea2e8a9 2092 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
57def98f 2093 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
3967c732 2094 break;
206ee256 2095 case SVt_REGEXP:
8d919b0a 2096 dumpregexp:
d63e6659 2097 {
8d919b0a 2098 struct regexp * const r = ReANY((REGEXP*)sv);
e3e400ec
YO
2099
2100#define SV_SET_STRINGIFY_REGEXP_FLAGS(d,flags,names) STMT_START { \
ec16d31f 2101 sv_setpv(d,""); \
e3e400ec 2102 append_flags(d, flags, names); \
ec16d31f
YO
2103 if (SvCUR(d) > 0 && *(SvEND(d) - 1) == ',') { \
2104 SvCUR_set(d, SvCUR(d) - 1); \
2105 SvPVX(d)[SvCUR(d)] = '\0'; \
2106 } \
2107} STMT_END
e3e400ec 2108 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->compflags,regexp_extflags_names);
dbc200c5
YO
2109 Perl_dump_indent(aTHX_ level, file, " COMPFLAGS = 0x%"UVxf" (%s)\n",
2110 (UV)(r->compflags), SvPVX_const(d));
2111
e3e400ec 2112 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->extflags,regexp_extflags_names);
d63e6659 2113 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
dbc200c5
YO
2114 (UV)(r->extflags), SvPVX_const(d));
2115
e3e400ec
YO
2116 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf" (%s)\n",
2117 PTR2UV(r->engine), (r->engine == &PL_core_reg_engine) ? "STANDARD" : "PLUG-IN" );
2118 if (r->engine == &PL_core_reg_engine) {
2119 SV_SET_STRINGIFY_REGEXP_FLAGS(d,r->intflags,regexp_core_intflags_names);
2120 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf" (%s)\n",
2121 (UV)(r->intflags), SvPVX_const(d));
2122 } else {
2123 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
d63e6659 2124 (UV)(r->intflags));
e3e400ec
YO
2125 }
2126#undef SV_SET_STRINGIFY_REGEXP_FLAGS
d63e6659
DM
2127 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2128 (UV)(r->nparens));
2129 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2130 (UV)(r->lastparen));
2131 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2132 (UV)(r->lastcloseparen));
2133 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2134 (IV)(r->minlen));
2135 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2136 (IV)(r->minlenret));
2137 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2138 (UV)(r->gofs));
2139 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2140 (UV)(r->pre_prefix));
d63e6659
DM
2141 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2142 (IV)(r->sublen));
6502e081
DM
2143 Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %"IVdf"\n",
2144 (IV)(r->suboffset));
2145 Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %"IVdf"\n",
2146 (IV)(r->subcoffset));
d63e6659
DM
2147 if (r->subbeg)
2148 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2149 PTR2UV(r->subbeg),
2150 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2151 else
2152 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
d63e6659
DM
2153 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2154 PTR2UV(r->mother_re));
01ffd0f1
FC
2155 if (nest < maxnest && r->mother_re)
2156 do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1,
2157 maxnest, dumpops, pvlim);
d63e6659
DM
2158 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2159 PTR2UV(r->paren_names));
2160 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2161 PTR2UV(r->substrs));
2162 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2163 PTR2UV(r->pprivate));
2164 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2165 PTR2UV(r->offs));
d63c20f2
DM
2166 Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%"UVxf"\n",
2167 PTR2UV(r->qr_anoncv));
db2c6cb3 2168#ifdef PERL_ANY_COW
d63e6659
DM
2169 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2170 PTR2UV(r->saved_copy));
2171#endif
2172 }
206ee256 2173 break;
3967c732 2174 }
5f954473 2175 SvREFCNT_dec_NN(d);
3967c732
JD
2176}
2177
36b1c95c
MH
2178/*
2179=for apidoc sv_dump
2180
2181Dumps the contents of an SV to the C<STDERR> filehandle.
2182
2183For an example of its output, see L<Devel::Peek>.
2184
2185=cut
2186*/
2187
3967c732 2188void
864dbfa3 2189Perl_sv_dump(pTHX_ SV *sv)
3967c732 2190{
7918f24d
NC
2191 PERL_ARGS_ASSERT_SV_DUMP;
2192
d1029faa
JP
2193 if (SvROK(sv))
2194 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2195 else
2196 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
8d063cd8 2197}
bd16a5f0
IZ
2198
2199int
2200Perl_runops_debug(pTHX)
2201{
2202 if (!PL_op) {
9b387841 2203 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
bd16a5f0
IZ
2204 return 0;
2205 }
2206
9f3673fb 2207 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
bd16a5f0 2208 do {
75d476e2
SM
2209#ifdef PERL_TRACE_OPS
2210 ++PL_op_exec_cnt[PL_op->op_type];
2211#endif
bd16a5f0 2212 if (PL_debug) {
b9ac451d 2213 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
bd16a5f0
IZ
2214 PerlIO_printf(Perl_debug_log,
2215 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2216 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2217 PTR2UV(*PL_watchaddr));
d6721266
DM
2218 if (DEBUG_s_TEST_) {
2219 if (DEBUG_v_TEST_) {
2220 PerlIO_printf(Perl_debug_log, "\n");
2221 deb_stack_all();
2222 }
2223 else
2224 debstack();
2225 }
2226
2227
bd16a5f0
IZ
2228 if (DEBUG_t_TEST_) debop(PL_op);
2229 if (DEBUG_P_TEST_) debprof(PL_op);
2230 }
fe83c362
SM
2231
2232 OP_ENTRY_PROBE(OP_NAME(PL_op));
16c91539 2233 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
9f3673fb 2234 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
47c9d59f 2235 PERL_ASYNC_CHECK();
bd16a5f0
IZ
2236
2237 TAINT_NOT;
2238 return 0;
2239}
2240
f9b02e42
DM
2241
2242/* print the names of the n lexical vars starting at pad offset off */
2243
2244void
2245S_deb_padvar(pTHX_ PADOFFSET off, int n, bool paren)
2246{
2247 PADNAME *sv;
2248 CV * const cv = deb_curcv(cxstack_ix);
2249 PADNAMELIST *comppad = NULL;
2250 int i;
2251
2252 if (cv) {
2253 PADLIST * const padlist = CvPADLIST(cv);
2254 comppad = PadlistNAMES(padlist);
2255 }
2256 if (paren)
2257 PerlIO_printf(Perl_debug_log, "(");
2258 for (i = 0; i < n; i++) {
2259 if (comppad && (sv = padnamelist_fetch(comppad, off + i)))
2260 PerlIO_printf(Perl_debug_log, "%"PNf, PNfARG(sv));
2261 else
2262 PerlIO_printf(Perl_debug_log, "[%"UVuf"]",
2263 (UV)(off+i));
2264 if (i < n - 1)
2265 PerlIO_printf(Perl_debug_log, ",");
2266 }
2267 if (paren)
2268 PerlIO_printf(Perl_debug_log, ")");
2269}
2270
2271
fedf30e1
DM
2272/* append to the out SV, the name of the lexical at offset off in the CV
2273 * cv */
2274
ec48399d 2275static void
fedf30e1
DM
2276S_append_padvar(pTHX_ PADOFFSET off, CV *cv, SV *out, int n,
2277 bool paren, bool is_scalar)
2278{
2279 PADNAME *sv;
2280 PADNAMELIST *namepad = NULL;
2281 int i;
2282
2283 if (cv) {
2284 PADLIST * const padlist = CvPADLIST(cv);
2285 namepad = PadlistNAMES(padlist);
2286 }
2287
2288 if (paren)
2289 sv_catpvs_nomg(out, "(");
2290 for (i = 0; i < n; i++) {
2291 if (namepad && (sv = padnamelist_fetch(namepad, off + i)))
2292 {
2293 STRLEN cur = SvCUR(out);
26334c4d
FC
2294 Perl_sv_catpvf(aTHX_ out, "[%"UTF8f,
2295 UTF8fARG(1, PadnameLEN(sv) - 1,
2296 PadnamePV(sv) + 1));
fedf30e1
DM
2297 if (is_scalar)
2298 SvPVX(out)[cur] = '$';
2299 }
2300 else
2301 Perl_sv_catpvf(aTHX_ out, "[%"UVuf"]", (UV)(off+i));
2302 if (i < n - 1)
2303 sv_catpvs_nomg(out, ",");
2304 }
2305 if (paren)
2306 sv_catpvs_nomg(out, "(");
2307}
2308
2309
ec48399d 2310static void
8bbe2fa8 2311S_append_gv_name(pTHX_ GV *gv, SV *out)
fedf30e1
DM
2312{
2313 SV *sv;
2314 if (!gv) {
2315 sv_catpvs_nomg(out, "<NULLGV>");
2316 return;
2317 }
2318 sv = newSV(0);
2319 gv_fullname4(sv, gv, NULL, FALSE);
ac892e4a 2320 Perl_sv_catpvf(aTHX_ out, "$%"SVf, SVfARG(sv));
fedf30e1
DM
2321 SvREFCNT_dec_NN(sv);
2322}
2323
2324#ifdef USE_ITHREADS
dc3c1c70
DM
2325# define ITEM_SV(item) (comppad ? \
2326 *av_fetch(comppad, (item)->pad_offset, FALSE) : NULL);
fedf30e1
DM
2327#else
2328# define ITEM_SV(item) UNOP_AUX_item_sv(item)
2329#endif
2330
2331
2332/* return a temporary SV containing a stringified representation of
48ee9c0e 2333 * the op_aux field of a MULTIDEREF op, associated with CV cv
fedf30e1
DM
2334 */
2335
2336SV*
48ee9c0e 2337Perl_multideref_stringify(pTHX_ const OP *o, CV *cv)
fedf30e1
DM
2338{
2339 UNOP_AUX_item *items = cUNOP_AUXo->op_aux;
2340 UV actions = items->uv;
2341 SV *sv;
2342 bool last = 0;
2343 bool is_hash = FALSE;
2344 int derefs = 0;
ff94d24c 2345 SV *out = newSVpvn_flags("",0,SVs_TEMP);
fedf30e1 2346#ifdef USE_ITHREADS
dc3c1c70
DM
2347 PAD *comppad;
2348
2349 if (cv) {
2350 PADLIST *padlist = CvPADLIST(cv);
2351 comppad = PadlistARRAY(padlist)[1];
2352 }
2353 else
2354 comppad = NULL;
fedf30e1
DM
2355#endif
2356
48ee9c0e 2357 PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY;
fedf30e1
DM
2358
2359 while (!last) {
2360 switch (actions & MDEREF_ACTION_MASK) {
2361
2362 case MDEREF_reload:
2363 actions = (++items)->uv;
2364 continue;
2b5060ae 2365 NOT_REACHED; /* NOTREACHED */
fedf30e1
DM
2366
2367 case MDEREF_HV_padhv_helem:
2368 is_hash = TRUE;
2b5060ae 2369 /* FALLTHROUGH */
fedf30e1
DM
2370 case MDEREF_AV_padav_aelem:
2371 derefs = 1;
2372 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2373 goto do_elem;
2b5060ae 2374 NOT_REACHED; /* NOTREACHED */
fedf30e1
DM
2375
2376 case MDEREF_HV_gvhv_helem:
2377 is_hash = TRUE;
2b5060ae 2378 /* FALLTHROUGH */
fedf30e1
DM
2379 case MDEREF_AV_gvav_aelem:
2380 derefs = 1;
dc3c1c70
DM
2381 items++;
2382 sv = ITEM_SV(items);
8bbe2fa8 2383 S_append_gv_name(aTHX_ (GV*)sv, out);
fedf30e1 2384 goto do_elem;
2b5060ae 2385 NOT_REACHED; /* NOTREACHED */
fedf30e1
DM
2386
2387 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
2388 is_hash = TRUE;
2b5060ae 2389 /* FALLTHROUGH */
fedf30e1 2390 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
dc3c1c70
DM
2391 items++;
2392 sv = ITEM_SV(items);
8bbe2fa8 2393 S_append_gv_name(aTHX_ (GV*)sv, out);
fedf30e1 2394 goto do_vivify_rv2xv_elem;
2b5060ae 2395 NOT_REACHED; /* NOTREACHED */
fedf30e1
DM
2396
2397 case MDEREF_HV_padsv_vivify_rv2hv_helem:
2398 is_hash = TRUE;
2b5060ae 2399 /* FALLTHROUGH */
fedf30e1
DM
2400 case MDEREF_AV_padsv_vivify_rv2av_aelem:
2401 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2402 goto do_vivify_rv2xv_elem;
2b5060ae 2403 NOT_REACHED; /* NOTREACHED */
fedf30e1
DM
2404
2405 case MDEREF_HV_pop_rv2hv_helem:
2406 case MDEREF_HV_vivify_rv2hv_helem:
2407 is_hash = TRUE;
2b5060ae 2408 /* FALLTHROUGH */
fedf30e1
DM
2409 do_vivify_rv2xv_elem:
2410 case MDEREF_AV_pop_rv2av_aelem:
2411 case MDEREF_AV_vivify_rv2av_aelem:
2412 if (!derefs++)
2413 sv_catpvs_nomg(out, "->");
2414 do_elem:
2415 if ((actions & MDEREF_INDEX_MASK)== MDEREF_INDEX_none) {
2416 sv_catpvs_nomg(out, "->");
2417 last = 1;
2418 break;
2419 }
2420
2421 sv_catpvn_nomg(out, (is_hash ? "{" : "["), 1);
2422 switch (actions & MDEREF_INDEX_MASK) {
2423 case MDEREF_INDEX_const:
2424 if (is_hash) {
dc3c1c70
DM
2425 items++;
2426 sv = ITEM_SV(items);
2427 if (!sv)
2428 sv_catpvs_nomg(out, "???");
2429 else {
2430 STRLEN cur;
2431 char *s;
2432 s = SvPV(sv, cur);
2433 pv_pretty(out, s, cur, 30,
2434 NULL, NULL,
2435 (PERL_PV_PRETTY_NOCLEAR
2436 |PERL_PV_PRETTY_QUOTE
2437 |PERL_PV_PRETTY_ELLIPSES));
2438 }
fedf30e1
DM
2439 }
2440 else
2441 Perl_sv_catpvf(aTHX_ out, "%"IVdf, (++items)->iv);
2442 break;
2443 case MDEREF_INDEX_padsv:
2444 S_append_padvar(aTHX_ (++items)->pad_offset, cv, out, 1, 0, 1);
2445 break;
2446 case MDEREF_INDEX_gvsv:
dc3c1c70
DM
2447 items++;
2448 sv = ITEM_SV(items);
8bbe2fa8 2449 S_append_gv_name(aTHX_ (GV*)sv, out);
fedf30e1
DM
2450 break;
2451 }
2452 sv_catpvn_nomg(out, (is_hash ? "}" : "]"), 1);
2453
2454 if (actions & MDEREF_FLAG_last)
2455 last = 1;
2456 is_hash = FALSE;
2457
2458 break;
2459
2460 default:
2461 PerlIO_printf(Perl_debug_log, "UNKNOWN(%d)",
2462 (int)(actions & MDEREF_ACTION_MASK));
2463 last = 1;
2464 break;
2465
2466 } /* switch */
2467
2468 actions >>= MDEREF_SHIFT;
2469 } /* while */
2470 return out;
2471}
2472
2473
bd16a5f0 2474I32
6867be6d 2475Perl_debop(pTHX_ const OP *o)
bd16a5f0 2476{
7918f24d
NC
2477 PERL_ARGS_ASSERT_DEBOP;
2478
1045810a
IZ
2479 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2480 return 0;
2481
bd16a5f0
IZ
2482 Perl_deb(aTHX_ "%s", OP_NAME(o));
2483 switch (o->op_type) {
2484 case OP_CONST:
996c9baa 2485 case OP_HINTSEVAL:
6cefa69e 2486 /* With ITHREADS, consts are stored in the pad, and the right pad
7367e658 2487 * may not be active here, so check.
6cefa69e 2488 * Looks like only during compiling the pads are illegal.
7367e658 2489 */
6cefa69e
RU
2490#ifdef USE_ITHREADS
2491 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2492#endif
7367e658 2493 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
bd16a5f0
IZ
2494 break;
2495 case OP_GVSV:
2496 case OP_GV:
8333ca1a 2497 if (cGVOPo_gv && isGV(cGVOPo_gv)) {
b9ac451d 2498 SV * const sv = newSV(0);
bd61b366 2499 gv_fullname3(sv, cGVOPo_gv, NULL);
93524f2b 2500 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
5f954473 2501 SvREFCNT_dec_NN(sv);
bd16a5f0 2502 }
8333ca1a
FC
2503 else if (cGVOPo_gv) {
2504 SV * const sv = newSV(0);
2505 assert(SvROK(cGVOPo_gv));
2506 assert(SvTYPE(SvRV(cGVOPo_gv)) == SVt_PVCV);
2507 PerlIO_printf(Perl_debug_log, "(cv ref: %s)",
ecf05a58 2508 SvPV_nolen_const(cv_name((CV *)SvRV(cGVOPo_gv),sv,0)));
8333ca1a
FC
2509 SvREFCNT_dec_NN(sv);
2510 }
bd16a5f0
IZ
2511 else
2512 PerlIO_printf(Perl_debug_log, "(NULL)");
2513 break;
a7fd8ef6 2514
bd16a5f0
IZ
2515 case OP_PADSV:
2516 case OP_PADAV:
2517 case OP_PADHV:
f9b02e42
DM
2518 S_deb_padvar(aTHX_ o->op_targ, 1, 1);
2519 break;
fedf30e1 2520
a7fd8ef6 2521 case OP_PADRANGE:
f9b02e42
DM
2522 S_deb_padvar(aTHX_ o->op_targ,
2523 o->op_private & OPpPADRANGE_COUNTMASK, 1);
bd16a5f0 2524 break;
a7fd8ef6 2525
fedf30e1 2526 case OP_MULTIDEREF:
ac892e4a
DM
2527 PerlIO_printf(Perl_debug_log, "(%"SVf")",
2528 SVfARG(multideref_stringify(o, deb_curcv(cxstack_ix))));
fedf30e1
DM
2529 break;
2530
bd16a5f0 2531 default:
091ab601 2532 break;
bd16a5f0
IZ
2533 }
2534 PerlIO_printf(Perl_debug_log, "\n");
2535 return 0;
2536}
2537
2538STATIC CV*
dc6240c9 2539S_deb_curcv(pTHX_ I32 ix)
bd16a5f0 2540{
dc6240c9
DM
2541 PERL_SI *si = PL_curstackinfo;
2542 for (; ix >=0; ix--) {
2543 const PERL_CONTEXT * const cx = &(si->si_cxstack)[ix];
2544
2545 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2546 return cx->blk_sub.cv;
2547 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2548 return cx->blk_eval.cv;
2549 else if (ix == 0 && si->si_type == PERLSI_MAIN)
2550 return PL_main_cv;
2551 else if (ix == 0 && CxTYPE(cx) == CXt_NULL
2552 && si->si_type == PERLSI_SORT)
2553 {
2554 /* fake sort sub; use CV of caller */
2555 si = si->si_prev;
2556 ix = si->si_cxix + 1;
2557 }
2558 }
2559 return NULL;
bd16a5f0
IZ
2560}
2561
2562void
2563Perl_watch(pTHX_ char **addr)
2564{
7918f24d
NC
2565 PERL_ARGS_ASSERT_WATCH;
2566
bd16a5f0
IZ
2567 PL_watchaddr = addr;
2568 PL_watchok = *addr;
2569 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2570 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2571}
2572
2573STATIC void
e1ec3a88 2574S_debprof(pTHX_ const OP *o)
bd16a5f0 2575{
7918f24d
NC
2576 PERL_ARGS_ASSERT_DEBPROF;
2577
61f9802b 2578 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
1045810a 2579 return;
bd16a5f0 2580 if (!PL_profiledata)
a02a5408 2581 Newxz(PL_profiledata, MAXO, U32);
bd16a5f0
IZ
2582 ++PL_profiledata[o->op_type];
2583}
2584
2585void
2586Perl_debprofdump(pTHX)
2587{
2588 unsigned i;
2589 if (!PL_profiledata)
2590 return;
2591 for (i = 0; i < MAXO; i++) {
2592 if (PL_profiledata[i])
2593 PerlIO_printf(Perl_debug_log,
2594 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2595 PL_op_name[i]);
2596 }
2597}
66610fdd 2598
3b721df9 2599
66610fdd 2600/*
14d04a33 2601 * ex: set ts=8 sts=4 sw=4 et:
37442d52 2602 */