/* PL_tainted must be correctly set for this mg_set */
SvSETMAGIC(TARG);
TAINT_NOT;
- LEAVE_SCOPE(cx->sb_oldsave);
+ CX_LEAVE_SCOPE(cx);
POPSUBST(cx);
PERL_ASYNC_CHECK();
RETURNOP(pm->op_next);
/* diag_listed_as: Exiting subroutine via %s */
Perl_ck_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
context_name[CxTYPE(cx)], OP_NAME(PL_op));
- if (CxTYPE(cx) == CXt_NULL)
+ if (CxTYPE(cx) == CXt_NULL) /* sort BLOCK */
return -1;
break;
case CXt_LOOP_LAZYIV:
/* diag_listed_as: Exiting subroutine via %s */
Perl_ck_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
context_name[CxTYPE(cx)], OP_NAME(PL_op));
- if ((CxTYPE(cx)) == CXt_NULL)
+ if ((CxTYPE(cx)) == CXt_NULL) /* sort BLOCK */
return -1;
break;
case CXt_LOOP_LAZYIV:
POPSUBST(cx);
continue; /* not break */
case CXt_SUB:
+ CX_LEAVE_SCOPE(cx);
POPSUB(cx);
break;
case CXt_EVAL:
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
break;
case CXt_BLOCK:
+ CX_LEAVE_SCOPE(cx);
POPBASICBLK(cx);
break;
case CXt_LOOP_LAZYIV:
case CXt_LOOP_LAZYSV:
case CXt_LOOP_FOR:
case CXt_LOOP_PLAIN:
+ CX_LEAVE_SCOPE(cx);
POPLOOP(cx);
break;
case CXt_WHEN:
+ CX_LEAVE_SCOPE(cx);
POPWHEN(cx);
break;
case CXt_GIVEN:
+ CX_LEAVE_SCOPE(cx);
POPGIVEN(cx);
break;
case CXt_NULL:
+ /* there isn't a POPNULL ! */
+ CX_LEAVE_SCOPE(cx);
break;
case CXt_FORMAT:
+ CX_LEAVE_SCOPE(cx);
POPFORMAT(cx);
break;
}
my_exit(1);
}
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
- POPBLOCK(cx,PL_curpm);
+ POPBLOCK(cx);
cxstack_ix--;
namesv = cx->blk_eval.old_namesv;
#ifdef DEBUGGING
PUSHBLOCK(cx, CXt_SUB, SP);
PUSHSUB_DB(cx);
cx->blk_sub.retop = PL_op->op_next;
- cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix;
+ cx->cx_old_savestack_ix = PL_savestack_ix;
SAVEI32(PL_debug);
PL_debug = 0;
{
PERL_CONTEXT *cx;
SV **newsp;
- PMOP *newpm;
I32 gimme;
cx = &cxstack[cxstack_ix];
leave_common(newsp, newsp, gimme, SVs_PADTMP|SVs_TEMP,
PL_op->op_private & OPpLVALUE);
+ CX_LEAVE_SCOPE(cx);
POPBASICBLK(cx);
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* Don't pop $1 et al till now */
+ POPBLOCK(cx);
cxstack_ix--;
return NORMAL;
PERL_CONTEXT *cx;
I32 gimme;
SV **newsp;
- PMOP *newpm;
SV **mark;
cx = &cxstack[cxstack_ix];
leave_common(newsp, MARK, gimme, SVs_PADTMP|SVs_TEMP,
PL_op->op_private & OPpLVALUE);
+ CX_LEAVE_SCOPE(cx);
POPLOOP(cx); /* Stack values are safe: release loop vars ... */
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* ... and pop $1 et al */
+ POPBLOCK(cx);
cxstack_ix--;
return NORMAL;
dSP;
SV **newsp;
SV **mark;
- PMOP *newpm;
I32 gimme;
PERL_CONTEXT *cx;
bool ref;
what = "undef";
}
croak:
+ CX_LEAVE_SCOPE(cx);
POPSUB(cx);
cxstack_ix--;
PL_curpm = cx->blk_oldpm;
}
PUTBACK;
+ CX_LEAVE_SCOPE(cx);
POPSUB(cx); /* Stack values are safe: release CV and @_ ... */
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* ... and pop $1 et al */
+ POPBLOCK(cx);
cxstack_ix--;
return cx->blk_sub.retop;
assert(cxstack_ix >= 0);
if (cxix < cxstack_ix) {
if (cxix < 0) {
- if (!CxMULTICALL(cxstack))
+ if (!( PL_curstackinfo->si_type == PERLSI_SORT
+ || ( PL_curstackinfo->si_type == PERLSI_MULTICALL
+ && (cxstack[0].cx_type & CXp_SUB_RE_FAKE))
+ )
+ )
DIE(aTHX_ "Can't return outside a subroutine");
- /* We must be in a sort block, which is a CXt_NULL not a
- * CXt_SUB. Handle specially. */
+ /* We must be in:
+ * a sort block, which is a CXt_NULL not a CXt_SUB;
+ * or a /(?{...})/ block.
+ * Handle specially. */
+ assert(CxTYPE(&cxstack[0]) == CXt_NULL
+ || ( CxTYPE(&cxstack[0]) == CXt_SUB
+ && (cxstack[0].cx_type & CXp_SUB_RE_FAKE)));
if (cxstack_ix > 0) {
/* See comment below about context popping. Since we know
* we're scalar and not lvalue, we can preserve the return
PP(pp_last)
{
PERL_CONTEXT *cx;
- PMOP *newpm;
S_unwind_loop(aTHX_ "last");
TAINT_NOT;
/* Stack values are safe: */
+ CX_LEAVE_SCOPE(cx);
POPLOOP(cx); /* release loop vars ... */
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* ... and pop $1 et al */
+ POPBLOCK(cx);
cxstack_ix--;
return cx->blk_loop.my_op->op_lastop->op_next;
TOPBLOCK(cx);
SPAGAIN;
- /* partial unrolled POPSUB(): */
-
/* protect @_ during save stack unwind. */
if (arg)
SvREFCNT_inc_NN(sv_2mortal(MUTABLE_SV(arg)));
assert(PL_scopestack_ix == cx->blk_oldscopesp);
CX_LEAVE_SCOPE(cx);
+ /* partial unrolled POPSUB(): */
+
if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)) {
AV* av = MUTABLE_AV(PAD_SVl(0));
assert(AvARRAY(MUTABLE_AV(
}
SP = PL_stack_base + POPMARK; /* pop original mark */
cx = &cxstack[cxstack_ix];
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
- POPBLOCK(cx,PL_curpm);
+ POPBLOCK(cx);
cxstack_ix--;
namesv = cx->blk_eval.old_namesv;
}
/* switch to eval mode */
PUSHBLOCK(cx, CXt_EVAL, SP);
PUSHEVAL(cx, name);
- cx->cx_u.cx_blk.blku_old_savestack_ix = old_savestack_ix;
+ cx->cx_old_savestack_ix = old_savestack_ix;
cx->blk_eval.retop = PL_op->op_next;
SAVECOPLINE(&PL_compiling);
PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
PUSHEVAL(cx, 0);
- cx->cx_u.cx_blk.blku_old_savestack_ix = old_savestack_ix;
+ cx->cx_old_savestack_ix = old_savestack_ix;
cx->blk_eval.retop = PL_op->op_next;
/* prepare to compile string */
{
dSP;
SV **newsp;
- PMOP *newpm;
I32 gimme;
PERL_CONTEXT *cx;
OP *retop;
* to get the current hints. So restore it early.
*/
PL_curcop = cx->blk_oldcop;
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* Don't pop $1 et al till now */
+ POPBLOCK(cx);
cxstack_ix--;
namesv = cx->blk_eval.old_namesv;
retop = cx->blk_eval.retop;
void
Perl_delete_eval_scope(pTHX)
{
- PMOP *newpm;
PERL_CONTEXT *cx;
I32 optype;
cx = &cxstack[cxstack_ix];
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
- POPBLOCK(cx,newpm);
- PL_curpm = newpm;
+ POPBLOCK(cx);
cxstack_ix--;
PERL_UNUSED_VAR(optype);
}
PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
PUSHEVAL(cx, 0);
- cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix;
+ cx->cx_old_savestack_ix = PL_savestack_ix;
PL_in_eval = EVAL_INEVAL;
if (flags & G_KEEPERR)
PP(pp_leavetry)
{
SV **newsp;
- PMOP *newpm;
I32 gimme;
PERL_CONTEXT *cx;
I32 optype;
PL_stack_sp = newsp;
else
leave_common(newsp, newsp, gimme, SVs_PADTMP|SVs_TEMP, FALSE);
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
- POPBLOCK(cx,newpm);
+ POPBLOCK(cx);
cxstack_ix--;
retop = cx->blk_eval.retop;
PERL_UNUSED_VAR(optype);
- PL_curpm = newpm; /* Don't pop $1 et al till now */
-
CLEAR_ERRSV();
return retop;
}
PERL_CONTEXT *cx;
I32 gimme;
SV **newsp;
- PMOP *newpm;
PERL_UNUSED_CONTEXT;
cx = &cxstack[cxstack_ix];
PL_stack_sp = newsp;
else
leave_common(newsp, newsp, gimme, SVs_PADTMP|SVs_TEMP, FALSE);
+
+ CX_LEAVE_SCOPE(cx);
POPGIVEN(cx);
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* Don't pop $1 et al till now */
+ POPBLOCK(cx);
cxstack_ix--;
return NORMAL;
{
I32 cxix;
PERL_CONTEXT *cx;
- PMOP *newpm;
-
cxix = dopoptowhen(cxstack_ix);
if (cxix < 0)
cx = &cxstack[cxstack_ix];
assert(CxTYPE(cx) == CXt_WHEN);
PL_stack_sp = PL_stack_base + cx->blk_oldsp;
+ CX_LEAVE_SCOPE(cx);
POPWHEN(cx);
- POPBLOCK(cx,newpm);
- PL_curpm = newpm; /* pop $1 et al */
+ POPBLOCK(cx);
cxstack_ix--;
return cx->blk_givwhen.leave_op->op_next;