if (MARK < SP) {
SV *sv = *SP;
- *++newsp = ((SvFLAGS(sv) & flags) && SvREFCNT(sv) == 1)
+ *++newsp = ((SvFLAGS(sv) & flags) && SvREFCNT(sv) == 1
+ && !SvMAGICAL(sv))
? sv
: lvalue
? sv_2mortal(SvREFCNT_inc_simple_NN(sv))
/* in case LEAVE wipes old return values */
while (++MARK <= SP) {
SV *sv = *MARK;
- if ((SvFLAGS(sv) & flags) && SvREFCNT(sv) == 1)
+ if ((SvFLAGS(sv) & flags) && SvREFCNT(sv) == 1
+ && !SvMAGICAL(sv))
*++newsp = sv;
else {
*++newsp = lvalue
if (gimme == G_SCALAR) {
if (CxLVAL(cx) && !ref) { /* Leave it as it is if we can. */
if (MARK <= SP) {
- if ((SvPADTMP(TOPs) || SvREADONLY(TOPs)) &&
- !SvSMAGICAL(TOPs)) {
+ if ((SvPADTMP(TOPs) || SvREADONLY(TOPs))) {
what =
SvREADONLY(TOPs) ? (TOPs == &PL_sv_undef) ? "undef"
: "a readonly value" : "a temporary";