Provide infrastructure for PERL_ASYNC_CHECK() style safe signals.
[p5sagit/p5-mst-13.2.git] / doop.c
diff --git a/doop.c b/doop.c
index 55962a0..1495953 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -333,9 +333,11 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
            dend = dstart + nlen;
        }
     }
-    if (grows) {
+    if (grows || hibit) {
        sv_setpvn(sv, (char*)dstart, d - dstart);
        Safefree(dstart);
+       if (grows && hibit)
+           Safefree(start);
     }
     else {
        *d = '\0';
@@ -343,8 +345,6 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
     }
     SvSETMAGIC(sv);
     SvUTF8_on(sv);
-    if (hibit)
-       Safefree(start);
     if (!isutf8 && !(PL_hints & HINT_UTF8))
        sv_utf8_downgrade(sv, TRUE);
 
@@ -517,17 +517,17 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            s += UTF8SKIP(s);
        }
     }
-    if (grows) {
+    if (grows || hibit) {
        sv_setpvn(sv, (char*)dstart, d - dstart);
        Safefree(dstart);
+       if (grows && hibit)
+           Safefree(start);
     }
     else {
        *d = '\0';
        SvCUR_set(sv, d - dstart);
     }
     SvUTF8_on(sv);
-    if (hibit)
-       Safefree(start);
     if (!isutf8 && !(PL_hints & HINT_UTF8))
        sv_utf8_downgrade(sv, TRUE);
     SvSETMAGIC(sv);
@@ -1206,7 +1206,7 @@ Perl_do_kv(pTHX)
        dokeys = dovalues = TRUE;
 
     if (!hv) {
-       if (PL_op->op_flags & OPf_MOD) {        /* lvalue */
+       if (PL_op->op_flags & OPf_MOD || LVRET) {       /* lvalue */
            dTARGET;            /* make sure to clear its target here */
            if (SvTYPE(TARG) == SVt_PVLV)
                LvTARG(TARG) = Nullsv;
@@ -1225,7 +1225,7 @@ Perl_do_kv(pTHX)
        IV i;
        dTARGET;
 
-       if (PL_op->op_flags & OPf_MOD) {        /* lvalue */
+       if (PL_op->op_flags & OPf_MOD || LVRET) {       /* lvalue */
            if (SvTYPE(TARG) < SVt_PVLV) {
                sv_upgrade(TARG, SVt_PVLV);
                sv_magic(TARG, Nullsv, 'k', Nullch, 0);