Change 33081 by [EMAIL PROTECTED] on 2008/01/26 21:55:51

        The layout for struct block_loop under ithreads can be simplified.
        Instead of wedging the pad offset into a void* iterdata, and always
        storing PL_comppad even when it isn't used, instead do this:
        
        PAD        *oldcomppad; /* Also used for the GV, if targoffset is 0 */
        /* This is also accesible via cx->blk_loop.my_op->op_targ */
        PADOFFSET  targoffset;
        
        and store the GV pointer in oldcompad. Pointers to pointers seems
        cleaner. This also allows us to eliminate the flag bit CXp_PADVAR.

Affected files ...

... //depot/perl/cop.h#174 edit
... //depot/perl/pp_ctl.c#679 edit
... //depot/perl/sv.c#1501 edit

Differences ...

==== //depot/perl/cop.h#174 (text) ====
Index: perl/cop.h
--- perl/cop.h#173~33080~       2008-01-26 09:54:29.000000000 -0800
+++ perl/cop.h  2008-01-26 13:55:51.000000000 -0800
@@ -436,8 +436,9 @@
     /* (except for non_ithreads we need to modify next_op in pp_ctl.c, hence
        why next_op is conditionally defined below.)  */
 #ifdef USE_ITHREADS
-    void *     iterdata;
-    PAD                *oldcomppad;
+    PAD                *oldcomppad; /* Also used for the GV, if targoffset is 
0 */
+    /* This is also accesible via cx->blk_loop.my_op->op_targ */
+    PADOFFSET  targoffset;
 #else
     OP *       next_op;
     SV **      itervar;
@@ -460,18 +461,19 @@
 
 #ifdef USE_ITHREADS
 #  define CxITERVAR(c)                                                 \
