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);
void
Perl_dump_all_perl(pTHX_ bool justperl)
{
-
- dVAR;
PerlIO_setlinebuf(Perl_debug_log);
if (PL_main_root)
op_dump(PL_main_root);
void
Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl)
{
- dVAR;
I32 i;
PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL;
void
Perl_dump_eval(pTHX)
{
- dVAR;
op_dump(PL_eval_root);
}
return FALSE;
}
-#define DUMP_OP_FLAGS(o,level,file) \
- if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) { \
- SV * const tmpsv = newSVpvs(""); \
- switch (o->op_flags & OPf_WANT) { \
- case OPf_WANT_VOID: \
- sv_catpv(tmpsv, ",VOID"); \
- break; \
- case OPf_WANT_SCALAR: \
- sv_catpv(tmpsv, ",SCALAR"); \
- break; \
- case OPf_WANT_LIST: \
- sv_catpv(tmpsv, ",LIST"); \
- break; \
- default: \
- sv_catpv(tmpsv, ",UNKNOWN"); \
- break; \
- } \
- append_flags(tmpsv, o->op_flags, op_flags_names); \
- if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED"); \
- if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE"); \
- if (o->op_static) sv_catpvs(tmpsv, ",STATIC"); \
- if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED"); \
- Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", \
- SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : ""); \
- }
-
-#define DUMP_OP_PRIVATE(o,level,file) \
- if (o->op_private) { \
- U32 optype = o->op_type; \
- U32 oppriv = o->op_private; \
- SV * const tmpsv = newSVpvs(""); \
- if (PL_opargs[optype] & OA_TARGLEX) { \
- if (oppriv & OPpTARGET_MY) \
- sv_catpv(tmpsv, ",TARGET_MY"); \
- } \
- 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 (optype == OP_ENTERSUB) { \
- append_flags(tmpsv, oppriv, op_entersub_names); \
- } \
- else { \
- switch (oppriv & 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; \
- } \
- if (oppriv & OPpMAYBE_LVSUB) \
- sv_catpv(tmpsv, ",MAYBE_LVSUB"); \
- } \
- if (optype == OP_AELEM || optype == OP_HELEM) { \
- if (oppriv & OPpLVAL_DEFER) \
- sv_catpv(tmpsv, ",LVAL_DEFER"); \
- } \
- else if (optype == OP_RV2HV || optype == OP_PADHV) { \
- if (oppriv & OPpMAYBE_TRUEBOOL) \
- sv_catpvs(tmpsv, ",OPpMAYBE_TRUEBOOL"); \
- if (oppriv & OPpTRUEBOOL) \
- sv_catpvs(tmpsv, ",OPpTRUEBOOL"); \
- } \
- else { \
- if (oppriv & HINT_STRICT_REFS) \
- sv_catpv(tmpsv, ",STRICT_REFS"); \
- if (oppriv & OPpOUR_INTRO) \
- sv_catpv(tmpsv, ",OUR_INTRO"); \
- } \
- } \
- else if (S_op_private_to_names(aTHX_ tmpsv, optype, oppriv)) { \
- } \
- else if (OP_IS_FILETEST(o->op_type)) { \
- if (oppriv & OPpFT_ACCESS) \
- sv_catpv(tmpsv, ",FT_ACCESS"); \
- if (oppriv & OPpFT_STACKED) \
- sv_catpv(tmpsv, ",FT_STACKED"); \
- if (oppriv & OPpFT_STACKING) \
- sv_catpv(tmpsv, ",FT_STACKING"); \
- if (oppriv & OPpFT_AFTER_t) \
- sv_catpv(tmpsv, ",AFTER_t"); \
- } \
- else if (o->op_type == OP_AASSIGN) { \
- if (oppriv & OPpASSIGN_COMMON) \
- sv_catpvs(tmpsv, ",COMMON"); \
- if (oppriv & OPpMAYBE_LVSUB) \
- sv_catpvs(tmpsv, ",MAYBE_LVSUB"); \
- } \
- if (o->op_flags & OPf_MOD && oppriv & OPpLVAL_INTRO) \
- sv_catpv(tmpsv, ",INTRO"); \
- if (o->op_type == OP_PADRANGE) \
- Perl_sv_catpvf(aTHX_ tmpsv, ",COUNT=%"UVuf, \
- (UV)(oppriv & OPpPADRANGE_COUNTMASK)); \
- if ( (o->op_type == OP_RV2HV || o->op_type == OP_RV2AV || \
- o->op_type == OP_PADAV || o->op_type == OP_PADHV || \
- o->op_type == OP_ASLICE || o->op_type == OP_HSLICE) \
- && oppriv & OPpSLICEWARNING ) \
- sv_catpvs(tmpsv, ",SLICEWARNING"); \
- if (SvCUR(tmpsv)) { \
- Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1); \
- } else \
- Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n", \
- (UV)oppriv); \
- }
-
void
Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
{
- dVAR;
UV seq;
const OPCODE optype = o->op_type;
Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
#endif
- DUMP_OP_FLAGS(o,level,file);
- DUMP_OP_PRIVATE(o,level,file);
+ if (o->op_flags || o->op_slabbed || o->op_savefree || o->op_static) {
+ SV * const tmpsv = newSVpvs("");
+ switch (o->op_flags & OPf_WANT) {
+ case OPf_WANT_VOID:
+ sv_catpv(tmpsv, ",VOID");
+ break;
+ case OPf_WANT_SCALAR:
+ sv_catpv(tmpsv, ",SCALAR");
+ break;
+ case OPf_WANT_LIST:
+ sv_catpv(tmpsv, ",LIST");
+ break;
+ default:
+ sv_catpv(tmpsv, ",UNKNOWN");
+ break;
+ }
+ append_flags(tmpsv, o->op_flags, op_flags_names);
+ if (o->op_slabbed) sv_catpvs(tmpsv, ",SLABBED");
+ if (o->op_savefree) sv_catpvs(tmpsv, ",SAVEFREE");
+ if (o->op_static) sv_catpvs(tmpsv, ",STATIC");
+ if (o->op_folded) sv_catpvs(tmpsv, ",FOLDED");
+ if (o->op_lastsib) sv_catpvs(tmpsv, ",LASTSIB");
+ Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n",
+ SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
+ }
+
+ if (o->op_private) {
+ U32 optype = o->op_type;
+ U32 oppriv = o->op_private;
+ SV * const tmpsv = newSVpvs("");
+ if (PL_opargs[optype] & OA_TARGLEX) {
+ if (oppriv & OPpTARGET_MY)
+ sv_catpv(tmpsv, ",TARGET_MY");
+ }
+ 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 (optype == OP_ENTERSUB) {
+ append_flags(tmpsv, oppriv, op_entersub_names);
+ }
+ else {
+ switch (oppriv & 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;
+ }
+ if (oppriv & OPpMAYBE_LVSUB)
+ sv_catpv(tmpsv, ",MAYBE_LVSUB");
+ }
+ if (optype == OP_AELEM || optype == OP_HELEM) {
+ if (oppriv & OPpLVAL_DEFER)
+ sv_catpv(tmpsv, ",LVAL_DEFER");
+ }
+ else if (optype == OP_RV2HV || optype == OP_PADHV) {
+ if (oppriv & OPpMAYBE_TRUEBOOL)
+ sv_catpvs(tmpsv, ",OPpMAYBE_TRUEBOOL");
+ if (oppriv & OPpTRUEBOOL)
+ sv_catpvs(tmpsv, ",OPpTRUEBOOL");
+ }
+ else {
+ if (oppriv & HINT_STRICT_REFS)
+ sv_catpv(tmpsv, ",STRICT_REFS");
+ if (oppriv & OPpOUR_INTRO)
+ sv_catpv(tmpsv, ",OUR_INTRO");
+ }
+ }
+ else if (S_op_private_to_names(aTHX_ tmpsv, optype, oppriv)) {
+ }
+ else if (OP_IS_FILETEST(o->op_type)) {
+ if (oppriv & OPpFT_ACCESS)
+ sv_catpv(tmpsv, ",FT_ACCESS");
+ if (oppriv & OPpFT_STACKED)
+ sv_catpv(tmpsv, ",FT_STACKED");
+ if (oppriv & OPpFT_STACKING)
+ sv_catpv(tmpsv, ",FT_STACKING");
+ if (oppriv & OPpFT_AFTER_t)
+ sv_catpv(tmpsv, ",AFTER_t");
+ }
+ else if (o->op_type == OP_AASSIGN) {
+ if (oppriv & OPpASSIGN_COMMON)
+ sv_catpvs(tmpsv, ",COMMON");
+ if (oppriv & OPpMAYBE_LVSUB)
+ sv_catpvs(tmpsv, ",MAYBE_LVSUB");
+ }
+ if (o->op_flags & OPf_MOD && oppriv & OPpLVAL_INTRO)
+ sv_catpv(tmpsv, ",INTRO");
+ if (o->op_type == OP_PADRANGE)
+ Perl_sv_catpvf(aTHX_ tmpsv, ",COUNT=%"UVuf,
+ (UV)(oppriv & OPpPADRANGE_COUNTMASK));
+ if ( (o->op_type == OP_RV2HV || o->op_type == OP_RV2AV ||
+ o->op_type == OP_PADAV || o->op_type == OP_PADHV ||
+ o->op_type == OP_ASLICE || o->op_type == OP_HSLICE)
+ && oppriv & OPpSLICEWARNING )
+ sv_catpvs(tmpsv, ",SLICEWARNING");
+ if (SvCUR(tmpsv)) {
+ Perl_dump_indent(aTHX_ level, file, "PRIVATE = (%s)\n", SvPVX_const(tmpsv) + 1);
+ } else
+ Perl_dump_indent(aTHX_ level, file, "PRIVATE = (0x%"UVxf")\n",
+ (UV)oppriv);
+ }
+
+
switch (optype) {
}
if (o->op_flags & OPf_KIDS) {
OP *kid;
- for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
+ for (kid = cUNOPo->op_first; kid; kid = OP_SIBLING(kid))
do_op_dump(level, file, kid);
}
Perl_dump_indent(aTHX_ level-1, file, "}\n");
void
Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
{
- dVAR;
SV *d;
const char *s;
U32 flags;
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)));
Perl_dump_indent(aTHX_ level, file, " FLAGS = %"IVdf"\n", (IV)LvFLAGS(sv));
- if (LvTYPE(sv) != 't' && LvTYPE(sv) != 'T')
+ if (isALPHA_FOLD_NE(LvTYPE(sv), 't'))
do_sv_dump(level+1, file, LvTARG(sv), nest+1, maxnest,
dumpops, pvlim);
}
void
Perl_sv_dump(pTHX_ SV *sv)
{
- dVAR;
-
PERL_ARGS_ASSERT_SV_DUMP;
if (SvROK(sv))
int
Perl_runops_debug(pTHX)
{
- dVAR;
if (!PL_op) {
Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "NULL OP IN RUN");
return 0;
I32
Perl_debop(pTHX_ const OP *o)
{
- dVAR;
int count;
PERL_ARGS_ASSERT_DEBOP;
STATIC CV*
S_deb_curcv(pTHX_ const I32 ix)
{
- dVAR;
const PERL_CONTEXT * const cx = &cxstack[ix];
if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
return cx->blk_sub.cv;
void
Perl_watch(pTHX_ char **addr)
{
- dVAR;
-
PERL_ARGS_ASSERT_WATCH;
PL_watchaddr = addr;
STATIC void
S_debprof(pTHX_ const OP *o)
{
- dVAR;
-
PERL_ARGS_ASSERT_DEBPROF;
if (!DEBUG_J_TEST_ && CopSTASH_eq(PL_curcop, PL_debstash))
void
Perl_debprofdump(pTHX)
{
- dVAR;
unsigned i;
if (!PL_profiledata)
return;