av.c apidoc
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index 6df5420..66d22bc 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -149,64 +149,33 @@ PP(pp_concat)
     bool left_utf = DO_UTF8(left);
     bool right_utf = DO_UTF8(right);
 
-    if (left_utf != right_utf) {
-        if (TARG == right && !right_utf) {
-            sv_utf8_upgrade(TARG); /* Now straight binary copy */
-            SvUTF8_on(TARG);
-        }
-        else {
-            /* Set TARG to PV(left), then add right */
-            char *l, *c;
-            STRLEN targlen;
-            if (TARG == right)
-                /* Need a safe copy elsewhere since we're just about to
-                   write onto TARG */
-                s = strdup(SvPV(right,len));
-            else
-                s = SvPV(right,len);
-            l = SvPV(left, targlen);
-            if (TARG != left)
-                sv_setpvn(TARG,l,targlen);
-            if (!left_utf)
-                sv_utf8_upgrade(TARG);
-            /* Extend TARG to length of right (s) */
-            targlen = SvCUR(TARG) + len;
-            if (!right_utf) {
-                /* plus one for each hi-byte char if we have to upgrade */
-                for (c = s; *c; c++)  {
-                    if (*c & 0x80)
-                        targlen++;
-                }
-            }
-            SvGROW(TARG, targlen+1);
-            /* And now copy, maybe upgrading right to UTF8 on the fly */
-            for (c = SvEND(TARG); *s; s++) {
-                 if (*s & 0x80 && !right_utf)
-                     c = (char*)uv_to_utf8((U8*)c, *s);
-                 else
-                     *c++ = *s;
-            }
-            SvCUR_set(TARG, targlen);
-            *SvEND(TARG) = '\0';
-            SvUTF8_on(TARG);
-            SETs(TARG);
-            RETURN;
-        }
-    }
-
     if (TARG != left) {
+       if (right_utf && !left_utf)
+           sv_utf8_upgrade(left);
        s = SvPV(left,len);
+       SvUTF8_off(TARG);
        if (TARG == right) {
+           if (left_utf && !right_utf)
+               sv_utf8_upgrade(right);
            sv_insert(TARG, 0, 0, s, len);
+           if (left_utf || right_utf)
+               SvUTF8_on(TARG);
            SETs(TARG);
            RETURN;
        }
        sv_setpvn(TARG,s,len);
     }
-    else if (SvGMAGICAL(TARG))
+    else if (SvGMAGICAL(TARG)) {
        mg_get(TARG);
-    else if (!SvOK(TARG) && SvTYPE(TARG) <= SVt_PVMG)
+       if (right_utf && !left_utf)
+           sv_utf8_upgrade(left);
+    }
+    else if (!SvOK(TARG) && SvTYPE(TARG) <= SVt_PVMG) {
        sv_setpv(TARG, "");     /* Suppress warning. */
+       s = SvPV_force(TARG, len);
+    }
+    if (left_utf && !right_utf)
+       sv_utf8_upgrade(right);
     s = SvPV(right,len);
     if (SvOK(TARG)) {
 #if defined(PERL_Y2KWARN)
@@ -225,7 +194,7 @@ PP(pp_concat)
     }
     else
        sv_setpvn(TARG,s,len);  /* suppress warning */
-    if (left_utf)
+    if (left_utf || right_utf)
        SvUTF8_on(TARG);
     SETTARG;
     RETURN;
@@ -2267,7 +2236,7 @@ S_get_db_sub(pTHX_ SV **svp, CV *cv)
                    && (gv = (GV*)*svp) ))) {
            /* Use GV from the stack as a fallback. */
            /* GV is potentially non-unique, or contain different CV. */
-           SV *tmp = newRV((SV*)cv));
+           SV *tmp = newRV((SV*)cv);
            sv_setsv(dbsv, tmp);
            SvREFCNT_dec(tmp);
        }