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),
sort_flags);
/* Reset cx, in case the context stack has been reallocated. */
- cx = &cxstack[cxstack_ix];
+ cx = CX_CUR();
PL_stack_sp = PL_stack_base + cx->blk_oldsp;
+ CX_LEAVE_SCOPE(cx);
if (!(flags & OPf_SPECIAL)) {
assert(CxTYPE(cx) == CXt_SUB);
- POPSUB(cx);
+ CX_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,PL_curpm);
- cxstack_ix--;
+ CX_POPBLOCK(cx);
+ CX_POP(cx);
POPSTACK;
CATCH_SET(oldcatch);
}
S_sortcv(pTHX_ SV *const a, SV *const b)
{
const I32 oldsaveix = PL_savestack_ix;
- const I32 oldscopeix = PL_scopestack_ix;
I32 result;
PMOP * const pm = PL_curpm;
COP * const cop = PL_curcop;
assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef);
result = SvIV(*PL_stack_sp);
- while (PL_scopestack_ix > oldscopeix) {
- LEAVE;
- }
- leave_scope(oldsaveix);
+ LEAVE_SCOPE(oldsaveix);
PL_curpm = pm;
return result;
}
S_sortcv_stacked(pTHX_ SV *const a, SV *const b)
{
const I32 oldsaveix = PL_savestack_ix;
- const I32 oldscopeix = PL_scopestack_ix;
I32 result;
AV * const av = GvAV(PL_defgv);
PMOP * const pm = PL_curpm;
assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef);
result = SvIV(*PL_stack_sp);
- while (PL_scopestack_ix > oldscopeix) {
- LEAVE;
- }
- leave_scope(oldsaveix);
+ LEAVE_SCOPE(oldsaveix);
PL_curpm = pm;
return result;
}
{
dSP;
const I32 oldsaveix = PL_savestack_ix;
- const I32 oldscopeix = PL_scopestack_ix;
CV * const cv=MUTABLE_CV(PL_sortcop);
I32 result;
PMOP * const pm = PL_curpm;
assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef);
result = SvIV(*PL_stack_sp);
- while (PL_scopestack_ix > oldscopeix) {
- LEAVE;
- }
- leave_scope(oldsaveix);
+ LEAVE_SCOPE(oldsaveix);
PL_curpm = pm;
return result;
}