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.