From: Nicholas Clark Date: Sat, 25 Feb 2006 15:38:25 +0000 (+0000) Subject: xgv_stash can be stored as a union with the NV, reducing the size of X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=584307902de552f84517013f42d1db478f4102bd;p=p5sagit%2Fp5-mst-13.2.git xgv_stash can be stored as a union with the NV, reducing the size of PVGVs by another pointer. p4raw-id: //depot/perl@27326 --- diff --git a/av.h b/av.h index 61a01f0..94cd82b 100644 --- a/av.h +++ b/av.h @@ -9,7 +9,10 @@ */ struct xpvav { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; SSize_t xav_fill; /* Index of last element present */ SSize_t xav_max; /* max index for which array has space */ union { diff --git a/cv.h b/cv.h index 960e727..6d93d71 100644 --- a/cv.h +++ b/cv.h @@ -11,7 +11,10 @@ /* This structure must the beginning of XPVFM in sv.h */ struct xpvcv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of xp_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { diff --git a/gv.h b/gv.h index 4ba000d..3e2bc90 100644 --- a/gv.h +++ b/gv.h @@ -41,7 +41,7 @@ struct gp { (*({ GV *_gv = (GV *) gv; \ assert(isGV_with_GP(_gv)); \ assert(SvTYPE(_gv) == SVt_PVGV || SvTYPE(_gv) >= SVt_PVLV); \ - &(GvXPVGV(_gv)->xgv_stash); \ + &(GvXPVGV(_gv)->xnv_u.xgv_stash); \ })) # define GvNAME(gv) \ (*({ GV *zzzz = (GV *) gv; \ @@ -58,7 +58,7 @@ struct gp { #else # define GvGP(gv) ((gv)->sv_u.svu_gp) # define GvFLAGS(gv) (GvXPVGV(gv)->xgv_flags) -# define GvSTASH(gv) (GvXPVGV(gv)->xgv_stash) +# define GvSTASH(gv) (GvXPVGV(gv)->xnv_u.xgv_stash) # define GvNAME(gv) (GvXPVGV(gv)->xgv_name) # define GvNAMELEN(gv) (GvXPVGV(gv)->xgv_namelen) #endif diff --git a/hv.h b/hv.h index 0fd0e6b..4f4d3aa 100644 --- a/hv.h +++ b/hv.h @@ -49,7 +49,10 @@ struct xpvhv_aux { /* hash structure: */ /* This structure must match the beginning of struct xpvmg in sv.h. */ struct xpvhv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xhv_fill; /* how full xhv_array currently is */ STRLEN xhv_max; /* subscript of last element of xhv_array */ union { diff --git a/sv.h b/sv.h index 1d62a88..7c098be 100644 --- a/sv.h +++ b/sv.h @@ -301,7 +301,10 @@ perform the upgrade if necessary. See C. struct xpv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ }; @@ -316,7 +319,10 @@ typedef struct { #endif struct xpviv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -345,7 +351,10 @@ typedef struct { #define xiv_iv xiv_u.xivu_iv struct xpvuv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -358,7 +367,10 @@ struct xpvuv { #define xuv_uv xuv_u.xuvu_uv struct xpvnv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -371,7 +383,10 @@ struct xpvnv { /* These structure must match the beginning of struct xpvhv in hv.h. */ struct xpvmg { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -388,7 +403,10 @@ struct xpvmg { }; struct xpvlv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -406,7 +424,6 @@ struct xpvlv { /* a full glob fits into this */ char* xgv_name; STRLEN xgv_namelen; - HV* xgv_stash; U8 xgv_flags; STRLEN xlv_targoff; @@ -417,7 +434,10 @@ struct xpvlv { }; struct xpvgv { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; + HV * xgv_stash; /* The stash of this GV */ + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -434,12 +454,14 @@ struct xpvgv { char* xgv_name; STRLEN xgv_namelen; - HV* xgv_stash; U8 xgv_flags; }; struct xpvbm { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -464,7 +486,10 @@ struct xpvbm { typedef U16 cv_flags_t; struct xpvfm { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -535,7 +560,10 @@ typedef struct { } xpvfm_allocated; struct xpvio { - NV xnv_nv; /* numeric value, if any */ + union { + NV xnv_nv; /* numeric value, if any */ + HV * xgv_stash; + } xnv_u; STRLEN xpv_cur; /* length of svu_pv as a C string */ STRLEN xpv_len; /* allocated size */ union { @@ -980,7 +1008,7 @@ in gv.h: */ +0.0 + -0.0 => +0.0 but -0.0 + -0.0 => -0.0 */ # define SvIVX(sv) (0 + ((XPVIV*) SvANY(sv))->xiv_iv) # define SvUVX(sv) (0 + ((XPVUV*) SvANY(sv))->xuv_uv) -# define SvNVX(sv) (-0.0 + ((XPVNV*) SvANY(sv))->xnv_nv) +# define SvNVX(sv) (-0.0 + ((XPVNV*) SvANY(sv))->xnv_u.xnv_nv) /* Don't test the core XS code yet. */ # if defined (PERL_CORE) && PERL_DEBUG_COW > 1 # define SvPVX(sv) (0 + (assert(!SvREADONLY(sv)), (sv)->sv_u.svu_pv)) @@ -1038,7 +1066,7 @@ in gv.h: */ assert(SvTYPE(_svi) != SVt_PVHV); \ assert(SvTYPE(_svi) != SVt_PVFM); \ assert(!isGV_with_GP(_svi)); \ - &(((XPVNV*) SvANY(_svi))->xnv_nv); \ + &(((XPVNV*) SvANY(_svi))->xnv_u.xnv_nv); \ })) # define SvMAGIC(sv) \ (*({ SV *const _svi = (SV *) sv; \ @@ -1054,7 +1082,7 @@ in gv.h: */ # define SvPVX(sv) ((sv)->sv_u.svu_pv) # define SvIVX(sv) ((XPVIV*) SvANY(sv))->xiv_iv # define SvUVX(sv) ((XPVUV*) SvANY(sv))->xuv_uv -# define SvNVX(sv) ((XPVNV*) SvANY(sv))->xnv_nv +# define SvNVX(sv) ((XPVNV*) SvANY(sv))->xnv_u.xnv_nv # define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_u.xmg_magic # define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash # endif @@ -1092,7 +1120,7 @@ in gv.h: */ #define SvNV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \ assert(SvTYPE(sv) != SVt_PVAV); assert(SvTYPE(sv) != SVt_PVHV); \ - (((XPVNV*)SvANY(sv))->xnv_nv = (val)); } STMT_END + (((XPVNV*)SvANY(sv))->xnv_u.xnv_nv = (val)); } STMT_END #define SvPV_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \ ((sv)->sv_u.svu_pv = (val)); } STMT_END