By moving the "can't upgrade downwards" croak() in Perl_sv_upgrade()
Nicholas Clark [Sat, 22 Dec 2007 16:05:50 +0000 (16:05 +0000)]
after the type changing logic, we allow sv_upgrade() from SVt_NV to
SVt_IV to "work" (SVt_NV beomes SVt_PVNV in the type changing logic)
which simplifies the code for Perl_sv_setiv() slightly.

p4raw-id: //depot/perl@32702

sv.c

diff --git a/sv.c b/sv.c
index 72b64b6..42e9d91 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -1123,11 +1123,6 @@ Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type)
     if (old_type == new_type)
        return;
 
-    if (old_type > new_type)
-       Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
-               (int)old_type, (int)new_type);
-
-
     old_body = SvANY(sv);
 
     /* Copying structures onto other structures that have been neatly zeroed
@@ -1208,6 +1203,11 @@ Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type)
            Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
                       sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
     }
+
+    if (old_type > new_type)
+       Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
+               (int)old_type, (int)new_type);
+
     new_type_details = bodies_by_type + new_type;
 
     SvFLAGS(sv) &= ~SVTYPEMASK;
@@ -1485,10 +1485,8 @@ Perl_sv_setiv(pTHX_ register SV *sv, IV i)
     SV_CHECK_THINKFIRST_COW_DROP(sv);
     switch (SvTYPE(sv)) {
     case SVt_NULL:
-       sv_upgrade(sv, SVt_IV);
-       break;
     case SVt_NV:
-       sv_upgrade(sv, SVt_PVNV);
+       sv_upgrade(sv, SVt_IV);
        break;
     case SVt_RV:
     case SVt_PV: