OP * retop; /* op to execute on exit from sub */
};
+#define CX_SUB_HASARGS_SET(cx, v) ((cx)->blk_sub.hasargs = (v))
+#define CX_SUB_HASARGS_GET(cx) ((cx)->blk_sub.hasargs + 0)
+
+#define CX_SUB_LVAL_SET(cx, v) ((cx)->blk_sub.lval = (v) & \
+ (OPpLVAL_INTRO|OPpENTERSUB_INARGS))
+#define CX_SUB_LVAL(cx) ((cx)->blk_sub.lval + 0)
+#define CX_SUB_LVAL_INARGS(cx) ((cx)->blk_sub.lval & \
+ OPpENTERSUB_INARGS)
+
/* base for the next two macros. Don't use directly.
* Note that the refcnt of the cv is incremented twice; The CX one is
* decremented by LEAVESUB, the other by LEAVE. */
-#define CX_SUB_HASARGS_SET(cx, v) ((cx)->blk_sub.hasargs = (v))
-#define CX_SUB_HASARGS_GET(cx) ((cx)->blk_sub.hasargs + 0)
-
#define PUSHSUB_BASE(cx) \
cx->blk_sub.cv = cv; \
cx->blk_sub.olddepth = CvDEPTH(cv); \
#define PUSHSUB(cx) \
PUSHSUB_BASE(cx) \
- cx->blk_sub.lval = PL_op->op_private & \
- (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
+ CX_SUB_LVAL_SET(cx, PL_op->op_private)
/* variant for use by OP_DBSTATE, where op_private holds hint bits */
#define PUSHSUB_DB(cx) \
PUSHSUB_BASE(cx) \
- cx->blk_sub.lval = 0;
+ CX_SUB_LVAL_SET(cx, 0)
#define PUSHFORMAT(cx) \
const I32 cxix = dopoptosub(cxstack_ix);
assert(cxix >= 0); /* We should only be called from inside subs */
- if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv))
- return cxstack[cxix].blk_sub.lval;
+ if (CX_SUB_LVAL(cxstack + cxix) && CvLVALUE(cxstack[cxix].blk_sub.cv))
+ return CX_SUB_LVAL(cxstack + cxix);
else
return 0;
}
TAINT_NOT;
- if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
+ if (CX_SUB_LVAL_INARGS(cx)) {
/* We are an argument to a function or grep().
* This kind of lvalueness was legal before lvalue
* subroutines too, so be backward compatible:
}
}
}
- else if (cx->blk_sub.lval) { /* Leave it as it is if we can. */
+ else if (CX_SUB_LVAL(cx)) { /* Leave it as it is if we can. */
/* Here we go for robustness, not for speed, so we change all
* the refcounts so the caller gets a live guy. Cannot set
* TEMP, so sv_2mortal is out of question. */
PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
(int)CX_SUB_HASARGS_GET(cx));
PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n",
- (int)cx->blk_sub.lval);
+ (int)CX_SUB_LVAL(cx));
PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
PTR2UV(cx->blk_sub.retop));
break;
ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
CX_SUB_HASARGS_SET(ncx, CX_SUB_HASARGS_GET(cx));
- ncx->blk_sub.lval = cx->blk_sub.lval;
+ CX_SUB_LVAL_SET(ncx, CX_SUB_LVAL(cx));
ncx->blk_sub.retop = cx->blk_sub.retop;
ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
cx->blk_sub.oldcomppad);