summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2007-12-26 11:55:15 +0000
committerNicholas Clark <nick@ccl4.org>2007-12-26 11:55:15 +0000
commitb53eecb41cfe1ac98c147076b9df0047426f32f2 (patch)
treea7953eba245873ff0f8fd774f22273e68bd3eaa9
parentc975a42590d4415cbde1dbf125978db0461d609f (diff)
downloadperl-b53eecb41cfe1ac98c147076b9df0047426f32f2.tar.gz
Swap SVt_RV and SVt_NV in the SV ordering.
p4raw-id: //depot/perl@32725
-rw-r--r--dump.c4
-rw-r--r--ext/B/B.xs2
-rw-r--r--ext/Storable/Storable.xs2
-rw-r--r--pp.c2
-rw-r--r--pp_hot.c2
-rw-r--r--sv.c20
-rw-r--r--sv.h8
7 files changed, 22 insertions, 18 deletions
diff --git a/dump.c b/dump.c
index 2a3439aca8..c6a9557c79 100644
--- a/dump.c
+++ b/dump.c
@@ -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);
}
diff --git a/pp.c b/pp.c
index f5ff461a99..349e91f03c 100644
--- a/pp.c
+++ b/pp.c
@@ -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);
diff --git a/pp_hot.c b/pp_hot.c
index 367f03e603..ca34f91890 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -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);
diff --git a/sv.c b/sv.c
index bd90934586..fda79357e8 100644
--- a/sv.c
+++ b/sv.c
@@ -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);
diff --git a/sv.h b/sv.h
index 63eccbd8f2..db2843bdc7 100644
--- a/sv.h
+++ b/sv.h
@@ -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); \