tweak for change#7173
[p5sagit/p5-mst-13.2.git] / sv.c
diff --git a/sv.c b/sv.c
index a89c49a..a2e6fbd 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -913,6 +913,10 @@ Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
     MAGIC*     magic;
     HV*                stash;
 
+    if (mt != SVt_PV && SvREADONLY(sv) && SvFAKE(sv)) {
+       sv_force_normal(sv);
+    }
+
     if (SvTYPE(sv) == mt)
        return TRUE;
 
@@ -1488,7 +1492,8 @@ Perl_sv_2iv(pTHX_ register SV *sv)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
          SV* tmpstr;
-         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
+          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+                  (SvRV(tmpstr) != SvRV(sv)))
              return SvIV(tmpstr);
          return PTR2IV(SvRV(sv));
        }
@@ -1618,7 +1623,8 @@ Perl_sv_2uv(pTHX_ register SV *sv)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
          SV* tmpstr;
-         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
+          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+                  (SvRV(tmpstr) != SvRV(sv)))
              return SvUV(tmpstr);
          return PTR2UV(SvRV(sv));
        }
@@ -1785,7 +1791,8 @@ Perl_sv_2nv(pTHX_ register SV *sv)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
          SV* tmpstr;
-         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
+          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+                  (SvRV(tmpstr) != SvRV(sv)))
              return SvNV(tmpstr);
          return PTR2NV(SvRV(sv));
        }
@@ -2112,7 +2119,8 @@ Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
            SV* tmpstr;
-           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
+            if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
+                    (SvRV(tmpstr) != SvRV(sv)))
                return SvPV(tmpstr,*lp);
            sv = (SV*)SvRV(sv);
            if (!sv)
@@ -2359,7 +2367,8 @@ Perl_sv_2bool(pTHX_ register SV *sv)
     if (SvROK(sv)) {
        dTHR;
        SV* tmpsv;
-       if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
+        if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
+                (SvRV(tmpsv) != SvRV(sv)))
            return SvTRUE(tmpsv);
       return SvRV(sv) != 0;
     }
@@ -2413,8 +2422,9 @@ Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
        STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
        SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
        SvCUR(sv) = len - 1;
+       SvLEN(sv) = len; /* No longer know the real size. */
        SvUTF8_on(sv);
-       Safefree(s); /* No longer using what was there before */
+       Safefree(s); /* No longer using what was there before. */
     }
 }
 
@@ -2439,7 +2449,7 @@ Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
            if (fail_ok)
                return FALSE;
            else
-               Perl_croak("big byte");
+               Perl_croak(aTHX_ "big byte");
        }
        SvCUR(sv) = len - 1;
        SvUTF8_off(sv);
@@ -5113,7 +5123,7 @@ Perl_sv_reset(pTHX_ register char *s, HV *stash)
                }
                if (GvHV(gv) && !HvNAME(GvHV(gv))) {
                    hv_clear(GvHV(gv));
-#ifndef VMS  /* VMS has no environ array */
+#if !defined( VMS) && !defined(EPOC)  /* VMS has no environ array */
                    if (gv == PL_envgv)
                        environ[0] = Nullch;
 #endif
@@ -6317,7 +6327,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
                    break;
                }
                if (utf)
-                   iv = (IV)utf8_to_uv(vecstr, &ulen, 0);
+                   iv = (IV)utf8_to_uv_chk(vecstr, &ulen, 0);
                else {
                    iv = *vecstr;
                    ulen = 1;
@@ -6399,7 +6409,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
                    break;
                }
                if (utf)
-                   uv = utf8_to_uv(vecstr, &ulen, 0);
+                   uv = utf8_to_uv_chk(vecstr, &ulen, 0);
                else {
                    uv = *vecstr;
                    ulen = 1;