-       ((c)->blk_loop.iterdata                                         \
-        ? (CxPADLOOP(cx)                                               \
-           ? &CX_CURPAD_SV( (c)->blk_loop,                             \
-                   INT2PTR(PADOFFSET, (c)->blk_loop.iterdata))         \
-           : &GvSV((GV*)(c)->blk_loop.iterdata))                       \
+       ((c)->blk_loop.oldcomppad                                       \
+        ? (CxPADLOOP(c)                                                \
+           ? &CX_CURPAD_SV( (c)->blk_loop, (c)->blk_loop.targoffset )  \
+           : &GvSV((GV*)(c)->blk_loop.oldcomppad))                     \
         : (SV**)NULL)
-#  define CX_ITERDATA_SET(cx,idata)                                    \
-       CX_CURPAD_SAVE(cx->blk_loop);                                   \
-       cx->blk_loop.iterdata = (idata);
+#  define CX_ITERDATA_SET(cx,idata,o)                                  \
+       if ((cx->blk_loop.targoffset = (o)))                            \
+           CX_CURPAD_SAVE(cx->blk_loop);                               \
+       else                                                            \
+           cx->blk_loop.oldcomppad = (idata);
 #else
 #  define CxITERVAR(c)         ((c)->blk_loop.itervar)
-#  define CX_ITERDATA_SET(cx,ivar)                                     \
+#  define CX_ITERDATA_SET(cx,ivar,o)                                   \
        cx->blk_loop.itervar = (SV**)(ivar);
 #endif
 #define CxLABEL(c)     (0 + (c)->blk_oldcop->cop_label)
@@ -492,15 +494,15 @@
        PUSHLOOP_OP_NEXT;                                               \
        cx->blk_loop.state_u.ary.ary = NULL;                            \
        cx->blk_loop.state_u.ary.ix = 0;                                \
-       CX_ITERDATA_SET(cx,NULL);
+       CX_ITERDATA_SET(cx, NULL, 0);
 
-#define PUSHLOOP_FOR(cx, dat, s)                                       \
+#define PUSHLOOP_FOR(cx, dat, s, offset)                               \
        cx->blk_loop.resetsp = s - PL_stack_base;                       \
        cx->blk_loop.my_op = cLOOP;                                     \
        PUSHLOOP_OP_NEXT;                                               \
        cx->blk_loop.state_u.ary.ary = NULL;                            \
        cx->blk_loop.state_u.ary.ix = 0;                                \
-       CX_ITERDATA_SET(cx,dat);
+       CX_ITERDATA_SET(cx, dat, offset);
 
 #define POPLOOP(cx)                                                    \
        if (CxTYPE(cx) == CXt_LOOP_LAZYSV) {                            \
@@ -680,10 +682,9 @@
 /* private flags for CXt_LOOP */
 #define CXp_FOR_DEF    0x10    /* foreach using $_ */
 #ifdef USE_ITHREADS
-#  define CXp_PADVAR   0x20    /* itervar lives on pad, iterdata has pad
-                                  offset; if not set, iterdata holds GV* */
-#  define CxPADLOOP(c) (CxTYPE_is_LOOP(c) && ((c)->cx_type & (CXp_PADVAR)))
+#  define CxPADLOOP(c) ((c)->blk_loop.targoffset)
 #endif
+
 /* private flags for CXt_SUBST */
 #define CXp_ONCE       0x10    /* What was sbu_once in struct subst */
 

==== //depot/perl/pp_ctl.c#679 (text) ====
Index: perl/pp_ctl.c
--- perl/pp_ctl.c#678~33080~    2008-01-26 09:54:29.000000000 -0800
+++ perl/pp_ctl.c       2008-01-26 13:55:51.000000000 -0800
@@ -1837,7 +1837,7 @@
     SV **svp;
     U8 cxtype = CXt_LOOP_FOR;
 #ifdef USE_ITHREADS
-    void *iterdata;
+    PAD *iterdata;
 #endif
 
     ENTER;
@@ -1853,8 +1853,7 @@
 #ifndef USE_ITHREADS
        svp = &PAD_SVl(PL_op->op_targ);         /* "my" variable */
 #else
-       iterdata = INT2PTR(void*, PL_op->op_targ);
-       cxtype |= CXp_PADVAR;
+       iterdata = NULL;
 #endif
     }
     else {
@@ -1863,7 +1862,7 @@
        SAVEGENERICSV(*svp);
        *svp = newSV(0);
 #ifdef USE_ITHREADS
-       iterdata = (void*)gv;
+       iterdata = (PAD*)gv;
 #endif
     }
 
@@ -1874,9 +1873,9 @@
 
     PUSHBLOCK(cx, cxtype, SP);
 #ifdef USE_ITHREADS
-    PUSHLOOP_FOR(cx, iterdata, MARK);
+    PUSHLOOP_FOR(cx, iterdata, MARK, PL_op->op_targ);
 #else
-    PUSHLOOP_FOR(cx, svp, MARK);
+    PUSHLOOP_FOR(cx, svp, MARK, /*Not used*/);
 #endif
     if (PL_op->op_flags & OPf_STACKED) {
        SV *maybe_ary = POPs;

==== //depot/perl/sv.c#1501 (text) ====
Index: perl/sv.c
--- perl/sv.c#1500~33080~       2008-01-26 09:54:29.000000000 -0800
+++ perl/sv.c   2008-01-26 13:55:51.000000000 -0800
@@ -10557,13 +10557,14 @@
                    = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
            case CXt_LOOP_LAZYIV:
            case CXt_LOOP_PLAIN:
-               ncx->blk_loop.iterdata  = (CxPADLOOP(ncx)
-                                          ? ncx->blk_loop.iterdata
-                                          : gv_dup((GV*)ncx->blk_loop.iterdata,
-                                                   param));
-               ncx->blk_loop.oldcomppad
-                   = (PAD*)ptr_table_fetch(PL_ptr_table,
-                                           ncx->blk_loop.oldcomppad);
+               if (CxPADLOOP(ncx)) {
+                   ncx->blk_loop.oldcomppad
+                       = (PAD*)ptr_table_fetch(PL_ptr_table,
+                                               ncx->blk_loop.oldcomppad);
+               } else {
+                   ncx->blk_loop.oldcomppad
+                       = (PAD*)gv_dup((GV*)ncx->blk_loop.oldcomppad, param);
+               }
                break;
            case CXt_FORMAT:
                ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
End of Patch.

Reply via email to