GCC + Threads on Win32 - best gcc results yet
[p5sagit/p5-mst-13.2.git] / cop.h
diff --git a/cop.h b/cop.h
index 3383ceb..f49bfaf 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -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);                                 \
@@ -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,11 +251,13 @@ struct subst {
        cx->sb_s                = s,                                    \
        cx->sb_m                = m,                                    \
        cx->sb_strend           = strend,                               \
-       cx->sb_subbase          = Nullch,                               \
+       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 */