An inconvenient hang would happen if the stdio _ptr wasn't
[p5sagit/p5-mst-13.2.git] / sv.c
diff --git a/sv.c b/sv.c
index 1720101..01076cb 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -2447,22 +2447,26 @@ bool
 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
 {
     if (SvPOK(sv) && SvUTF8(sv)) {
-        char *c = SvPVX(sv);
-       STRLEN len = SvCUR(sv) + 1;     /* include trailing NUL */
-        if (!utf8_to_bytes((U8*)c, &len)) {
-           if (fail_ok)
-               return FALSE;
-           else {
-               if (PL_op)
-                   Perl_croak(aTHX_ "Wide character in %s",
-                              PL_op_desc[PL_op->op_type]);
-               else
-                   Perl_croak(aTHX_ "Wide character");
+        if (SvCUR(sv)) {
+           char *c = SvPVX(sv);
+           STRLEN len = SvCUR(sv);
+
+           if (!utf8_to_bytes((U8*)c, &len)) {
+               if (fail_ok)
+                   return FALSE;
+               else {
+                   if (PL_op)
+                       Perl_croak(aTHX_ "Wide character in %s",
+                                  PL_op_desc[PL_op->op_type]);
+                   else
+                       Perl_croak(aTHX_ "Wide character");
+               }
            }
+           SvCUR(sv) = len;
        }
-       SvCUR(sv) = len - 1;
        SvUTF8_off(sv);
     }
+
     return TRUE;
 }
 
@@ -2860,7 +2864,8 @@ Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
        if (SvTEMP(sstr) &&             /* slated for free anyway? */
            SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
            !(sflags & SVf_OOK) &&      /* and not involved in OOK hack? */
-           SvLEN(sstr))                        /* and really is a string */
+           SvLEN(sstr)         &&      /* and really is a string */
+           !(PL_op && PL_op->op_type == OP_AASSIGN)) /* and won't be needed again, potentially */
        {
            if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
                if (SvOOK(dstr)) {
@@ -6622,11 +6627,10 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
                *--eptr = '#';
            *--eptr = '%';
 
+           /* No taint.  Otherwise we are in the strange situation
+            * where printf() taints but print($float) doesn't.
+            * --jhi */
            (void)sprintf(PL_efloatbuf, eptr, nv);
-#ifdef USE_LOCALE_NUMERIC
-           if ((PL_hints & HINT_LOCALE) && maybe_tainted)
-               *maybe_tainted = TRUE;
-#endif
 
            eptr = PL_efloatbuf;
            elen = strlen(PL_efloatbuf);