X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cop.h;h=ff09420e566fb48f6655383e4ec33f58bacaab86;hb=48614a46f2d1bab9f109995e713e48774d849328;hp=f2e4463a19abe3c6fbaa5569470ee274754d383a;hpb=9850bf21fc4ed69d8ddb0293df59411f891c62df;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cop.h b/cop.h index f2e4463..ff09420 100644 --- a/cop.h +++ b/cop.h @@ -407,9 +407,14 @@ struct block_loop { #define POPLOOP(cx) \ SvREFCNT_dec(cx->blk_loop.iterlval); \ if (CxITERVAR(cx)) { \ - SV **s_v_p = CxITERVAR(cx); \ - sv_2mortal(*s_v_p); \ - *s_v_p = cx->blk_loop.itersave; \ + if (SvPADMY(cx->blk_loop.itersave)) { \ + SV **s_v_p = CxITERVAR(cx); \ + sv_2mortal(*s_v_p); \ + *s_v_p = cx->blk_loop.itersave; \ + } \ + else { \ + SvREFCNT_dec(cx->blk_loop.itersave); \ + } \ } \ if (cx->blk_loop.iterary && cx->blk_loop.iterary != PL_curstack)\ SvREFCNT_dec(cx->blk_loop.iterary); @@ -729,14 +734,16 @@ See L. #define dMULTICALL \ SV **newsp; /* set by POPBLOCK */ \ PERL_CONTEXT *cx; \ - CV *cv; \ + CV *multicall_cv; \ OP *multicall_cop; \ bool multicall_oldcatch; \ U8 hasargs = 0 /* used by PUSHSUB */ -#define PUSH_MULTICALL \ +#define PUSH_MULTICALL(the_cv) \ STMT_START { \ - AV* padlist = CvPADLIST(cv); \ + CV * const _nOnclAshIngNamE_ = the_cv; \ + CV * const cv = _nOnclAshIngNamE_; \ + AV * const padlist = CvPADLIST(cv); \ ENTER; \ multicall_oldcatch = CATCH_GET; \ SAVETMPS; SAVEVPTR(PL_op); \ @@ -749,6 +756,7 @@ See L. } \ SAVECOMPPAD(); \ PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); \ + multicall_cv = cv; \ multicall_cop = CvSTART(cv); \ } STMT_END @@ -760,8 +768,8 @@ See L. #define POP_MULTICALL \ STMT_START { \ - LEAVESUB(cv); \ - CvDEPTH(cv)--; \ + LEAVESUB(multicall_cv); \ + CvDEPTH(multicall_cv)--; \ POPBLOCK(cx,PL_curpm); \ CATCH_SET(multicall_oldcatch); \ LEAVE; \