/* 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.
/*
-=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
if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) {
/* This won't alter the UTF-8 flag */
- sv_setpvn(dsv, "", 0);
+ sv_setpvs(dsv, "");
}
if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
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 ellipses.
if (!(flags & PERL_PV_PRETTY_NOCLEAR)) {
/* This won't alter the UTF-8 flag */
- sv_setpvn(dsv, "", 0);
+ sv_setpvs(dsv, "");
}
if ( dq == '"' )
- sv_catpvn(dsv, "\"", 1);
+ sv_catpvs(dsv, "\"");
else if ( flags & PERL_PV_PRETTY_LTGT )
- sv_catpvn(dsv, "<", 1);
+ 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_ELLIPSES) && ( escaped < count ) )
- sv_catpvn( dsv, "...", 3 );
+ sv_catpvs(dsv, "...");
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);
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);
}
int unref = 0;
U32 type;
- sv_setpvn(t, "", 0);
+ sv_setpvs(t, "");
retry:
if (!sv) {
sv_catpv(t, "VOID");
#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, "'=");
return;
}
if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
- && type != SVt_PVCV && !isGV_with_GP(sv))
+ && type != SVt_PVCV && !isGV_with_GP(sv) && type != SVt_PVFM)
|| (type == SVt_IV && !SvROK(sv))) {
if (SvIsUV(sv)
#ifdef PERL_OLD_COPY_ON_WRITE
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)) {
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)
Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
}
if (SvOOK(sv)) {
- const AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ (HV*)sv);
+ const 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));
}
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);
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)));
}
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)
switch (o->op_type) {
case OP_CONST:
case OP_HINTSEVAL:
- PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo_sv));
+ /* 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:
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;
PERL_ARGS_ASSERT_SV_CATXMLPVN;
- sv_catpvn(dsv,"",0);
+ sv_catpvs(dsv,"");
dsvcur = SvCUR(dsv); /* in case we have to restart */
retry:
PERL_ARGS_ASSERT_SV_XMLPEEK;
sv_utf8_upgrade(t);
- sv_setpvn(t, "", 0);
+ sv_setpvs(t, "");
/* retry: */
if (!sv) {
sv_catpv(t, "VOID=\"\"");
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");
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");
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. */