More PERL_POISON - poison SvANY() and SvREFCNT() in freed SV heads.
[p5sagit/p5-mst-13.2.git] / cop.h
diff --git a/cop.h b/cop.h
index f2e4463..ff09420 100644 (file)
--- 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<perlcall/Lightweight Callbacks>.
 #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<perlcall/Lightweight Callbacks>.
        }                                                               \
        SAVECOMPPAD();                                                  \
        PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv));                       \
+       multicall_cv = cv;                                              \
        multicall_cop = CvSTART(cv);                                    \
     } STMT_END
 
@@ -760,8 +768,8 @@ See L<perlcall/Lightweight Callbacks>.
 
 #define POP_MULTICALL \
     STMT_START {                                                       \
-       LEAVESUB(cv);                                                   \
-       CvDEPTH(cv)--;                                                  \
+       LEAVESUB(multicall_cv);                                         \
+       CvDEPTH(multicall_cv)--;                                        \
        POPBLOCK(cx,PL_curpm);                                          \
        CATCH_SET(multicall_oldcatch);                                  \
        LEAVE;                                                          \