chsize = 1;
break;
default:
- if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) )
+ if ( (pv+readsize < end) && isDIGIT((U8)*(pv+readsize)) )
chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE,
"%c%03o", esc, c);
else
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_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 ellipses.
Returns a pointer to the prettified text as held by dsv.
-
+
=cut
*/
*/
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_pos, "pos(.)" },
- { PERL_MAGIC_symtab, "symtab(:)" },
- { PERL_MAGIC_backref, "backref(<)" },
- { PERL_MAGIC_arylen_p, "arylen_p(@)" },
- { PERL_MAGIC_overload, "overload(A)" },
- { PERL_MAGIC_bm, "bm(B)" },
- { PERL_MAGIC_regdata, "regdata(D)" },
- { PERL_MAGIC_env, "env(E)" },
- { PERL_MAGIC_hints, "hints(H)" },
- { PERL_MAGIC_isa, "isa(I)" },
- { PERL_MAGIC_dbfile, "dbfile(L)" },
- { PERL_MAGIC_shared, "shared(N)" },
- { PERL_MAGIC_tied, "tied(P)" },
- { PERL_MAGIC_sig, "sig(S)" },
- { PERL_MAGIC_uvar, "uvar(U)" },
- { PERL_MAGIC_checkcall, "checkcall(])" },
- { PERL_MAGIC_overload_elem, "overload_elem(a)" },
- { PERL_MAGIC_overload_table, "overload_table(c)" },
- { PERL_MAGIC_regdatum, "regdatum(d)" },
- { PERL_MAGIC_envelem, "envelem(e)" },
- { PERL_MAGIC_fm, "fm(f)" },
- { PERL_MAGIC_regex_global, "regex_global(g)" },
- { PERL_MAGIC_hintselem, "hintselem(h)" },
- { PERL_MAGIC_isaelem, "isaelem(i)" },
- { PERL_MAGIC_nkeys, "nkeys(k)" },
- { PERL_MAGIC_dbline, "dbline(l)" },
- { PERL_MAGIC_shared_scalar, "shared_scalar(n)" },
- { PERL_MAGIC_collxfrm, "collxfrm(o)" },
- { PERL_MAGIC_tiedelem, "tiedelem(p)" },
- { PERL_MAGIC_tiedscalar, "tiedscalar(q)" },
- { PERL_MAGIC_qr, "qr(r)" },
- { PERL_MAGIC_sigelem, "sigelem(s)" },
- { PERL_MAGIC_taint, "taint(t)" },
- { PERL_MAGIC_uvar_elem, "uvar_elem(u)" },
- { PERL_MAGIC_vec, "vec(v)" },
- { PERL_MAGIC_vstring, "vstring(V)" },
- { PERL_MAGIC_utf8, "utf8(w)" },
- { PERL_MAGIC_substr, "substr(x)" },
- { PERL_MAGIC_defelem, "defelem(y)" },
- { PERL_MAGIC_ext, "ext(~)" },
+#include "mg_names.c"
/* this null string terminates the list */
{ 0, NULL },
};
" MAGIC = 0x%"UVxf"\n", PTR2UV(mg));
if (mg->mg_virtual) {
const MGVTBL * const v = mg->mg_virtual;
- 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";
- else if (v == &PL_vtbl_sig) s = "sig";
- else if (v == &PL_vtbl_sigelem) s = "sigelem";
- else if (v == &PL_vtbl_pack) s = "pack";
- else if (v == &PL_vtbl_packelem) s = "packelem";
- else if (v == &PL_vtbl_dbline) s = "dbline";
- else if (v == &PL_vtbl_isa) s = "isa";
- else if (v == &PL_vtbl_arylen) s = "arylen";
- else if (v == &PL_vtbl_mglob) s = "mglob";
- else if (v == &PL_vtbl_nkeys) s = "nkeys";
- else if (v == &PL_vtbl_taint) s = "taint";
- else if (v == &PL_vtbl_substr) s = "substr";
- else if (v == &PL_vtbl_vec) s = "vec";
- else if (v == &PL_vtbl_pos) s = "pos";
- else if (v == &PL_vtbl_bm) s = "bm";
- else if (v == &PL_vtbl_fm) s = "fm";
- else if (v == &PL_vtbl_uvar) s = "uvar";
- else if (v == &PL_vtbl_defelem) s = "defelem";
-#ifdef USE_LOCALE_COLLATE
- else if (v == &PL_vtbl_collxfrm) s = "collxfrm";
-#endif
- else if (v == &PL_vtbl_amagic) s = "amagic";
- else if (v == &PL_vtbl_amagicelem) s = "amagicelem";
- else if (v == &PL_vtbl_backref) s = "backref";
- 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 if (v == &PL_vtbl_hints) s = "hints";
- else s = NULL;
- if (s)
- Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", s);
+ if (v >= PL_magic_vtables
+ && v < PL_magic_vtables + magic_vtable_max) {
+ const U32 i = v - PL_magic_vtables;
+ Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = &PL_vtbl_%s\n", PL_magic_vtable_names[i]);
+ }
else
Perl_dump_indent(aTHX_ level, file, " MG_VIRTUAL = 0x%"UVxf"\n", PTR2UV(v));
}
{GVf_IMPORTED_CV, " CV"},
};
+const struct flag_to_name regexp_flags_names[] = {
+ {RXf_PMf_MULTILINE, "PMf_MULTILINE,"},
+ {RXf_PMf_SINGLELINE, "PMf_SINGLELINE,"},
+ {RXf_PMf_FOLD, "PMf_FOLD,"},
+ {RXf_PMf_EXTENDED, "PMf_EXTENDED,"},
+ {RXf_PMf_KEEPCOPY, "PMf_KEEPCOPY,"},
+ {RXf_ANCH_BOL, "ANCH_BOL,"},
+ {RXf_ANCH_MBOL, "ANCH_MBOL,"},
+ {RXf_ANCH_SBOL, "ANCH_SBOL,"},
+ {RXf_ANCH_GPOS, "ANCH_GPOS,"},
+ {RXf_GPOS_SEEN, "GPOS_SEEN,"},
+ {RXf_GPOS_FLOAT, "GPOS_FLOAT,"},
+ {RXf_LOOKBEHIND_SEEN, "LOOKBEHIND_SEEN,"},
+ {RXf_EVAL_SEEN, "EVAL_SEEN,"},
+ {RXf_CANY_SEEN, "CANY_SEEN,"},
+ {RXf_NOSCAN, "NOSCAN,"},
+ {RXf_CHECK_ALL, "CHECK_ALL,"},
+ {RXf_MATCH_UTF8, "MATCH_UTF8,"},
+ {RXf_USE_INTUIT_NOML, "USE_INTUIT_NOML,"},
+ {RXf_USE_INTUIT_ML, "USE_INTUIT_ML,"},
+ {RXf_INTUIT_TAIL, "INTUIT_TAIL,"},
+ {RXf_SPLIT, "SPLIT,"},
+ {RXf_COPY_DONE, "COPY_DONE,"},
+ {RXf_TAINTED_SEEN, "TAINTED_SEEN,"},
+ {RXf_TAINTED, "TAINTED,"},
+ {RXf_START_ONLY, "START_ONLY,"},
+ {RXf_SKIPWHITE, "SKIPWHITE,"},
+ {RXf_WHITE, "WHITE,"},
+ {RXf_NULL, "NULL,"},
+};
+
void
Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
{
(int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
(int)(PL_dumpindent*level), "");
- if (!(flags & SVpad_NAME && (type == SVt_PVMG || type == SVt_PVNV))) {
+ if (!((flags & SVpad_NAME) == SVpad_NAME
+ && (type == SVt_PVMG || type == SVt_PVNV))) {
if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,");
}
- if (!(flags & SVpad_NAME && type == SVt_PVMG)) {
+ if (!((flags & SVpad_NAME) == SVpad_NAME && type == SVt_PVMG)) {
if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
if (flags & SVs_PADMY) sv_catpv(d, "PADMY,");
}
case SVt_PVCV:
case SVt_PVFM:
append_flags(d, CvFLAGS(sv), cv_flags_names);
- if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
break;
case SVt_PVHV:
append_flags(d, flags, hv_flags_names);
sv_catpv(d, " ),");
}
}
- if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
- if (SvVALID(sv)) sv_catpv(d, "VALID,");
/* FALL THROUGH */
default:
evaled_or_uv:
if (SvIsUV(sv) && !(flags & SVf_ROK)) sv_catpv(d, "IsUV,");
break;
case SVt_PVMG:
+ if (SvTAIL(sv)) sv_catpv(d, "TAIL,");
+ if (SvVALID(sv)) sv_catpv(d, "VALID,");
if (SvPAD_TYPED(sv)) sv_catpv(d, "TYPED,");
if (SvPAD_OUR(sv)) sv_catpv(d, "OUR,");
/* FALL THROUGH */
/* Dump general SV fields */
if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV
- && type != SVt_PVCV && !isGV_with_GP(sv) && type != SVt_PVFM
- && type != SVt_PVIO && type != SVt_REGEXP)
+ && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO
+ && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv))
|| (type == SVt_IV && !SvROK(sv))) {
if (SvIsUV(sv)
#ifdef PERL_OLD_COPY_ON_WRITE
PerlIO_putc(file, '\n');
}
- if ((type == SVt_PVNV || type == SVt_PVMG) && SvFLAGS(sv) & SVpad_NAME) {
+ if ((type == SVt_PVNV || type == SVt_PVMG)
+ && (SvFLAGS(sv) & SVpad_NAME) == SVpad_NAME) {
Perl_dump_indent(aTHX_ level, file, " COP_LOW = %"UVuf"\n",
(UV) COP_SEQ_RANGE_LOW(sv));
Perl_dump_indent(aTHX_ level, file, " COP_HIGH = %"UVuf"\n",
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);
}
if (SvSTASH(sv))
do_hv_dump(level, file, " STASH", SvSTASH(sv));
+
+ if ((type == SVt_PVMG || type == SVt_PVLV) && SvVALID(sv)) {
+ Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
+ Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
+ Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
+ }
}
/* Dump type-specific SV fields */
break;
case SVt_PVHV:
Perl_dump_indent(aTHX_ level, file, " ARRAY = 0x%"UVxf, PTR2UV(HvARRAY(sv)));
- if (HvARRAY(sv) && HvKEYS(sv)) {
+ if (HvARRAY(sv) && HvUSEDKEYS(sv)) {
/* Show distribution of HEs in the ARRAY */
int freq[200];
#define FREQ_MAX ((int)(sizeof freq / sizeof freq[0] - 1))
int i;
int max = 0;
- U32 pow2 = 2, keys = HvKEYS(sv);
+ U32 pow2 = 2, keys = HvUSEDKEYS(sv);
NV theoret, sum = 0;
PerlIO_printf(file, " (");
}
while ((keys = keys >> 1))
pow2 = pow2 << 1;
- theoret = HvKEYS(sv);
+ theoret = HvUSEDKEYS(sv);
theoret += theoret * (theoret-1)/pow2;
PerlIO_putc(file, '\n');
Perl_dump_indent(aTHX_ level, file, " hash quality = %.1"NVff"%%", theoret/sum*100);
}
PerlIO_putc(file, '\n');
- Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
+ Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvUSEDKEYS(sv));
Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
}
}
if (nest < maxnest) {
- if (HvEITER_get(sv)) /* preserve iterator */
- Perl_dump_indent(aTHX_ level, file,
- " (*** Active iterator; skipping element dump ***)\n");
- else {
- HE *he;
- HV * const hv = MUTABLE_HV(sv);
- int count = maxnest - nest;
+ HV * const hv = MUTABLE_HV(sv);
+ STRLEN i;
+ HE *he;
- hv_iterinit(hv);
- while ((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
- && count--) {
- STRLEN len;
- const U32 hash = HeHASH(he);
- SV * const keysv = hv_iterkeysv(he);
- const char * const keypv = SvPV_const(keysv, len);
- SV * const elt = hv_iterval(hv, he);
-
- 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, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
- if (HeKREHASH(he))
- PerlIO_printf(file, "[REHASH] ");
- PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV)hash);
- do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
+ if (HvARRAY(hv)) {
+ int count = maxnest - nest;
+ for (i=0; i <= HvMAX(hv); i++) {
+ for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) {
+ U32 hash;
+ SV * keysv;
+ const char * keypv;
+ SV * elt;
+ STRLEN len;
+
+ if (count-- <= 0) goto DONEHV;
+
+ hash = HeHASH(he);
+ keysv = hv_iterkeysv(he);
+ keypv = SvPV_const(keysv, len);
+ elt = HeVAL(he);
+
+ 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, 6 * SvCUR(keysv), UNI_DISPLAY_QQ));
+ if (HvEITER_get(hv) == he)
+ PerlIO_printf(file, "[CURRENT] ");
+ if (HeKREHASH(he))
+ PerlIO_printf(file, "[REHASH] ");
+ PerlIO_printf(file, "HASH = 0x%"UVxf"\n", (UV) hash);
+ do_sv_dump(level+1, file, elt, nest+1, maxnest, dumpops, pvlim);
+ }
}
- hv_iterinit(hv); /* Return to status quo */
+ DONEHV:;
}
}
break;
do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
dumpops, pvlim);
}
- if (SvVALID(sv)) {
- Perl_dump_indent(aTHX_ level, file, " FLAGS = %u\n", (U8)BmFLAGS(sv));
- Perl_dump_indent(aTHX_ level, file, " RARE = %u\n", (U8)BmRARE(sv));
- Perl_dump_indent(aTHX_ level, file, " PREVIOUS = %"UVuf"\n", (UV)BmPREVIOUS(sv));
- Perl_dump_indent(aTHX_ level, file, " USEFUL = %"IVdf"\n", (IV)BmUSEFUL(sv));
- }
if (!isGV_with_GP(sv))
break;
Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", GvNAME(sv));
Perl_dump_indent(aTHX_ level, file, " TYPE = '\\%o'\n", IoTYPE(sv));
Perl_dump_indent(aTHX_ level, file, " FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
break;
+ case SVt_REGEXP:
+ {
+ struct regexp * const r = (struct regexp *)SvANY(sv);
+ flags = RX_EXTFLAGS((REGEXP*)sv);
+ sv_setpv(d,"");
+ append_flags(d, flags, regexp_flags_names);
+ if (*(SvEND(d) - 1) == ',') {
+ SvCUR_set(d, SvCUR(d) - 1);
+ SvPVX(d)[SvCUR(d)] = '\0';
+ }
+ Perl_dump_indent(aTHX_ level, file, " EXTFLAGS = 0x%"UVxf" (%s)\n",
+ (UV)flags, SvPVX_const(d));
+ Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%"UVxf"\n",
+ (UV)(r->intflags));
+ Perl_dump_indent(aTHX_ level, file, " NPARENS = %"UVuf"\n",
+ (UV)(r->nparens));
+ Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %"UVuf"\n",
+ (UV)(r->lastparen));
+ Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %"UVuf"\n",
+ (UV)(r->lastcloseparen));
+ Perl_dump_indent(aTHX_ level, file, " MINLEN = %"IVdf"\n",
+ (IV)(r->minlen));
+ Perl_dump_indent(aTHX_ level, file, " MINLENRET = %"IVdf"\n",
+ (IV)(r->minlenret));
+ Perl_dump_indent(aTHX_ level, file, " GOFS = %"UVuf"\n",
+ (UV)(r->gofs));
+ Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %"UVuf"\n",
+ (UV)(r->pre_prefix));
+ Perl_dump_indent(aTHX_ level, file, " SEEN_EVALS = %"UVuf"\n",
+ (UV)(r->seen_evals));
+ Perl_dump_indent(aTHX_ level, file, " SUBLEN = %"IVdf"\n",
+ (IV)(r->sublen));
+ if (r->subbeg)
+ Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%"UVxf" %s\n",
+ PTR2UV(r->subbeg),
+ pv_display(d, r->subbeg, r->sublen, 50, pvlim));
+ else
+ Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n");
+ Perl_dump_indent(aTHX_ level, file, " ENGINE = 0x%"UVxf"\n",
+ PTR2UV(r->engine));
+ Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%"UVxf"\n",
+ PTR2UV(r->mother_re));
+ Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%"UVxf"\n",
+ PTR2UV(r->paren_names));
+ Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%"UVxf"\n",
+ PTR2UV(r->substrs));
+ Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%"UVxf"\n",
+ PTR2UV(r->pprivate));
+ Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%"UVxf"\n",
+ PTR2UV(r->offs));
+#ifdef PERL_OLD_COPY_ON_WRITE
+ Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%"UVxf"\n",
+ PTR2UV(r->saved_copy));
+#endif
+ }
+ break;
}
SvREFCNT_dec(d);
}