Change 33076 by [EMAIL PROTECTED] on 2008/01/26 16:03:03

        As itersave points to the initial CxITERVAR(), and the state of
        SvPADMY() does not change over the duration of the scope, we can
        perform conditional actions at loop push time. For the non-pad case,
        a reference to the initial CxITERVAR() is already held on the scope
        stack thanks to SAVEGENERICSV(*svp); in pp_enteriter. So there is no
        need to save another reference to it in itersave - it's not going away.

Affected files ...

... //depot/perl/cop.h#172 edit

Differences ...

==== //depot/perl/cop.h#172 (text) ====
Index: perl/cop.h
--- perl/cop.h#171~33075~       2008-01-26 07:17:09.000000000 -0800
+++ perl/cop.h  2008-01-26 08:03:03.000000000 -0800
@@ -469,14 +469,15 @@
         : (SV**)NULL)
 #  define CX_ITERDATA_SET(cx,idata)                                    \
        CX_CURPAD_SAVE(cx->blk_loop);                                   \
-       if ((cx->blk_loop.iterdata = (idata)))                          \
+       if ((cx->blk_loop.iterdata = (idata)) && SvPADMY(*CxITERVAR(cx))) \
            cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));       \
        else                                                            \
            cx->blk_loop.itersave = NULL;
 #else
 #  define CxITERVAR(c)         ((c)->blk_loop.itervar)
 #  define CX_ITERDATA_SET(cx,ivar)                                     \
-       if ((cx->blk_loop.itervar = (SV**)(ivar)))                      \
+       if ((cx->blk_loop.itervar = (SV**)(ivar))                       \
+           && SvPADMY(*CxITERVAR(cx)))                                 \
            cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));       \
        else                                                            \
            cx->blk_loop.itersave = NULL;
@@ -515,14 +516,10 @@
            SvREFCNT_dec(cx->blk_loop.state_u.lazysv.end);              \
        }                                                               \
        if (cx->blk_loop.itersave) {                                    \
-            if (SvPADMY(cx->blk_loop.itersave)) {                      \
-               SV ** const s_v_p = CxITERVAR(cx);                      \
-               sv_2mortal(*s_v_p);                                     \
-               *s_v_p = cx->blk_loop.itersave;                         \
-           }                                                           \
-           else {                                                      \
-               SvREFCNT_dec(cx->blk_loop.itersave);                    \
-           }                                                           \
+           SV ** const s_v_p = CxITERVAR(cx);                          \
+           assert(SvPADMY(cx->blk_loop.itersave));                     \
+           sv_2mortal(*s_v_p);                                         \
+           *s_v_p = cx->blk_loop.itersave;                             \
        }                                                               \
        if (CxTYPE(cx) == CXt_LOOP_FOR)                                 \
            SvREFCNT_dec(cx->blk_loop.state_u.ary.ary);
End of Patch.

Reply via email to