This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
gv.c: Added gv_fetchmethod_(sv|pv|pvn)_flags.
[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.
23 */
24
8d063cd8 25#include "EXTERN.h"
864dbfa3 26#define PERL_IN_DUMP_C
8d063cd8 27#include "perl.h"
f722798b 28#include "regcomp.h"
0bd48802
AL
29#include "proto.h"
30
8d063cd8 31
5357ca29
NC
32static const char* const svtypenames[SVt_LAST] = {
33 "NULL",
1cb9cd50 34 "BIND",
5357ca29 35 "IV",
b53eecb4 36 "NV",
5357ca29
NC
37 "PV",
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",
1cb9cd50 54 "BIND",
5357ca29 55 "IV",
b53eecb4 56 "NV",
5357ca29
NC
57 "PV",
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
NC
88
89
27da23d5 90#define Sequence PL_op_sequence
2814eb74 91
3967c732 92void
864dbfa3 93Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
3967c732 94{
3967c732 95 va_list args;
7918f24d 96 PERL_ARGS_ASSERT_DUMP_INDENT;
3967c732 97 va_start(args, pat);
c5be433b 98 dump_vindent(level, file, pat, &args);
3967c732
JD
99 va_end(args);
100}
8adcabd8
LW
101
102void
c5be433b
GS
103Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
104{
97aff369 105 dVAR;
7918f24d 106 PERL_ARGS_ASSERT_DUMP_VINDENT;
c8db6e60 107 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
c5be433b
GS
108 PerlIO_vprintf(file, pat, *args);
109}
110
111void
864dbfa3 112Perl_dump_all(pTHX)
79072805 113{
712a6fe4 114 dump_all_perl(FALSE);
f0e3f042
CS
115}
116
117void
118Perl_dump_all_perl(pTHX_ bool justperl)
119{
120
97aff369 121 dVAR;
760ac839 122 PerlIO_setlinebuf(Perl_debug_log);
3280af22 123 if (PL_main_root)
3967c732 124 op_dump(PL_main_root);
f0e3f042 125 dump_packsubs_perl(PL_defstash, justperl);
463ee0b2
LW
126}
127
128void
e1ec3a88 129Perl_dump_packsubs(pTHX_ const HV *stash)
463ee0b2 130{
28eb953d 131 PERL_ARGS_ASSERT_DUMP_PACKSUBS;
f0e3f042
CS
132 dump_packsubs_perl(stash, FALSE);
133}
134
135void
136Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
137{
97aff369 138 dVAR;
a0d0e21e 139 I32 i;
463ee0b2 140
28eb953d 141 PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
7918f24d 142
8990e307
LW
143 if (!HvARRAY(stash))
144 return;
a0d0e21e 145 for (i = 0; i <= (I32) HvMAX(stash); i++) {
e1ec3a88 146 const HE *entry;
4db58590 147 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
159b6efe 148 const GV * const gv = (const GV *)HeVAL(entry);
e29cdcb3
GS
149 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
150 continue;
8ebc5c01 151 if (GvCVu(gv))
f0e3f042 152 dump_sub_perl(gv, justperl);
85e6fe83
LW
153 if (GvFORM(gv))
154 dump_form(gv);
61f9802b
AL
155 if (HeKEY(entry)[HeKLEN(entry)-1] == ':') {
156 const HV * const hv = GvHV(gv);
157 if (hv && (hv != PL_defstash))
f0e3f042 158 dump_packsubs_perl(hv, justperl); /* nested package */
61f9802b 159 }
463ee0b2 160 }
79072805
LW
161 }
162}
163
164void
e1ec3a88 165Perl_dump_sub(pTHX_ const GV *gv)
a687059c 166{
28eb953d 167 PERL_ARGS_ASSERT_DUMP_SUB;
f0e3f042
CS
168 dump_sub_perl(gv, FALSE);
169}
170
171void
172Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl)
173{
174 SV * sv;
85e6fe83 175
28eb953d 176 PERL_ARGS_ASSERT_DUMP_SUB_PERL;
7918f24d 177
f0e3f042
CS
178 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
179 return;
180
181 sv = sv_newmortal();
bd61b366 182 gv_fullname3(sv, gv, NULL);
b15aece3 183 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv));
aed2304a 184 if (CvISXSUB(GvCV(gv)))
91f3b821
GS
185 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "(xsub 0x%"UVxf" %d)\n",
186 PTR2UV(CvXSUB(GvCV(gv))),
894356b3 187 (int)CvXSUBANY(GvCV(gv)).any_i32);
85e6fe83 188 else if (CvROOT(GvCV(gv)))
3967c732 189 op_dump(CvROOT(GvCV(gv)));
85e6fe83 190 else
cea2e8a9 191 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
85e6fe83
LW
192}
193
194void
e1ec3a88 195Perl_dump_form(pTHX_ const GV *gv)
85e6fe83 196{
b464bac0 197 SV * const sv = sv_newmortal();
85e6fe83 198
7918f24d
NC
199 PERL_ARGS_ASSERT_DUMP_FORM;
200
bd61b366 201 gv_fullname3(sv, gv, NULL);
b15aece3 202 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv));
85e6fe83 203 if (CvROOT(GvFORM(gv)))
3967c732 204 op_dump(CvROOT(GvFORM(gv)));
85e6fe83 205 else
cea2e8a9 206 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "<undef>\n");
a687059c
LW
207}
208
8adcabd8 209void
864dbfa3 210Perl_dump_eval(pTHX)
8d063cd8 211{
97aff369 212 dVAR;
3967c732
JD
213 op_dump(PL_eval_root);
214}
215
3df15adc
YO
216
217/*
87cea99e 218=for apidoc pv_escape
3df15adc
YO
219
220Escapes at most the first "count" chars of pv and puts the results into
ab3bbdeb 221dsv such that the size of the escaped string will not exceed "max" chars
3df15adc
YO
222and will not contain any incomplete escape sequences.
223
ab3bbdeb
YO
224If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
225will also be escaped.
3df15adc
YO
226
227Normally the SV will be cleared before the escaped string is prepared,
ab3bbdeb
YO
228but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
229
38a44b82 230If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
ab3bbdeb 231if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
38a44b82 232using C<is_utf8_string()> to determine if it is Unicode.
ab3bbdeb
YO
233
234If PERL_PV_ESCAPE_ALL is set then all input chars will be output
681f01c2
KW
235using C<\x01F1> style escapes, otherwise if PERL_PV_ESCAPE_NONASCII is set, only
236chars above 127 will be escaped using this style; otherwise, only chars above
237255 will be so escaped; other non printable chars will use octal or
238common escaped patterns like C<\n>. Otherwise, if PERL_PV_ESCAPE_NOBACKSLASH
239then all chars below 255 will be treated as printable and
ab3bbdeb
YO
240will be output as literals.
241
242If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
c8536afa
KW
243string will be escaped, regardless of max. If the output is to be in hex,
244then it will be returned as a plain hex
245sequence. Thus the output will either be a single char,
246an octal escape sequence, a special escape like C<\n> or a hex value.
3df15adc 247
44a2ac75
YO
248If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
249not a '\\'. This is because regexes very often contain backslashed
250sequences, whereas '%' is not a particularly common character in patterns.
251
ab3bbdeb 252Returns a pointer to the escaped text as held by dsv.
3df15adc
YO
253
254=cut
255*/
ab3bbdeb 256#define PV_ESCAPE_OCTBUFSIZE 32
ddc5bc0f 257
3967c732 258char *
ddc5bc0f 259Perl_pv_escape( pTHX_ SV *dsv, char const * const str,
ab3bbdeb
YO
260 const STRLEN count, const STRLEN max,
261 STRLEN * const escaped, const U32 flags )
262{
61f9802b
AL
263 const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\';
264 const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc;
44a2ac75 265 char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF";
ab3bbdeb
YO
266 STRLEN wrote = 0; /* chars written so far */
267 STRLEN chsize = 0; /* size of data to be written */
268 STRLEN readsize = 1; /* size of data just read */
38a44b82 269 bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */
ddc5bc0f 270 const char *pv = str;
61f9802b 271 const char * const end = pv + count; /* end of string */
44a2ac75 272 octbuf[0] = esc;
ab3bbdeb 273
7918f24d
NC
274 PERL_ARGS_ASSERT_PV_ESCAPE;
275
9ed8b5e5 276 if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
7fddd944 277 /* This won't alter the UTF-8 flag */
76f68e9b 278 sv_setpvs(dsv, "");
7fddd944 279 }
ab3bbdeb 280
ddc5bc0f 281 if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
ab3bbdeb
YO
282 isuni = 1;
283
284 for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
ddc5bc0f 285 const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv;
ab3bbdeb
YO
286 const U8 c = (U8)u & 0xFF;
287
681f01c2
KW
288 if ( ( u > 255 )
289 || (flags & PERL_PV_ESCAPE_ALL)
290 || (( u > 127 ) && (flags & PERL_PV_ESCAPE_NONASCII)))
291 {
ab3bbdeb
YO
292 if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
293 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
294 "%"UVxf, u);
295 else
296 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
44a2ac75 297 "%cx{%"UVxf"}", esc, u);
ab3bbdeb
YO
298 } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
299 chsize = 1;
300 } else {
44a2ac75
YO
301 if ( (c == dq) || (c == esc) || !isPRINT(c) ) {
302 chsize = 2;
ab3bbdeb 303 switch (c) {
44a2ac75
YO
304
305 case '\\' : /* fallthrough */
306 case '%' : if ( c == esc ) {
307 octbuf[1] = esc;
308 } else {
309 chsize = 1;
310 }
311 break;
3df15adc
YO
312 case '\v' : octbuf[1] = 'v'; break;
313 case '\t' : octbuf[1] = 't'; break;
314 case '\r' : octbuf[1] = 'r'; break;
315 case '\n' : octbuf[1] = 'n'; break;
316 case '\f' : octbuf[1] = 'f'; break;
44a2ac75 317 case '"' :
ab3bbdeb 318 if ( dq == '"' )
3df15adc 319 octbuf[1] = '"';
ab3bbdeb
YO
320 else
321 chsize = 1;
44a2ac75 322 break;
3df15adc 323 default:
bbae360a 324 if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
ab3bbdeb 325 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
44a2ac75
YO
326 "%c%03o", esc, c);
327 else
ab3bbdeb 328 chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
44a2ac75 329 "%c%o", esc, c);
ab3bbdeb
YO
330 }
331 } else {
44a2ac75 332 chsize = 1;
ab3bbdeb 333 }
44a2ac75
YO
334 }
335 if ( max && (wrote + chsize > max) ) {
336 break;
ab3bbdeb 337 } else if (chsize > 1) {
44a2ac75
YO
338 sv_catpvn(dsv, octbuf, chsize);
339 wrote += chsize;
3df15adc 340 } else {
7fddd944
NC
341 /* If PERL_PV_ESCAPE_NOBACKSLASH is set then bytes in the range
342 128-255 can be appended raw to the dsv. If dsv happens to be
343 UTF-8 then we need catpvf to upgrade them for us.
344 Or add a new API call sv_catpvc(). Think about that name, and
345 how to keep it clear that it's unlike the s of catpvs, which is
346 really an array octets, not a string. */
347 Perl_sv_catpvf( aTHX_ dsv, "%c", c);
3df15adc
YO
348 wrote++;
349 }
ab3bbdeb
YO
350 if ( flags & PERL_PV_ESCAPE_FIRSTCHAR )
351 break;
3967c732 352 }
ab3bbdeb
YO
353 if (escaped != NULL)
354 *escaped= pv - str;
355 return SvPVX(dsv);
356}
357/*
87cea99e 358=for apidoc pv_pretty
ab3bbdeb
YO
359
360Converts a string into something presentable, handling escaping via
95b611b0 361pv_escape() and supporting quoting and ellipses.
ab3bbdeb
YO
362
363If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
364double quoted with any double quotes in the string escaped. Otherwise
365if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
366angle brackets.
6cba11c8 367
95b611b0
RGS
368If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
369string were output then an ellipsis C<...> will be appended to the
ab3bbdeb 370string. Note that this happens AFTER it has been quoted.
6cba11c8 371
ab3bbdeb
YO
372If start_color is non-null then it will be inserted after the opening
373quote (if there is one) but before the escaped text. If end_color
374is non-null then it will be inserted after the escaped text but before
95b611b0 375any quotes or ellipses.
ab3bbdeb
YO
376
377Returns a pointer to the prettified text as held by dsv.
6cba11c8 378
ab3bbdeb
YO
379=cut
380*/
381
382char *
ddc5bc0f
YO
383Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count,
384 const STRLEN max, char const * const start_color, char const * const end_color,
ab3bbdeb
YO
385 const U32 flags )
386{
61f9802b 387 const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
ab3bbdeb 388 STRLEN escaped;
7918f24d
NC
389
390 PERL_ARGS_ASSERT_PV_PRETTY;
391
881a015e
NC
392 if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
393 /* This won't alter the UTF-8 flag */
76f68e9b 394 sv_setpvs(dsv, "");
881a015e
NC
395 }
396
ab3bbdeb 397 if ( dq == '"' )
76f68e9b 398 sv_catpvs(dsv, "\"");
ab3bbdeb 399 else if ( flags & PERL_PV_PRETTY_LTGT )
76f68e9b 400 sv_catpvs(dsv, "<");
ab3bbdeb
YO
401
402 if ( start_color != NULL )
76f68e9b 403 sv_catpv(dsv, start_color);
ab3bbdeb
YO
404
405 pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );
406
407 if ( end_color != NULL )
76f68e9b 408 sv_catpv(dsv, end_color);
ab3bbdeb
YO
409
410 if ( dq == '"' )
76f68e9b 411 sv_catpvs( dsv, "\"");
ab3bbdeb 412 else if ( flags & PERL_PV_PRETTY_LTGT )
76f68e9b 413 sv_catpvs(dsv, ">");
ab3bbdeb 414
95b611b0 415 if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) )
76f68e9b 416 sv_catpvs(dsv, "...");
ab3bbdeb 417
3df15adc
YO
418 return SvPVX(dsv);
419}
420
421/*
422=for apidoc pv_display
423
3df15adc 424Similar to
3967c732 425
3df15adc
YO
426 pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
427
428except that an additional "\0" will be appended to the string when
429len > cur and pv[cur] is "\0".
430
431Note that the final string may be up to 7 chars longer than pvlim.
432
433=cut
434*/
435
436char *
437Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
438{
7918f24d
NC
439 PERL_ARGS_ASSERT_PV_DISPLAY;
440
ddc5bc0f 441 pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
3df15adc 442 if (len > cur && pv[cur] == '\0')
76f68e9b 443 sv_catpvs( dsv, "\\0");
e6abe6d8
JH
444 return SvPVX(dsv);
445}
446
447char *
864dbfa3 448Perl_sv_peek(pTHX_ SV *sv)
3967c732 449{
27da23d5 450 dVAR;
aec46f14 451 SV * const t = sv_newmortal();
3967c732 452 int unref = 0;
5357ca29 453 U32 type;
3967c732 454
76f68e9b 455 sv_setpvs(t, "");
3967c732
JD
456 retry:
457 if (!sv) {
458 sv_catpv(t, "VOID");
459 goto finish;
460 }
ad64d0ec 461 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
3967c732
JD
462 sv_catpv(t, "WILD");
463 goto finish;
464 }
7996736c 465 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
3967c732
JD
466 if (sv == &PL_sv_undef) {
467 sv_catpv(t, "SV_UNDEF");
468 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
469 SVs_GMG|SVs_SMG|SVs_RMG)) &&
470 SvREADONLY(sv))
471 goto finish;
472 }
473 else if (sv == &PL_sv_no) {
474 sv_catpv(t, "SV_NO");
475 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
476 SVs_GMG|SVs_SMG|SVs_RMG)) &&
477 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
478 SVp_POK|SVp_NOK)) &&
479 SvCUR(sv) == 0 &&
480 SvNVX(sv) == 0.0)
481 goto finish;
482 }
7996736c 483 else if (sv == &PL_sv_yes) {
3967c732
JD
484 sv_catpv(t, "SV_YES");
485 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
486 SVs_GMG|SVs_SMG|SVs_RMG)) &&
487 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
488 SVp_POK|SVp_NOK)) &&
489 SvCUR(sv) == 1 &&
b15aece3 490 SvPVX_const(sv) && *SvPVX_const(sv) == '1' &&
3967c732
JD
491 SvNVX(sv) == 1.0)
492 goto finish;
7996736c
MHM
493 }
494 else {
495 sv_catpv(t, "SV_PLACEHOLDER");
496 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
497 SVs_GMG|SVs_SMG|SVs_RMG)) &&
498 SvREADONLY(sv))
499 goto finish;
3967c732
JD
500 }
501 sv_catpv(t, ":");
502 }
503 else if (SvREFCNT(sv) == 0) {
504 sv_catpv(t, "(");
505 unref++;
506 }
a3b4c9c6
DM
507 else if (DEBUG_R_TEST_) {
508 int is_tmp = 0;
509 I32 ix;
510 /* is this SV on the tmps stack? */
511 for (ix=PL_tmps_ix; ix>=0; ix--) {
512 if (PL_tmps_stack[ix] == sv) {
513 is_tmp = 1;
514 break;
515 }
516 }
517 if (SvREFCNT(sv) > 1)
518 Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
519 is_tmp ? "T" : "");
520 else if (is_tmp)
521 sv_catpv(t, "<T>");
04932ac8
DM
522 }
523
3967c732
JD
524 if (SvROK(sv)) {
525 sv_catpv(t, "\\");
526 if (SvCUR(t) + unref > 10) {
b162af07 527 SvCUR_set(t, unref + 3);
3967c732
JD
528 *SvEND(t) = '\0';
529 sv_catpv(t, "...");
530 goto finish;
531 }
ad64d0ec 532 sv = SvRV(sv);
3967c732
JD
533 goto retry;
534 }
5357ca29
NC
535 type = SvTYPE(sv);
536 if (type == SVt_PVCV) {
537 Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
3967c732 538 goto finish;
5357ca29
NC
539 } else if (type < SVt_LAST) {
540 sv_catpv(t, svshorttypenames[type]);
3967c732 541
5357ca29
NC
542 if (type == SVt_NULL)
543 goto finish;
544 } else {
545 sv_catpv(t, "FREED");
3967c732 546 goto finish;
3967c732
JD
547 }
548
549 if (SvPOKp(sv)) {
b15aece3 550 if (!SvPVX_const(sv))
3967c732
JD
551 sv_catpv(t, "(null)");
552 else {
b9ac451d 553 SV * const tmp = newSVpvs("");
3967c732 554 sv_catpv(t, "(");
5115136b
DM
555 if (SvOOK(sv)) {
556 STRLEN delta;
557 SvOOK_offset(sv, delta);
558 Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-delta, delta, 0, 127));
559 }
b15aece3 560 Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127));
32639b87 561 if (SvUTF8(sv))
b2ff9928 562 Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]",
e9569a7a 563 sv_uni_display(tmp, sv, 6 * SvCUR(sv),
c728cb41 564 UNI_DISPLAY_QQ));
3967c732
JD
565 SvREFCNT_dec(tmp);
566 }
567 }
568 else if (SvNOKp(sv)) {
e54dc35b 569 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 570 Perl_sv_catpvf(aTHX_ t, "(%"NVgf")",SvNVX(sv));
e54dc35b 571 RESTORE_NUMERIC_LOCAL();
3967c732 572 }
57def98f 573 else if (SvIOKp(sv)) {
cf2093f6 574 if (SvIsUV(sv))
57def98f 575 Perl_sv_catpvf(aTHX_ t, "(%"UVuf")", (UV)SvUVX(sv));
cf2093f6 576 else
57def98f 577 Perl_sv_catpvf(aTHX_ t, "(%"IVdf")", (IV)SvIVX(sv));
25da4f38 578 }
3967c732
JD
579 else
580 sv_catpv(t, "()");
2ef28da1 581
3967c732 582 finish:
61f9802b
AL
583 while (unref--)
584 sv_catpv(t, ")");
59b714e2
RGS
585 if (PL_tainting && SvTAINTED(sv))
586 sv_catpv(t, " [tainted]");
8b6b16e7 587 return SvPV_nolen(t);
3967c732
JD
588}
589
590void
6867be6d 591Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
3967c732
JD
592{
593 char ch;
594
7918f24d
NC
595 PERL_ARGS_ASSERT_DO_PMOP_DUMP;
596
3967c732 597 if (!pm) {
cea2e8a9 598 Perl_dump_indent(aTHX_ level, file, "{}\n");
3967c732
JD
599 return;
600 }
cea2e8a9 601 Perl_dump_indent(aTHX_ level, file, "{\n");
3967c732
JD
602 level++;
603 if (pm->op_pmflags & PMf_ONCE)
604 ch = '?';
605 else
606 ch = '/';
aaa362c4 607 if (PM_GETRE(pm))
cea2e8a9 608 Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n",
220fc49f 609 ch, RX_PRECOMP(PM_GETRE(pm)), ch,
3967c732
JD
610 (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : "");
611 else
cea2e8a9 612 Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n");
20e98b0f 613 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
cea2e8a9 614 Perl_dump_indent(aTHX_ level, file, "PMf_REPL = ");
20e98b0f 615 op_dump(pm->op_pmreplrootu.op_pmreplroot);
3967c732 616 }
07bc277f 617 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
4199688e 618 SV * const tmpsv = pm_description(pm);
b15aece3 619 Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
3967c732
JD
620 SvREFCNT_dec(tmpsv);
621 }
622
cea2e8a9 623 Perl_dump_indent(aTHX_ level-1, file, "}\n");
3967c732
JD
624}
625
a0c2f4dd
NC
626const struct flag_to_name pmflags_flags_names[] = {
627 {PMf_CONST, ",CONST"},
628 {PMf_KEEP, ",KEEP"},
629 {PMf_GLOBAL, ",GLOBAL"},
630 {PMf_CONTINUE, ",CONTINUE"},
631 {PMf_RETAINT, ",RETAINT"},
632 {PMf_EVAL, ",EVAL"},
633 {PMf_NONDESTRUCT, ",NONDESTRUCT"},
634};
635
b9ac451d 636static SV *
4199688e
AL
637S_pm_description(pTHX_ const PMOP *pm)
638{
639 SV * const desc = newSVpvs("");
61f9802b 640 const REGEXP * const regex = PM_GETRE(pm);
4199688e
AL
641 const U32 pmflags = pm->op_pmflags;
642
7918f24d
NC
643 PERL_ARGS_ASSERT_PM_DESCRIPTION;
644
4199688e
AL
645 if (pmflags & PMf_ONCE)
646 sv_catpv(desc, ",ONCE");
c737faaf
YO
647#ifdef USE_ITHREADS
648 if (SvREADONLY(PL_regex_pad[pm->op_pmoffset]))
649 sv_catpv(desc, ":USED");
650#else
651 if (pmflags & PMf_USED)
652 sv_catpv(desc, ":USED");
653#endif
c737faaf 654
68d4833d 655 if (regex) {
07bc277f 656 if (RX_EXTFLAGS(regex) & RXf_TAINTED)
68d4833d 657 sv_catpv(desc, ",TAINTED");
07bc277f
NC
658 if (RX_CHECK_SUBSTR(regex)) {
659 if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN))
68d4833d 660 sv_catpv(desc, ",SCANFIRST");
07bc277f 661 if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL)
68d4833d
AB
662 sv_catpv(desc, ",ALL");
663 }
07bc277f 664 if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE)
68d4833d 665 sv_catpv(desc, ",SKIPWHITE");
4199688e 666 }
68d4833d 667
a0c2f4dd 668 append_flags(desc, pmflags, pmflags_flags_names);
4199688e
AL
669 return desc;
670}
671
3967c732 672void
864dbfa3 673Perl_pmop_dump(pTHX_ PMOP *pm)
3967c732
JD
674{
675 do_pmop_dump(0, Perl_debug_log, pm);
79072805
LW
676}
677
2814eb74
PJ
678/* An op sequencer. We visit the ops in the order they're to execute. */
679
680STATIC void
0bd48802 681S_sequence(pTHX_ register const OP *o)
2814eb74 682{
27da23d5 683 dVAR;
c445ea15 684 const OP *oldop = NULL;
2814eb74 685
2814eb74
PJ
686 if (!o)
687 return;
688
3b721df9
NC
689#ifdef PERL_MAD
690 if (o->op_next == 0)
691 return;
692#endif
693
724e67cb
RGS
694 if (!Sequence)
695 Sequence = newHV();
2814eb74
PJ
696
697 for (; o; o = o->op_next) {
294b3b39
AL
698 STRLEN len;
699 SV * const op = newSVuv(PTR2UV(o));
700 const char * const key = SvPV_const(op, len);
701
2814eb74
PJ
702 if (hv_exists(Sequence, key, len))
703 break;
704
705 switch (o->op_type) {
706 case OP_STUB:
707 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
04fe65b0 708 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
2814eb74
PJ
709 break;
710 }
711 goto nothin;
712 case OP_NULL:
3b721df9
NC
713#ifdef PERL_MAD
714 if (o == o->op_next)
715 return;
716#endif
2814eb74
PJ
717 if (oldop && o->op_next)
718 continue;
719 break;
720 case OP_SCALAR:
721 case OP_LINESEQ:
722 case OP_SCOPE:
723 nothin:
724 if (oldop && o->op_next)
725 continue;
04fe65b0 726 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
2814eb74
PJ
727 break;
728
729 case OP_MAPWHILE:
730 case OP_GREPWHILE:
731 case OP_AND:
732 case OP_OR:
733 case OP_DOR:
734 case OP_ANDASSIGN:
735 case OP_ORASSIGN:
736 case OP_DORASSIGN:
737 case OP_COND_EXPR:
738 case OP_RANGE:
04fe65b0 739 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
294b3b39 740 sequence_tail(cLOGOPo->op_other);
2814eb74
PJ
741 break;
742
743 case OP_ENTERLOOP:
744 case OP_ENTERITER:
04fe65b0 745 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
294b3b39
AL
746 sequence_tail(cLOOPo->op_redoop);
747 sequence_tail(cLOOPo->op_nextop);
748 sequence_tail(cLOOPo->op_lastop);
2814eb74
PJ
749 break;
750
2814eb74 751 case OP_SUBST:
04fe65b0 752 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
29f2e912 753 sequence_tail(cPMOPo->op_pmstashstartu.op_pmreplstart);
2814eb74
PJ
754 break;
755
29f2e912
NC
756 case OP_QR:
757 case OP_MATCH:
2814eb74
PJ
758 case OP_HELEM:
759 break;
760
761 default:
04fe65b0 762 (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0);
2814eb74
PJ
763 break;
764 }
765 oldop = o;
766 }
767}
768
294b3b39
AL
769static void
770S_sequence_tail(pTHX_ const OP *o)
771{
772 while (o && (o->op_type == OP_NULL))
773 o = o->op_next;
774 sequence(o);
775}
776
2814eb74 777STATIC UV
0bd48802 778S_sequence_num(pTHX_ const OP *o)
2814eb74 779{
27da23d5 780 dVAR;
2814eb74
PJ
781 SV *op,
782 **seq;
93524f2b 783 const char *key;
2814eb74
PJ
784 STRLEN len;
785 if (!o) return 0;
c0fd1b42 786 op = newSVuv(PTR2UV(o));
93524f2b 787 key = SvPV_const(op, len);
2814eb74
PJ
788 seq = hv_fetch(Sequence, key, len, 0);
789 return seq ? SvUV(*seq): 0;
790}
791
a0c2f4dd
NC
792const struct flag_to_name op_flags_names[] = {
793 {OPf_KIDS, ",KIDS"},
794 {OPf_PARENS, ",PARENS"},
a0c2f4dd
NC
795 {OPf_REF, ",REF"},
796 {OPf_MOD, ",MOD"},
65cccc5e 797 {OPf_STACKED, ",STACKED"},
a0c2f4dd
NC
798 {OPf_SPECIAL, ",SPECIAL"}
799};
800
ea9ad1f2 801const struct flag_to_name op_trans_names[] = {
65cccc5e
VP
802 {OPpTRANS_FROM_UTF, ",FROM_UTF"},
803 {OPpTRANS_TO_UTF, ",TO_UTF"},
804 {OPpTRANS_IDENTICAL, ",IDENTICAL"},
ea9ad1f2 805 {OPpTRANS_SQUASH, ",SQUASH"},
ea9ad1f2 806 {OPpTRANS_COMPLEMENT, ",COMPLEMENT"},
65cccc5e
VP
807 {OPpTRANS_GROWS, ",GROWS"},
808 {OPpTRANS_DELETE, ",DELETE"}
ea9ad1f2
NC
809};
810
811const struct flag_to_name op_entersub_names[] = {
ea9ad1f2
NC
812 {OPpENTERSUB_DB, ",DB"},
813 {OPpENTERSUB_HASTARG, ",HASTARG"},
65cccc5e 814 {OPpENTERSUB_AMPER, ",AMPER"},
ea9ad1f2 815 {OPpENTERSUB_NOPAREN, ",NOPAREN"},
65cccc5e 816 {OPpENTERSUB_INARGS, ",INARGS"}
ea9ad1f2
NC
817};
818
819const struct flag_to_name op_const_names[] = {
65cccc5e
VP
820 {OPpCONST_NOVER, ",NOVER"},
821 {OPpCONST_SHORTCIRCUIT, ",SHORTCIRCUIT"},
ea9ad1f2 822 {OPpCONST_STRICT, ",STRICT"},
65cccc5e 823 {OPpCONST_ENTERED, ",ENTERED"},
65cccc5e
VP
824 {OPpCONST_BARE, ",BARE"},
825 {OPpCONST_WARNING, ",WARNING"}
ea9ad1f2
NC
826};
827
828const struct flag_to_name op_sort_names[] = {
829 {OPpSORT_NUMERIC, ",NUMERIC"},
830 {OPpSORT_INTEGER, ",INTEGER"},
65cccc5e
VP
831 {OPpSORT_REVERSE, ",REVERSE"},
832 {OPpSORT_INPLACE, ",INPLACE"},
833 {OPpSORT_DESCEND, ",DESCEND"},
834 {OPpSORT_QSORT, ",QSORT"},
835 {OPpSORT_STABLE, ",STABLE"}
ea9ad1f2
NC
836};
837
838const struct flag_to_name op_open_names[] = {
839 {OPpOPEN_IN_RAW, ",IN_RAW"},
840 {OPpOPEN_IN_CRLF, ",IN_CRLF"},
841 {OPpOPEN_OUT_RAW, ",OUT_RAW"},
842 {OPpOPEN_OUT_CRLF, ",OUT_CRLF"}
843};
844
261c990e
NC
845const struct flag_to_name op_exit_names[] = {
846 {OPpEXIT_VMSISH, ",EXIT_VMSISH"},
847 {OPpHUSH_VMSISH, ",HUSH_VMSISH"}
848};
849
850#define OP_PRIVATE_ONCE(op, flag, name) \
851 const struct flag_to_name CAT2(op, _names)[] = { \
852 {(flag), (name)} \
f58883a1 853 }
261c990e
NC
854
855OP_PRIVATE_ONCE(op_aassign, OPpASSIGN_COMMON, ",COMMON");
856OP_PRIVATE_ONCE(op_leavesub, OPpREFCOUNTED, ",REFCOUNTED");
857OP_PRIVATE_ONCE(op_sassign, OPpASSIGN_BACKWARDS, ",BACKWARDS");
858OP_PRIVATE_ONCE(op_repeat, OPpREPEAT_DOLIST, ",DOLIST");
65cccc5e 859OP_PRIVATE_ONCE(op_reverse, OPpREVERSE_INPLACE, ",INPLACE");
261c990e
NC
860OP_PRIVATE_ONCE(op_rv2cv, OPpLVAL_INTRO, ",INTRO");
861OP_PRIVATE_ONCE(op_flip, OPpFLIP_LINENUM, ",LINENUM");
862OP_PRIVATE_ONCE(op_gv, OPpEARLY_CV, ",EARLY_CV");
863OP_PRIVATE_ONCE(op_list, OPpLIST_GUESSED, ",GUESSED");
864OP_PRIVATE_ONCE(op_delete, OPpSLICE, ",SLICE");
865OP_PRIVATE_ONCE(op_exists, OPpEXISTS_SUB, ",EXISTS_SUB");
866OP_PRIVATE_ONCE(op_die, OPpHUSH_VMSISH, ",HUSH_VMSISH");
867
1fe3abee
NC
868struct op_private_by_op {
869 U16 op_type;
870 U16 len;
871 const struct flag_to_name *start;
872};
873
874const struct op_private_by_op op_private_names[] = {
261c990e
NC
875 {OP_LEAVESUB, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
876 {OP_LEAVE, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
877 {OP_LEAVESUBLV, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
878 {OP_LEAVEWRITE, C_ARRAY_LENGTH(op_leavesub_names), op_leavesub_names },
879 {OP_AASSIGN, C_ARRAY_LENGTH(op_aassign_names), op_aassign_names },
880 {OP_DIE, C_ARRAY_LENGTH(op_die_names), op_die_names },
881 {OP_DELETE, C_ARRAY_LENGTH(op_delete_names), op_delete_names },
882 {OP_EXISTS, C_ARRAY_LENGTH(op_exists_names), op_exists_names },
883 {OP_EXIT, C_ARRAY_LENGTH(op_exit_names), op_exit_names },
884 {OP_FLIP, C_ARRAY_LENGTH(op_flip_names), op_flip_names },
885 {OP_FLOP, C_ARRAY_LENGTH(op_flip_names), op_flip_names },
886 {OP_GV, C_ARRAY_LENGTH(op_gv_names), op_gv_names },
887 {OP_LIST, C_ARRAY_LENGTH(op_list_names), op_list_names },
888 {OP_SASSIGN, C_ARRAY_LENGTH(op_sassign_names), op_sassign_names },
889 {OP_REPEAT, C_ARRAY_LENGTH(op_repeat_names), op_repeat_names },
890 {OP_RV2CV, C_ARRAY_LENGTH(op_rv2cv_names), op_rv2cv_names },
1fe3abee
NC
891 {OP_TRANS, C_ARRAY_LENGTH(op_trans_names), op_trans_names },
892 {OP_CONST, C_ARRAY_LENGTH(op_const_names), op_const_names },
893 {OP_SORT, C_ARRAY_LENGTH(op_sort_names), op_sort_names },
894 {OP_OPEN, C_ARRAY_LENGTH(op_open_names), op_open_names },
895 {OP_BACKTICK, C_ARRAY_LENGTH(op_open_names), op_open_names }
896};
897
898static bool
899S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
900 const struct op_private_by_op *start = op_private_names;
901 const struct op_private_by_op *const end
902 = op_private_names + C_ARRAY_LENGTH(op_private_names);
903
904 /* This is a linear search, but no worse than the code that it replaced.
905 It's debugging code - size is more important than speed. */
906 do {
907 if (optype == start->op_type) {
908 S_append_flags(aTHX_ tmpsv, op_private, start->start,
909 start->start + start->len);
910 return TRUE;
911 }
912 } while (++start < end);
913 return FALSE;
914}
915
79072805 916void
6867be6d 917Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
79072805 918{
27da23d5 919 dVAR;
2814eb74 920 UV seq;
e15d5972
AL
921 const OPCODE optype = o->op_type;
922
7918f24d
NC
923 PERL_ARGS_ASSERT_DO_OP_DUMP;
924
0bd48802 925 sequence(o);
cea2e8a9 926 Perl_dump_indent(aTHX_ level, file, "{\n");
3967c732 927 level++;
0bd48802 928 seq = sequence_num(o);
2814eb74 929 if (seq)
f5992bc4 930 PerlIO_printf(file, "%-4"UVuf, seq);
93a17b20 931 else
3967c732 932 PerlIO_printf(file, " ");
c8db6e60
JH
933 PerlIO_printf(file,
934 "%*sTYPE = %s ===> ",
53e06cf0 935 (int)(PL_dumpindent*level-4), "", OP_NAME(o));
2814eb74 936 if (o->op_next)
f5992bc4 937 PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n",
666ea192 938 sequence_num(o->op_next));
79072805 939 else
3967c732 940 PerlIO_printf(file, "DONE\n");
11343788 941 if (o->op_targ) {
e15d5972 942 if (optype == OP_NULL) {
cea2e8a9 943 Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]);
e15d5972 944 if (o->op_targ == OP_NEXTSTATE) {
ae7d165c 945 if (CopLINE(cCOPo))
f5992bc4 946 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
9d98dee5 947 (UV)CopLINE(cCOPo));
ae7d165c
PJ
948 if (CopSTASHPV(cCOPo))
949 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
950 CopSTASHPV(cCOPo));
4b65a919 951 if (CopLABEL(cCOPo))
ae7d165c 952 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
4b65a919 953 CopLABEL(cCOPo));
ae7d165c
PJ
954 }
955 }
8990e307 956 else
894356b3 957 Perl_dump_indent(aTHX_ level, file, "TARG = %ld\n", (long)o->op_targ);
8990e307 958 }
748a9306 959#ifdef DUMPADDR
57def98f 960 Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
79072805 961#endif
7e5d8ed2 962 if (o->op_flags || o->op_latefree || o->op_latefreed || o->op_attached) {
e15d5972 963 SV * const tmpsv = newSVpvs("");
5dc0d613 964 switch (o->op_flags & OPf_WANT) {
54310121 965 case OPf_WANT_VOID:
46fc3d4c 966 sv_catpv(tmpsv, ",VOID");
54310121 967 break;
968 case OPf_WANT_SCALAR:
46fc3d4c 969 sv_catpv(tmpsv, ",SCALAR");
54310121 970 break;
971 case OPf_WANT_LIST:
46fc3d4c 972 sv_catpv(tmpsv, ",LIST");
54310121 973 break;
974 default:
46fc3d4c 975 sv_catpv(tmpsv, ",UNKNOWN");
54310121 976 break;
977 }
a0c2f4dd 978 append_flags(tmpsv, o->op_flags, op_flags_names);
29522234
DM
979 if (o->op_latefree)
980 sv_catpv(tmpsv, ",LATEFREE");
981 if (o->op_latefreed)
982 sv_catpv(tmpsv, ",LATEFREED");
7e5d8ed2
DM
983 if (o->op_attached)
984 sv_catpv(tmpsv, ",ATTACHED");
b15aece3 985 Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
46fc3d4c 986 SvREFCNT_dec(tmpsv);
79072805 987 }
11343788 988 if (o->op_private) {
e15d5972
AL
989 SV * const tmpsv = newSVpvs("");
990 if (PL_opargs[optype] & OA_TARGLEX) {
07447971
GS
991 if (o->op_private & OPpTARGET_MY)
992 sv_catpv(tmpsv, ",TARGET_MY");
993 }
e15d5972 994 else if (optype == OP_ENTERSUB ||
5c135d48
NC
995 optype == OP_RV2SV ||
996 optype == OP_GVSV ||
997 optype == OP_RV2AV ||
998 optype == OP_RV2HV ||
999 optype == OP_RV2GV ||
1000 optype == OP_AELEM ||
1001 optype == OP_HELEM )
85e6fe83 1002 {
e15d5972 1003 if (optype == OP_ENTERSUB) {
ea9ad1f2 1004 append_flags(tmpsv, o->op_private, op_entersub_names);
68dc0745 1005 }
bf91b999 1006 else {
d3011074 1007 switch (o->op_private & OPpDEREF) {
b9ac451d
AL
1008 case OPpDEREF_SV:
1009 sv_catpv(tmpsv, ",SV");
1010 break;
1011 case OPpDEREF_AV:
1012 sv_catpv(tmpsv, ",AV");
1013 break;
1014 case OPpDEREF_HV:
1015 sv_catpv(tmpsv, ",HV");
1016 break;
1017 }
bf91b999
SC
1018 if (o->op_private & OPpMAYBE_LVSUB)
1019 sv_catpv(tmpsv, ",MAYBE_LVSUB");
1020 }
0824d667 1021
e15d5972 1022 if (optype == OP_AELEM || optype == OP_HELEM) {
5dc0d613 1023 if (o->op_private & OPpLVAL_DEFER)
46fc3d4c 1024 sv_catpv(tmpsv, ",LVAL_DEFER");
68dc0745 1025 }
1026 else {
5dc0d613 1027 if (o->op_private & HINT_STRICT_REFS)
46fc3d4c 1028 sv_catpv(tmpsv, ",STRICT_REFS");
192587c2
GS
1029 if (o->op_private & OPpOUR_INTRO)
1030 sv_catpv(tmpsv, ",OUR_INTRO");
68dc0745 1031 }
8d063cd8 1032 }
1fe3abee
NC
1033 else if (S_op_private_to_names(aTHX_ tmpsv, optype, o->op_private)) {
1034 }
ef69c8fc 1035 else if (PL_check[optype] != Perl_ck_ftst) {
6ecf81d6 1036 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
fbb0b3b3
RGS
1037 sv_catpv(tmpsv, ",FT_ACCESS");
1038 if (o->op_private & OPpFT_STACKED)
1039 sv_catpv(tmpsv, ",FT_STACKED");
1af34c76 1040 }
11343788 1041 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
46fc3d4c 1042 sv_catpv(tmpsv, ",INTRO");
1043 if (SvCUR(tmpsv))
b15aece3 1044 Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
46fc3d4c 1045 SvREFCNT_dec(tmpsv);
8d063cd8 1046 }
8d063cd8 1047
3b721df9
NC
1048#ifdef PERL_MAD
1049 if (PL_madskills && o->op_madprop) {
76f68e9b 1050 SV * const tmpsv = newSVpvs("");
3b721df9
NC
1051 MADPROP* mp = o->op_madprop;
1052 Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n");
1053 level++;
1054 while (mp) {
61f9802b 1055 const char tmp = mp->mad_key;
76f68e9b 1056 sv_setpvs(tmpsv,"'");
3b721df9
NC
1057 if (tmp)
1058 sv_catpvn(tmpsv, &tmp, 1);
1059 sv_catpv(tmpsv, "'=");
1060 switch (mp->mad_type) {
1061 case MAD_NULL:
1062 sv_catpv(tmpsv, "NULL");
1063 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1064 break;
1065 case MAD_PV:
1066 sv_catpv(tmpsv, "<");
1067 sv_catpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen);
1068 sv_catpv(tmpsv, ">");
1069 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1070 break;
1071 case MAD_OP:
1072 if ((OP*)mp->mad_val) {
1073 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1074 do_op_dump(level, file, (OP*)mp->mad_val);
1075 }
1076 break;
1077 default:
1078 sv_catpv(tmpsv, "(UNK)");
1079 Perl_dump_indent(aTHX_ level, file, "%s\n", SvPVX(tmpsv));
1080 break;
1081 }
1082 mp = mp->mad_next;
1083 }
1084 level--;
1085 Perl_dump_indent(aTHX_ level, file, "}\n");
1086
1087 SvREFCNT_dec(tmpsv);
1088 }
1089#endif
1090
e15d5972 1091 switch (optype) {
971a9dd3 1092 case OP_AELEMFAST:
93a17b20 1093 case OP_GVSV:
79072805 1094 case OP_GV:
971a9dd3 1095#ifdef USE_ITHREADS
c803eecc 1096 Perl_dump_indent(aTHX_ level, file, "PADIX = %" IVdf "\n", (IV)cPADOPo->op_padix);
971a9dd3 1097#else
1640e9f0 1098 if ( ! (o->op_flags & OPf_SPECIAL)) { /* not lexical */
38c076c7 1099 if (cSVOPo->op_sv) {
d4c19fe8 1100 SV * const tmpsv = newSV(0);
38c076c7
DM
1101 ENTER;
1102 SAVEFREESV(tmpsv);
3b721df9 1103#ifdef PERL_MAD
84021b46 1104 /* FIXME - is this making unwarranted assumptions about the
3b721df9
NC
1105 UTF-8 cleanliness of the dump file handle? */
1106 SvUTF8_on(tmpsv);
1107#endif
159b6efe 1108 gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL);
8b6b16e7 1109 Perl_dump_indent(aTHX_ level, file, "GV = %s\n",
d5263905 1110 SvPV_nolen_const(tmpsv));
38c076c7
DM
1111 LEAVE;
1112 }
1113 else
1114 Perl_dump_indent(aTHX_ level, file, "GV = NULL\n");
378cc40b 1115 }
971a9dd3 1116#endif
79072805
LW
1117 break;
1118 case OP_CONST:
996c9baa 1119 case OP_HINTSEVAL:
f5d5a27c 1120 case OP_METHOD_NAMED:
b6a15bc5
DM
1121#ifndef USE_ITHREADS
1122 /* with ITHREADS, consts are stored in the pad, and the right pad
1123 * may not be active here, so skip */
3848b962 1124 Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv));
b6a15bc5 1125#endif
79072805 1126 break;
93a17b20
LW
1127 case OP_NEXTSTATE:
1128 case OP_DBSTATE:
57843af0 1129 if (CopLINE(cCOPo))
f5992bc4 1130 Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
9d98dee5 1131 (UV)CopLINE(cCOPo));
ed094faf
GS
1132 if (CopSTASHPV(cCOPo))
1133 Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
1134 CopSTASHPV(cCOPo));
4b65a919 1135 if (CopLABEL(cCOPo))
ed094faf 1136 Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n",
4b65a919 1137 CopLABEL(cCOPo));
79072805
LW
1138 break;
1139 case OP_ENTERLOOP:
cea2e8a9 1140 Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
11343788 1141 if (cLOOPo->op_redoop)
f5992bc4 1142 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
79072805 1143 else
3967c732 1144 PerlIO_printf(file, "DONE\n");
cea2e8a9 1145 Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
11343788 1146 if (cLOOPo->op_nextop)
f5992bc4 1147 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
79072805 1148 else
3967c732 1149 PerlIO_printf(file, "DONE\n");
cea2e8a9 1150 Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
11343788 1151 if (cLOOPo->op_lastop)
f5992bc4 1152 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
79072805 1153 else
3967c732 1154 PerlIO_printf(file, "DONE\n");
79072805
LW
1155 break;
1156 case OP_COND_EXPR:
1a67a97c 1157 case OP_RANGE:
a0d0e21e 1158 case OP_MAPWHILE:
79072805
LW
1159 case OP_GREPWHILE:
1160 case OP_OR:
1161 case OP_AND:
cea2e8a9 1162 Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
11343788 1163 if (cLOGOPo->op_other)
f5992bc4 1164 PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
79072805 1165 else
3967c732 1166 PerlIO_printf(file, "DONE\n");
79072805
LW
1167 break;
1168 case OP_PUSHRE:
1169 case OP_MATCH:
8782bef2 1170 case OP_QR:
79072805 1171 case OP_SUBST:
3967c732 1172 do_pmop_dump(level, file, cPMOPo);
79072805 1173 break;
7934575e
GS
1174 case OP_LEAVE:
1175 case OP_LEAVEEVAL:
1176 case OP_LEAVESUB:
1177 case OP_LEAVESUBLV:
1178 case OP_LEAVEWRITE:
1179 case OP_SCOPE:
1180 if (o->op_private & OPpREFCOUNTED)
1181 Perl_dump_indent(aTHX_ level, file, "REFCNT = %"UVuf"\n", (UV)o->op_targ);
1182 break;
a0d0e21e
LW
1183 default:
1184 break;
79072805 1185 }
11343788 1186 if (o->op_flags & OPf_KIDS) {
79072805 1187 OP *kid;
11343788 1188 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3967c732 1189 do_op_dump(level, file, kid);
8d063cd8 1190 }
cea2e8a9 1191 Perl_dump_indent(aTHX_ level-1, file, "}\n");
3967c732
JD
1192}
1193
1194void
6867be6d 1195Perl_op_dump(pTHX_ const OP *o)
3967c732 1196{
7918f24d 1197 PERL_ARGS_ASSERT_OP_DUMP;
3967c732 1198 do_op_dump(0, Perl_debug_log, o);
8d063cd8
LW
1199}
1200
8adcabd8 1201void
864dbfa3 1202Perl_gv_dump(pTHX_ GV *gv)
378cc40b 1203{
79072805 1204 SV *sv;
378cc40b 1205
7918f24d
NC
1206 PERL_ARGS_ASSERT_GV_DUMP;
1207
79072805 1208 if (!gv) {
760ac839 1209 PerlIO_printf(Perl_debug_log, "{}\n");
378cc40b
LW
1210 return;
1211 }
8990e307 1212 sv = sv_newmortal();
760ac839 1213 PerlIO_printf(Perl_debug_log, "{\n");
bd61b366 1214 gv_fullname3(sv, gv, NULL);
b15aece3 1215 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "GV_NAME = %s", SvPVX_const(sv));
79072805 1216 if (gv != GvEGV(gv)) {
bd61b366 1217 gv_efullname3(sv, GvEGV(gv), NULL);
b15aece3 1218 Perl_dump_indent(aTHX_ 1, Perl_debug_log, "-> %s", SvPVX_const(sv));
8adcabd8 1219 }
3967c732 1220 PerlIO_putc(Perl_debug_log, '\n');
cea2e8a9 1221 Perl_dump_indent(aTHX_ 0, Perl_debug_log, "}\n");
8d063cd8
LW
1222}
1223
14befaf4 1224
afe38520 1225/* map magic types to the symbolic names
14befaf4
DM
1226 * (with the PERL_MAGIC_ prefixed stripped)
1227 */
1228
27da23d5 1229static const struct { const char type; const char *name; } magic_names[] = {
52f49505 1230#include "mg_names.c"
516a5887 1231 /* this null string terminates the list */
b9ac451d 1232 { 0, NULL },
14befaf4
DM
1233};
1234
8adcabd8 1235void
6867be6d 1236Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
8d063cd8 1237{
7918f24d
NC
1238 PERL_ARGS_ASSERT_DO_MAGIC_DUMP;
1239
3967c732 1240 for (; mg; mg = mg->mg_moremagic) {
b900a521
JH
1241 Perl_dump_indent(aTHX_ level, file,
1242 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
3967c732 1243 if (mg->mg_virtual) {
bfed75c6 1244 const MGVTBL * const v = mg->mg_virtual;
2d1f1fe5
NC
1245 if (v >= PL_magic_vtables
1246 && v < PL_magic_vtables + magic_vtable_max) {
1247 const U32 i = v - PL_magic_vtables;
1248 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
1249 }
3967c732 1250 else
b900a521 1251 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
3967c732
JD
1252 }
1253 else
cea2e8a9 1254 Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0\n");
8d063cd8 1255
3967c732 1256 if (mg->mg_private)
cea2e8a9 1257 Perl_dump_indent(aTHX_ level, file, " MG_PRIVATE = %d\n", mg->mg_private);
3967c732 1258
14befaf4
DM
1259 {
1260 int n;
c445ea15 1261 const char *name = NULL;
27da23d5 1262 for (n = 0; magic_names[n].name; n++) {
14befaf4
DM
1263 if (mg->mg_type == magic_names[n].type) {
1264 name = magic_names[n].name;
1265 break;
1266 }
1267 }
1268 if (name)
1269 Perl_dump_indent(aTHX_ level, file,
1270 " MG_TYPE = PERL_MAGIC_%s\n", name);
1271 else
1272 Perl_dump_indent(aTHX_ level, file,
1273 " MG_TYPE = UNKNOWN(\\%o)\n", mg->mg_type);
1274 }
3967c732
JD
1275
1276 if (mg->mg_flags) {
cea2e8a9 1277 Perl_dump_indent(aTHX_ level, file, " MG_FLAGS = 0x%02X\n", mg->mg_flags);
cb50f42d
YST
1278 if (mg->mg_type == PERL_MAGIC_envelem &&
1279 mg->mg_flags & MGf_TAINTEDDIR)
cea2e8a9 1280 Perl_dump_indent(aTHX_ level, file, " TAINTEDDIR\n");
4c02285a
FR
1281 if (mg->mg_type == PERL_MAGIC_regex_global &&
1282 mg->mg_flags & MGf_MINMATCH)
1283 Perl_dump_indent(aTHX_ level, file, " MINMATCH\n");
3967c732 1284 if (mg->mg_flags & MGf_REFCOUNTED)
cea2e8a9 1285 Perl_dump_indent(aTHX_ level, file, " REFCOUNTED\n");
3967c732 1286 if (mg->mg_flags & MGf_GSKIP)
cea2e8a9 1287 Perl_dump_indent(aTHX_ level, file, " GSKIP\n");
4c02285a
FR
1288 if (mg->mg_flags & MGf_COPY)
1289 Perl_dump_indent(aTHX_ level, file, " COPY\n");
1290 if (mg->mg_flags & MGf_DUP)
1291 Perl_dump_indent(aTHX_ level, file, " DUP\n");
1292 if (mg->mg_flags & MGf_LOCAL)
1293 Perl_dump_indent(aTHX_ level, file, " LOCAL\n");
3967c732
JD
1294 }
1295 if (mg->mg_obj) {
4c02285a 1296 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n",
28d8d7f4
YO
1297 PTR2UV(mg->mg_obj));
1298 if (mg->mg_type == PERL_MAGIC_qr) {
07bc277f 1299 REGEXP* const re = (REGEXP *)mg->mg_obj;
61f9802b 1300 SV * const dsv = sv_newmortal();
866c78d1 1301 const char * const s
4c02285a 1302 = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re),
28d8d7f4 1303 60, NULL, NULL,
95b611b0 1304 ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES |
3c8556c3 1305 (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0))
28d8d7f4 1306 );
6483fb35
RGS
1307 Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s);
1308 Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n",
07bc277f 1309 (IV)RX_REFCNT(re));
28d8d7f4
YO
1310 }
1311 if (mg->mg_flags & MGf_REFCOUNTED)
3967c732
JD
1312 do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */
1313 }
1314 if (mg->mg_len)
894356b3 1315 Perl_dump_indent(aTHX_ level, file, " MG_LEN = %ld\n", (long)mg->mg_len);
3967c732 1316 if (mg->mg_ptr) {
b900a521 1317 Perl_dump_indent(aTHX_ level, file, " MG_PTR = 0x%"UVxf, PTR2UV(mg->mg_ptr));
3967c732 1318 if (mg->mg_len >= 0) {
7e8c5dac 1319 if (mg->mg_type != PERL_MAGIC_utf8) {
61f9802b 1320 SV * const sv = newSVpvs("");
7e8c5dac
HS
1321 PerlIO_printf(file, " %s", pv_display(sv, mg->mg_ptr, mg->mg_len, 0, pvlim));
1322 SvREFCNT_dec(sv);
1323 }
3967c732
JD
1324 }
1325 else if (mg->mg_len == HEf_SVKEY) {
1326 PerlIO_puts(file, " => HEf_SVKEY\n");
ad64d0ec
NC
1327 do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1,
1328 maxnest, dumpops, pvlim); /* MG is already +1 */
3967c732
JD
1329 continue;
1330 }
866f9d6c 1331 else if (mg->mg_len == -1 && mg->mg_type == PERL_MAGIC_utf8);
3967c732 1332 else
866f9d6c
FC
1333 PerlIO_puts(
1334 file,
1335 " ???? - " __FILE__
1336 " does not know how to handle this MG_LEN"
1337 );
3967c732
JD
1338 PerlIO_putc(file, '\n');
1339 }
7e8c5dac 1340 if (mg->mg_type == PERL_MAGIC_utf8) {
61f9802b 1341 const STRLEN * const cache = (STRLEN *) mg->mg_ptr;
7e8c5dac
HS
1342 if (cache) {
1343 IV i;
1344 for (i = 0; i < PERL_MAGIC_UTF8_CACHESIZE; i++)
1345 Perl_dump_indent(aTHX_ level, file,
1346 " %2"IVdf": %"UVuf" -> %"UVuf"\n",
1347 i,
1348 (UV)cache[i * 2],
1349 (UV)cache[i * 2 + 1]);
1350 }
1351 }
378cc40b 1352 }
3967c732
JD
1353}
1354
1355void
6867be6d 1356Perl_magic_dump(pTHX_ const MAGIC *mg)
3967c732 1357{
b9ac451d 1358 do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0);
3967c732
JD
1359}
1360
1361void
e1ec3a88 1362Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
3967c732 1363{
bfcb3514 1364 const char *hvname;
7918f24d
NC
1365
1366 PERL_ARGS_ASSERT_DO_HV_DUMP;
1367
b900a521 1368 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
bfcb3514 1369 if (sv && (hvname = HvNAME_get(sv)))
d7d51f4b
YO
1370 {
1371 /* we have to use pv_display and HvNAMELEN_get() so that we display the real package
1372 name which quite legally could contain insane things like tabs, newlines, nulls or
1373 other scary crap - this should produce sane results - except maybe for unicode package
1374 names - but we will wait for someone to file a bug on that - demerphq */
1375 SV * const tmpsv = newSVpvs("");
1376 PerlIO_printf(file, "\t%s\n", pv_display(tmpsv, hvname, HvNAMELEN_get(sv), 0, 1024));
1377 }
79072805 1378 else
3967c732
JD
1379 PerlIO_putc(file, '\n');
1380}
1381
1382void
e1ec3a88 1383Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
3967c732 1384{
7918f24d
NC
1385 PERL_ARGS_ASSERT_DO_GV_DUMP;
1386
b900a521 1387 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
3967c732
JD
1388 if (sv && GvNAME(sv))
1389 PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv));
c90c0ff4 1390 else
3967c732
JD
1391 PerlIO_putc(file, '\n');
1392}
1393
1394void
e1ec3a88 1395Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
3967c732 1396{
7918f24d
NC
1397 PERL_ARGS_ASSERT_DO_GVGV_DUMP;
1398
b900a521 1399 Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
3967c732 1400 if (sv && GvNAME(sv)) {
bfcb3514 1401 const char *hvname;
3967c732 1402 PerlIO_printf(file, "\t\"");
bfcb3514
NC
1403 if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1404 PerlIO_printf(file, "%s\" :: \"", hvname);
3967c732 1405 PerlIO_printf(file, "%s\"\n", GvNAME(sv));
8d063cd8 1406 }
3967c732
JD
1407 else
1408 PerlIO_putc(file, '\n');
1409}
1410
a0c2f4dd
NC
1411const struct flag_to_name first_sv_flags_names[] = {
1412 {SVs_TEMP, "TEMP,"},
1413 {SVs_OBJECT, "OBJECT,"},
1414 {SVs_GMG, "GMG,"},
1415 {SVs_SMG, "SMG,"},
1416 {SVs_RMG, "RMG,"},
1417 {SVf_IOK, "IOK,"},
1418 {SVf_NOK, "NOK,"},
1419 {SVf_POK, "POK,"}
1420};
1421
1422const struct flag_to_name second_sv_flags_names[] = {
1423 {SVf_OOK, "OOK,"},
1424 {SVf_FAKE, "FAKE,"},
1425 {SVf_READONLY, "READONLY,"},
1426 {SVf_BREAK, "BREAK,"},
1427 {SVf_AMAGIC, "OVERLOAD,"},
1428 {SVp_IOK, "pIOK,"},
1429 {SVp_NOK, "pNOK,"},
1430 {SVp_POK, "pPOK,"}
1431};
1432
ae1f06a1
NC
1433const struct flag_to_name cv_flags_names[] = {
1434 {CVf_ANON, "ANON,"},
1435 {CVf_UNIQUE, "UNIQUE,"},
1436 {CVf_CLONE, "CLONE,"},
1437 {CVf_CLONED, "CLONED,"},
1438 {CVf_CONST, "CONST,"},
1439 {CVf_NODEBUG, "NODEBUG,"},
1440 {CVf_LVALUE, "LVALUE,"},
1441 {CVf_METHOD, "METHOD,"},
cfc1e951 1442 {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
31d45e0c 1443 {CVf_CVGV_RC, "CVGV_RC,"},
bad4ae38 1444 {CVf_DYNFILE, "DYNFILE,"},
31d45e0c 1445 {CVf_ISXSUB, "ISXSUB,"}
ae1f06a1
NC
1446};
1447
1448const struct flag_to_name hv_flags_names[] = {
1449 {SVphv_SHAREKEYS, "SHAREKEYS,"},
1450 {SVphv_LAZYDEL, "LAZYDEL,"},
1451 {SVphv_HASKFLAGS, "HASKFLAGS,"},
1452 {SVphv_REHASH, "REHASH,"},
1453 {SVphv_CLONEABLE, "CLONEABLE,"}
1454};
1455
1456const struct flag_to_name gp_flags_names[] = {
1457 {GVf_INTRO, "INTRO,"},
1458 {GVf_MULTI, "MULTI,"},
1459 {GVf_ASSUMECV, "ASSUMECV,"},
1460 {GVf_IN_PAD, "IN_PAD,"}
1461};
1462
1463const struct flag_to_name gp_flags_imported_names[] = {
1464 {GVf_IMPORTED_SV, " SV"},
1465 {GVf_IMPORTED_AV, " AV"},
1466 {GVf_IMPORTED_HV, " HV"},
1467 {GVf_IMPORTED_CV, " CV"},
1468};
1469
d63e6659
DM
1470const struct flag_to_name regexp_flags_names[] = {
1471 {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
1472 {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
1473 {RXf_PMf_FOLD, "PMf_FOLD,"},
1474 {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
1475 {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
1476 {RXf_ANCH_BOL, "ANCH_BOL,"},
1477 {RXf_ANCH_MBOL, "ANCH_MBOL,"},
1478 {RXf_ANCH_SBOL, "ANCH_SBOL,"},
1479 {RXf_ANCH_GPOS, "ANCH_GPOS,"},
1480 {RXf_GPOS_SEEN, "GPOS_SEEN,"},
1481 {RXf_GPOS_FLOAT, "GPOS_FLOAT,"},
1482 {RXf_LOOKBEHIND_SEEN, "LOOKBEHIND_SEEN,"},
1483 {RXf_EVAL_SEEN, "EVAL_SEEN,"},
1484 {RXf_CANY_SEEN, "CANY_SEEN,"},
1485 {RXf_NOSCAN, "NOSCAN,"},
1486 {RXf_CHECK_ALL, "CHECK_ALL,"},
1487 {RXf_MATCH_UTF8, "MATCH_UTF8,"},
1488 {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
1489 {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
1490 {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
1491 {RXf_SPLIT, "SPLIT,"},
1492 {RXf_COPY_DONE, "COPY_DONE,"},
1493 {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
1494 {RXf_TAINTED, "TAINTED,"},
1495 {RXf_START_ONLY, "START_ONLY,"},
1496 {RXf_SKIPWHITE, "SKIPWHITE,"},
1497 {RXf_WHITE, "WHITE,"},
1498 {RXf_NULL, "NULL,"},
1499};
1500
3967c732 1501void
864dbfa3 1502Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
3967c732 1503{
97aff369 1504 dVAR;
cea89e20 1505 SV *d;
e1ec3a88 1506 const char *s;
3967c732
JD
1507 U32 flags;
1508 U32 type;
1509
7918f24d
NC
1510 PERL_ARGS_ASSERT_DO_SV_DUMP;
1511
3967c732 1512 if (!sv) {
cea2e8a9 1513 Perl_dump_indent(aTHX_ level, file, "SV = 0\n");
3967c732 1514 return;
378cc40b 1515 }
2ef28da1 1516
3967c732
JD
1517 flags = SvFLAGS(sv);
1518 type = SvTYPE(sv);
79072805 1519
e0bbf362
DM
1520 /* process general SV flags */
1521
cea89e20 1522 d = Perl_newSVpvf(aTHX_
57def98f 1523 "(0x%"UVxf") at 0x%"UVxf"\n%*s REFCNT = %"IVdf"\n%*s FLAGS = (",
56431972 1524 PTR2UV(SvANY(sv)), PTR2UV(sv),
894356b3
GS
1525 (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
1526 (int)(PL_dumpindent*level), "");
8d063cd8 1527
1979170b
NC
1528 if (!((flags & SVpad_NAME) == SVpad_NAME
1529 && (type == SVt_PVMG || type == SVt_PVNV))) {
e604303a
NC
1530 if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,");
1531 }
1979170b 1532 if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
e604303a
NC
1533 if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
1534 if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
1535 }
a0c2f4dd 1536 append_flags(d, flags, first_sv_flags_names);
810b8aa5
GS
1537 if (flags & SVf_ROK) {
1538 sv_catpv(d, "ROK,");
1539 if (SvWEAKREF(sv)) sv_catpv(d, "WEAKREF,");
1540 }
a0c2f4dd 1541 append_flags(d, flags, second_sv_flags_names);
1ccdb730
NC
1542 if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
1543 if (SvPCS_IMPORTED(sv))
1544 sv_catpv(d, "PCS_IMPORTED,");
1545 else
9660f481 1546 sv_catpv(d, "SCREAM,");
1ccdb730 1547 }
3967c732 1548
e0bbf362
DM
1549 /* process type-specific SV flags */
1550
3967c732
JD
1551 switch (type) {
1552 case SVt_PVCV:
1553 case SVt_PVFM:
ae1f06a1 1554 append_flags(d, CvFLAGS(sv), cv_flags_names);
3967c732
JD
1555 break;
1556 case SVt_PVHV:
ae1f06a1 1557 append_flags(d, flags, hv_flags_names);
3967c732 1558 break;
926fc7b6
DM
1559 case SVt_PVGV:
1560 case SVt_PVLV:
1561 if (isGV_with_GP(sv)) {
ae1f06a1 1562 append_flags(d, GvFLAGS(sv), gp_flags_names);
926fc7b6 1563 }
926fc7b6 1564 if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
3967c732
JD
1565 sv_catpv(d, "IMPORT");
1566 if (GvIMPORTED(sv) == GVf_IMPORTED)
1567 sv_catpv(d, "ALL,");
1568 else {
1569 sv_catpv(d, "(");
ae1f06a1 1570 append_flags(d, GvFLAGS(sv), gp_flags_imported_names);
3967c732
JD
1571 sv_catpv(d, " ),");
1572 }
1573 }
addd1794 1574 /* FALL THROUGH */
25da4f38 1575 default:
e604303a 1576 evaled_or_uv:
25da4f38 1577 if (SvEVALED(sv)) sv_catpv(d, "EVALED,");
69c678eb 1578 if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
25da4f38 1579 break;
addd1794 1580 case SVt_PVMG:
c13a5c80
NC
1581 if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
1582 if (SvVALID(sv)) sv_catpv(d, "VALID,");
00b1698f 1583 if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
e604303a 1584 if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
2e94196c 1585 /* FALL THROUGH */
e604303a
NC
1586 case SVt_PVNV:
1587 if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,");
1588 goto evaled_or_uv;
11ca45c0
NC
1589 case SVt_PVAV:
1590 break;
3967c732 1591 }
86f0d186
NC
1592 /* SVphv_SHAREKEYS is also 0x20000000 */
1593 if ((type != SVt_PVHV) && SvUTF8(sv))
9fe74ede 1594 sv_catpv(d, "UTF8");
3967c732 1595
b162af07
SP
1596 if (*(SvEND(d) - 1) == ',') {
1597 SvCUR_set(d, SvCUR(d) - 1);
1598 SvPVX(d)[SvCUR(d)] = '\0';
1599 }
3967c732 1600 sv_catpv(d, ")");
b15aece3 1601 s = SvPVX_const(d);
3967c732 1602
e0bbf362
DM
1603 /* dump initial SV details */
1604
fd0854ff 1605#ifdef DEBUG_LEAKING_SCALARS
cbe56f1d 1606 Perl_dump_indent(aTHX_ level, file,
cd676548 1607 "ALLOCATED at %s:%d %s %s (parent 0x%"UVxf"); serial %"UVuf"\n",
fd0854ff
DM
1608 sv->sv_debug_file ? sv->sv_debug_file : "(unknown)",
1609 sv->sv_debug_line,
1610 sv->sv_debug_inpad ? "for" : "by",
1611 sv->sv_debug_optype ? PL_op_name[sv->sv_debug_optype]: "(none)",
cd676548 1612 PTR2UV(sv->sv_debug_parent),
cbe56f1d
DM
1613 sv->sv_debug_serial
1614 );
fd0854ff 1615#endif
cea2e8a9 1616 Perl_dump_indent(aTHX_ level, file, "SV = ");
e0bbf362
DM
1617
1618 /* Dump SV type */
1619
5357ca29
NC
1620 if (type < SVt_LAST) {
1621 PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
1622
1623 if (type == SVt_NULL) {
1624 SvREFCNT_dec(d);
1625 return;
1626 }
1627 } else {
faccc32b 1628 PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
cea89e20 1629 SvREFCNT_dec(d);
3967c732
JD
1630 return;
1631 }
e0bbf362
DM
1632
1633 /* Dump general SV fields */
1634
27bd069f 1635 if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
0a0c4b76
NC
1636 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
1637 && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
4df7f6af 1638 || (type == SVt_IV && !SvROK(sv))) {
765f542d 1639 if (SvIsUV(sv)
f8c7b90f 1640#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
1641 || SvIsCOW(sv)
1642#endif
1643 )
57def98f 1644 Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv));
cf2093f6 1645 else
57def98f 1646 Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv));
f8c7b90f 1647#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
1648 if (SvIsCOW_shared_hash(sv))
1649 PerlIO_printf(file, " (HASH)");
1650 else if (SvIsCOW_normal(sv))
1651 PerlIO_printf(file, " (COW from 0x%"UVxf")", (UV)SvUVX(sv));
1652#endif
3967c732
JD
1653 PerlIO_putc(file, '\n');
1654 }
e0bbf362 1655
1979170b
NC
1656 if ((type == SVt_PVNV || type == SVt_PVMG)
1657 && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
0e4c4423
NC
1658 Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
1659 (UV) COP_SEQ_RANGE_LOW(sv));
1660 Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
1661 (UV) COP_SEQ_RANGE_HIGH(sv));
1662 } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
08e44740 1663 && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP
c0a413d1 1664 && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv))
0e4c4423 1665 || type == SVt_NV) {
e54dc35b 1666 STORE_NUMERIC_LOCAL_SET_STANDARD();
57def98f 1667 /* %Vg doesn't work? --jhi */
cf2093f6 1668#ifdef USE_LONG_DOUBLE
2d4389e4 1669 Perl_dump_indent(aTHX_ level, file, " NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
cf2093f6 1670#else
cea2e8a9 1671 Perl_dump_indent(aTHX_ level, file, " NV = %.*g\n", DBL_DIG, SvNVX(sv));
cf2093f6 1672#endif
e54dc35b 1673 RESTORE_NUMERIC_LOCAL();
3967c732 1674 }
e0bbf362 1675
3967c732 1676 if (SvROK(sv)) {
57def98f 1677 Perl_dump_indent(aTHX_ level, file, " RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
3967c732
JD
1678 if (nest < maxnest)
1679 do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
3967c732 1680 }
e0bbf362 1681
cea89e20
JH
1682 if (type < SVt_PV) {
1683 SvREFCNT_dec(d);
3967c732 1684 return;
cea89e20 1685 }
e0bbf362 1686
a49b46c6 1687 if ((type <= SVt_PVLV && !isGV_with_GP(sv)) || type == SVt_PVFM) {
b15aece3 1688 if (SvPVX_const(sv)) {
69240efd 1689 STRLEN delta;
7a4bba22 1690 if (SvOOK(sv)) {
69240efd 1691 SvOOK_offset(sv, delta);
7a4bba22 1692 Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n",
5186cc12 1693 (UV) delta);
69240efd
NC
1694 } else {
1695 delta = 0;
7a4bba22 1696 }
b15aece3 1697 Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv)));
7a4bba22
NC
1698 if (SvOOK(sv)) {
1699 PerlIO_printf(file, "( %s . ) ",
1700 pv_display(d, SvPVX_const(sv) - delta, delta, 0,
1701 pvlim));
1702 }
b15aece3 1703 PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim));
e9569a7a
GG
1704 if (SvUTF8(sv)) /* the 6? \x{....} */
1705 PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ));
e6abe6d8 1706 PerlIO_printf(file, "\n");
57def98f
JH
1707 Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv));
1708 Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv));
3967c732
JD
1709 }
1710 else
cea2e8a9 1711 Perl_dump_indent(aTHX_ level, file, " PV = 0\n");
3967c732 1712 }
e0bbf362 1713
3967c732 1714 if (type >= SVt_PVMG) {
0e4c4423 1715 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
61f9802b 1716 HV * const ost = SvOURSTASH(sv);
38cbaf55
RGS
1717 if (ost)
1718 do_hv_dump(level, file, " OURSTASH", ost);
0e4c4423
NC
1719 } else {
1720 if (SvMAGIC(sv))
8530ff28 1721 do_magic_dump(level, file, SvMAGIC(sv), nest+1, maxnest, dumpops, pvlim);
0e4c4423 1722 }
3967c732
JD
1723 if (SvSTASH(sv))
1724 do_hv_dump(level, file, " STASH", SvSTASH(sv));
c13a5c80
NC
1725
1726 if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
1727 Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
1728 Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
1729 Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
1730 }
3967c732 1731 }
e0bbf362
DM
1732
1733 /* Dump type-specific SV fields */
1734
3967c732 1735 switch (type) {
3967c732 1736 case SVt_PVAV:
57def98f 1737 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(AvARRAY(sv)));
3967c732 1738 if (AvARRAY(sv) != AvALLOC(sv)) {
57def98f
JH
1739 PerlIO_printf(file, " (offset=%"IVdf")\n", (IV)(AvARRAY(sv) - AvALLOC(sv)));
1740 Perl_dump_indent(aTHX_ level, file, " ALLOC = 0x%"UVxf"\n", PTR2UV(AvALLOC(sv)));
3967c732
JD
1741 }
1742 else
1743 PerlIO_putc(file, '\n');
57def98f
JH
1744 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv));
1745 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv));
a3874608 1746 Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0);
76f68e9b 1747 sv_setpvs(d, "");
11ca45c0
NC
1748 if (AvREAL(sv)) sv_catpv(d, ",REAL");
1749 if (AvREIFY(sv)) sv_catpv(d, ",REIFY");
b15aece3
SP
1750 Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n",
1751 SvCUR(d) ? SvPVX_const(d) + 1 : "");
502c6561 1752 if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) {
3967c732 1753 int count;
502c6561
NC
1754 for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) {
1755 SV** const elt = av_fetch(MUTABLE_AV(sv),count,0);
3967c732 1756
57def98f 1757 Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count);
2ef28da1 1758 if (elt)
3967c732
JD
1759 do_sv_dump(level+1, file, *elt, nest+1, maxnest, dumpops, pvlim);
1760 }
1761 }
1762 break;
1763 case SVt_PVHV:
57def98f 1764 Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
1b95d04f 1765 if (HvARRAY(sv) && HvUSEDKEYS(sv)) {
3967c732
JD
1766 /* Show distribution of HEs in the ARRAY */
1767 int freq[200];
bb7a0f54 1768#define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
3967c732
JD
1769 int i;
1770 int max = 0;
1b95d04f 1771 U32 pow2 = 2, keys = HvUSEDKEYS(sv);
65202027 1772 NV theoret, sum = 0;
3967c732
JD
1773
1774 PerlIO_printf(file, " (");
1775 Zero(freq, FREQ_MAX + 1, int);
eb160463 1776 for (i = 0; (STRLEN)i <= HvMAX(sv); i++) {
c445ea15
AL
1777 HE* h;
1778 int count = 0;
3967c732
JD
1779 for (h = HvARRAY(sv)[i]; h; h = HeNEXT(h))
1780 count++;
1781 if (count > FREQ_MAX)
1782 count = FREQ_MAX;
1783 freq[count]++;
1784 if (max < count)
1785 max = count;
1786 }
1787 for (i = 0; i <= max; i++) {
1788 if (freq[i]) {
1789 PerlIO_printf(file, "%d%s:%d", i,
1790 (i == FREQ_MAX) ? "+" : "",
1791 freq[i]);
1792 if (i != max)
1793 PerlIO_printf(file, ", ");
1794 }
1795 }
1796 PerlIO_putc(file, ')');
b8fa94d8
MG
1797 /* The "quality" of a hash is defined as the total number of
1798 comparisons needed to access every element once, relative
1799 to the expected number needed for a random hash.
1800
1801 The total number of comparisons is equal to the sum of
e76cd0fa
AMS
1802 the squares of the number of entries in each bucket.
1803 For a random hash of n keys into k buckets, the expected
b8fa94d8
MG
1804 value is
1805 n + n(n-1)/2k
1806 */
1807
3967c732
JD
1808 for (i = max; i > 0; i--) { /* Precision: count down. */
1809 sum += freq[i] * i * i;
1810 }
155aba94 1811 while ((keys = keys >> 1))
3967c732 1812 pow2 = pow2 << 1;
1b95d04f 1813 theoret = HvUSEDKEYS(sv);
b8fa94d8 1814 theoret += theoret * (theoret-1)/pow2;
3967c732 1815 PerlIO_putc(file, '\n');
6b4667fc 1816 Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
3967c732
JD
1817 }
1818 PerlIO_putc(file, '\n');
1b95d04f 1819 Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
57def98f
JH
1820 Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
1821 Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
bfcb3514
NC
1822 Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1823 Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
8d2f4536 1824 {
b9ac451d 1825 MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab);
8d2f4536
NC
1826 if (mg && mg->mg_obj) {
1827 Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
1828 }
1829 }
bfcb3514 1830 {
b9ac451d 1831 const char * const hvname = HvNAME_get(sv);
bfcb3514
NC
1832 if (hvname)
1833 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1834 }
86f55936 1835 if (SvOOK(sv)) {
ad64d0ec 1836 AV * const backrefs
85fbaab2 1837 = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv));
7d88e6c4 1838 struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta;
67e04715
FC
1839 if (HvAUX(sv)->xhv_name_count)
1840 Perl_dump_indent(aTHX_
7afc2217
FC
1841 level, file, " NAMECOUNT = %"IVdf"\n",
1842 (IV)HvAUX(sv)->xhv_name_count
67e04715 1843 );
15d9236d 1844 if (HvAUX(sv)->xhv_name_u.xhvnameu_name && HvENAME_HEK_NN(sv)) {
ec3405c8
NC
1845 const I32 count = HvAUX(sv)->xhv_name_count;
1846 if (count) {
1847 SV * const names = newSVpvs_flags("", SVs_TEMP);
1848 /* The starting point is the first element if count is
1849 positive and the second element if count is negative. */
1850 HEK *const *hekp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1851 + (count < 0 ? 1 : 0);
1852 HEK *const *const endp = HvAUX(sv)->xhv_name_u.xhvnameu_names
1853 + (count < 0 ? -count : count);
1854 while (hekp < endp) {
67e04715
FC
1855 if (*hekp) {
1856 sv_catpvs(names, ", \"");
ec3405c8 1857 sv_catpvn(names, HEK_KEY(*hekp), HEK_LEN(*hekp));
67e04715 1858 sv_catpvs(names, "\"");
ec3405c8
NC
1859 } else {
1860 /* This should never happen. */
1861 sv_catpvs(names, ", (null)");
67e04715 1862 }
ec3405c8
NC
1863 ++hekp;
1864 }
67e04715
FC
1865 Perl_dump_indent(aTHX_
1866 level, file, " ENAME = %s\n", SvPV_nolen(names)+2
1867 );
1868 }
1869 else
1870 Perl_dump_indent(aTHX_
1871 level, file, " ENAME = \"%s\"\n", HvENAME_get(sv)
1872 );
1873 }
86f55936
NC
1874 if (backrefs) {
1875 Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n",
1876 PTR2UV(backrefs));
ad64d0ec 1877 do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest,
86f55936
NC
1878 dumpops, pvlim);
1879 }
7d88e6c4
NC
1880 if (meta) {
1881 /* FIXME - mro_algs kflags can signal a UTF-8 name. */
1882 Perl_dump_indent(aTHX_ level, file, " MRO_WHICH = \"%.*s\" (0x%"UVxf")\n",
1883 (int)meta->mro_which->length,
1884 meta->mro_which->name,
1885 PTR2UV(meta->mro_which));
1886 Perl_dump_indent(aTHX_ level, file, " CACHE_GEN = 0x%"UVxf"\n",
1887 (UV)meta->cache_gen);
1888 Perl_dump_indent(aTHX_ level, file, " PKG_GEN = 0x%"UVxf"\n",
1889 (UV)meta->pkg_gen);
1890 if (meta->mro_linear_all) {
1891 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_ALL = 0x%"UVxf"\n",
1892 PTR2UV(meta->mro_linear_all));
1893 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_all), nest+1, maxnest,
1894 dumpops, pvlim);
1895 }
1896 if (meta->mro_linear_current) {
1897 Perl_dump_indent(aTHX_ level, file, " MRO_LINEAR_CURRENT = 0x%"UVxf"\n",
1898 PTR2UV(meta->mro_linear_current));
1899 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_linear_current), nest+1, maxnest,
1900 dumpops, pvlim);
1901 }
1902 if (meta->mro_nextmethod) {
1903 Perl_dump_indent(aTHX_ level, file, " MRO_NEXTMETHOD = 0x%"UVxf"\n",
1904 PTR2UV(meta->mro_nextmethod));
1905 do_sv_dump(level+1, file, MUTABLE_SV(meta->mro_nextmethod), nest+1, maxnest,
1906 dumpops, pvlim);
1907 }
1908 if (meta->isa) {
1909 Perl_dump_indent(aTHX_ level, file, " ISA = 0x%"UVxf"\n",
1910 PTR2UV(meta->isa));
1911 do_sv_dump(level+1, file, MUTABLE_SV(meta->isa), nest+1, maxnest,
1912 dumpops, pvlim);
1913 }
1914 }
86f55936 1915 }
b5698553 1916 if (nest < maxnest) {
cbab3169 1917 HV * const hv = MUTABLE_HV(sv);
b5698553
TH
1918 STRLEN i;
1919 HE *he;
cbab3169 1920
b5698553
TH
1921 if (HvARRAY(hv)) {
1922 int count = maxnest - nest;
1923 for (i=0; i <= HvMAX(hv); i++) {
1924 for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
1925 U32 hash;
1926 SV * keysv;
1927 const char * keypv;
1928 SV * elt;
cbab3169 1929 STRLEN len;
b5698553
TH
1930
1931 if (count-- <= 0) goto DONEHV;
1932
1933 hash = HeHASH(he);
1934 keysv = hv_iterkeysv(he);
1935 keypv = SvPV_const(keysv, len);
1936 elt = HeVAL(he);
cbab3169
FC
1937
1938 Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim));
1939 if (SvUTF8(keysv))
1940 PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
b5698553
TH
1941 if (HvEITER_get(hv) == he)
1942 PerlIO_printf(file, "[CURRENT] ");
cbab3169
FC
1943 if (HeKREHASH(he))
1944 PerlIO_printf(file, "[REHASH] ");
b5698553 1945 PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
cbab3169 1946 do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
3967c732 1947 }
b5698553
TH
1948 }
1949 DONEHV:;
1950 }
3967c732
JD
1951 }
1952 break;
e0bbf362 1953
3967c732 1954 case SVt_PVCV:
cbf82dd0
NC
1955 if (SvPOK(sv)) {
1956 STRLEN len;
1957 const char *const proto = SvPV_const(sv, len);
1958 Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n",
1959 (int) len, proto);
1960 }
3967c732
JD
1961 /* FALL THROUGH */
1962 case SVt_PVFM:
1963 do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv));
d04ba589
NC
1964 if (!CvISXSUB(sv)) {
1965 if (CvSTART(sv)) {
1966 Perl_dump_indent(aTHX_ level, file,
1967 " START = 0x%"UVxf" ===> %"IVdf"\n",
1968 PTR2UV(CvSTART(sv)),
1969 (IV)sequence_num(CvSTART(sv)));
1970 }
1971 Perl_dump_indent(aTHX_ level, file, " ROOT = 0x%"UVxf"\n",
1972 PTR2UV(CvROOT(sv)));
1973 if (CvROOT(sv) && dumpops) {
1974 do_op_dump(level+1, file, CvROOT(sv));
1975 }
1976 } else {
126f53f3 1977 SV * const constant = cv_const_sv((const CV *)sv);
b1886099 1978
d04ba589 1979 Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv)));
b1886099
NC
1980
1981 if (constant) {
1982 Perl_dump_indent(aTHX_ level, file, " XSUBANY = 0x%"UVxf
1983 " (CONST SV)\n",
1984 PTR2UV(CvXSUBANY(sv).any_ptr));
1985 do_sv_dump(level+1, file, constant, nest+1, maxnest, dumpops,
1986 pvlim);
1987 } else {
1988 Perl_dump_indent(aTHX_ level, file, " XSUBANY = %"IVdf"\n",
1989 (IV)CvXSUBANY(sv).any_i32);
1990 }
1991 }
3967c732 1992 do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv));
57843af0 1993 Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv));
5129b2ca
NC
1994 if (type == SVt_PVCV)
1995 Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
894356b3 1996 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
a3985cdc 1997 Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
3967c732 1998 if (type == SVt_PVFM)
57def98f
JH
1999 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)FmLINES(sv));
2000 Perl_dump_indent(aTHX_ level, file, " PADLIST = 0x%"UVxf"\n", PTR2UV(CvPADLIST(sv)));
dd2155a4
DM
2001 if (nest < maxnest) {
2002 do_dump_pad(level+1, file, CvPADLIST(sv), 0);
3967c732
JD
2003 }
2004 {
b9ac451d 2005 const CV * const outside = CvOUTSIDE(sv);
2ef28da1 2006 Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n",
57def98f 2007 PTR2UV(outside),
cf2093f6
JH
2008 (!outside ? "null"
2009 : CvANON(outside) ? "ANON"
2010 : (outside == PL_main_cv) ? "MAIN"
2011 : CvUNIQUE(outside) ? "UNIQUE"
2012 : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED"));
3967c732
JD
2013 }
2014 if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv)))
ad64d0ec 2015 do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim);
3967c732 2016 break;
e0bbf362 2017
926fc7b6
DM
2018 case SVt_PVGV:
2019 case SVt_PVLV:
b9ac451d
AL
2020 if (type == SVt_PVLV) {
2021 Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv));
2022 Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv));
2023 Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv));
2024 Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv)));
2025 if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
2026 do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
2027 dumpops, pvlim);
2028 }
926fc7b6
DM
2029 if (!isGV_with_GP(sv))
2030 break;
cea2e8a9 2031 Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
57def98f 2032 Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv));
3967c732 2033 do_hv_dump (level, file, " GvSTASH", GvSTASH(sv));
57def98f 2034 Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv)));
f472eb5c
GS
2035 if (!GvGP(sv))
2036 break;
57def98f
JH
2037 Perl_dump_indent(aTHX_ level, file, " SV = 0x%"UVxf"\n", PTR2UV(GvSV(sv)));
2038 Perl_dump_indent(aTHX_ level, file, " REFCNT = %"IVdf"\n", (IV)GvREFCNT(sv));
2039 Perl_dump_indent(aTHX_ level, file, " IO = 0x%"UVxf"\n", PTR2UV(GvIOp(sv)));
2040 Perl_dump_indent(aTHX_ level, file, " FORM = 0x%"UVxf" \n", PTR2UV(GvFORM(sv)));
2041 Perl_dump_indent(aTHX_ level, file, " AV = 0x%"UVxf"\n", PTR2UV(GvAV(sv)));
2042 Perl_dump_indent(aTHX_ level, file, " HV = 0x%"UVxf"\n", PTR2UV(GvHV(sv)));
2043 Perl_dump_indent(aTHX_ level, file, " CV = 0x%"UVxf"\n", PTR2UV(GvCV(sv)));
2044 Perl_dump_indent(aTHX_ level, file, " CVGEN = 0x%"UVxf"\n", (UV)GvCVGEN(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));
e39917cc 2047 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)GvFLAGS(sv));
3967c732
JD
2048 do_gv_dump (level, file, " EGV", GvEGV(sv));
2049 break;
2050 case SVt_PVIO:
57def98f
JH
2051 Perl_dump_indent(aTHX_ level, file, " IFP = 0x%"UVxf"\n", PTR2UV(IoIFP(sv)));
2052 Perl_dump_indent(aTHX_ level, file, " OFP = 0x%"UVxf"\n", PTR2UV(IoOFP(sv)));
2053 Perl_dump_indent(aTHX_ level, file, " DIRP = 0x%"UVxf"\n", PTR2UV(IoDIRP(sv)));
2054 Perl_dump_indent(aTHX_ level, file, " LINES = %"IVdf"\n", (IV)IoLINES(sv));
2055 Perl_dump_indent(aTHX_ level, file, " PAGE = %"IVdf"\n", (IV)IoPAGE(sv));
2056 Perl_dump_indent(aTHX_ level, file, " PAGE_LEN = %"IVdf"\n", (IV)IoPAGE_LEN(sv));
2057 Perl_dump_indent(aTHX_ level, file, " LINES_LEFT = %"IVdf"\n", (IV)IoLINES_LEFT(sv));
27533608 2058 if (IoTOP_NAME(sv))
cea2e8a9 2059 Perl_dump_indent(aTHX_ level, file, " TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
9ba1f565
NC
2060 if (!IoTOP_GV(sv) || SvTYPE(IoTOP_GV(sv)) == SVt_PVGV)
2061 do_gv_dump (level, file, " TOP_GV", IoTOP_GV(sv));
2062 else {
2063 Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n",
2064 PTR2UV(IoTOP_GV(sv)));
ad64d0ec
NC
2065 do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1,
2066 maxnest, dumpops, pvlim);
9ba1f565
NC
2067 }
2068 /* Source filters hide things that are not GVs in these three, so let's
2069 be careful out there. */
27533608 2070 if (IoFMT_NAME(sv))
cea2e8a9 2071 Perl_dump_indent(aTHX_ level, file, " FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
9ba1f565
NC
2072 if (!IoFMT_GV(sv) || SvTYPE(IoFMT_GV(sv)) == SVt_PVGV)
2073 do_gv_dump (level, file, " FMT_GV", IoFMT_GV(sv));
2074 else {
2075 Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n",
2076 PTR2UV(IoFMT_GV(sv)));
ad64d0ec
NC
2077 do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1,
2078 maxnest, dumpops, pvlim);
9ba1f565 2079 }
27533608 2080 if (IoBOTTOM_NAME(sv))
cea2e8a9 2081 Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
9ba1f565
NC
2082 if (!IoBOTTOM_GV(sv) || SvTYPE(IoBOTTOM_GV(sv)) == SVt_PVGV)
2083 do_gv_dump (level, file, " BOTTOM_GV", IoBOTTOM_GV(sv));
2084 else {
2085 Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n",
2086 PTR2UV(IoBOTTOM_GV(sv)));
ad64d0ec
NC
2087 do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1,
2088 maxnest, dumpops, pvlim);
9ba1f565 2089 }
27533608 2090 if (isPRINT(IoTYPE(sv)))
cea2e8a9 2091 Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv));
27533608 2092 else
cea2e8a9 2093 Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
57def98f 2094 Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
3967c732 2095 break;
206ee256 2096 case SVt_REGEXP:
d63e6659
DM
2097 {
2098 struct regexp * const r = (struct regexp *)SvANY(sv);
2099 flags = RX_EXTFLAGS((REGEXP*)sv);
2100 sv_setpv(d,"");
2101 append_flags(d, flags, regexp_flags_names);
2102 if (*(SvEND(d) - 1) == ',') {
2103 SvCUR_set(d, SvCUR(d) - 1);
2104 SvPVX(d)[SvCUR(d)] = '\0';
2105 }
2106 Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
2107 (UV)flags, SvPVX_const(d));
2108 Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
2109 (UV)(r->intflags));
2110 Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
2111 (UV)(r->nparens));
2112 Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
2113 (UV)(r->lastparen));
2114 Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
2115 (UV)(r->lastcloseparen));
2116 Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
2117 (IV)(r->minlen));
2118 Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
2119 (IV)(r->minlenret));
2120 Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
2121 (UV)(r->gofs));
2122 Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
2123 (UV)(r->pre_prefix));
2124 Perl_dump_indent(aTHX_ level, file, " SEEN_EVALS = %"UVuf"\n",
2125 (UV)(r->seen_evals));
2126 Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
2127 (IV)(r->sublen));
2128 if (r->subbeg)
2129 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
2130 PTR2UV(r->subbeg),
2131 pv_display(d, r->subbeg, r->sublen, 50, pvlim));
2132 else
2133 Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
2134 Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf"\n",
2135 PTR2UV(r->engine));
2136 Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
2137 PTR2UV(r->mother_re));
2138 Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
2139 PTR2UV(r->paren_names));
2140 Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
2141 PTR2UV(r->substrs));
2142 Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
2143 PTR2UV(r->pprivate));
2144 Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
2145 PTR2UV(r->offs));
2146#ifdef PERL_OLD_COPY_ON_WRITE
2147 Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
2148 PTR2UV(r->saved_copy));
2149#endif
2150 }
206ee256 2151 break;
3967c732 2152 }
cea89e20 2153 SvREFCNT_dec(d);
3967c732
JD
2154}
2155
2156void
864dbfa3 2157Perl_sv_dump(pTHX_ SV *sv)
3967c732 2158{
97aff369 2159 dVAR;
7918f24d
NC
2160
2161 PERL_ARGS_ASSERT_SV_DUMP;
2162
d1029faa
JP
2163 if (SvROK(sv))
2164 do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0);
2165 else
2166 do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0);
8d063cd8 2167}
bd16a5f0
IZ
2168
2169int
2170Perl_runops_debug(pTHX)
2171{
97aff369 2172 dVAR;
bd16a5f0 2173 if (!PL_op) {
9b387841 2174 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
bd16a5f0
IZ
2175 return 0;
2176 }
2177
9f3673fb 2178 DEBUG_l(Perl_deb(aTHX_ "Entering new RUNOPS level\n"));
bd16a5f0 2179 do {
bd16a5f0 2180 if (PL_debug) {
b9ac451d 2181 if (PL_watchaddr && (*PL_watchaddr != PL_watchok))
bd16a5f0
IZ
2182 PerlIO_printf(Perl_debug_log,
2183 "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n",
2184 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok),
2185 PTR2UV(*PL_watchaddr));
d6721266
DM
2186 if (DEBUG_s_TEST_) {
2187 if (DEBUG_v_TEST_) {
2188 PerlIO_printf(Perl_debug_log, "\n");
2189 deb_stack_all();
2190 }
2191 else
2192 debstack();
2193 }
2194
2195
bd16a5f0
IZ
2196 if (DEBUG_t_TEST_) debop(PL_op);
2197 if (DEBUG_P_TEST_) debprof(PL_op);
2198 }
16c91539 2199 } while ((PL_op = PL_op->op_ppaddr(aTHX)));
9f3673fb 2200 DEBUG_l(Perl_deb(aTHX_ "leaving RUNOPS level\n"));
bd16a5f0
IZ
2201
2202 TAINT_NOT;
2203 return 0;
2204}
2205
2206I32
6867be6d 2207Perl_debop(pTHX_ const OP *o)
bd16a5f0 2208{
97aff369 2209 dVAR;
7918f24d
NC
2210
2211 PERL_ARGS_ASSERT_DEBOP;
2212
1045810a
IZ
2213 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
2214 return 0;
2215
bd16a5f0
IZ
2216 Perl_deb(aTHX_ "%s", OP_NAME(o));
2217 switch (o->op_type) {
2218 case OP_CONST:
996c9baa 2219 case OP_HINTSEVAL:
6cefa69e 2220 /* With ITHREADS, consts are stored in the pad, and the right pad
7367e658 2221 * may not be active here, so check.
6cefa69e 2222 * Looks like only during compiling the pads are illegal.
7367e658 2223 */
6cefa69e
RU
2224#ifdef USE_ITHREADS
2225 if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME)
2226#endif
7367e658 2227 PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
bd16a5f0
IZ
2228 break;
2229 case OP_GVSV:
2230 case OP_GV:
2231 if (cGVOPo_gv) {
b9ac451d 2232 SV * const sv = newSV(0);
3b721df9 2233#ifdef PERL_MAD
84021b46 2234 /* FIXME - is this making unwarranted assumptions about the
3b721df9
NC
2235 UTF-8 cleanliness of the dump file handle? */
2236 SvUTF8_on(sv);
2237#endif
bd61b366 2238 gv_fullname3(sv, cGVOPo_gv, NULL);
93524f2b 2239 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
bd16a5f0
IZ
2240 SvREFCNT_dec(sv);
2241 }
2242 else
2243 PerlIO_printf(Perl_debug_log, "(NULL)");
2244 break;
2245 case OP_PADSV:
2246 case OP_PADAV:
2247 case OP_PADHV:
a3b680e6 2248 {
bd16a5f0 2249 /* print the lexical's name */
b9ac451d 2250 CV * const cv = deb_curcv(cxstack_ix);
a3b680e6 2251 SV *sv;
bd16a5f0 2252 if (cv) {
b9ac451d 2253 AV * const padlist = CvPADLIST(cv);
502c6561 2254 AV * const comppad = MUTABLE_AV(*av_fetch(padlist, 0, FALSE));
bd16a5f0
IZ
2255 sv = *av_fetch(comppad, o->op_targ, FALSE);
2256 } else
a0714e2c 2257 sv = NULL;
bd16a5f0 2258 if (sv)
b9ac451d 2259 PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv));
bd16a5f0 2260 else
b9ac451d 2261 PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ);
a3b680e6 2262 }
bd16a5f0
IZ
2263 break;
2264 default:
091ab601 2265 break;
bd16a5f0
IZ
2266 }
2267 PerlIO_printf(Perl_debug_log, "\n");
2268 return 0;
2269}
2270
2271STATIC CV*
61f9802b 2272S_deb_curcv(pTHX_ const I32 ix)
bd16a5f0 2273{
97aff369 2274 dVAR;
b9ac451d 2275 const PERL_CONTEXT * const cx = &cxstack[ix];
bd16a5f0
IZ
2276 if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
2277 return cx->blk_sub.cv;
2278 else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx))
2279 return PL_compcv;
2280 else if (ix == 0 && PL_curstackinfo->si_type == PERLSI_MAIN)
2281 return PL_main_cv;
2282 else if (ix <= 0)
601f1833 2283 return NULL;
bd16a5f0
IZ
2284 else
2285 return deb_curcv(ix - 1);
2286}
2287
2288void
2289Perl_watch(pTHX_ char **addr)
2290{
97aff369 2291 dVAR;
7918f24d
NC
2292
2293 PERL_ARGS_ASSERT_WATCH;
2294
bd16a5f0
IZ
2295 PL_watchaddr = addr;
2296 PL_watchok = *addr;
2297 PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n",
2298 PTR2UV(PL_watchaddr), PTR2UV(PL_watchok));
2299}
2300
2301STATIC void
e1ec3a88 2302S_debprof(pTHX_ const OP *o)
bd16a5f0 2303{
97aff369 2304 dVAR;
7918f24d
NC
2305
2306 PERL_ARGS_ASSERT_DEBPROF;
2307
61f9802b 2308 if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
1045810a 2309 return;
bd16a5f0 2310 if (!PL_profiledata)
a02a5408 2311 Newxz(PL_profiledata, MAXO, U32);
bd16a5f0
IZ
2312 ++PL_profiledata[o->op_type];
2313}
2314
2315void
2316Perl_debprofdump(pTHX)
2317{
97aff369 2318 dVAR;
bd16a5f0
IZ
2319 unsigned i;
2320 if (!PL_profiledata)
2321 return;
2322 for (i = 0; i < MAXO; i++) {
2323 if (PL_profiledata[i])
2324 PerlIO_printf(Perl_debug_log,
2325 "%5lu %s\n", (unsigned long)PL_profiledata[i],
2326 PL_op_name[i]);
2327 }
2328}
66610fdd 2329
3b721df9
NC
2330#ifdef PERL_MAD
2331/*
2332 * XML variants of most of the above routines
2333 */
2334
4136a0f7 2335STATIC void
3b721df9
NC
2336S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2337{
2338 va_list args;
7918f24d
NC
2339
2340 PERL_ARGS_ASSERT_XMLDUMP_ATTR;
2341
3b721df9
NC
2342 PerlIO_printf(file, "\n ");
2343 va_start(args, pat);
2344 xmldump_vindent(level, file, pat, &args);
2345 va_end(args);
2346}
2347
2348
2349void
2350Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
2351{
2352 va_list args;
7918f24d 2353 PERL_ARGS_ASSERT_XMLDUMP_INDENT;
3b721df9
NC
2354 va_start(args, pat);
2355 xmldump_vindent(level, file, pat, &args);
2356 va_end(args);
2357}
2358
2359void
2360Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
2361{
7918f24d
NC
2362 PERL_ARGS_ASSERT_XMLDUMP_VINDENT;
2363
3b721df9
NC
2364 PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), "");
2365 PerlIO_vprintf(file, pat, *args);
2366}
2367
2368void
2369Perl_xmldump_all(pTHX)
2370{
f0e3f042
CS
2371 xmldump_all_perl(FALSE);
2372}
2373
2374void
0190d5ef 2375Perl_xmldump_all_perl(pTHX_ bool justperl PERL_UNUSED_DECL)
f0e3f042 2376{
3b721df9
NC
2377 PerlIO_setlinebuf(PL_xmlfp);
2378 if (PL_main_root)
2379 op_xmldump(PL_main_root);
0190d5ef
CS
2380 /* someday we might call this, when it outputs XML: */
2381 /* xmldump_packsubs_perl(PL_defstash, justperl); */
3b721df9
NC
2382 if (PL_xmlfp != (PerlIO*)PerlIO_stdout())
2383 PerlIO_close(PL_xmlfp);
2384 PL_xmlfp = 0;
2385}
2386
2387void
2388Perl_xmldump_packsubs(pTHX_ const HV *stash)
2389{
28eb953d 2390 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS;
3ab0c9fa
NC
2391 xmldump_packsubs_perl(stash, FALSE);
2392}
2393
2394void
2395Perl_xmldump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
2396{
3b721df9
NC
2397 I32 i;
2398 HE *entry;
2399
28eb953d 2400 PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL;
7918f24d 2401
3b721df9
NC
2402 if (!HvARRAY(stash))
2403 return;
2404 for (i = 0; i <= (I32) HvMAX(stash); i++) {
2405 for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
159b6efe 2406 GV *gv = MUTABLE_GV(HeVAL(entry));
3b721df9
NC
2407 HV *hv;
2408 if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv))
2409 continue;
2410 if (GvCVu(gv))
3ab0c9fa 2411 xmldump_sub_perl(gv, justperl);
3b721df9
NC
2412 if (GvFORM(gv))
2413 xmldump_form(gv);
2414 if (HeKEY(entry)[HeKLEN(entry)-1] == ':'
2415 && (hv = GvHV(gv)) && hv != PL_defstash)
3ab0c9fa 2416 xmldump_packsubs_perl(hv, justperl); /* nested package */
3b721df9
NC
2417 }
2418 }
2419}
2420
2421void
2422Perl_xmldump_sub(pTHX_ const GV *gv)
2423{
28eb953d 2424 PERL_ARGS_ASSERT_XMLDUMP_SUB;
f0e3f042
CS
2425 xmldump_sub_perl(gv, FALSE);
2426}
2427
2428void
2429Perl_xmldump_sub_perl(pTHX_ const GV *gv, bool justperl)
2430{
2431 SV * sv;
3b721df9 2432
28eb953d 2433 PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL;
7918f24d 2434
f0e3f042
CS
2435 if (justperl && (CvISXSUB(GvCV(gv)) || !CvROOT(GvCV(gv))))
2436 return;
2437
2438 sv = sv_newmortal();
1a9a51d4 2439 gv_fullname3(sv, gv, NULL);
3b721df9
NC
2440 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv));
2441 if (CvXSUB(GvCV(gv)))
2442 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n",
2443 PTR2UV(CvXSUB(GvCV(gv))),
2444 (int)CvXSUBANY(GvCV(gv)).any_i32);
2445 else if (CvROOT(GvCV(gv)))
2446 op_xmldump(CvROOT(GvCV(gv)));
2447 else
2448 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2449}
2450
2451void
2452Perl_xmldump_form(pTHX_ const GV *gv)
2453{
61f9802b 2454 SV * const sv = sv_newmortal();
3b721df9 2455
7918f24d
NC
2456 PERL_ARGS_ASSERT_XMLDUMP_FORM;
2457
1a9a51d4 2458 gv_fullname3(sv, gv, NULL);
3b721df9
NC
2459 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv));
2460 if (CvROOT(GvFORM(gv)))
2461 op_xmldump(CvROOT(GvFORM(gv)));
2462 else
2463 Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "<undef>\n");
2464}
2465
2466void
2467Perl_xmldump_eval(pTHX)
2468{
2469 op_xmldump(PL_eval_root);
2470}
2471
2472char *
2473Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
2474{
7918f24d 2475 PERL_ARGS_ASSERT_SV_CATXMLSV;
3b721df9
NC
2476 return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv));
2477}
2478
2479char *
9dcc53ea
Z
2480Perl_sv_catxmlpv(pTHX_ SV *dsv, const char *pv, int utf8)
2481{
2482 PERL_ARGS_ASSERT_SV_CATXMLPV;
2483 return sv_catxmlpvn(dsv, pv, strlen(pv), utf8);
2484}
2485
2486char *
20f84293 2487Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
3b721df9
NC
2488{
2489 unsigned int c;
61f9802b 2490 const char * const e = pv + len;
20f84293 2491 const char * const start = pv;
3b721df9
NC
2492 STRLEN dsvcur;
2493 STRLEN cl;
2494
7918f24d
NC
2495 PERL_ARGS_ASSERT_SV_CATXMLPVN;
2496
76f68e9b 2497 sv_catpvs(dsv,"");
3b721df9
NC
2498 dsvcur = SvCUR(dsv); /* in case we have to restart */
2499
2500 retry:
2501 while (pv < e) {
2502 if (utf8) {
2503 c = utf8_to_uvchr((U8*)pv, &cl);
2504 if (cl == 0) {
2505 SvCUR(dsv) = dsvcur;
2506 pv = start;
2507 utf8 = 0;
2508 goto retry;
2509 }
2510 }
2511 else
2512 c = (*pv & 255);
2513
2514 switch (c) {
2515 case 0x00:
2516 case 0x01:
2517 case 0x02:
2518 case 0x03:
2519 case 0x04:
2520 case 0x05:
2521 case 0x06:
2522 case 0x07:
2523 case 0x08:
2524 case 0x0b:
2525 case 0x0c:
2526 case 0x0e:
2527 case 0x0f:
2528 case 0x10:
2529 case 0x11:
2530 case 0x12:
2531 case 0x13:
2532 case 0x14:
2533 case 0x15:
2534 case 0x16:
2535 case 0x17:
2536 case 0x18:
2537 case 0x19:
2538 case 0x1a:
2539 case 0x1b:
2540 case 0x1c:
2541 case 0x1d:
2542 case 0x1e:
2543 case 0x1f:
2544 case 0x7f:
2545 case 0x80:
2546 case 0x81:
2547 case 0x82:
2548 case 0x83:
2549 case 0x84:
2550 case 0x86:
2551 case 0x87:
2552 case 0x88:
2553 case 0x89:
2554 case 0x90:
2555 case 0x91:
2556 case 0x92:
2557 case 0x93:
2558 case 0x94:
2559 case 0x95:
2560 case 0x96:
2561 case 0x97:
2562 case 0x98:
2563 case 0x99:
2564 case 0x9a:
2565 case 0x9b:
2566 case 0x9c:
2567 case 0x9d:
2568 case 0x9e:
2569 case 0x9f:
2570 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2571 break;
2572 case '<':
f3a2811a 2573 sv_catpvs(dsv, "&lt;");
3b721df9
NC
2574 break;
2575 case '>':
f3a2811a 2576 sv_catpvs(dsv, "&gt;");
3b721df9
NC
2577 break;
2578 case '&':
f3a2811a 2579 sv_catpvs(dsv, "&amp;");
3b721df9
NC
2580 break;
2581 case '"':
49de0815 2582 sv_catpvs(dsv, "&#34;");
3b721df9
NC
2583 break;
2584 default:
2585 if (c < 0xD800) {
2586 if (c < 32 || c > 127) {
2587 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2588 }
2589 else {
5e7aa789
NC
2590 const char string = (char) c;
2591 sv_catpvn(dsv, &string, 1);
3b721df9
NC
2592 }
2593 break;
2594 }
2595 if ((c >= 0xD800 && c <= 0xDB7F) ||
2596 (c >= 0xDC00 && c <= 0xDFFF) ||
2597 (c >= 0xFFF0 && c <= 0xFFFF) ||
2598 c > 0x10ffff)
2599 Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c);
2600 else
2601 Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c);
2602 }
2603
2604 if (utf8)
2605 pv += UTF8SKIP(pv);
2606 else
2607 pv++;
2608 }
2609
2610 return SvPVX(dsv);
2611}
2612
2613char *
2614Perl_sv_xmlpeek(pTHX_ SV *sv)
2615{
61f9802b 2616 SV * const t = sv_newmortal();
3b721df9
NC
2617 STRLEN n_a;
2618 int unref = 0;
2619
7918f24d
NC
2620 PERL_ARGS_ASSERT_SV_XMLPEEK;
2621
3b721df9 2622 sv_utf8_upgrade(t);
76f68e9b 2623 sv_setpvs(t, "");
3b721df9
NC
2624 /* retry: */
2625 if (!sv) {
2626 sv_catpv(t, "VOID=\"\"");
2627 goto finish;
2628 }
ad64d0ec 2629 else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') {
3b721df9
NC
2630 sv_catpv(t, "WILD=\"\"");
2631 goto finish;
2632 }
2633 else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes || sv == &PL_sv_placeholder) {
2634 if (sv == &PL_sv_undef) {
2635 sv_catpv(t, "SV_UNDEF=\"1\"");
2636 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2637 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2638 SvREADONLY(sv))
2639 goto finish;
2640 }
2641 else if (sv == &PL_sv_no) {
2642 sv_catpv(t, "SV_NO=\"1\"");
2643 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2644 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2645 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2646 SVp_POK|SVp_NOK)) &&
2647 SvCUR(sv) == 0 &&
2648 SvNVX(sv) == 0.0)
2649 goto finish;
2650 }
2651 else if (sv == &PL_sv_yes) {
2652 sv_catpv(t, "SV_YES=\"1\"");
2653 if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
2654 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2655 !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
2656 SVp_POK|SVp_NOK)) &&
2657 SvCUR(sv) == 1 &&
2658 SvPVX(sv) && *SvPVX(sv) == '1' &&
2659 SvNVX(sv) == 1.0)
2660 goto finish;
2661 }
2662 else {
2663 sv_catpv(t, "SV_PLACEHOLDER=\"1\"");
2664 if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
2665 SVs_GMG|SVs_SMG|SVs_RMG)) &&
2666 SvREADONLY(sv))
2667 goto finish;
2668 }
2669 sv_catpv(t, " XXX=\"\" ");
2670 }
2671 else if (SvREFCNT(sv) == 0) {
2672 sv_catpv(t, " refcnt=\"0\"");
2673 unref++;
2674 }
2675 else if (DEBUG_R_TEST_) {
2676 int is_tmp = 0;
2677 I32 ix;
2678 /* is this SV on the tmps stack? */
2679 for (ix=PL_tmps_ix; ix>=0; ix--) {
2680 if (PL_tmps_stack[ix] == sv) {
2681 is_tmp = 1;
2682 break;
2683 }
2684 }
2685 if (SvREFCNT(sv) > 1)
2686 Perl_sv_catpvf(aTHX_ t, " DRT=\"<%"UVuf"%s>\"", (UV)SvREFCNT(sv),
2687 is_tmp ? "T" : "");
2688 else if (is_tmp)
2689 sv_catpv(t, " DRT=\"<T>\"");
2690 }
2691
2692 if (SvROK(sv)) {
2693 sv_catpv(t, " ROK=\"\"");
2694 }
2695 switch (SvTYPE(sv)) {
2696 default:
2697 sv_catpv(t, " FREED=\"1\"");
2698 goto finish;
2699
2700 case SVt_NULL:
2701 sv_catpv(t, " UNDEF=\"1\"");
2702 goto finish;
2703 case SVt_IV:
2704 sv_catpv(t, " IV=\"");
2705 break;
2706 case SVt_NV:
2707 sv_catpv(t, " NV=\"");
2708 break;
3b721df9
NC
2709 case SVt_PV:
2710 sv_catpv(t, " PV=\"");
2711 break;
2712 case SVt_PVIV:
2713 sv_catpv(t, " PVIV=\"");
2714 break;
2715 case SVt_PVNV:
2716 sv_catpv(t, " PVNV=\"");
2717 break;
2718 case SVt_PVMG:
2719 sv_catpv(t, " PVMG=\"");
2720 break;
2721 case SVt_PVLV:
2722 sv_catpv(t, " PVLV=\"");
2723 break;
2724 case SVt_PVAV:
2725 sv_catpv(t, " AV=\"");
2726 break;
2727 case SVt_PVHV:
2728 sv_catpv(t, " HV=\"");
2729 break;
2730 case SVt_PVCV:
2731 if (CvGV(sv))
2732 Perl_sv_catpvf(aTHX_ t, " CV=\"(%s)\"", GvNAME(CvGV(sv)));
2733 else
2734 sv_catpv(t, " CV=\"()\"");
2735 goto finish;
2736 case SVt_PVGV:
2737 sv_catpv(t, " GV=\"");
2738 break;
cecf5685
NC
2739 case SVt_BIND:
2740 sv_catpv(t, " BIND=\"");
3b721df9 2741 break;
d914baab 2742 case SVt_REGEXP:
8619e557 2743 sv_catpv(t, " REGEXP=\"");
4df7f6af 2744 break;
3b721df9
NC
2745 case SVt_PVFM:
2746 sv_catpv(t, " FM=\"");
2747 break;
2748 case SVt_PVIO:
2749 sv_catpv(t, " IO=\"");
2750 break;
2751 }
2752
2753 if (SvPOKp(sv)) {
2754 if (SvPVX(sv)) {
2755 sv_catxmlsv(t, sv);
2756 }
2757 }
2758 else if (SvNOKp(sv)) {
2759 STORE_NUMERIC_LOCAL_SET_STANDARD();
2760 Perl_sv_catpvf(aTHX_ t, "%"NVgf"",SvNVX(sv));
2761 RESTORE_NUMERIC_LOCAL();
2762 }
2763 else if (SvIOKp(sv)) {
2764 if (SvIsUV(sv))
2765 Perl_sv_catpvf(aTHX_ t, "%"UVuf"", (UV)SvUVX(sv));
2766 else
2767 Perl_sv_catpvf(aTHX_ t, "%"IVdf"", (IV)SvIVX(sv));
2768 }
2769 else
2770 sv_catpv(t, "");
2771 sv_catpv(t, "\"");
2772
2773 finish:
61f9802b
AL
2774 while (unref--)
2775 sv_catpv(t, ")");
3b721df9
NC
2776 return SvPV(t, n_a);
2777}
2778
2779void
2780Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
2781{
7918f24d
NC
2782 PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP;
2783
3b721df9
NC
2784 if (!pm) {
2785 Perl_xmldump_indent(aTHX_ level, file, "<pmop/>\n");
2786 return;
2787 }
2788 Perl_xmldump_indent(aTHX_ level, file, "<pmop \n");
2789 level++;
2790 if (PM_GETRE(pm)) {
d914baab 2791 REGEXP *const r = PM_GETRE(pm);
643e696a 2792 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
ad64d0ec 2793 sv_catxmlsv(tmpsv, MUTABLE_SV(r));
3b721df9
NC
2794 Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
2795 SvPVX(tmpsv));
2796 SvREFCNT_dec(tmpsv);
2797 Perl_xmldump_indent(aTHX_ level, file, "when=\"%s\"\n",
2798 (pm->op_private & OPpRUNTIME) ? "RUN" : "COMP");
2799 }
2800 else
2801 Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n");
d914baab 2802 if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) {
3df43ef7 2803 SV * const tmpsv = pm_description(pm);
3b721df9
NC
2804 Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2805 SvREFCNT_dec(tmpsv);
2806 }
2807
2808 level--;
20e98b0f 2809 if (pm->op_type != OP_PUSHRE && pm->op_pmreplrootu.op_pmreplroot) {
3b721df9
NC
2810 Perl_xmldump_indent(aTHX_ level, file, ">\n");
2811 Perl_xmldump_indent(aTHX_ level+1, file, "<pm_repl>\n");
20e98b0f 2812 do_op_xmldump(level+2, file, pm->op_pmreplrootu.op_pmreplroot);
3b721df9
NC
2813 Perl_xmldump_indent(aTHX_ level+1, file, "</pm_repl>\n");
2814 Perl_xmldump_indent(aTHX_ level, file, "</pmop>\n");
2815 }
2816 else
2817 Perl_xmldump_indent(aTHX_ level, file, "/>\n");
2818}
2819
2820void
2821Perl_pmop_xmldump(pTHX_ const PMOP *pm)
2822{
2823 do_pmop_xmldump(0, PL_xmlfp, pm);
2824}
2825
2826void
2827Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
2828{
2829 UV seq;
2830 int contents = 0;
7918f24d
NC
2831
2832 PERL_ARGS_ASSERT_DO_OP_XMLDUMP;
2833
3b721df9
NC
2834 if (!o)
2835 return;
2836 sequence(o);
2837 seq = sequence_num(o);
2838 Perl_xmldump_indent(aTHX_ level, file,
2839 "<op_%s seq=\"%"UVuf" -> ",
2840 OP_NAME(o),
2841 seq);
2842 level++;
2843 if (o->op_next)
2844 PerlIO_printf(file, seq ? "%"UVuf"\"" : "(%"UVuf")\"",
2845 sequence_num(o->op_next));
2846 else
2847 PerlIO_printf(file, "DONE\"");
2848
2849 if (o->op_targ) {
2850 if (o->op_type == OP_NULL)
2851 {
2852 PerlIO_printf(file, " was=\"%s\"", PL_op_name[o->op_targ]);
2853 if (o->op_targ == OP_NEXTSTATE)
2854 {
2855 if (CopLINE(cCOPo))
f5992bc4 2856 PerlIO_printf(file, " line=\"%"UVuf"\"",
3b721df9
NC
2857 (UV)CopLINE(cCOPo));
2858 if (CopSTASHPV(cCOPo))
2859 PerlIO_printf(file, " package=\"%s\"",
2860 CopSTASHPV(cCOPo));
4b65a919 2861 if (CopLABEL(cCOPo))
3b721df9 2862 PerlIO_printf(file, " label=\"%s\"",
4b65a919 2863 CopLABEL(cCOPo));
3b721df9
NC
2864 }
2865 }
2866 else
2867 PerlIO_printf(file, " targ=\"%ld\"", (long)o->op_targ);
2868 }
2869#ifdef DUMPADDR
2870 PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next);
2871#endif
2872 if (o->op_flags) {
76f68e9b 2873 SV * const tmpsv = newSVpvs("");
3b721df9
NC
2874 switch (o->op_flags & OPf_WANT) {
2875 case OPf_WANT_VOID:
2876 sv_catpv(tmpsv, ",VOID");
2877 break;
2878 case OPf_WANT_SCALAR:
2879 sv_catpv(tmpsv, ",SCALAR");
2880 break;
2881 case OPf_WANT_LIST:
2882 sv_catpv(tmpsv, ",LIST");
2883 break;
2884 default:
2885 sv_catpv(tmpsv, ",UNKNOWN");
2886 break;
2887 }
2888 if (o->op_flags & OPf_KIDS)
2889 sv_catpv(tmpsv, ",KIDS");
2890 if (o->op_flags & OPf_PARENS)
2891 sv_catpv(tmpsv, ",PARENS");
2892 if (o->op_flags & OPf_STACKED)
2893 sv_catpv(tmpsv, ",STACKED");
2894 if (o->op_flags & OPf_REF)
2895 sv_catpv(tmpsv, ",REF");
2896 if (o->op_flags & OPf_MOD)
2897 sv_catpv(tmpsv, ",MOD");
2898 if (o->op_flags & OPf_SPECIAL)
2899 sv_catpv(tmpsv, ",SPECIAL");
2900 PerlIO_printf(file, " flags=\"%s\"", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : "");
2901 SvREFCNT_dec(tmpsv);
2902 }
2903 if (o->op_private) {
76f68e9b 2904 SV * const tmpsv = newSVpvs("");
3b721df9
NC
2905 if (PL_opargs[o->op_type] & OA_TARGLEX) {
2906 if (o->op_private & OPpTARGET_MY)
2907 sv_catpv(tmpsv, ",TARGET_MY");
2908 }
2909 else if (o->op_type == OP_LEAVESUB ||
2910 o->op_type == OP_LEAVE ||
2911 o->op_type == OP_LEAVESUBLV ||
2912 o->op_type == OP_LEAVEWRITE) {
2913 if (o->op_private & OPpREFCOUNTED)
2914 sv_catpv(tmpsv, ",REFCOUNTED");
2915 }
2916 else if (o->op_type == OP_AASSIGN) {
2917 if (o->op_private & OPpASSIGN_COMMON)
2918 sv_catpv(tmpsv, ",COMMON");
2919 }
2920 else if (o->op_type == OP_SASSIGN) {
2921 if (o->op_private & OPpASSIGN_BACKWARDS)
2922 sv_catpv(tmpsv, ",BACKWARDS");
2923 }
2924 else if (o->op_type == OP_TRANS) {
2925 if (o->op_private & OPpTRANS_SQUASH)
2926 sv_catpv(tmpsv, ",SQUASH");
2927 if (o->op_private & OPpTRANS_DELETE)
2928 sv_catpv(tmpsv, ",DELETE");
2929 if (o->op_private & OPpTRANS_COMPLEMENT)
2930 sv_catpv(tmpsv, ",COMPLEMENT");
2931 if (o->op_private & OPpTRANS_IDENTICAL)
2932 sv_catpv(tmpsv, ",IDENTICAL");
2933 if (o->op_private & OPpTRANS_GROWS)
2934 sv_catpv(tmpsv, ",GROWS");
2935 }
2936 else if (o->op_type == OP_REPEAT) {
2937 if (o->op_private & OPpREPEAT_DOLIST)
2938 sv_catpv(tmpsv, ",DOLIST");
2939 }
2940 else if (o->op_type == OP_ENTERSUB ||
2941 o->op_type == OP_RV2SV ||
2942 o->op_type == OP_GVSV ||
2943 o->op_type == OP_RV2AV ||
2944 o->op_type == OP_RV2HV ||
2945 o->op_type == OP_RV2GV ||
2946 o->op_type == OP_AELEM ||
2947 o->op_type == OP_HELEM )
2948 {
2949 if (o->op_type == OP_ENTERSUB) {
2950 if (o->op_private & OPpENTERSUB_AMPER)
2951 sv_catpv(tmpsv, ",AMPER");
2952 if (o->op_private & OPpENTERSUB_DB)
2953 sv_catpv(tmpsv, ",DB");
2954 if (o->op_private & OPpENTERSUB_HASTARG)
2955 sv_catpv(tmpsv, ",HASTARG");
2956 if (o->op_private & OPpENTERSUB_NOPAREN)
2957 sv_catpv(tmpsv, ",NOPAREN");
2958 if (o->op_private & OPpENTERSUB_INARGS)
2959 sv_catpv(tmpsv, ",INARGS");
3b721df9
NC
2960 }
2961 else {
2962 switch (o->op_private & OPpDEREF) {
2963 case OPpDEREF_SV:
2964 sv_catpv(tmpsv, ",SV");
2965 break;
2966 case OPpDEREF_AV:
2967 sv_catpv(tmpsv, ",AV");
2968 break;
2969 case OPpDEREF_HV:
2970 sv_catpv(tmpsv, ",HV");
2971 break;
2972 }
2973 if (o->op_private & OPpMAYBE_LVSUB)
2974 sv_catpv(tmpsv, ",MAYBE_LVSUB");
2975 }
2976 if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) {
2977 if (o->op_private & OPpLVAL_DEFER)
2978 sv_catpv(tmpsv, ",LVAL_DEFER");
2979 }
2980 else {
2981 if (o->op_private & HINT_STRICT_REFS)
2982 sv_catpv(tmpsv, ",STRICT_REFS");
2983 if (o->op_private & OPpOUR_INTRO)
2984 sv_catpv(tmpsv, ",OUR_INTRO");
2985 }
2986 }
2987 else if (o->op_type == OP_CONST) {
2988 if (o->op_private & OPpCONST_BARE)
2989 sv_catpv(tmpsv, ",BARE");
2990 if (o->op_private & OPpCONST_STRICT)
2991 sv_catpv(tmpsv, ",STRICT");
3b721df9
NC
2992 if (o->op_private & OPpCONST_WARNING)
2993 sv_catpv(tmpsv, ",WARNING");
2994 if (o->op_private & OPpCONST_ENTERED)
2995 sv_catpv(tmpsv, ",ENTERED");
2996 }
2997 else if (o->op_type == OP_FLIP) {
2998 if (o->op_private & OPpFLIP_LINENUM)
2999 sv_catpv(tmpsv, ",LINENUM");
3000 }
3001 else if (o->op_type == OP_FLOP) {
3002 if (o->op_private & OPpFLIP_LINENUM)
3003 sv_catpv(tmpsv, ",LINENUM");
3004 }
3005 else if (o->op_type == OP_RV2CV) {
3006 if (o->op_private & OPpLVAL_INTRO)
3007 sv_catpv(tmpsv, ",INTRO");
3008 }
3009 else if (o->op_type == OP_GV) {
3010 if (o->op_private & OPpEARLY_CV)
3011 sv_catpv(tmpsv, ",EARLY_CV");
3012 }
3013 else if (o->op_type == OP_LIST) {
3014 if (o->op_private & OPpLIST_GUESSED)
3015 sv_catpv(tmpsv, ",GUESSED");
3016 }
3017 else if (o->op_type == OP_DELETE) {
3018 if (o->op_private & OPpSLICE)
3019 sv_catpv(tmpsv, ",SLICE");
3020 }
3021 else if (o->op_type == OP_EXISTS) {
3022 if (o->op_private & OPpEXISTS_SUB)
3023 sv_catpv(tmpsv, ",EXISTS_SUB");
3024 }
3025 else if (o->op_type == OP_SORT) {
3026 if (o->op_private & OPpSORT_NUMERIC)
3027 sv_catpv(tmpsv, ",NUMERIC");
3028 if (o->op_private & OPpSORT_INTEGER)
3029 sv_catpv(tmpsv, ",INTEGER");
3030 if (o->op_private & OPpSORT_REVERSE)
3031 sv_catpv(tmpsv, ",REVERSE");
3032 }
3b721df9
NC
3033 else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) {
3034 if (o->op_private & OPpOPEN_IN_RAW)
3035 sv_catpv(tmpsv, ",IN_RAW");
3036 if (o->op_private & OPpOPEN_IN_CRLF)
3037 sv_catpv(tmpsv, ",IN_CRLF");
3038 if (o->op_private & OPpOPEN_OUT_RAW)
3039 sv_catpv(tmpsv, ",OUT_RAW");
3040 if (o->op_private & OPpOPEN_OUT_CRLF)
3041 sv_catpv(tmpsv, ",OUT_CRLF");
3042 }
3043 else if (o->op_type == OP_EXIT) {
3044 if (o->op_private & OPpEXIT_VMSISH)
3045 sv_catpv(tmpsv, ",EXIT_VMSISH");
3046 if (o->op_private & OPpHUSH_VMSISH)
3047 sv_catpv(tmpsv, ",HUSH_VMSISH");
3048 }
3049 else if (o->op_type == OP_DIE) {
3050 if (o->op_private & OPpHUSH_VMSISH)
3051 sv_catpv(tmpsv, ",HUSH_VMSISH");
3052 }
ef69c8fc 3053 else if (PL_check[o->op_type] != Perl_ck_ftst) {
6ecf81d6 3054 if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS)
3b721df9
NC
3055 sv_catpv(tmpsv, ",FT_ACCESS");
3056 if (o->op_private & OPpFT_STACKED)
3057 sv_catpv(tmpsv, ",FT_STACKED");
3058 }
3059 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
3060 sv_catpv(tmpsv, ",INTRO");
3061 if (SvCUR(tmpsv))
3062 S_xmldump_attr(aTHX_ level, file, "private=\"%s\"", SvPVX(tmpsv) + 1);
3063 SvREFCNT_dec(tmpsv);
3064 }
3065
3066 switch (o->op_type) {
3067 case OP_AELEMFAST:
3068 if (o->op_flags & OPf_SPECIAL) {
3069 break;
3070 }
3071 case OP_GVSV:
3072 case OP_GV:
3073#ifdef USE_ITHREADS
3074 S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix);
3075#else
3076 if (cSVOPo->op_sv) {
d914baab
NC
3077 SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE);
3078 SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE);
3b721df9
NC
3079 char *s;
3080 STRLEN len;
3081 ENTER;
3082 SAVEFREESV(tmpsv1);
3083 SAVEFREESV(tmpsv2);
159b6efe 3084 gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL);
3b721df9
NC
3085 s = SvPV(tmpsv1,len);
3086 sv_catxmlpvn(tmpsv2, s, len, 1);
3087 S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len));
3088 LEAVE;
3089 }
3090 else
3091 S_xmldump_attr(aTHX_ level, file, "gv=\"NULL\"");
3092#endif
3093 break;
3094 case OP_CONST:
996c9baa 3095 case OP_HINTSEVAL:
3b721df9
NC
3096 case OP_METHOD_NAMED:
3097#ifndef USE_ITHREADS
3098 /* with ITHREADS, consts are stored in the pad, and the right pad
3099 * may not be active here, so skip */
3100 S_xmldump_attr(aTHX_ level, file, "%s", sv_xmlpeek(cSVOPo_sv));
3101#endif
3102 break;
3103 case OP_ANONCODE:
3104 if (!contents) {
3105 contents = 1;
3106 PerlIO_printf(file, ">\n");
3107 }
3108 do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv));
3109 break;
3b721df9
NC
3110 case OP_NEXTSTATE:
3111 case OP_DBSTATE:
3112 if (CopLINE(cCOPo))
f5992bc4 3113 S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
3b721df9
NC
3114 (UV)CopLINE(cCOPo));
3115 if (CopSTASHPV(cCOPo))
3116 S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",
3117 CopSTASHPV(cCOPo));
4b65a919 3118 if (CopLABEL(cCOPo))
3b721df9 3119 S_xmldump_attr(aTHX_ level, file, "label=\"%s\"",
4b65a919 3120 CopLABEL(cCOPo));
3b721df9
NC
3121 break;
3122 case OP_ENTERLOOP:
3123 S_xmldump_attr(aTHX_ level, file, "redo=\"");
3124 if (cLOOPo->op_redoop)
3125 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_redoop));
3126 else
3127 PerlIO_printf(file, "DONE\"");
3128 S_xmldump_attr(aTHX_ level, file, "next=\"");
3129 if (cLOOPo->op_nextop)
3130 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_nextop));
3131 else
3132 PerlIO_printf(file, "DONE\"");
3133 S_xmldump_attr(aTHX_ level, file, "last=\"");
3134 if (cLOOPo->op_lastop)
3135 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOOPo->op_lastop));
3136 else
3137 PerlIO_printf(file, "DONE\"");
3138 break;
3139 case OP_COND_EXPR:
3140 case OP_RANGE:
3141 case OP_MAPWHILE:
3142 case OP_GREPWHILE:
3143 case OP_OR:
3144 case OP_AND:
3145 S_xmldump_attr(aTHX_ level, file, "other=\"");
3146 if (cLOGOPo->op_other)
3147 PerlIO_printf(file, "%"UVuf"\"", sequence_num(cLOGOPo->op_other));
3148 else
3149 PerlIO_printf(file, "DONE\"");
3150 break;
3151 case OP_LEAVE:
3152 case OP_LEAVEEVAL:
3153 case OP_LEAVESUB:
3154 case OP_LEAVESUBLV:
3155 case OP_LEAVEWRITE:
3156 case OP_SCOPE:
3157 if (o->op_private & OPpREFCOUNTED)
3158 S_xmldump_attr(aTHX_ level, file, "refcnt=\"%"UVuf"\"", (UV)o->op_targ);
3159 break;
3160 default:
3161 break;
3162 }
3163
3164 if (PL_madskills && o->op_madprop) {
fb2b694a 3165 char prevkey = '\0';
d914baab 3166 SV * const tmpsv = newSVpvn_utf8("", 0, TRUE);
20f84293 3167 const MADPROP* mp = o->op_madprop;
61f9802b 3168
3b721df9
NC
3169 if (!contents) {
3170 contents = 1;
3171 PerlIO_printf(file, ">\n");
3172 }
3173 Perl_xmldump_indent(aTHX_ level, file, "<madprops>\n");
3174 level++;
3175 while (mp) {
3176 char tmp = mp->mad_key;
76f68e9b 3177 sv_setpvs(tmpsv,"\"");
3b721df9
NC
3178 if (tmp)
3179 sv_catxmlpvn(tmpsv, &tmp, 1, 0);
fb2b694a
GG
3180 if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */
3181 sv_catxmlpvn(tmpsv, &prevkey, 1, 0);
3182 else
3183 prevkey = tmp;
3b721df9
NC
3184 sv_catpv(tmpsv, "\"");
3185 switch (mp->mad_type) {
3186 case MAD_NULL:
3187 sv_catpv(tmpsv, "NULL");
3188 Perl_xmldump_indent(aTHX_ level, file, "<mad_null key=%s/>\n", SvPVX(tmpsv));
3189 break;
3190 case MAD_PV:
3191 sv_catpv(tmpsv, " val=\"");
3192 sv_catxmlpvn(tmpsv, (char*)mp->mad_val, mp->mad_vlen,1);
3193 sv_catpv(tmpsv, "\"");
3194 Perl_xmldump_indent(aTHX_ level, file, "<mad_pv key=%s/>\n", SvPVX(tmpsv));
3195 break;
3196 case MAD_SV:
3197 sv_catpv(tmpsv, " val=\"");
ad64d0ec 3198 sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val));
3b721df9
NC
3199 sv_catpv(tmpsv, "\"");
3200 Perl_xmldump_indent(aTHX_ level, file, "<mad_sv key=%s/>\n", SvPVX(tmpsv));
3201 break;
3202 case MAD_OP:
3203 if ((OP*)mp->mad_val) {
3204 Perl_xmldump_indent(aTHX_ level, file, "<mad_op key=%s>\n", SvPVX(tmpsv));
3205 do_op_xmldump(level+1, file, (OP*)mp->mad_val);
3206 Perl_xmldump_indent(aTHX_ level, file, "</mad_op>\n");
3207 }
3208 break;
3209 default:
3210 Perl_xmldump_indent(aTHX_ level, file, "<mad_unk key=%s/>\n", SvPVX(tmpsv));
3211 break;
3212 }
3213 mp = mp->mad_next;
3214 }
3215 level--;
3216 Perl_xmldump_indent(aTHX_ level, file, "</madprops>\n");
3217
3218 SvREFCNT_dec(tmpsv);
3219 }
3220
3221 switch (o->op_type) {
3222 case OP_PUSHRE:
3223 case OP_MATCH:
3224 case OP_QR:
3225 case OP_SUBST:
3226 if (!contents) {
3227 contents = 1;
3228 PerlIO_printf(file, ">\n");
3229 }
3230 do_pmop_xmldump(level, file, cPMOPo);
3231 break;
3232 default:
3233 break;
3234 }
3235
3236 if (o->op_flags & OPf_KIDS) {
3237 OP *kid;
3238 if (!contents) {
3239 contents = 1;
3240 PerlIO_printf(file, ">\n");
3241 }
3242 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
3243 do_op_xmldump(level, file, kid);
3244 }
3245
3246 if (contents)
3247 Perl_xmldump_indent(aTHX_ level-1, file, "</op_%s>\n", OP_NAME(o));
3248 else
3249 PerlIO_printf(file, " />\n");
3250}
3251
3252void
3253Perl_op_xmldump(pTHX_ const OP *o)
3254{
7918f24d
NC
3255 PERL_ARGS_ASSERT_OP_XMLDUMP;
3256
3b721df9
NC
3257 do_op_xmldump(0, PL_xmlfp, o);
3258}
3259#endif
3260
66610fdd
RGS
3261/*
3262 * Local variables:
3263 * c-indentation-style: bsd
3264 * c-basic-offset: 4
3265 * indent-tabs-mode: t
3266 * End:
3267 *
37442d52
RGS
3268 * ex: set ts=8 sts=4 sw=4 noet:
3269 */