};
#ifdef USE_ITHREADS
-# define CxITERVAR(c) \
+# define CxITERVAR_PADSV(c) \
+ &CX_CURPAD_SV( (c)->blk_loop.itervar_u, (c)->blk_loop.my_op->op_targ)
+#else
+# define CxITERVAR_PADSV(c) ((c)->blk_loop.itervar_u.svp)
+#endif
+
+#define CxITERVAR(c) \
((c)->blk_loop.itervar_u.oldcomppad \
? (CxPADLOOP(c) \
- ? &CX_CURPAD_SV( (c)->blk_loop.itervar_u, (c)->blk_loop.my_op->op_targ) \
+ ? CxITERVAR_PADSV(c) \
: &GvSV((c)->blk_loop.itervar_u.gv)) \
: (SV**)NULL)
-#else
-# define CxITERVAR(c) ((c)->blk_loop.itervar_u.svp)
-#endif
+
#define CxLABEL(c) (0 + CopLABEL((c)->blk_oldcop))
#define CxHASARGS(c) (((c)->cx_type & CXp_HASARGS) == CXp_HASARGS)
#define CxLVAL(c) (0 + (c)->blk_u16)
}
else { /* symbol table variable */
GV * const gv = MUTABLE_GV(POPs);
- SV** svp = &GvSV(gv); SAVEGENERICSV(*svp);
+ SV** svp = &GvSV(gv);
+ save_pushptrptr(gv, SvREFCNT_inc(*svp), SAVEt_GVSV);
*svp = newSV(0);
-#ifdef USE_ITHREADS
itervar = (void *)gv;
-#else
- itervar = (void *)svp;
-#endif
}
if (PL_op->op_private & OPpITER_DEF)
*(char**)ptr = str;
}
break;
+ case SAVEt_GVSV: /* scalar slot in GV */
+ value = MUTABLE_SV(SSPOPPTR);
+ gv = MUTABLE_GV(SSPOPPTR);
+ ptr = &GvSV(gv);
+ goto restore_svp;
case SAVEt_GENERIC_SVREF: /* generic sv */
value = MUTABLE_SV(SSPOPPTR);
ptr = SSPOPPTR;
+ restore_svp:
sv = *(SV**)ptr;
*(SV**)ptr = value;
SvREFCNT_dec(sv);
#define SAVEt_ADELETE 46
#define SAVEt_I32_SMALL 47
#define SAVEt_INT_SMALL 48
+#define SAVEt_GVSV 49
#define SAVEf_SETMAGIC 1
#define SAVEf_KEEPOLDELEM 2
}
require "test.pl";
-plan( tests => 47 );
+plan( tests => 54 );
my $ok;
cmp_ok("@a37725",'eq',"5 4 3 2",'bug 27725: reverse with empty slots bug');
}
+# [perl #21469] bad things happened with for $x (...) { *x = *y }
+
+{
+ my $i = 1;
+ $x_21469 = 'X';
+ $y1_21469 = 'Y1';
+ $y2_21469 = 'Y2';
+ $y3_21469 = 'Y3';
+ for $x_21469 (1,2,3) {
+ is($x_21469, $i, "bug 21469: correct at start of loop $i");
+ *x_21469 = (*y1_21469, *y2_21469, *y3_21469)[$i-1];
+ is($x_21469, "Y$i", "bug 21469: correct at tail of loop $i");
+ $i++;
+ }
+ is($x_21469, 'X', "bug 21469: X okay at end of loop");
+}