Run embed.pl and keywords.pl to complete RESTART -> INIT change
[p5sagit/p5-mst-13.2.git] / cop.h
diff --git a/cop.h b/cop.h
index 501faac..f49bfaf 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.
@@ -28,7 +28,9 @@ struct block_sub {
     CV *       cv;
     GV *       gv;
     GV *       dfoutgv;
+#ifndef USE_THREADS
     AV *       savearray;
+#endif /* USE_THREADS */
     AV *       argarray;
     U16                olddepth;
     U8         hasargs;
@@ -54,11 +56,19 @@ struct block_sub {
 #define POPSUB1(cx)                                                    \
        cxsub = cx->blk_sub;    /* because DESTROY may clobber *cx */
 
+#ifdef USE_THREADS
+#define POPSAVEARRAY() NOOP
+#else
+#define POPSAVEARRAY()                                                 \
+    STMT_START {                                                       \
+       SvREFCNT_dec(GvAV(defgv));                                      \
+       GvAV(defgv) = cxsub.savearray;                                  \
+    } STMT_END
+#endif /* USE_THREADS */
+
 #define POPSUB2()                                                      \
        if (cxsub.hasargs) {                                            \
-           /* put back old @_ */                                       \
-           SvREFCNT_dec(GvAV(defgv));                                  \
-           GvAV(defgv) = cxsub.savearray;                              \
+           POPSAVEARRAY();                                             \
            /* destroy arg array */                                     \
            av_clear(cxsub.argarray);                                   \
            AvREAL_off(cxsub.argarray);                                 \
@@ -125,10 +135,10 @@ struct block_loop {
          POPLOOP2(); }
 
 #define POPLOOP1(cx)                                                   \
-       cxloop = cx->blk_loop;  /* because DESTROY may clobber *cx */
+       cxloop = cx->blk_loop;  /* because DESTROY may clobber *cx */   \
+       newsp = stack_base + cxloop.resetsp;
 
 #define POPLOOP2()                                                     \
-       newsp = stack_base + cxloop.resetsp;                            \
        SvREFCNT_dec(cxloop.iterlval);                                  \
        if (cxloop.itervar) {                                           \
            SvREFCNT_dec(*cxloop.itervar);                              \
@@ -210,7 +220,7 @@ struct subst {
     char *     sbu_s;
     char *     sbu_m;
     char *     sbu_strend;
-    char *     sbu_subbase;
+    void *     sbu_rxres;
     REGEXP *   sbu_rx;
 };
 #define sb_iters       cx_u.cx_subst.sbu_iters
@@ -225,7 +235,7 @@ struct subst {
 #define sb_s           cx_u.cx_subst.sbu_s
 #define sb_m           cx_u.cx_subst.sbu_m
 #define sb_strend      cx_u.cx_subst.sbu_strend
-#define sb_subbase     cx_u.cx_subst.sbu_subbase
+#define sb_rxres       cx_u.cx_subst.sbu_rxres
 #define sb_rx          cx_u.cx_subst.sbu_rx
 
 #define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix],                        \
@@ -241,10 +251,13 @@ struct subst {
        cx->sb_s                = s,                                    \
        cx->sb_m                = m,                                    \
        cx->sb_strend           = strend,                               \
+       cx->sb_rxres            = Null(void*),                          \
        cx->sb_rx               = rx,                                   \
-       cx->cx_type             = CXt_SUBST
+       cx->cx_type             = CXt_SUBST;                            \
+       rxres_save(&cx->sb_rxres, rx)
 
-#define POPSUBST(cx) cxstack_ix--
+#define POPSUBST(cx) cx = &cxstack[cxstack_ix--];                      \
+       rxres_free(&cx->sb_rxres)
 
 struct context {
     I32                cx_type;        /* what kind of context this is */
@@ -265,9 +278,10 @@ struct context {
 /* "gimme" values */
 #define G_SCALAR       0
 #define G_ARRAY                1
+#define G_VOID         128     /* skip this bit when adding flags below */
 
 /* extra flags for perl_call_* routines */
 #define G_DISCARD      2       /* Call FREETMPS. */
 #define G_EVAL         4       /* Assume eval {} around subroutine call. */
 #define G_NOARGS       8       /* Don't construct a @_ array. */
-#define G_KEEPERR      16      /* Append errors to $@ rather than overwriting it */
+#define G_KEEPERR      16      /* Append errors to $@, don't overwrite it */