X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/61f9802b72e0698621aaf73d88595b3d5d85df0a..5b5f44f3a344ad0db95bde1f3ceadf6efd9b4c7b:/dump.c diff --git a/dump.c b/dump.c index 2d01693..724baf8 100644 --- a/dump.c +++ b/dump.c @@ -1,7 +1,7 @@ /* dump.c * - * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, + * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -9,8 +9,10 @@ */ /* - * "'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and - * it has not been hard for me to read your mind and memory.'" + * 'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and + * it has not been hard for me to read your mind and memory.' + * + * [p.220 of _The Lord of the Rings_, II/i: "Many Meetings"] */ /* This file contains utility routines to dump the contents of SV and OP @@ -32,11 +34,11 @@ static const char* const svtypenames[SVt_LAST] = { "BIND", "IV", "NV", - "RV", "PV", "PVIV", "PVNV", "PVMG", + "REGEXP", "PVGV", "PVLV", "PVAV", @@ -52,11 +54,11 @@ static const char* const svshorttypenames[SVt_LAST] = { "BIND", "IV", "NV", - "RV", "PV", "PVIV", "PVNV", "PVMG", + "REGEXP", "GV", "PVLV", "AV", @@ -72,6 +74,7 @@ void Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...) { va_list args; + PERL_ARGS_ASSERT_DUMP_INDENT; va_start(args, pat); dump_vindent(level, file, pat, &args); va_end(args); @@ -81,6 +84,7 @@ void Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args) { dVAR; + PERL_ARGS_ASSERT_DUMP_VINDENT; PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), ""); PerlIO_vprintf(file, pat, *args); } @@ -101,12 +105,14 @@ Perl_dump_packsubs(pTHX_ const HV *stash) dVAR; I32 i; + PERL_ARGS_ASSERT_DUMP_PACKSUBS; + if (!HvARRAY(stash)) return; for (i = 0; i <= (I32) HvMAX(stash); i++) { const HE *entry; for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) { - const GV * const gv = (GV*)HeVAL(entry); + const GV * const gv = (const GV *)HeVAL(entry); if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv)) continue; if (GvCVu(gv)) @@ -127,6 +133,8 @@ Perl_dump_sub(pTHX_ const GV *gv) { SV * const sv = sv_newmortal(); + PERL_ARGS_ASSERT_DUMP_SUB; + gv_fullname3(sv, gv, NULL); Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nSUB %s = ", SvPVX_const(sv)); if (CvISXSUB(GvCV(gv))) @@ -144,6 +152,8 @@ Perl_dump_form(pTHX_ const GV *gv) { SV * const sv = sv_newmortal(); + PERL_ARGS_ASSERT_DUMP_FORM; + gv_fullname3(sv, gv, NULL); Perl_dump_indent(aTHX_ 0, Perl_debug_log, "\nFORMAT %s = ", SvPVX_const(sv)); if (CvROOT(GvFORM(gv))) @@ -161,9 +171,7 @@ Perl_dump_eval(pTHX) /* -=for apidoc Apd|char*|pv_escape|NN SV *dsv|NN const char const *str\ - |const STRLEN count|const STRLEN max - |STRLEN const *escaped, const U32 flags +=for apidoc pv_escape Escapes at most the first "count" chars of pv and puts the results into dsv such that the size of the escaped string will not exceed "max" chars @@ -175,9 +183,9 @@ will also be escaped. Normally the SV will be cleared before the escaped string is prepared, but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur. -If PERL_PV_ESCAPE_UNI is set then the input string is treated as unicode, +If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode, if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned -using C to determine if it is unicode. +using C to determine if it is Unicode. If PERL_PV_ESCAPE_ALL is set then all input chars will be output using C<\x01F1> style escapes, otherwise only chars above 255 will be @@ -214,13 +222,17 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str, STRLEN wrote = 0; /* chars written so far */ STRLEN chsize = 0; /* size of data to be written */ STRLEN readsize = 1; /* size of data just read */ - bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this unicode */ + bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this Unicode */ const char *pv = str; const char * const end = pv + count; /* end of string */ octbuf[0] = esc; - if (!flags & PERL_PV_ESCAPE_NOCLEAR) - sv_setpvn(dsv, "", 0); + PERL_ARGS_ASSERT_PV_ESCAPE; + + if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) { + /* This won't alter the UTF-8 flag */ + sv_setpvs(dsv, ""); + } if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) isuni = 1; @@ -279,6 +291,12 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str, sv_catpvn(dsv, octbuf, chsize); wrote += chsize; } else { + /* If PERL_PV_ESCAPE_NOBACKSLASH is set then bytes in the range + 128-255 can be appended raw to the dsv. If dsv happens to be + UTF-8 then we need catpvf to upgrade them for us. + Or add a new API call sv_catpvc(). Think about that name, and + how to keep it clear that it's unlike the s of catpvs, which is + really an array octets, not a string. */ Perl_sv_catpvf( aTHX_ dsv, "%c", c); wrote++; } @@ -290,27 +308,24 @@ Perl_pv_escape( pTHX_ SV *dsv, char const * const str, return SvPVX(dsv); } /* -=for apidoc Apd|char *|pv_pretty|NN SV *dsv|NN const char const *str\ - |const STRLEN count|const STRLEN max\ - |const char const *start_color| const char const *end_color\ - |const U32 flags +=for apidoc pv_pretty Converts a string into something presentable, handling escaping via -pv_escape() and supporting quoting and elipses. +pv_escape() and supporting quoting and ellipses. If the PERL_PV_PRETTY_QUOTE flag is set then the result will be double quoted with any double quotes in the string escaped. Otherwise if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in angle brackets. -If the PERL_PV_PRETTY_ELIPSES flag is set and not all characters in -string were output then an elipses C<...> will be appended to the +If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in +string were output then an ellipsis C<...> will be appended to the string. Note that this happens AFTER it has been quoted. If start_color is non-null then it will be inserted after the opening quote (if there is one) but before the escaped text. If end_color is non-null then it will be inserted after the escaped text but before -any quotes or elipses. +any quotes or ellipses. Returns a pointer to the prettified text as held by dsv. @@ -324,29 +339,34 @@ Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count, { const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; STRLEN escaped; - + + PERL_ARGS_ASSERT_PV_PRETTY; + + if (!(flags & PERL_PV_PRETTY_NOCLEAR)) { + /* This won't alter the UTF-8 flag */ + sv_setpvs(dsv, ""); + } + if ( dq == '"' ) - sv_setpvn(dsv, "\"", 1); + sv_catpvs(dsv, "\""); else if ( flags & PERL_PV_PRETTY_LTGT ) - sv_setpvn(dsv, "<", 1); - else - sv_setpvn(dsv, "", 0); + sv_catpvs(dsv, "<"); if ( start_color != NULL ) - Perl_sv_catpv( aTHX_ dsv, start_color); + sv_catpv(dsv, start_color); pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR ); if ( end_color != NULL ) - Perl_sv_catpv( aTHX_ dsv, end_color); + sv_catpv(dsv, end_color); if ( dq == '"' ) - sv_catpvn( dsv, "\"", 1 ); + sv_catpvs( dsv, "\""); else if ( flags & PERL_PV_PRETTY_LTGT ) - sv_catpvn( dsv, ">", 1); + sv_catpvs(dsv, ">"); - if ( (flags & PERL_PV_PRETTY_ELIPSES) && ( escaped < count ) ) - sv_catpvn( dsv, "...", 3 ); + if ( (flags & PERL_PV_PRETTY_ELLIPSES) && ( escaped < count ) ) + sv_catpvs(dsv, "..."); return SvPVX(dsv); } @@ -354,9 +374,6 @@ Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count, /* =for apidoc pv_display - char *pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len, - STRLEN pvlim, U32 flags) - Similar to pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE); @@ -372,9 +389,11 @@ Note that the final string may be up to 7 chars longer than pvlim. char * Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) { + PERL_ARGS_ASSERT_PV_DISPLAY; + pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); if (len > cur && pv[cur] == '\0') - sv_catpvn( dsv, "\\0", 2 ); + sv_catpvs( dsv, "\\0"); return SvPVX(dsv); } @@ -386,13 +405,13 @@ Perl_sv_peek(pTHX_ SV *sv) int unref = 0; U32 type; - sv_setpvn(t, "", 0); + sv_setpvs(t, ""); retry: if (!sv) { sv_catpv(t, "VOID"); goto finish; } - else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') { + else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') { sv_catpv(t, "WILD"); goto finish; } @@ -463,7 +482,7 @@ Perl_sv_peek(pTHX_ SV *sv) sv_catpv(t, "..."); goto finish; } - sv = (SV*)SvRV(sv); + sv = SvRV(sv); goto retry; } type = SvTYPE(sv); @@ -491,7 +510,7 @@ Perl_sv_peek(pTHX_ SV *sv) Perl_sv_catpvf(aTHX_ t, "%s)", pv_display(tmp, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), 127)); if (SvUTF8(sv)) Perl_sv_catpvf(aTHX_ t, " [UTF8 \"%s\"]", - sv_uni_display(tmp, sv, 8 * sv_len_utf8(sv), + sv_uni_display(tmp, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ)); SvREFCNT_dec(tmp); } @@ -513,6 +532,8 @@ Perl_sv_peek(pTHX_ SV *sv) finish: while (unref--) sv_catpv(t, ")"); + if (PL_tainting && SvTAINTED(sv)) + sv_catpv(t, " [tainted]"); return SvPV_nolen(t); } @@ -521,6 +542,8 @@ Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) { char ch; + PERL_ARGS_ASSERT_DO_PMOP_DUMP; + if (!pm) { Perl_dump_indent(aTHX_ level, file, "{}\n"); return; @@ -533,7 +556,7 @@ Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) ch = '/'; if (PM_GETRE(pm)) Perl_dump_indent(aTHX_ level, file, "PMf_PRE %c%s%c%s\n", - ch, PM_GETRE(pm)->precomp, ch, + ch, RX_PRECOMP(PM_GETRE(pm)), ch, (pm->op_private & OPpRUNTIME) ? " (RUNTIME)" : ""); else Perl_dump_indent(aTHX_ level, file, "PMf_PRE (RUNTIME)\n"); @@ -541,7 +564,7 @@ Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) Perl_dump_indent(aTHX_ level, file, "PMf_REPL = "); op_dump(pm->op_pmreplrootu.op_pmreplroot); } - if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) { + if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) { SV * const tmpsv = pm_description(pm); Perl_dump_indent(aTHX_ level, file, "PMFLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : ""); SvREFCNT_dec(tmpsv); @@ -557,6 +580,8 @@ S_pm_description(pTHX_ const PMOP *pm) const REGEXP * const regex = PM_GETRE(pm); const U32 pmflags = pm->op_pmflags; + PERL_ARGS_ASSERT_PM_DESCRIPTION; + if (pmflags & PMf_ONCE) sv_catpv(desc, ",ONCE"); #ifdef USE_ITHREADS @@ -568,15 +593,15 @@ S_pm_description(pTHX_ const PMOP *pm) #endif if (regex) { - if (regex->extflags & RXf_TAINTED) + if (RX_EXTFLAGS(regex) & RXf_TAINTED) sv_catpv(desc, ",TAINTED"); - if (regex->check_substr) { - if (!(regex->extflags & RXf_NOSCAN)) + if (RX_CHECK_SUBSTR(regex)) { + if (!(RX_EXTFLAGS(regex) & RXf_NOSCAN)) sv_catpv(desc, ",SCANFIRST"); - if (regex->extflags & RXf_CHECK_ALL) + if (RX_EXTFLAGS(regex) & RXf_CHECK_ALL) sv_catpv(desc, ",ALL"); } - if (regex->extflags & RXf_SKIPWHITE) + if (RX_EXTFLAGS(regex) & RXf_SKIPWHITE) sv_catpv(desc, ",SKIPWHITE"); } @@ -631,7 +656,7 @@ S_sequence(pTHX_ register const OP *o) switch (o->op_type) { case OP_STUB: if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) { - hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); + (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); break; } goto nothin; @@ -649,7 +674,7 @@ S_sequence(pTHX_ register const OP *o) nothin: if (oldop && o->op_next) continue; - hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); + (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); break; case OP_MAPWHILE: @@ -662,20 +687,20 @@ S_sequence(pTHX_ register const OP *o) case OP_DORASSIGN: case OP_COND_EXPR: case OP_RANGE: - hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); + (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); sequence_tail(cLOGOPo->op_other); break; case OP_ENTERLOOP: case OP_ENTERITER: - hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); + (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); sequence_tail(cLOOPo->op_redoop); sequence_tail(cLOOPo->op_nextop); sequence_tail(cLOOPo->op_lastop); break; case OP_SUBST: - hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); + (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); sequence_tail(cPMOPo->op_pmstashstartu.op_pmreplstart); break; @@ -685,7 +710,7 @@ S_sequence(pTHX_ register const OP *o) break; default: - hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); + (void)hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); break; } oldop = o; @@ -722,6 +747,8 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) UV seq; const OPCODE optype = o->op_type; + PERL_ARGS_ASSERT_DO_OP_DUMP; + sequence(o); Perl_dump_indent(aTHX_ level, file, "{\n"); level++; @@ -748,9 +775,9 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) if (CopSTASHPV(cCOPo)) Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n", CopSTASHPV(cCOPo)); - if (cCOPo->cop_label) + if (CopLABEL(cCOPo)) Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n", - cCOPo->cop_label); + CopLABEL(cCOPo)); } } else @@ -951,7 +978,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) sv_catpv(tmpsv, ",HUSH_VMSISH"); } else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) { - if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS) + if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS) sv_catpv(tmpsv, ",FT_ACCESS"); if (o->op_private & OPpFT_STACKED) sv_catpv(tmpsv, ",FT_STACKED"); @@ -965,13 +992,13 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) #ifdef PERL_MAD if (PL_madskills && o->op_madprop) { - SV * const tmpsv = newSVpvn("", 0); + SV * const tmpsv = newSVpvs(""); MADPROP* mp = o->op_madprop; Perl_dump_indent(aTHX_ level, file, "MADPROPS = {\n"); level++; while (mp) { const char tmp = mp->mad_key; - sv_setpvn(tmpsv,"'",1); + sv_setpvs(tmpsv,"'"); if (tmp) sv_catpvn(tmpsv, &tmp, 1); sv_catpv(tmpsv, "'="); @@ -1023,7 +1050,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) UTF-8 cleanliness of the dump file handle? */ SvUTF8_on(tmpsv); #endif - gv_fullname3(tmpsv, (GV*)cSVOPo->op_sv, NULL); + gv_fullname3(tmpsv, MUTABLE_GV(cSVOPo->op_sv), NULL); Perl_dump_indent(aTHX_ level, file, "GV = %s\n", SvPV_nolen_const(tmpsv)); LEAVE; @@ -1034,6 +1061,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) #endif break; case OP_CONST: + case OP_HINTSEVAL: case OP_METHOD_NAMED: #ifndef USE_ITHREADS /* with ITHREADS, consts are stored in the pad, and the right pad @@ -1041,7 +1069,6 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) Perl_dump_indent(aTHX_ level, file, "SV = %s\n", SvPEEK(cSVOPo_sv)); #endif break; - case OP_SETSTATE: case OP_NEXTSTATE: case OP_DBSTATE: if (CopLINE(cCOPo)) @@ -1050,9 +1077,9 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) if (CopSTASHPV(cCOPo)) Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n", CopSTASHPV(cCOPo)); - if (cCOPo->cop_label) + if (CopLABEL(cCOPo)) Perl_dump_indent(aTHX_ level, file, "LABEL = \"%s\"\n", - cCOPo->cop_label); + CopLABEL(cCOPo)); break; case OP_ENTERLOOP: Perl_dump_indent(aTHX_ level, file, "REDO ===> "); @@ -1112,6 +1139,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) void Perl_op_dump(pTHX_ const OP *o) { + PERL_ARGS_ASSERT_OP_DUMP; do_op_dump(0, Perl_debug_log, o); } @@ -1120,6 +1148,8 @@ Perl_gv_dump(pTHX_ GV *gv) { SV *sv; + PERL_ARGS_ASSERT_GV_DUMP; + if (!gv) { PerlIO_printf(Perl_debug_log, "{}\n"); return; @@ -1170,7 +1200,6 @@ static const struct { const char type; const char *name; } magic_names[] = { { PERL_MAGIC_isaelem, "isaelem(i)" }, { PERL_MAGIC_nkeys, "nkeys(k)" }, { PERL_MAGIC_dbline, "dbline(l)" }, - { PERL_MAGIC_mutex, "mutex(m)" }, { PERL_MAGIC_shared_scalar, "shared_scalar(n)" }, { PERL_MAGIC_collxfrm, "collxfrm(o)" }, { PERL_MAGIC_tiedelem, "tiedelem(p)" }, @@ -1178,7 +1207,7 @@ static const struct { const char type; const char *name; } magic_names[] = { { PERL_MAGIC_qr, "qr(r)" }, { PERL_MAGIC_sigelem, "sigelem(s)" }, { PERL_MAGIC_taint, "taint(t)" }, - { PERL_MAGIC_uvar_elem, "uvar_elem(v)" }, + { PERL_MAGIC_uvar_elem, "uvar_elem(u)" }, { PERL_MAGIC_vec, "vec(v)" }, { PERL_MAGIC_vstring, "vstring(V)" }, { PERL_MAGIC_utf8, "utf8(w)" }, @@ -1192,6 +1221,8 @@ static const struct { const char type; const char *name; } magic_names[] = { void Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim) { + PERL_ARGS_ASSERT_DO_MAGIC_DUMP; + for (; mg; mg = mg->mg_moremagic) { Perl_dump_indent(aTHX_ level, file, " MAGIC = 0x%"UVxf"\n", PTR2UV(mg)); @@ -1273,16 +1304,17 @@ Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 Perl_dump_indent(aTHX_ level, file, " MG_OBJ = 0x%"UVxf"\n", PTR2UV(mg->mg_obj)); if (mg->mg_type == PERL_MAGIC_qr) { - const regexp * const re = (regexp *)mg->mg_obj; + REGEXP* const re = (REGEXP *)mg->mg_obj; SV * const dsv = sv_newmortal(); - const char * const s = pv_pretty(dsv, re->wrapped, re->wraplen, + const char * const s + = pv_pretty(dsv, RX_WRAPPED(re), RX_WRAPLEN(re), 60, NULL, NULL, - ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELIPSES | - ((re->extflags & RXf_UTF8) ? PERL_PV_ESCAPE_UNI : 0)) + ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES | + (RX_UTF8(re) ? PERL_PV_ESCAPE_UNI : 0)) ); Perl_dump_indent(aTHX_ level+1, file, " PAT = %s\n", s); Perl_dump_indent(aTHX_ level+1, file, " REFCNT = %"IVdf"\n", - (IV)re->refcnt); + (IV)RX_REFCNT(re)); } if (mg->mg_flags & MGf_REFCOUNTED) do_sv_dump(level+2, file, mg->mg_obj, nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */ @@ -1300,7 +1332,8 @@ Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 } else if (mg->mg_len == HEf_SVKEY) { PerlIO_puts(file, " => HEf_SVKEY\n"); - do_sv_dump(level+2, file, (SV*)((mg)->mg_ptr), nest+1, maxnest, dumpops, pvlim); /* MG is already +1 */ + do_sv_dump(level+2, file, MUTABLE_SV(((mg)->mg_ptr)), nest+1, + maxnest, dumpops, pvlim); /* MG is already +1 */ continue; } else @@ -1332,6 +1365,9 @@ void Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv) { const char *hvname; + + PERL_ARGS_ASSERT_DO_HV_DUMP; + Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv)); if (sv && (hvname = HvNAME_get(sv))) PerlIO_printf(file, "\t\"%s\"\n", hvname); @@ -1342,6 +1378,8 @@ Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv) void Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv) { + PERL_ARGS_ASSERT_DO_GV_DUMP; + Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv)); if (sv && GvNAME(sv)) PerlIO_printf(file, "\t\"%s\"\n", GvNAME(sv)); @@ -1352,6 +1390,8 @@ Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv) void Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv) { + PERL_ARGS_ASSERT_DO_GVGV_DUMP; + Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv)); if (sv && GvNAME(sv)) { const char *hvname; @@ -1373,6 +1413,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo U32 flags; U32 type; + PERL_ARGS_ASSERT_DO_SV_DUMP; + if (!sv) { Perl_dump_indent(aTHX_ level, file, "SV = 0\n"); return; @@ -1437,7 +1479,6 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo if (CvMETHOD(sv)) sv_catpv(d, "METHOD,"); if (CvLOCKED(sv)) sv_catpv(d, "LOCKED,"); if (CvWEAKOUTSIDE(sv)) sv_catpv(d, "WEAKOUTSIDE,"); - if (CvASSERTION(sv)) sv_catpv(d, "ASSERTION,"); break; case SVt_PVHV: if (HvSHAREKEYS(sv)) sv_catpv(d, "SHAREKEYS,"); @@ -1519,8 +1560,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo return; } if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV - && type != SVt_PVCV && !isGV_with_GP(sv)) - || type == SVt_IV) { + && type != SVt_PVCV && !isGV_with_GP(sv) && type != SVt_PVFM) + || (type == SVt_IV && !SvROK(sv))) { if (SvIsUV(sv) #ifdef PERL_OLD_COPY_ON_WRITE || SvIsCOW(sv) @@ -1529,8 +1570,6 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo Perl_dump_indent(aTHX_ level, file, " UV = %"UVuf, (UV)SvUVX(sv)); else Perl_dump_indent(aTHX_ level, file, " IV = %"IVdf, (IV)SvIVX(sv)); - if (SvOOK(sv)) - PerlIO_printf(file, " (OFFSET)"); #ifdef PERL_OLD_COPY_ON_WRITE if (SvIsCOW_shared_hash(sv)) PerlIO_printf(file, " (HASH)"); @@ -1545,8 +1584,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n", (UV) COP_SEQ_RANGE_HIGH(sv)); } else if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV - && type != SVt_PVCV && type != SVt_PVFM && !isGV_with_GP(sv) - && !SvVALID(sv)) + && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP + && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv)) || type == SVt_NV) { STORE_NUMERIC_LOCAL_SET_STANDARD(); /* %Vg doesn't work? --jhi */ @@ -1566,14 +1605,25 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo SvREFCNT_dec(d); return; } - if (type <= SVt_PVLV && !isGV_with_GP(sv)) { + if ((type <= SVt_PVLV && !isGV_with_GP(sv)) || type == SVt_PVFM) { if (SvPVX_const(sv)) { + STRLEN delta; + if (SvOOK(sv)) { + SvOOK_offset(sv, delta); + Perl_dump_indent(aTHX_ level, file," OFFSET = %"UVuf"\n", + (UV) delta); + } else { + delta = 0; + } Perl_dump_indent(aTHX_ level, file," PV = 0x%"UVxf" ", PTR2UV(SvPVX_const(sv))); - if (SvOOK(sv)) - PerlIO_printf(file, "( %s . ) ", pv_display(d, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, pvlim)); + if (SvOOK(sv)) { + PerlIO_printf(file, "( %s . ) ", + pv_display(d, SvPVX_const(sv) - delta, delta, 0, + pvlim)); + } PerlIO_printf(file, "%s", pv_display(d, SvPVX_const(sv), SvCUR(sv), SvLEN(sv), pvlim)); - if (SvUTF8(sv)) /* the 8? \x{....} */ - PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 8 * sv_len_utf8(sv), UNI_DISPLAY_QQ)); + if (SvUTF8(sv)) /* the 6? \x{....} */ + PerlIO_printf(file, " [UTF8 \"%s\"]", sv_uni_display(d, sv, 6 * SvCUR(sv), UNI_DISPLAY_QQ)); PerlIO_printf(file, "\n"); Perl_dump_indent(aTHX_ level, file, " CUR = %"IVdf"\n", (IV)SvCUR(sv)); Perl_dump_indent(aTHX_ level, file, " LEN = %"IVdf"\n", (IV)SvLEN(sv)); @@ -1581,6 +1631,12 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo else Perl_dump_indent(aTHX_ level, file, " PV = 0\n"); } + if (type == SVt_REGEXP) { + /* FIXME dumping + Perl_dump_indent(aTHX_ level, file, " REGEXP = 0x%"UVxf"\n", + PTR2UV(((struct regexp *)SvANY(sv))->xrx_regexp)); + */ + } if (type >= SVt_PVMG) { if (type == SVt_PVMG && SvPAD_OUR(sv)) { HV * const ost = SvOURSTASH(sv); @@ -1605,15 +1661,15 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)AvFILLp(sv)); Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)AvMAX(sv)); Perl_dump_indent(aTHX_ level, file, " ARYLEN = 0x%"UVxf"\n", SvMAGIC(sv) ? PTR2UV(AvARYLEN(sv)) : 0); - sv_setpvn(d, "", 0); + sv_setpvs(d, ""); if (AvREAL(sv)) sv_catpv(d, ",REAL"); if (AvREIFY(sv)) sv_catpv(d, ",REIFY"); Perl_dump_indent(aTHX_ level, file, " FLAGS = (%s)\n", SvCUR(d) ? SvPVX_const(d) + 1 : ""); - if (nest < maxnest && av_len((AV*)sv) >= 0) { + if (nest < maxnest && av_len(MUTABLE_AV(sv)) >= 0) { int count; - for (count = 0; count <= av_len((AV*)sv) && count < maxnest; count++) { - SV** const elt = av_fetch((AV*)sv,count,0); + for (count = 0; count <= av_len(MUTABLE_AV(sv)) && count < maxnest; count++) { + SV** const elt = av_fetch(MUTABLE_AV(sv),count,0); Perl_dump_indent(aTHX_ level + 1, file, "Elt No. %"IVdf"\n", (IV)count); if (elt) @@ -1694,17 +1750,18 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname); } if (SvOOK(sv)) { - const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv); + AV * const backrefs + = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv)); if (backrefs) { Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n", PTR2UV(backrefs)); - do_sv_dump(level+1, file, (SV*)backrefs, nest+1, maxnest, + do_sv_dump(level+1, file, MUTABLE_SV(backrefs), nest+1, maxnest, dumpops, pvlim); } } if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */ HE *he; - HV * const hv = (HV*)sv; + HV * const hv = MUTABLE_HV(sv); int count = maxnest - nest; hv_iterinit(hv); @@ -1718,7 +1775,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo Perl_dump_indent(aTHX_ level+1, file, "Elt %s ", pv_display(d, keypv, len, 0, pvlim)); if (SvUTF8(keysv)) - PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 8 * sv_len_utf8(keysv), UNI_DISPLAY_QQ)); + PerlIO_printf(file, "[UTF8 \"%s\"] ", sv_uni_display(d, keysv, 6 * SvCUR(keysv), UNI_DISPLAY_QQ)); if (HeKREHASH(he)) PerlIO_printf(file, "[REHASH] "); PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash); @@ -1750,7 +1807,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo do_op_dump(level+1, file, CvROOT(sv)); } } else { - SV * const constant = cv_const_sv((CV *)sv); + SV * const constant = cv_const_sv((const CV *)sv); Perl_dump_indent(aTHX_ level, file, " XSUB = 0x%"UVxf"\n", PTR2UV(CvXSUB(sv))); @@ -1767,7 +1824,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo } do_gvgv_dump(level, file, " GVGV::GV", CvGV(sv)); Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", CvFILE(sv)); - Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv)); + if (type == SVt_PVCV) + Perl_dump_indent(aTHX_ level, file, " DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv)); Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv)); Perl_dump_indent(aTHX_ level, file, " OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv)); if (type == SVt_PVFM) @@ -1787,7 +1845,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo : CvGV(outside) ? GvNAME(CvGV(outside)) : "UNDEFINED")); } if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))) - do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim); + do_sv_dump(level+1, file, MUTABLE_SV(CvOUTSIDE(sv)), nest+1, maxnest, dumpops, pvlim); break; case SVt_PVGV: case SVt_PVLV: @@ -1842,8 +1900,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo else { Perl_dump_indent(aTHX_ level, file, " TOP_GV = 0x%"UVxf"\n", PTR2UV(IoTOP_GV(sv))); - do_sv_dump (level+1, file, (SV *) IoTOP_GV(sv), nest+1, maxnest, - dumpops, pvlim); + do_sv_dump (level+1, file, MUTABLE_SV(IoTOP_GV(sv)), nest+1, + maxnest, dumpops, pvlim); } /* Source filters hide things that are not GVs in these three, so let's be careful out there. */ @@ -1854,8 +1912,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo else { Perl_dump_indent(aTHX_ level, file, " FMT_GV = 0x%"UVxf"\n", PTR2UV(IoFMT_GV(sv))); - do_sv_dump (level+1, file, (SV *) IoFMT_GV(sv), nest+1, maxnest, - dumpops, pvlim); + do_sv_dump (level+1, file, MUTABLE_SV(IoFMT_GV(sv)), nest+1, + maxnest, dumpops, pvlim); } if (IoBOTTOM_NAME(sv)) Perl_dump_indent(aTHX_ level, file, " BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv)); @@ -1864,10 +1922,9 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo else { Perl_dump_indent(aTHX_ level, file, " BOTTOM_GV = 0x%"UVxf"\n", PTR2UV(IoBOTTOM_GV(sv))); - do_sv_dump (level+1, file, (SV *) IoBOTTOM_GV(sv), nest+1, maxnest, - dumpops, pvlim); + do_sv_dump (level+1, file, MUTABLE_SV(IoBOTTOM_GV(sv)), nest+1, + maxnest, dumpops, pvlim); } - Perl_dump_indent(aTHX_ level, file, " SUBPROCESS = %"IVdf"\n", (IV)IoSUBPROCESS(sv)); if (isPRINT(IoTYPE(sv))) Perl_dump_indent(aTHX_ level, file, " TYPE = '%c'\n", IoTYPE(sv)); else @@ -1882,7 +1939,13 @@ void Perl_sv_dump(pTHX_ SV *sv) { dVAR; - do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0); + + PERL_ARGS_ASSERT_SV_DUMP; + + if (SvROK(sv)) + do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0); + else + do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0); } int @@ -1928,13 +1991,24 @@ I32 Perl_debop(pTHX_ const OP *o) { dVAR; + + PERL_ARGS_ASSERT_DEBOP; + if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_) return 0; Perl_deb(aTHX_ "%s", OP_NAME(o)); switch (o->op_type) { case OP_CONST: - PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv)); + case OP_HINTSEVAL: + /* With ITHREADS, consts are stored in the pad, and the right pad + * may not be active here, so check. + * Looks like only during compiling the pads are illegal. + */ +#ifdef USE_ITHREADS + if ((((SVOP*)o)->op_sv) || !IN_PERL_COMPILETIME) +#endif + PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv)); break; case OP_GVSV: case OP_GV: @@ -1961,7 +2035,7 @@ Perl_debop(pTHX_ const OP *o) SV *sv; if (cv) { AV * const padlist = CvPADLIST(cv); - AV * const comppad = (AV*)(*av_fetch(padlist, 0, FALSE)); + AV * const comppad = MUTABLE_AV(*av_fetch(padlist, 0, FALSE)); sv = *av_fetch(comppad, o->op_targ, FALSE); } else sv = NULL; @@ -1999,6 +2073,9 @@ void Perl_watch(pTHX_ char **addr) { dVAR; + + PERL_ARGS_ASSERT_WATCH; + PL_watchaddr = addr; PL_watchok = *addr; PerlIO_printf(Perl_debug_log, "WATCHING, %"UVxf" is currently %"UVxf"\n", @@ -2009,6 +2086,9 @@ STATIC void S_debprof(pTHX_ const OP *o) { dVAR; + + PERL_ARGS_ASSERT_DEBPROF; + if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash)) return; if (!PL_profiledata) @@ -2040,6 +2120,9 @@ STATIC void S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...) { va_list args; + + PERL_ARGS_ASSERT_XMLDUMP_ATTR; + PerlIO_printf(file, "\n "); va_start(args, pat); xmldump_vindent(level, file, pat, &args); @@ -2051,6 +2134,7 @@ void Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...) { va_list args; + PERL_ARGS_ASSERT_XMLDUMP_INDENT; va_start(args, pat); xmldump_vindent(level, file, pat, &args); va_end(args); @@ -2059,6 +2143,8 @@ Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...) void Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args) { + PERL_ARGS_ASSERT_XMLDUMP_VINDENT; + PerlIO_printf(file, "%*s", (int)(level*PL_dumpindent), ""); PerlIO_vprintf(file, pat, *args); } @@ -2080,11 +2166,13 @@ Perl_xmldump_packsubs(pTHX_ const HV *stash) I32 i; HE *entry; + PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS; + if (!HvARRAY(stash)) return; for (i = 0; i <= (I32) HvMAX(stash); i++) { for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) { - GV *gv = (GV*)HeVAL(entry); + GV *gv = MUTABLE_GV(HeVAL(entry)); HV *hv; if (SvTYPE(gv) != SVt_PVGV || !GvGP(gv)) continue; @@ -2104,7 +2192,9 @@ Perl_xmldump_sub(pTHX_ const GV *gv) { SV * const sv = sv_newmortal(); - gv_fullname3(sv, gv, Nullch); + PERL_ARGS_ASSERT_XMLDUMP_SUB; + + gv_fullname3(sv, gv, NULL); Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nSUB %s = ", SvPVX(sv)); if (CvXSUB(GvCV(gv))) Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "(xsub 0x%"UVxf" %d)\n", @@ -2121,7 +2211,9 @@ Perl_xmldump_form(pTHX_ const GV *gv) { SV * const sv = sv_newmortal(); - gv_fullname3(sv, gv, Nullch); + PERL_ARGS_ASSERT_XMLDUMP_FORM; + + gv_fullname3(sv, gv, NULL); Perl_xmldump_indent(aTHX_ 0, PL_xmlfp, "\nFORMAT %s = ", SvPVX(sv)); if (CvROOT(GvFORM(gv))) op_xmldump(CvROOT(GvFORM(gv))); @@ -2138,19 +2230,22 @@ Perl_xmldump_eval(pTHX) char * Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv) { + PERL_ARGS_ASSERT_SV_CATXMLSV; return sv_catxmlpvn(dsv, SvPVX(ssv), SvCUR(ssv), SvUTF8(ssv)); } char * -Perl_sv_catxmlpvn(pTHX_ SV *dsv, char* pv, STRLEN len, int utf8) +Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8) { unsigned int c; const char * const e = pv + len; - char *start = pv; + const char * const start = pv; STRLEN dsvcur; STRLEN cl; - sv_catpvn(dsv,"",0); + PERL_ARGS_ASSERT_SV_CATXMLPVN; + + sv_catpvs(dsv,""); dsvcur = SvCUR(dsv); /* in case we have to restart */ retry: @@ -2226,16 +2321,16 @@ Perl_sv_catxmlpvn(pTHX_ SV *dsv, char* pv, STRLEN len, int utf8) Perl_sv_catpvf(aTHX_ dsv, "STUPIDXML(#x%X)", c); break; case '<': - Perl_sv_catpvf(aTHX_ dsv, "<"); + sv_catpvs(dsv, "<"); break; case '>': - Perl_sv_catpvf(aTHX_ dsv, ">"); + sv_catpvs(dsv, ">"); break; case '&': - Perl_sv_catpvf(aTHX_ dsv, "&"); + sv_catpvs(dsv, "&"); break; case '"': - Perl_sv_catpvf(aTHX_ dsv, """); + sv_catpvs(dsv, """); break; default: if (c < 0xD800) { @@ -2243,7 +2338,8 @@ Perl_sv_catxmlpvn(pTHX_ SV *dsv, char* pv, STRLEN len, int utf8) Perl_sv_catpvf(aTHX_ dsv, "&#x%X;", c); } else { - Perl_sv_catpvf(aTHX_ dsv, "%c", c); + const char string = (char) c; + sv_catpvn(dsv, &string, 1); } break; } @@ -2272,14 +2368,16 @@ Perl_sv_xmlpeek(pTHX_ SV *sv) STRLEN n_a; int unref = 0; + PERL_ARGS_ASSERT_SV_XMLPEEK; + sv_utf8_upgrade(t); - sv_setpvn(t, "", 0); + sv_setpvs(t, ""); /* retry: */ if (!sv) { sv_catpv(t, "VOID=\"\""); goto finish; } - else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') { + else if (sv == (const SV *)0x55555555 || SvTYPE(sv) == 'U') { sv_catpv(t, "WILD=\"\""); goto finish; } @@ -2359,9 +2457,6 @@ Perl_sv_xmlpeek(pTHX_ SV *sv) case SVt_NV: sv_catpv(t, " NV=\""); break; - case SVt_RV: - sv_catpv(t, " RV=\""); - break; case SVt_PV: sv_catpv(t, " PV=\""); break; @@ -2395,6 +2490,9 @@ Perl_sv_xmlpeek(pTHX_ SV *sv) case SVt_BIND: sv_catpv(t, " BIND=\""); break; + case SVt_REGEXP: + sv_catpv(t, " ORANGE=\""); + break; case SVt_PVFM: sv_catpv(t, " FM=\""); break; @@ -2432,6 +2530,8 @@ Perl_sv_xmlpeek(pTHX_ SV *sv) void Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) { + PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP; + if (!pm) { Perl_xmldump_indent(aTHX_ level, file, "\n"); return; @@ -2439,10 +2539,9 @@ Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) Perl_xmldump_indent(aTHX_ level, file, "precomp; - SV * const tmpsv = newSVpvn("",0); - SvUTF8_on(tmpsv); - sv_catxmlpvn(tmpsv, s, strlen(s), 1); + REGEXP *const r = PM_GETRE(pm); + SV * const tmpsv = newSVpvn_utf8("", 0, TRUE); + sv_catxmlsv(tmpsv, MUTABLE_SV(r)); Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n", SvPVX(tmpsv)); SvREFCNT_dec(tmpsv); @@ -2451,7 +2550,7 @@ Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) } else Perl_xmldump_indent(aTHX_ level, file, "pre=\"\" when=\"RUN\"\n"); - if (pm->op_pmflags || (PM_GETRE(pm) && PM_GETRE(pm)->check_substr)) { + if (pm->op_pmflags || (PM_GETRE(pm) && RX_CHECK_SUBSTR(PM_GETRE(pm)))) { SV * const tmpsv = pm_description(pm); Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : ""); SvREFCNT_dec(tmpsv); @@ -2480,6 +2579,9 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) { UV seq; int contents = 0; + + PERL_ARGS_ASSERT_DO_OP_XMLDUMP; + if (!o) return; sequence(o); @@ -2507,9 +2609,9 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) if (CopSTASHPV(cCOPo)) PerlIO_printf(file, " package=\"%s\"", CopSTASHPV(cCOPo)); - if (cCOPo->cop_label) + if (CopLABEL(cCOPo)) PerlIO_printf(file, " label=\"%s\"", - cCOPo->cop_label); + CopLABEL(cCOPo)); } } else @@ -2519,7 +2621,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) PerlIO_printf(file, " addr=\"0x%"UVxf" => 0x%"UVxf"\"", (UV)o, (UV)o->op_next); #endif if (o->op_flags) { - SV * const tmpsv = newSVpvn("", 0); + SV * const tmpsv = newSVpvs(""); switch (o->op_flags & OPf_WANT) { case OPf_WANT_VOID: sv_catpv(tmpsv, ",VOID"); @@ -2550,7 +2652,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) SvREFCNT_dec(tmpsv); } if (o->op_private) { - SV * const tmpsv = newSVpvn("", 0); + SV * const tmpsv = newSVpvs(""); if (PL_opargs[o->op_type] & OA_TARGLEX) { if (o->op_private & OPpTARGET_MY) sv_catpv(tmpsv, ",TARGET_MY"); @@ -2704,7 +2806,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) sv_catpv(tmpsv, ",HUSH_VMSISH"); } else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) { - if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS) + if (OP_IS_FILETEST_ACCESS(o->op_type) && o->op_private & OPpFT_ACCESS) sv_catpv(tmpsv, ",FT_ACCESS"); if (o->op_private & OPpFT_STACKED) sv_catpv(tmpsv, ",FT_STACKED"); @@ -2727,16 +2829,14 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) S_xmldump_attr(aTHX_ level, file, "padix=\"%" IVdf "\"", (IV)cPADOPo->op_padix); #else if (cSVOPo->op_sv) { - SV * const tmpsv1 = newSV(0); - SV * const tmpsv2 = newSVpvn("",0); + SV * const tmpsv1 = newSVpvn_utf8(NULL, 0, TRUE); + SV * const tmpsv2 = newSVpvn_utf8("", 0, TRUE); char *s; STRLEN len; - SvUTF8_on(tmpsv1); - SvUTF8_on(tmpsv2); ENTER; SAVEFREESV(tmpsv1); SAVEFREESV(tmpsv2); - gv_fullname3(tmpsv1, (GV*)cSVOPo->op_sv, Nullch); + gv_fullname3(tmpsv1, MUTABLE_GV(cSVOPo->op_sv), NULL); s = SvPV(tmpsv1,len); sv_catxmlpvn(tmpsv2, s, len, 1); S_xmldump_attr(aTHX_ level, file, "gv=\"%s\"", SvPV(tmpsv2, len)); @@ -2747,6 +2847,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) #endif break; case OP_CONST: + case OP_HINTSEVAL: case OP_METHOD_NAMED: #ifndef USE_ITHREADS /* with ITHREADS, consts are stored in the pad, and the right pad @@ -2761,7 +2862,6 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) } do_op_xmldump(level+1, file, CvROOT(cSVOPo_sv)); break; - case OP_SETSTATE: case OP_NEXTSTATE: case OP_DBSTATE: if (CopLINE(cCOPo)) @@ -2770,9 +2870,9 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) if (CopSTASHPV(cCOPo)) S_xmldump_attr(aTHX_ level, file, "package=\"%s\"", CopSTASHPV(cCOPo)); - if (cCOPo->cop_label) + if (CopLABEL(cCOPo)) S_xmldump_attr(aTHX_ level, file, "label=\"%s\"", - cCOPo->cop_label); + CopLABEL(cCOPo)); break; case OP_ENTERLOOP: S_xmldump_attr(aTHX_ level, file, "redo=\""); @@ -2818,10 +2918,9 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) if (PL_madskills && o->op_madprop) { char prevkey = '\0'; - SV * const tmpsv = newSVpvn("", 0); - const MADPROP* const mp = o->op_madprop; + SV * const tmpsv = newSVpvn_utf8("", 0, TRUE); + const MADPROP* mp = o->op_madprop; - sv_utf8_upgrade(tmpsv); if (!contents) { contents = 1; PerlIO_printf(file, ">\n"); @@ -2830,7 +2929,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) level++; while (mp) { char tmp = mp->mad_key; - sv_setpvn(tmpsv,"\"",1); + sv_setpvs(tmpsv,"\""); if (tmp) sv_catxmlpvn(tmpsv, &tmp, 1, 0); if ((tmp == '_') || (tmp == '#')) /* '_' '#' whitespace belong to the previous token. */ @@ -2851,7 +2950,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) break; case MAD_SV: sv_catpv(tmpsv, " val=\""); - sv_catxmlsv(tmpsv, (SV*)mp->mad_val); + sv_catxmlsv(tmpsv, MUTABLE_SV(mp->mad_val)); sv_catpv(tmpsv, "\""); Perl_xmldump_indent(aTHX_ level, file, "\n", SvPVX(tmpsv)); break; @@ -2908,6 +3007,8 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) void Perl_op_xmldump(pTHX_ const OP *o) { + PERL_ARGS_ASSERT_OP_XMLDUMP; + do_op_xmldump(0, PL_xmlfp, o); } #endif