diff options
author | Nicholas Clark <nick@ccl4.org> | 2007-12-22 16:05:50 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2007-12-22 16:05:50 +0000 |
commit | 3376de987afecc3e3aea14b3dea087f4b50fd3f4 (patch) | |
tree | 1be14d8414339a84c539f19e7c79b8e0581940a5 | |
parent | 64484faa0be51485f76b4a5e1542b1fe76c13a76 (diff) | |
download | perl-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.c | 14 |
1 files changed, 6 insertions, 8 deletions
@@ -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: |