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.