gimme = G_SCALAR;
PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
if (!(flags & OPf_SPECIAL)) {
- cx->cx_type = CXt_SUB;
+ cx->cx_type = CXt_SUB|CXp_MULTICALL;
PUSHSUB(cx);
if (!is_xsub) {
PADLIST * const padlist = CvPADLIST(cv);
}
}
- else {
- /* mimic PUSHSUB. Note that we're cheating and using a
- * CXt_NULL block as a CXt_SUB block */
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor;
- PL_tmps_floor = PL_tmps_ix;
- }
- cx->cx_u.cx_blk.blku_old_savestack_ix = old_savestack_ix;
+ cx->blk_oldsaveix = old_savestack_ix;
- cx->cx_type |= CXp_MULTICALL;
-
start = p1 - max;
sortsvp(aTHX_ start, max,
(is_xsub ? S_sortcv_xsub : hasargs ? S_sortcv_stacked : S_sortcv),
PL_stack_sp = PL_stack_base + cx->blk_oldsp;
+ CX_LEAVE_SCOPE(cx);
if (!(flags & OPf_SPECIAL)) {
assert(CxTYPE(cx) == CXt_SUB);
POPSUB(cx);
}
else
assert(CxTYPE(cx) == CXt_NULL);
- /* mimic POPSUB */
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;
+ /* there isn't a POPNULL ! */
POPBLOCK(cx);
- cxstack_ix--;
+ CX_POP(cx);
POPSTACK;
CATCH_SET(oldcatch);
}