[inseparable changes from patch from perl5.003_15 to perl5.003_16]
[p5sagit/p5-mst-13.2.git] / cop.h
diff --git a/cop.h b/cop.h
index 299873b..543c039 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -105,13 +105,16 @@ struct block_loop {
        cx->blk_loop.next_op = cLOOP->op_nextop;                        \
        cx->blk_loop.last_op = cLOOP->op_lastop;                        \
        cx->blk_loop.iterlval = Nullsv;                                 \
-       cx->blk_loop.itervar = ivar;                                    \
-       if (ivar)                                                       \
-           cx->blk_loop.itersave = *cx->blk_loop.itervar;
+       if (cx->blk_loop.itervar = (ivar))                              \
+           cx->blk_loop.itersave = SvREFCNT_inc(*cx->blk_loop.itervar);
 
 #define POPLOOP(cx)                                                    \
        newsp           = stack_base + cx->blk_loop.resetsp;            \
-       SvREFCNT_dec(cx->blk_loop.iterlval)
+       SvREFCNT_dec(cx->blk_loop.iterlval);                            \
+       if (cx->blk_loop.itervar) {                                     \
+           SvREFCNT_dec(*cx->blk_loop.itervar);                        \
+           *cx->blk_loop.itervar = cx->blk_loop.itersave;              \
+       }
 
 /* context common to subroutines, evals and loops */
 struct block {
@@ -177,8 +180,9 @@ struct subst {
     I32                sbu_iters;
     I32                sbu_maxiters;
     I32                sbu_safebase;
-    I32                sbu_once;
     I32                sbu_oldsave;
+    bool       sbu_once;
+    bool       sbu_rxtainted;
     char *     sbu_orig;
     SV *       sbu_dstr;
     SV *       sbu_targ;
@@ -191,8 +195,9 @@ struct subst {
 #define sb_iters       cx_u.cx_subst.sbu_iters
 #define sb_maxiters    cx_u.cx_subst.sbu_maxiters
 #define sb_safebase    cx_u.cx_subst.sbu_safebase
-#define sb_once                cx_u.cx_subst.sbu_once
 #define sb_oldsave     cx_u.cx_subst.sbu_oldsave
+#define sb_once                cx_u.cx_subst.sbu_once
+#define sb_rxtainted   cx_u.cx_subst.sbu_rxtainted
 #define sb_orig                cx_u.cx_subst.sbu_orig
 #define sb_dstr                cx_u.cx_subst.sbu_dstr
 #define sb_targ                cx_u.cx_subst.sbu_targ
@@ -206,8 +211,9 @@ struct subst {
        cx->sb_iters            = iters,                                \
        cx->sb_maxiters         = maxiters,                             \
        cx->sb_safebase         = safebase,                             \
-       cx->sb_once             = once,                                 \
        cx->sb_oldsave          = oldsave,                              \
+       cx->sb_once             = once,                                 \
+       cx->sb_rxtainted        = rxtainted,                            \
        cx->sb_orig             = orig,                                 \
        cx->sb_dstr             = dstr,                                 \
        cx->sb_targ             = targ,                                 \