Problems with SKIP in makemaker
[p5sagit/p5-mst-13.2.git] / cop.h
diff --git a/cop.h b/cop.h
index 9728962..a569967 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -1,6 +1,6 @@
 /*    cop.h
  *
- *    Copyright (c) 1991-1994, Larry Wall
+ *    Copyright (c) 1991-1997, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -47,13 +47,25 @@ struct block_sub {
        (void)SvREFCNT_inc(cx->blk_sub.dfoutgv)
 
 #define POPSUB(cx)                                                     \
-       if (cx->blk_sub.hasargs) {   /* put back old @_ */              \
+       { struct block_sub cxsub;                                       \
+         POPSUB1(cx);                                                  \
+         POPSUB2(); }
+
+#define POPSUB1(cx)                                                    \
+       cxsub = cx->blk_sub;    /* because DESTROY may clobber *cx */
+
+#define POPSUB2()                                                      \
+       if (cxsub.hasargs) {                                            \
+           /* put back old @_ */                                       \
            SvREFCNT_dec(GvAV(defgv));                                  \
-           GvAV(defgv) = cx->blk_sub.savearray;                        \
+           GvAV(defgv) = cxsub.savearray;                              \
+           /* destroy arg array */                                     \
+           av_clear(cxsub.argarray);                                   \
+           AvREAL_off(cxsub.argarray);                                 \
        }                                                               \
-       if (cx->blk_sub.cv) {                                           \
-           if (!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth))      \
-               SvREFCNT_dec((SV*)cx->blk_sub.cv);                      \
+       if (cxsub.cv) {                                                 \
+           if (!(CvDEPTH(cxsub.cv) = cxsub.olddepth))                  \
+               SvREFCNT_dec(cxsub.cv);                                 \
        }
 
 #define POPFORMAT(cx)                                                  \
@@ -101,17 +113,29 @@ 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.iterlval = Nullsv;                                 \
        if (cx->blk_loop.itervar = (ivar))                              \
-           cx->blk_loop.itersave = SvREFCNT_inc(*cx->blk_loop.itervar);
+           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;            \
-       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;              \
-       }
+       { struct block_loop cxloop;                                     \
+         POPLOOP1(cx);                                                 \
+         POPLOOP2(); }
+
+#define POPLOOP1(cx)                                                   \
+       cxloop = cx->blk_loop;  /* because DESTROY may clobber *cx */   \
+       newsp = stack_base + cxloop.resetsp;
+
+#define POPLOOP2()                                                     \
+       SvREFCNT_dec(cxloop.iterlval);                                  \
+       if (cxloop.itervar) {                                           \
+           SvREFCNT_dec(*cxloop.itervar);                              \
+           *cxloop.itervar = cxloop.itersave;                          \
+       }                                                               \
+       if (cxloop.iterary && cxloop.iterary != curstack)               \
+           SvREFCNT_dec(cxloop.iterary);
 
 /* context common to subroutines, evals and loops */
 struct block {