summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2007-12-22 16:05:50 +0000
committerNicholas Clark <nick@ccl4.org>2007-12-22 16:05:50 +0000
commit3376de987afecc3e3aea14b3dea087f4b50fd3f4 (patch)
tree1be14d8414339a84c539f19e7c79b8e0581940a5
parent64484faa0be51485f76b4a5e1542b1fe76c13a76 (diff)
downloadperl-3376de987afecc3e3aea14b3dea087f4b50fd3f4.tar.gz
By moving the "can't upgrade downwards" croak() in Perl_sv_upgrade()
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
-rw-r--r--sv.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/sv.c b/sv.c
index 72b64b638b..42e9d91081 100644
--- 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: