USE_ITHREADS tweaks and notes
[p5sagit/p5-mst-13.2.git] / op.h
diff --git a/op.h b/op.h
index 2129572..5231a41 100644 (file)
--- a/op.h
+++ b/op.h
@@ -158,7 +158,8 @@ typedef U32 PADOFFSET;
 /* Private for OP_DELETE */
 #define OPpSLICE               64      /* Operating on a list of keys */
 
-/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */
+/* Private for OP_SORT, OP_PRTF, OP_SPRINTF, OP_FTTEXT, OP_FTBINARY, */
+/*             string comparisons, and case changers. */
 #define OPpLOCALE              64      /* Use locale */
 
 /* Private for OP_SORT */
@@ -304,23 +305,28 @@ struct loop {
 
 
 #ifdef USE_ITHREADS
-#  define      cGVOPx(o)       ((GV*)PAD_SV(cPADOPx(o)->op_padix))
-#  define      cGVOP           ((GV*)PAD_SV(cPADOP->op_padix))
-#  define      cGVOPo          ((GV*)PAD_SV(cPADOPo->op_padix))
-#  define      kGVOP           ((GV*)PAD_SV(kPADOP->op_padix))
-#  define      cGVOP_set(v)    (PL_curpad[cPADOP->op_padix] = (SV*)(v))
-#  define      cGVOPo_set(v)   (PL_curpad[cPADOPo->op_padix] = (SV*)(v))
-#  define      kGVOP_set(v)    (PL_curpad[kPADOP->op_padix] = (SV*)(v))
+#  define      cGVOPx_gv(o)    ((GV*)PL_curpad[cPADOPx(o)->op_padix])
+#  define      IS_PADGV(v)     (v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v))
+#  define      IS_PADCONST(v)  (v && SvREADONLY(v))
+#  define      cSVOPx_sv(v)    (cSVOPx(v)->op_sv \
+                                ? cSVOPx(v)->op_sv : PL_curpad[(v)->op_targ])
+#  define      cSVOPx_svp(v)   (cSVOPx(v)->op_sv \
+                                ? &cSVOPx(v)->op_sv : &PL_curpad[(v)->op_targ])
 #else
-#  define      cGVOPx(o)       ((GV*)cSVOPx(o)->op_sv)
-#  define      cGVOP           ((GV*)cSVOP->op_sv)
-#  define      cGVOPo          ((GV*)cSVOPo->op_sv)
-#  define      kGVOP           ((GV*)kSVOP->op_sv)
-#  define      cGVOP_set(v)    (cPADOP->op_sv = (SV*)(v))
-#  define      cGVOPo_set(v)   (cPADOPo->op_sv = (SV*)(v))
-#  define      kGVOP_set(v)    (kPADOP->op_sv = (SV*)(v))
+#  define      cGVOPx_gv(o)    ((GV*)cSVOPx(o)->op_sv)
+#  define      IS_PADGV(v)     FALSE
+#  define      IS_PADCONST(v)  FALSE
+#  define      cSVOPx_sv(v)    (cSVOPx(v)->op_sv)
+#  define      cSVOPx_svp(v)   (&cSVOPx(v)->op_sv)
 #endif
 
+#define        cGVOP_gv                cGVOPx_gv(PL_op)
+#define        cGVOPo_gv               cGVOPx_gv(o)
+#define        kGVOP_gv                cGVOPx_gv(kid)
+#define cSVOP_sv               cSVOPx_sv(PL_op)
+#define cSVOPo_sv              cSVOPx_sv(o)
+#define kSVOP_sv               cSVOPx_sv(kid)
+
 #define Nullop Null(OP*)
 
 /* Lowest byte of PL_opargs */