[shell changes from patch from perl5.003_23 to perl5.003_24]
[p5sagit/p5-mst-13.2.git] / cop.h
diff --git a/cop.h b/cop.h
index 6aa32df..d450e09 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -46,16 +46,22 @@ struct block_sub {
        cx->blk_sub.dfoutgv = defoutgv;                                 \
        (void)SvREFCNT_inc(cx->blk_sub.dfoutgv)
 
+/* We muck with cxstack_ix since _dec may call a DESTROY, overwriting cx. */
+
 #define POPSUB(cx)                                                     \
-       if (cx->blk_sub.hasargs) {   /* put back old @_ */              \
+       if (cx->blk_sub.hasargs) {                                      \
+           /* put back old @_ */                                       \
+           SvREFCNT_dec(GvAV(defgv));                                  \
            GvAV(defgv) = cx->blk_sub.savearray;                        \
+           /* destroy arg array */                                     \
+           av_clear(cx->blk_sub.argarray);                             \
+           AvREAL_off(cx->blk_sub.argarray);                           \
        }                                                               \
        if (cx->blk_sub.cv) {                                           \
            if (!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth)) {    \
-               if (cx->blk_sub.hasargs) {                              \
-                   SvREFCNT_inc((SV*)cx->blk_sub.argarray);            \
-               }                                                       \
+               cxstack_ix++;                                           \
                SvREFCNT_dec((SV*)cx->blk_sub.cv);                      \
+               cxstack_ix--;                                           \
            }                                                           \
        }
 
@@ -93,6 +99,7 @@ struct block_loop {
     OP *       last_op;
     SV **      itervar;
     SV *       itersave;
+    SV *       iterlval;
     AV *       iterary;
     I32                iterix;
 };
@@ -103,12 +110,21 @@ struct block_loop {
        cx->blk_loop.redo_op = cLOOP->op_redoop;                        \
        cx->blk_loop.next_op = cLOOP->op_nextop;                        \
        cx->blk_loop.last_op = cLOOP->op_lastop;                        \
-       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);\
+       cx->blk_loop.iterlval = Nullsv;                                 \
+       cx->blk_loop.iterary = Nullav;                                  \
+       cx->blk_loop.iterix = -1;
 
 #define POPLOOP(cx)                                                    \
-       newsp           = stack_base + cx->blk_loop.resetsp;
+       newsp           = stack_base + cx->blk_loop.resetsp;            \
+       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;              \
+       }                                                               \
+       if (cx->blk_loop.iterary && cx->blk_loop.iterary != curstack)   \
+           SvREFCNT_dec(cx->blk_loop.iterary);
 
 /* context common to subroutines, evals and loops */
 struct block {
@@ -174,8 +190,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;
@@ -188,8 +205,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
@@ -203,8 +221,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,                                 \