X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=dump.c;h=4805536654fc910211c7390ced3eaf464daad644;hb=c8e599d3a7f82b1ac9916859e455d8fd113f5731;hp=e548585cb6def306903afb0a7d21710087e09388;hpb=4199688e3d699f53e17448d3bad6e93e57d49dcc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/dump.c b/dump.c index e548585..4805536 100644 --- a/dump.c +++ b/dump.c @@ -119,40 +119,209 @@ Perl_dump_eval(pTHX) op_dump(PL_eval_root); } + +/* +=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 + +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 +and will not contain any incomplete escape sequences. + +If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string +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_DETECT is set then the input string is scanned +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 +escaped using this style, other non printable chars will use octal or +common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH +then all chars below 255 will be treated as printable and +will be output as literals. + +If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the +string will be escaped, regardles of max. If the string is utf8 and +the chars value is >255 then it will be returned as a plain hex +sequence. Thus the output will either be a single char, +an octal escape sequence, a special escape like C<\n> or a 3 or +more digit hex value. + +Returns a pointer to the escaped text as held by dsv. + +=cut +*/ +#define PV_ESCAPE_OCTBUFSIZE 32 + char * -Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) +Perl_pv_escape( pTHX_ SV *dsv, char const * const str, + const STRLEN count, const STRLEN max, + STRLEN * const escaped, const U32 flags ) { - const bool nul_terminated = len > cur && pv[cur] == '\0'; - bool truncated = 0; - - sv_setpvn(dsv, "\"", 1); - for (; cur--; pv++) { - if (pvlim && SvCUR(dsv) >= pvlim) { - truncated = 1; - break; - } - switch (*pv) { - case '\t': sv_catpvs(dsv, "\\t"); break; - case '\n': sv_catpvs(dsv, "\\n"); break; - case '\r': sv_catpvs(dsv, "\\r"); break; - case '\f': sv_catpvs(dsv, "\\f"); break; - case '"': sv_catpvs(dsv, "\\\""); break; - case '\\': sv_catpvs(dsv, "\\\\"); break; - default: - if (isPRINT(*pv)) - sv_catpvn(dsv, pv, 1); - else if (cur && isDIGIT(*(pv+1))) - Perl_sv_catpvf(aTHX_ dsv, "\\%03o", (U8)*pv); - else - Perl_sv_catpvf(aTHX_ dsv, "\\%o", (U8)*pv); - } + char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : '\\'; + char octbuf[PV_ESCAPE_OCTBUFSIZE] = "\\123456789ABCDF"; + 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 */ + const char *pv = str; + const char *end = pv + count; /* end of string */ + + if (!flags & PERL_PV_ESCAPE_NOCLEAR) + sv_setpvn(dsv, "", 0); + + if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) + isuni = 1; + + for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) { + const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv; + const U8 c = (U8)u & 0xFF; + + if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) { + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, + "%"UVxf, u); + else + chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, + "\\x{%"UVxf"}", u); + } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { + chsize = 1; + } else { + if ( (c == dq) || (c == '\\') || !isPRINT(c) ) { + chsize = 2; + switch (c) { + case '\\' : octbuf[1] = '\\'; break; + case '\v' : octbuf[1] = 'v'; break; + case '\t' : octbuf[1] = 't'; break; + case '\r' : octbuf[1] = 'r'; break; + case '\n' : octbuf[1] = 'n'; break; + case '\f' : octbuf[1] = 'f'; break; + case '"' : + if ( dq == '"' ) + octbuf[1] = '"'; + else + chsize = 1; + break; + default: + if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) ) + chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, + "\\%03o", c); + else + chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, + "\\%o", c); + } + } else { + chsize=1; + } + } + if ( max && (wrote + chsize > max) ) { + break; + } else if (chsize > 1) { + sv_catpvn(dsv, octbuf, chsize); + wrote += chsize; + } else { + Perl_sv_catpvf( aTHX_ dsv, "%c", c); + wrote++; + } + if ( flags & PERL_PV_ESCAPE_FIRSTCHAR ) + break; } - sv_catpvs(dsv, "\""); - if (truncated) - sv_catpvs(dsv, "..."); - if (nul_terminated) - sv_catpvs(dsv, "\\0"); + if (escaped != NULL) + *escaped= pv - 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 + +Converts a string into something presentable, handling escaping via +pv_escape() and supporting quoting and elipses. + +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 +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. + +Returns a pointer to the prettified text as held by dsv. + +=cut +*/ + +char * +Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count, + const STRLEN max, char const * const start_color, char const * const end_color, + const U32 flags ) +{ + U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '\\'; + STRLEN escaped; + + if ( dq == '"' ) + sv_setpvn(dsv, "\"", 1); + else if ( flags & PERL_PV_PRETTY_LTGT ) + sv_setpvn(dsv, "<", 1); + else + sv_setpvn(dsv, "", 0); + + if ( start_color != NULL ) + Perl_sv_catpv( aTHX_ 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); + + if ( dq == '"' ) + sv_catpvn( dsv, "\"", 1 ); + else if ( flags & PERL_PV_PRETTY_LTGT ) + sv_catpvn( dsv, ">", 1); + + if ( (flags & PERL_PV_PRETTY_ELIPSES) && ( escaped < count ) ) + sv_catpvn( dsv, "...", 3 ); + + return SvPVX(dsv); +} + +/* +=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); + +except that an additional "\0" will be appended to the string when +len > cur and pv[cur] is "\0". +Note that the final string may be up to 7 chars longer than pvlim. + +=cut +*/ + +char * +Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) +{ + pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); + if (len > cur && pv[cur] == '\0') + sv_catpvn( dsv, "\\0", 2 ); return SvPVX(dsv); } @@ -305,7 +474,7 @@ Perl_sv_peek(pTHX_ SV *sv) if (!SvPVX_const(sv)) sv_catpv(t, "(null)"); else { - SV *tmp = newSVpvs(""); + SV * const tmp = newSVpvs(""); sv_catpv(t, "("); if (SvOOK(sv)) Perl_sv_catpvf(aTHX_ t, "[%s]", pv_display(tmp, SvPVX_const(sv)-SvIVX(sv), SvIVX(sv), 0, 127)); @@ -373,8 +542,7 @@ Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm) Perl_dump_indent(aTHX_ level-1, file, "}\n"); } -static -SV * +static SV * S_pm_description(pTHX_ const PMOP *pm) { SV * const desc = newSVpvs(""); @@ -423,11 +591,7 @@ STATIC void S_sequence(pTHX_ register const OP *o) { dVAR; - SV *op; - const char *key; - STRLEN len; const OP *oldop = NULL; - OP *l; if (!o) return; @@ -441,8 +605,10 @@ S_sequence(pTHX_ register const OP *o) Sequence = newHV(); for (; o; o = o->op_next) { - op = newSVuv(PTR2UV(o)); - key = SvPV_const(op, len); + STRLEN len; + SV * const op = newSVuv(PTR2UV(o)); + const char * const key = SvPV_const(op, len); + if (hv_exists(Sequence, key, len)) break; @@ -481,32 +647,22 @@ S_sequence(pTHX_ register const OP *o) case OP_COND_EXPR: case OP_RANGE: hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); - for (l = cLOGOPo->op_other; l && l->op_type == OP_NULL; l = l->op_next) - ; - sequence(l); + sequence_tail(cLOGOPo->op_other); break; case OP_ENTERLOOP: case OP_ENTERITER: hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); - for (l = cLOOPo->op_redoop; l && l->op_type == OP_NULL; l = l->op_next) - ; - sequence(l); - for (l = cLOOPo->op_nextop; l && l->op_type == OP_NULL; l = l->op_next) - ; - sequence(l); - for (l = cLOOPo->op_lastop; l && l->op_type == OP_NULL; l = l->op_next) - ; - sequence(l); + sequence_tail(cLOOPo->op_redoop); + sequence_tail(cLOOPo->op_nextop); + sequence_tail(cLOOPo->op_lastop); break; case OP_QR: case OP_MATCH: case OP_SUBST: hv_store(Sequence, key, len, newSVuv(++PL_op_seq), 0); - for (l = cPMOPo->op_pmreplstart; l && l->op_type == OP_NULL; l = l->op_next) - ; - sequence(l); + sequence_tail(cPMOPo->op_pmreplstart); break; case OP_HELEM: @@ -520,6 +676,14 @@ S_sequence(pTHX_ register const OP *o) } } +static void +S_sequence_tail(pTHX_ const OP *o) +{ + while (o && (o->op_type == OP_NULL)) + o = o->op_next; + sequence(o); +} + STATIC UV S_sequence_num(pTHX_ const OP *o) { @@ -540,30 +704,30 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) { dVAR; UV seq; + const OPCODE optype = o->op_type; + sequence(o); Perl_dump_indent(aTHX_ level, file, "{\n"); level++; seq = sequence_num(o); if (seq) - PerlIO_printf(file, "%-4"UVf, seq); + PerlIO_printf(file, "%-4"UVuf, seq); else PerlIO_printf(file, " "); PerlIO_printf(file, "%*sTYPE = %s ===> ", (int)(PL_dumpindent*level-4), "", OP_NAME(o)); if (o->op_next) - PerlIO_printf(file, seq ? "%"UVf"\n" : "(%"UVf")\n", + PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n", sequence_num(o->op_next)); else PerlIO_printf(file, "DONE\n"); if (o->op_targ) { - if (o->op_type == OP_NULL) - { + if (optype == OP_NULL) { Perl_dump_indent(aTHX_ level, file, " (was %s)\n", PL_op_name[o->op_targ]); - if (o->op_targ == OP_NEXTSTATE) - { + if (o->op_targ == OP_NEXTSTATE) { if (CopLINE(cCOPo)) - Perl_dump_indent(aTHX_ level, file, "LINE = %"UVf"\n", + Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n", (UV)CopLINE(cCOPo)); if (CopSTASHPV(cCOPo)) Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n", @@ -580,7 +744,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next); #endif if (o->op_flags) { - SV *tmpsv = newSVpvs(""); + SV * const tmpsv = newSVpvs(""); switch (o->op_flags & OPf_WANT) { case OPf_WANT_VOID: sv_catpv(tmpsv, ",VOID"); @@ -611,27 +775,27 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) SvREFCNT_dec(tmpsv); } if (o->op_private) { - SV *tmpsv = newSVpvs(""); - if (PL_opargs[o->op_type] & OA_TARGLEX) { + SV * const tmpsv = newSVpvs(""); + if (PL_opargs[optype] & OA_TARGLEX) { if (o->op_private & OPpTARGET_MY) sv_catpv(tmpsv, ",TARGET_MY"); } - else if (o->op_type == OP_LEAVESUB || - o->op_type == OP_LEAVE || - o->op_type == OP_LEAVESUBLV || - o->op_type == OP_LEAVEWRITE) { + else if (optype == OP_LEAVESUB || + optype == OP_LEAVE || + optype == OP_LEAVESUBLV || + optype == OP_LEAVEWRITE) { if (o->op_private & OPpREFCOUNTED) sv_catpv(tmpsv, ",REFCOUNTED"); } - else if (o->op_type == OP_AASSIGN) { + else if (optype == OP_AASSIGN) { if (o->op_private & OPpASSIGN_COMMON) sv_catpv(tmpsv, ",COMMON"); } - else if (o->op_type == OP_SASSIGN) { + else if (optype == OP_SASSIGN) { if (o->op_private & OPpASSIGN_BACKWARDS) sv_catpv(tmpsv, ",BACKWARDS"); } - else if (o->op_type == OP_TRANS) { + else if (optype == OP_TRANS) { if (o->op_private & OPpTRANS_SQUASH) sv_catpv(tmpsv, ",SQUASH"); if (o->op_private & OPpTRANS_DELETE) @@ -643,20 +807,20 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) if (o->op_private & OPpTRANS_GROWS) sv_catpv(tmpsv, ",GROWS"); } - else if (o->op_type == OP_REPEAT) { + else if (optype == OP_REPEAT) { if (o->op_private & OPpREPEAT_DOLIST) sv_catpv(tmpsv, ",DOLIST"); } - else if (o->op_type == OP_ENTERSUB || - o->op_type == OP_RV2SV || - o->op_type == OP_GVSV || - o->op_type == OP_RV2AV || - o->op_type == OP_RV2HV || - o->op_type == OP_RV2GV || - o->op_type == OP_AELEM || - o->op_type == OP_HELEM ) + else if (optype == OP_ENTERSUB || + optype == OP_RV2SV || + optype == OP_GVSV || + optype == OP_RV2AV || + optype == OP_RV2HV || + optype == OP_RV2GV || + optype == OP_AELEM || + optype == OP_HELEM ) { - if (o->op_type == OP_ENTERSUB) { + if (optype == OP_ENTERSUB) { if (o->op_private & OPpENTERSUB_AMPER) sv_catpv(tmpsv, ",AMPER"); if (o->op_private & OPpENTERSUB_DB) @@ -672,20 +836,20 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) } else { switch (o->op_private & OPpDEREF) { - case OPpDEREF_SV: - sv_catpv(tmpsv, ",SV"); - break; - case OPpDEREF_AV: - sv_catpv(tmpsv, ",AV"); - break; - case OPpDEREF_HV: - sv_catpv(tmpsv, ",HV"); - break; - } + case OPpDEREF_SV: + sv_catpv(tmpsv, ",SV"); + break; + case OPpDEREF_AV: + sv_catpv(tmpsv, ",AV"); + break; + case OPpDEREF_HV: + sv_catpv(tmpsv, ",HV"); + break; + } if (o->op_private & OPpMAYBE_LVSUB) sv_catpv(tmpsv, ",MAYBE_LVSUB"); } - if (o->op_type == OP_AELEM || o->op_type == OP_HELEM) { + if (optype == OP_AELEM || optype == OP_HELEM) { if (o->op_private & OPpLVAL_DEFER) sv_catpv(tmpsv, ",LVAL_DEFER"); } @@ -696,7 +860,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) sv_catpv(tmpsv, ",OUR_INTRO"); } } - else if (o->op_type == OP_CONST) { + else if (optype == OP_CONST) { if (o->op_private & OPpCONST_BARE) sv_catpv(tmpsv, ",BARE"); if (o->op_private & OPpCONST_STRICT) @@ -708,35 +872,35 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) if (o->op_private & OPpCONST_ENTERED) sv_catpv(tmpsv, ",ENTERED"); } - else if (o->op_type == OP_FLIP) { + else if (optype == OP_FLIP) { if (o->op_private & OPpFLIP_LINENUM) sv_catpv(tmpsv, ",LINENUM"); } - else if (o->op_type == OP_FLOP) { + else if (optype == OP_FLOP) { if (o->op_private & OPpFLIP_LINENUM) sv_catpv(tmpsv, ",LINENUM"); } - else if (o->op_type == OP_RV2CV) { + else if (optype == OP_RV2CV) { if (o->op_private & OPpLVAL_INTRO) sv_catpv(tmpsv, ",INTRO"); } - else if (o->op_type == OP_GV) { + else if (optype == OP_GV) { if (o->op_private & OPpEARLY_CV) sv_catpv(tmpsv, ",EARLY_CV"); } - else if (o->op_type == OP_LIST) { + else if (optype == OP_LIST) { if (o->op_private & OPpLIST_GUESSED) sv_catpv(tmpsv, ",GUESSED"); } - else if (o->op_type == OP_DELETE) { + else if (optype == OP_DELETE) { if (o->op_private & OPpSLICE) sv_catpv(tmpsv, ",SLICE"); } - else if (o->op_type == OP_EXISTS) { + else if (optype == OP_EXISTS) { if (o->op_private & OPpEXISTS_SUB) sv_catpv(tmpsv, ",EXISTS_SUB"); } - else if (o->op_type == OP_SORT) { + else if (optype == OP_SORT) { if (o->op_private & OPpSORT_NUMERIC) sv_catpv(tmpsv, ",NUMERIC"); if (o->op_private & OPpSORT_INTEGER) @@ -744,11 +908,11 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) if (o->op_private & OPpSORT_REVERSE) sv_catpv(tmpsv, ",REVERSE"); } - else if (o->op_type == OP_THREADSV) { + else if (optype == OP_THREADSV) { if (o->op_private & OPpDONE_SVREF) sv_catpv(tmpsv, ",SVREF"); } - else if (o->op_type == OP_OPEN || o->op_type == OP_BACKTICK) { + else if (optype == OP_OPEN || optype == OP_BACKTICK) { if (o->op_private & OPpOPEN_IN_RAW) sv_catpv(tmpsv, ",IN_RAW"); if (o->op_private & OPpOPEN_IN_CRLF) @@ -758,17 +922,17 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) if (o->op_private & OPpOPEN_OUT_CRLF) sv_catpv(tmpsv, ",OUT_CRLF"); } - else if (o->op_type == OP_EXIT) { + else if (optype == OP_EXIT) { if (o->op_private & OPpEXIT_VMSISH) sv_catpv(tmpsv, ",EXIT_VMSISH"); if (o->op_private & OPpHUSH_VMSISH) sv_catpv(tmpsv, ",HUSH_VMSISH"); } - else if (o->op_type == OP_DIE) { + else if (optype == OP_DIE) { if (o->op_private & OPpHUSH_VMSISH) sv_catpv(tmpsv, ",HUSH_VMSISH"); } - else if (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) { + else if (PL_check[optype] != MEMBER_TO_FPTR(Perl_ck_ftst)) { if (OP_IS_FILETEST_ACCESS(o) && o->op_private & OPpFT_ACCESS) sv_catpv(tmpsv, ",FT_ACCESS"); if (o->op_private & OPpFT_STACKED) @@ -824,7 +988,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) } #endif - switch (o->op_type) { + switch (optype) { case OP_AELEMFAST: case OP_GVSV: case OP_GV: @@ -863,7 +1027,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) case OP_NEXTSTATE: case OP_DBSTATE: if (CopLINE(cCOPo)) - Perl_dump_indent(aTHX_ level, file, "LINE = %"UVf"\n", + Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n", (UV)CopLINE(cCOPo)); if (CopSTASHPV(cCOPo)) Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n", @@ -875,17 +1039,17 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) case OP_ENTERLOOP: Perl_dump_indent(aTHX_ level, file, "REDO ===> "); if (cLOOPo->op_redoop) - PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_redoop)); + PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop)); else PerlIO_printf(file, "DONE\n"); Perl_dump_indent(aTHX_ level, file, "NEXT ===> "); if (cLOOPo->op_nextop) - PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_nextop)); + PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop)); else PerlIO_printf(file, "DONE\n"); Perl_dump_indent(aTHX_ level, file, "LAST ===> "); if (cLOOPo->op_lastop) - PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_lastop)); + PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop)); else PerlIO_printf(file, "DONE\n"); break; @@ -897,7 +1061,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) case OP_AND: Perl_dump_indent(aTHX_ level, file, "OTHER ===> "); if (cLOGOPo->op_other) - PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOGOPo->op_other)); + PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other)); else PerlIO_printf(file, "DONE\n"); break; @@ -963,6 +1127,7 @@ static const struct { const char type; const char *name; } magic_names[] = { { PERL_MAGIC_sv, "sv(\\0)" }, { PERL_MAGIC_arylen, "arylen(#)" }, { PERL_MAGIC_rhash, "rhash(%)" }, + { PERL_MAGIC_regdata_names, "regdata_names(+)" }, { PERL_MAGIC_pos, "pos(.)" }, { PERL_MAGIC_symtab, "symtab(:)" }, { PERL_MAGIC_backref, "backref(<)" }, @@ -1004,7 +1169,7 @@ static const struct { const char type; const char *name; } magic_names[] = { { PERL_MAGIC_defelem, "defelem(y)" }, { PERL_MAGIC_ext, "ext(~)" }, /* this null string terminates the list */ - { 0, 0 }, + { 0, NULL }, }; void @@ -1015,7 +1180,7 @@ Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 " MAGIC = 0x%"UVxf"\n", PTR2UV(mg)); if (mg->mg_virtual) { const MGVTBL * const v = mg->mg_virtual; - const char *s = NULL; + const char *s; if (v == &PL_vtbl_sv) s = "sv"; else if (v == &PL_vtbl_env) s = "env"; else if (v == &PL_vtbl_envelem) s = "envelem"; @@ -1045,6 +1210,7 @@ Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 else if (v == &PL_vtbl_utf8) s = "utf8"; else if (v == &PL_vtbl_arylen_p) s = "arylen_p"; else if (v == &PL_vtbl_hintselem) s = "hintselem"; + else s = NULL; if (s) Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s); else @@ -1129,7 +1295,7 @@ Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 void Perl_magic_dump(pTHX_ const MAGIC *mg) { - do_magic_dump(0, Perl_debug_log, mg, 0, 0, 0, 0); + do_magic_dump(0, Perl_debug_log, mg, 0, 0, FALSE, 0); } void @@ -1241,15 +1407,19 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo if (HvREHASH(sv)) sv_catpv(d, "REHASH,"); if (flags & SVphv_CLONEABLE) sv_catpv(d, "CLONEABLE,"); break; - case SVt_PVGV: case SVt_PVLV: - if (GvINTRO(sv)) sv_catpv(d, "INTRO,"); - if (GvMULTI(sv)) sv_catpv(d, "MULTI,"); - if (GvUNIQUE(sv)) sv_catpv(d, "UNIQUE,"); - if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,"); - if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,"); + case SVt_PVGV: + case SVt_PVLV: + if (isGV_with_GP(sv)) { + if (GvINTRO(sv)) sv_catpv(d, "INTRO,"); + if (GvMULTI(sv)) sv_catpv(d, "MULTI,"); + if (GvUNIQUE(sv)) sv_catpv(d, "UNIQUE,"); + if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,"); + if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,"); + } if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,"); + if (SvPAD_STATE(sv)) sv_catpv(d, "STATE,"); if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,"); - if (GvIMPORTED(sv)) { + if (isGV_with_GP(sv) && GvIMPORTED(sv)) { sv_catpv(d, "IMPORT"); if (GvIMPORTED(sv) == GVf_IMPORTED) sv_catpv(d, "ALL,"); @@ -1448,7 +1618,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo if (HvARRAY(sv) && HvKEYS(sv)) { /* Show distribution of HEs in the ARRAY */ int freq[200]; -#define FREQ_MAX (sizeof freq / sizeof freq[0] - 1) +#define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1)) int i; int max = 0; U32 pow2 = 2, keys = HvKEYS(sv); @@ -1505,18 +1675,18 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv)); Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv))); { - MAGIC *mg = mg_find(sv, PERL_MAGIC_symtab); + MAGIC * const mg = mg_find(sv, PERL_MAGIC_symtab); if (mg && mg->mg_obj) { Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj)); } } { - const char *hvname = HvNAME_get(sv); + const char * const hvname = HvNAME_get(sv); if (hvname) Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname); } if (SvOOK(sv)) { - AV *backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv); + const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv); if (backrefs) { Perl_dump_indent(aTHX_ level, file, " BACKREFS = 0x%"UVxf"\n", PTR2UV(backrefs)); @@ -1552,8 +1722,12 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo } break; case SVt_PVCV: - if (SvPOK(sv)) - Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%s\"\n", SvPV_nolen_const(sv)); + if (SvPOK(sv)) { + STRLEN len; + const char *const proto = SvPV_const(sv, len); + Perl_dump_indent(aTHX_ level, file, " PROTOTYPE = \"%.*s\"\n", + (int) len, proto); + } /* FALL THROUGH */ case SVt_PVFM: do_hv_dump(level, file, " COMP_STASH", CvSTASH(sv)); @@ -1597,7 +1771,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo do_dump_pad(level+1, file, CvPADLIST(sv), 0); } { - const CV *outside = CvOUTSIDE(sv); + const CV * const outside = CvOUTSIDE(sv); Perl_dump_indent(aTHX_ level, file, " OUTSIDE = 0x%"UVxf" (%s)\n", PTR2UV(outside), (!outside ? "null" @@ -1609,21 +1783,22 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo if (nest < maxnest && (CvCLONE(sv) || CvCLONED(sv))) do_sv_dump(level+1, file, (SV*)CvOUTSIDE(sv), nest+1, maxnest, dumpops, pvlim); break; - case SVt_PVGV: case SVt_PVLV: - if (type == SVt_PVLV) { - Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv)); - Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv)); - Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv)); - Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv))); - if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T') - do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest, - dumpops, pvlim); - } + case SVt_PVGV: + case SVt_PVLV: + if (type == SVt_PVLV) { + Perl_dump_indent(aTHX_ level, file, " TYPE = %c\n", LvTYPE(sv)); + Perl_dump_indent(aTHX_ level, file, " TARGOFF = %"IVdf"\n", (IV)LvTARGOFF(sv)); + Perl_dump_indent(aTHX_ level, file, " TARGLEN = %"IVdf"\n", (IV)LvTARGLEN(sv)); + Perl_dump_indent(aTHX_ level, file, " TARG = 0x%"UVxf"\n", PTR2UV(LvTARG(sv))); + if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T') + do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest, + dumpops, pvlim); + } + if (!isGV_with_GP(sv)) + break; Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv)); Perl_dump_indent(aTHX_ level, file, " NAMELEN = %"IVdf"\n", (IV)GvNAMELEN(sv)); do_hv_dump (level, file, " GvSTASH", GvSTASH(sv)); - if (!isGV_with_GP(sv)) - break; Perl_dump_indent(aTHX_ level, file, " GP = 0x%"UVxf"\n", PTR2UV(GvGP(sv))); if (!GvGP(sv)) break; @@ -1712,7 +1887,7 @@ Perl_runops_debug(pTHX) do { PERL_ASYNC_CHECK(); if (PL_debug) { - if (PL_watchaddr != 0 && *PL_watchaddr != PL_watchok) + if (PL_watchaddr && (*PL_watchaddr != PL_watchok)) PerlIO_printf(Perl_debug_log, "WARNING: %"UVxf" changed from %"UVxf" to %"UVxf"\n", PTR2UV(PL_watchaddr), PTR2UV(PL_watchok), @@ -1752,7 +1927,7 @@ Perl_debop(pTHX_ const OP *o) case OP_GVSV: case OP_GV: if (cGVOPo_gv) { - SV *sv = newSV(0); + SV * const sv = newSV(0); #ifdef PERL_MAD /* FIXME - it this making unwarranted assumptions about the UTF-8 cleanliness of the dump file handle? */ @@ -1770,18 +1945,18 @@ Perl_debop(pTHX_ const OP *o) case OP_PADHV: { /* print the lexical's name */ - CV *cv = deb_curcv(cxstack_ix); + CV * const cv = deb_curcv(cxstack_ix); SV *sv; if (cv) { - AV * const padlist = CvPADLIST(cv); + AV * const padlist = CvPADLIST(cv); AV * const comppad = (AV*)(*av_fetch(padlist, 0, FALSE)); sv = *av_fetch(comppad, o->op_targ, FALSE); } else sv = NULL; if (sv) - PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv)); + PerlIO_printf(Perl_debug_log, "(%s)", SvPV_nolen_const(sv)); else - PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ); + PerlIO_printf(Perl_debug_log, "[%"UVuf"]", (UV)o->op_targ); } break; default: @@ -1795,7 +1970,7 @@ STATIC CV* S_deb_curcv(pTHX_ I32 ix) { dVAR; - const PERL_CONTEXT *cx = &cxstack[ix]; + const PERL_CONTEXT * const cx = &cxstack[ix]; if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) return cx->blk_sub.cv; else if (CxTYPE(cx) == CXt_EVAL && !CxTRYBLOCK(cx)) @@ -2268,7 +2443,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)) { - SV * const tmpsv = pmflags_description(pm); + SV * const tmpsv = pm_description(pm); Perl_xmldump_indent(aTHX_ level, file, "pmflags=\"%s\"\n", SvCUR(tmpsv) ? SvPVX(tmpsv) + 1 : ""); SvREFCNT_dec(tmpsv); } @@ -2318,7 +2493,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) if (o->op_targ == OP_NEXTSTATE) { if (CopLINE(cCOPo)) - PerlIO_printf(file, " line=\"%"UVf"\"", + PerlIO_printf(file, " line=\"%"UVuf"\"", (UV)CopLINE(cCOPo)); if (CopSTASHPV(cCOPo)) PerlIO_printf(file, " package=\"%s\"", @@ -2585,7 +2760,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o) case OP_NEXTSTATE: case OP_DBSTATE: if (CopLINE(cCOPo)) - S_xmldump_attr(aTHX_ level, file, "line=\"%"UVf"\"", + S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"", (UV)CopLINE(cCOPo)); if (CopSTASHPV(cCOPo)) S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",