This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix for "[ID 20010213.005] utf8 + localized hash elems + 64 bits?"
[perl5.git] / doop.c
diff --git a/doop.c b/doop.c
index 55962a0..f323069 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -187,8 +187,11 @@ S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
            d = s;
        dstart = d;
 
+#ifdef MACOS_TRADITIONAL
+#define comp CoMP   /* "comp" is a keyword in some compilers ... */
+#endif
+
        if (PL_op->op_private & OPpTRANS_SQUASH) {
-           U8* p = send;
            UV pch = 0xfeedface;
            while (s < send) {
                STRLEN len;
@@ -333,9 +336,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 +348,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 +520,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 +1209,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 +1228,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);