summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cop.h16
-rw-r--r--pp_ctl.c3
-rw-r--r--pp_hot.c3
-rw-r--r--pp_sort.c2
4 files changed, 11 insertions, 13 deletions
diff --git a/cop.h b/cop.h
index 7934484724..268c24fdcc 100644
--- a/cop.h
+++ b/cop.h
@@ -595,7 +595,7 @@ struct block_format {
* The context frame holds a reference to the CV so that it can't be
* freed while we're executing it */
-#define PUSHSUB_BASE(cx, cv, hasargs) \
+#define PUSHSUB_BASE(cx, cv, op, hasargs) \
ENTRY_PROBE(CvNAMED(cv) \
? HEK_KEY(CvNAME_HEK(cv)) \
: GvENAME(CvGV(cv)), \
@@ -607,7 +607,7 @@ struct block_format {
cx->blk_sub.olddepth = CvDEPTH(cv); \
cx->blk_sub.prevcomppad = PL_comppad; \
cx->cx_type |= (hasargs) ? CXp_HASARGS : 0; \
- cx->blk_sub.retop = NULL; \
+ cx->blk_sub.retop = op; \
SvREFCNT_inc_simple_void_NN(cv);
#define PUSHSUB_GET_LVALUE_MASK(func) \
@@ -620,17 +620,17 @@ struct block_format {
? 0 : (U8)func(aTHX) \
)
-#define PUSHSUB(cx, cv, hasargs) \
+#define PUSHSUB(cx, cv, op, hasargs) \
{ \
U8 phlags = PUSHSUB_GET_LVALUE_MASK(Perl_was_lvalue_sub); \
- PUSHSUB_BASE(cx, cv, hasargs) \
+ PUSHSUB_BASE(cx, cv, op, hasargs) \
cx->blk_u16 = PL_op->op_private & \
(phlags|OPpDEREF); \
}
/* variant for use by OP_DBSTATE, where op_private holds hint bits */
-#define PUSHSUB_DB(cx, cv, hasargs) \
- PUSHSUB_BASE(cx, cv, hasargs) \
+#define PUSHSUB_DB(cx, cv, op, hasargs) \
+ PUSHSUB_BASE(cx, cv, op, hasargs) \
cx->blk_u16 = 0;
@@ -1345,7 +1345,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
PUSHSTACKi(PERLSI_MULTICALL); \
PUSHBLOCK(cx, (CXt_SUB|CXp_MULTICALL|flags), gimme, \
PL_stack_sp, PL_savestack_ix); \
- PUSHSUB(cx, cv, hasargs); \
+ PUSHSUB(cx, cv, NULL, hasargs); \
SAVEOP(); \
saveix_floor = PL_savestack_ix; \
if (!(flags & CXp_SUB_RE_FAKE)) \
@@ -1394,7 +1394,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
assert(CxMULTICALL(cx)); \
CX_POPSUB_COMMON(cx); \
cx->cx_type = (CXt_SUB|CXp_MULTICALL|flags); \
- PUSHSUB(cx, cv, hasargs); \
+ PUSHSUB(cx, cv, NULL, hasargs); \
if (!(flags & CXp_SUB_RE_FAKE)) \
CvDEPTH(cv)++; \
if (CvDEPTH(cv) >= 2) \
diff --git a/pp_ctl.c b/pp_ctl.c
index b1452cd604..16d5e11677 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2014,8 +2014,7 @@ PP(pp_dbstate)
}
else {
PUSHBLOCK(cx, CXt_SUB, gimme, SP, PL_savestack_ix);
- PUSHSUB_DB(cx, cv, 0);
- cx->blk_sub.retop = PL_op->op_next;
+ PUSHSUB_DB(cx, cv, PL_op->op_next, 0);
SAVEI32(PL_debug);
PL_debug = 0;
diff --git a/pp_hot.c b/pp_hot.c
index 5e54622251..825cf3f998 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3854,8 +3854,7 @@ PP(pp_entersub)
gimme = GIMME_V;
PUSHBLOCK(cx, CXt_SUB, gimme, MARK, old_savestack_ix);
hasargs = cBOOL(PL_op->op_flags & OPf_STACKED);
- PUSHSUB(cx, cv, hasargs);
- cx->blk_sub.retop = PL_op->op_next;
+ PUSHSUB(cx, cv, PL_op->op_next, hasargs);
padlist = CvPADLIST(cv);
if (UNLIKELY((depth = ++CvDEPTH(cv)) >= 2))
diff --git a/pp_sort.c b/pp_sort.c
index 2b1147ffc9..5f7ae22903 100644
--- a/pp_sort.c
+++ b/pp_sort.c
@@ -1671,7 +1671,7 @@ PP(pp_sort)
PUSHBLOCK(cx, CXt_NULL, gimme, PL_stack_base, old_savestack_ix);
if (!(flags & OPf_SPECIAL)) {
cx->cx_type = CXt_SUB|CXp_MULTICALL;
- PUSHSUB(cx, cv, hasargs);
+ PUSHSUB(cx, cv, NULL, hasargs);
if (!is_xsub) {
PADLIST * const padlist = CvPADLIST(cv);