}
else if (SvGMAGICAL(TARG))
mg_get(TARG);
- else if (!SvOK(TARG)) {
- s = SvPV_force(TARG, len);
+ else if (!SvOK(TARG) && SvTYPE(TARG) <= SVt_PVMG) {
sv_setpv(TARG, ""); /* Suppress warning. */
+ s = SvPV_force(TARG, len);
}
s = SvPV(right,len);
sv_catpvn(TARG,s,len);
{
dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
{
- dPOPTOPnnrl;
+ dPOPTOPnnrl_ul;
SETn( left + right );
RETURN;
}
SP = lastrelem;
else
SP = firstrelem + (lastlelem - firstlelem);
+ lelem = firstlelem + (relem - firstrelem);
while (relem <= SP)
- *relem++ = &sv_undef;
+ *relem++ = (lelem <= lastlelem) ? *lelem++ : &sv_undef;
RETURN;
}
else {
if (cx->blk_loop.iterix >= (av == curstack ? cx->blk_oldsp : AvFILL(av)))
RETPUSHNO;
+ SvREFCNT_dec(*cx->blk_loop.itervar);
+
if (sv = AvARRAY(av)[++cx->blk_loop.iterix])
SvTEMP_off(sv);
else
LvTARGLEN(lv) = 1;
sv = (SV*)lv;
}
- *cx->blk_loop.itervar = sv;
+
+ *cx->blk_loop.itervar = SvREFCNT_inc(sv);
RETPUSHYES;
}
register CV *cv;
register CONTEXT *cx;
I32 gimme;
- I32 hasargs = (op->op_flags & OPf_STACKED) != 0;
+ bool hasargs = (op->op_flags & OPf_STACKED) != 0;
+ bool may_clone = TRUE;
if (!sv)
DIE("Not a CODE reference");
break;
}
cv = (CV*)SvRV(sv);
- if (SvTYPE(cv) == SVt_PVCV)
+ if (SvTYPE(cv) == SVt_PVCV) {
+ may_clone = FALSE;
break;
+ }
/* FALL THROUGH */
case SVt_PVHV:
case SVt_PVAV:
DIE("Not a CODE reference");
case SVt_PVCV:
cv = (CV*)sv;
+ may_clone = FALSE;
break;
case SVt_PVGV:
if (!(cv = GvCV((GV*)sv)))
ENTER;
SAVETMPS;
+ if (may_clone && cv && CvCLONE(cv))
+ cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
+
retry:
if (!cv)
DIE("Not a CODE reference");
}
cx->blk_sub.savearray = GvAV(defgv);
cx->blk_sub.argarray = av;
- GvAV(defgv) = cx->blk_sub.argarray;
+ GvAV(defgv) = (AV*)SvREFCNT_inc(av);
++MARK;
if (items > AvMAX(av) + 1) {