PERL_STACK_OVERFLOW_CHECK();
pad_push(CvPADLIST(cv), CvDEPTH(cv));
}
- SAVECOMPPAD();
PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
RETURNOP(CvSTART(cv));
}
SVs_PADSTALE, SVs_PADSTALE);
}
SAVEPADSVANDMORTALIZE(PL_op->op_targ);
-#ifdef USE_ITHREADS
- itervar = PL_comppad;
-#else
itervar = &PAD_SVl(PL_op->op_targ);
-#endif
}
else if (LIKELY(isGV(TOPs))) { /* symbol table variable */
GV * const gv = MUTABLE_GV(POPs);
SvREFCNT_dec(cv);
DIE(aTHX_ "Can't goto subroutine from a sort sub (or similar callback)");
}
+
+ /* partial unrolled POPSUB(): */
+
if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)) {
AV* av = cx->blk_sub.argarray;
}
else CLEAR_ARGARRAY(av);
}
+
/* We donate this refcount later to the calleeās pad. */
SvREFCNT_inc_simple_void(arg);
- if (CxTYPE(cx) == CXt_SUB &&
- !(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))
- SvREFCNT_dec(cx->blk_sub.cv);
- oldsave = PL_scopestack[PL_scopestack_ix - 1];
+
+ assert(PL_scopestack_ix == cx->blk_oldscopesp);
+ oldsave = PL_scopestack[cx->blk_oldscopesp - 1];
LEAVE_SCOPE(oldsave);
+ PL_comppad = cx->blk_sub.prevcomppad;
+ PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;
/* A destructor called during LEAVE_SCOPE could have undefined
* our precious cv. See bug #99850. */
DIE(aTHX_ "Goto undefined subroutine");
}
+ if (CxTYPE(cx) == CXt_SUB) {
+ CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth;
+ SvREFCNT_dec_NN(cx->blk_sub.cv);
+ }
+
/* Now do some callish stuff. */
SAVETMPS;
SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */
}
else {
PADLIST * const padlist = CvPADLIST(cv);
+
+ /* partial unrolled PUSHSUB(): */
+
cx->blk_sub.cv = cv;
cx->blk_sub.olddepth = CvDEPTH(cv);
CvDEPTH(cv)++;
- if (CvDEPTH(cv) < 2)
- SvREFCNT_inc_simple_void_NN(cv);
- else {
+ SvREFCNT_inc_simple_void_NN(cv);
+ if (CvDEPTH(cv) > 1) {
if (CvDEPTH(cv) == PERL_SUB_DEPTH_WARN && ckWARN(WARN_RECURSION))
sub_crush_depth(cv);
pad_push(padlist, CvDEPTH(cv));
}
PL_curcop = cx->blk_oldcop;
- SAVECOMPPAD();
+ cx->blk_sub.prevcomppad = PL_comppad;
PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));
if (CxHASARGS(cx))
{
- CX_CURPAD_SAVE(cx->blk_sub);
-
/* cx->blk_sub.argarray has no reference count, so we
need something to hang on to our argument array so
that cx->blk_sub.argarray does not end up pointing
ence count. */
if (arg) {
SvREFCNT_dec(PAD_SVl(0));
- PAD_SVl(0) = (SV *)(cx->blk_sub.argarray = arg);
+ PAD_SVl(0) = (SV *)arg;
}
+ cx->blk_sub.argarray = (AV*)PAD_SVl(0);
/* GvAV(PL_defgv) might have been modified on scope
exit, so restore it. */