diff options
author | Nicholas Clark <nick@ccl4.org> | 2007-12-26 11:55:15 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2007-12-26 11:55:15 +0000 |
commit | b53eecb41cfe1ac98c147076b9df0047426f32f2 (patch) | |
tree | a7953eba245873ff0f8fd774f22273e68bd3eaa9 | |
parent | c975a42590d4415cbde1dbf125978db0461d609f (diff) | |
download | perl-b53eecb41cfe1ac98c147076b9df0047426f32f2.tar.gz |
Swap SVt_RV and SVt_NV in the SV ordering.
p4raw-id: //depot/perl@32725
-rw-r--r-- | dump.c | 4 | ||||
-rw-r--r-- | ext/B/B.xs | 2 | ||||
-rw-r--r-- | ext/Storable/Storable.xs | 2 | ||||
-rw-r--r-- | pp.c | 2 | ||||
-rw-r--r-- | pp_hot.c | 2 | ||||
-rw-r--r-- | sv.c | 20 | ||||
-rw-r--r-- | sv.h | 8 |
7 files changed, 22 insertions, 18 deletions
@@ -31,8 +31,8 @@ static const char* const svtypenames[SVt_LAST] = { "NULL", "BIND", "IV", - "NV", "RV", + "NV", "PV", "PVIV", "PVNV", @@ -51,8 +51,8 @@ static const char* const svshorttypenames[SVt_LAST] = { "UNDEF", "BIND", "IV", - "NV", "RV", + "NV", "PV", "PVIV", "PVNV", diff --git a/ext/B/B.xs b/ext/B/B.xs index 380e4edb19..e6af7a1531 100644 --- a/ext/B/B.xs +++ b/ext/B/B.xs @@ -25,8 +25,8 @@ static const char* const svclassnames[] = { "B::BIND", #endif "B::IV", - "B::NV", "B::RV", + "B::NV", "B::PV", "B::PVIV", "B::PVNV", diff --git a/ext/Storable/Storable.xs b/ext/Storable/Storable.xs index 0ac2b66cd3..e284163f99 100644 --- a/ext/Storable/Storable.xs +++ b/ext/Storable/Storable.xs @@ -4497,7 +4497,7 @@ static SV *retrieve_ref(pTHX_ stcxt_t *cxt, const char *cname) if (cname) { /* No need to do anything, as rv will already be PVMG. */ - assert (SvTYPE(rv) >= SVt_RV); + assert (SvTYPE(rv) == SVt_RV || SvTYPE(rv) >= SVt_PV); } else { sv_upgrade(rv, SVt_RV); } @@ -172,7 +172,7 @@ PP(pp_rv2gv) const char * const name = CopSTASHPV(PL_curcop); gv = newGVgen(name); } - if (SvTYPE(sv) < SVt_RV) + if (SvTYPE(sv) < SVt_RV || SvTYPE(sv) == SVt_NV) sv_upgrade(sv, SVt_RV); else if (SvPVX_const(sv)) { SvPV_free(sv); @@ -2940,7 +2940,7 @@ Perl_vivify_ref(pTHX_ SV *sv, U32 to_what) if (!SvOK(sv)) { if (SvREADONLY(sv)) Perl_croak(aTHX_ PL_no_modify); - if (SvTYPE(sv) < SVt_RV) + if (SvTYPE(sv) < SVt_RV || SvTYPE(sv) == SVt_NV) sv_upgrade(sv, SVt_RV); else if (SvTYPE(sv) >= SVt_PV) { SvPV_free(sv); @@ -890,13 +890,13 @@ static const struct body_details bodies_by_type[] = { FIT_ARENA(0, sizeof(struct ptr_tbl_ent)) }, + /* RVs are in the head now. */ + { 0, 0, 0, SVt_RV, FALSE, NONV, NOARENA, 0 }, + /* 8 bytes on most ILP32 with IEEE doubles */ { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) }, - /* RVs are in the head now. */ - { 0, 0, 0, SVt_RV, FALSE, NONV, NOARENA, 0 }, - /* 8 bytes on most ILP32 with IEEE doubles */ { sizeof(xpv_allocated), copy_length(XPV, xpv_len) @@ -1235,7 +1235,11 @@ Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type) return; case SVt_RV: assert(old_type == SVt_NULL); - SvANY(sv) = &sv->sv_u.svu_rv; + SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv)); + /* Could leave this in, but changing it happens to make the next step + clearler. The key part is that SvANY(sv) is not NULL: + SvANY(sv) = &sv->sv_u.svu_rv; + */ SvRV_set(sv, 0); return; case SVt_PVHV: @@ -1286,7 +1290,7 @@ Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type) The target created by newSVrv also is, and it can have magic. However, it never has SvPVX set. */ - if (old_type >= SVt_RV) { + if (old_type == SVt_RV || old_type >= SVt_PV) { assert(SvPVX_const(sv) == 0); } @@ -1357,7 +1361,7 @@ Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type) if (new_type == SVt_PVIO) IoPAGE_LEN(sv) = 60; - if (old_type < SVt_RV) + if (old_type < SVt_RV || old_type == SVt_NV) SvPV_set(sv, NULL); break; default: @@ -3483,7 +3487,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) goto undef_sstr; case SVt_RV: - if (dtype < SVt_RV) + if (dtype < SVt_PV && dtype != SVt_RV) sv_upgrade(dstr, SVt_RV); break; case SVt_PVFM: @@ -7856,7 +7860,7 @@ Perl_newSVrv(pTHX_ SV *rv, const char *classname) sv_upgrade(rv, SVt_RV); } else if (SvROK(rv)) { SvREFCNT_dec(SvRV(rv)); - } else if (SvTYPE(rv) < SVt_RV) + } else if (SvTYPE(rv) < SVt_RV || SvTYPE(rv) == SVt_NV) sv_upgrade(rv, SVt_RV); else if (SvTYPE(rv) > SVt_RV) { SvPV_free(rv); @@ -47,8 +47,8 @@ typedef enum { SVt_NULL, /* 0 */ SVt_BIND, /* 1 */ SVt_IV, /* 2 */ - SVt_NV, /* 3 */ - SVt_RV, /* 4 */ + SVt_RV, /* 3 */ + SVt_NV, /* 4 */ SVt_PV, /* 5 */ SVt_PVIV, /* 6 */ SVt_PVNV, /* 7 */ @@ -1298,7 +1298,7 @@ the scalar's value cannot change unless written to. })) # define SvRV(sv) \ (*({ SV *const _svi = (SV *) (sv); \ - assert(SvTYPE(_svi) >= SVt_RV); \ + assert(SvTYPE(_svi) >= SVt_PV || SvTYPE(_svi) == SVt_RV); \ assert(SvTYPE(_svi) != SVt_PVAV); \ assert(SvTYPE(_svi) != SVt_PVHV); \ assert(SvTYPE(_svi) != SVt_PVCV); \ @@ -1383,7 +1383,7 @@ the scalar's value cannot change unless written to. assert(!isGV_with_GP(sv)); \ (((XPVUV*)SvANY(sv))->xuv_uv = (val)); } STMT_END #define SvRV_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + STMT_START { assert(SvTYPE(sv) >= SVt_PV || SvTYPE(sv) == SVt_RV); \ assert(SvTYPE(sv) != SVt_PVAV); \ assert(SvTYPE(sv) != SVt_PVHV); \ assert(SvTYPE(sv) != SVt_PVCV); \ |