X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=3a3d867919bf67b8dadab745ce250eec984906ba;hb=d54344fc28d39ef8e90173262ec572bec67f5e6c;hp=a9fc9fb9af42cbca8847592fe8c8d050596b8c8b;hpb=4fee5c7184334b5d6258d0f47b645f04accfe0b7;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index a9fc9fb..3a3d867 100644 --- a/hv.h +++ b/hv.h @@ -33,6 +33,7 @@ struct xpvhv { STRLEN xhv_max; /* subscript of last element of xhv_array */ IV xhv_keys; /* how many elements in the array */ NV xnv_nv; /* numeric value, if any */ +#define xhv_placeholders xnv_nv MAGIC* xmg_magic; /* magic for scalar array */ HV* xmg_stash; /* class package */ @@ -64,7 +65,7 @@ struct xpvhv { /* =for apidoc AmU||HEf_SVKEY This flag, used in the length slot of hash entries and magic structures, -specifies the structure contains a C pointer where a C pointer +specifies the structure contains an C pointer where a C pointer is to be expected. (For information only--not to be used). =for apidoc AmU||Nullhv @@ -119,19 +120,38 @@ C. */ /* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */ -#define HEf_SVKEY -2 /* hent_key is a SV* */ +#define HEf_SVKEY -2 /* hent_key is an SV* */ #define Nullhv Null(HV*) -#define HvARRAY(hv) ((HE**)((XPVHV*) SvANY(hv))->xhv_array) +#define HvARRAY(hv) (*(HE***)&((XPVHV*) SvANY(hv))->xhv_array) #define HvFILL(hv) ((XPVHV*) SvANY(hv))->xhv_fill #define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max -#define HvKEYS(hv) ((XPVHV*) SvANY(hv))->xhv_keys #define HvRITER(hv) ((XPVHV*) SvANY(hv))->xhv_riter #define HvEITER(hv) ((XPVHV*) SvANY(hv))->xhv_eiter #define HvPMROOT(hv) ((XPVHV*) SvANY(hv))->xhv_pmroot #define HvNAME(hv) ((XPVHV*) SvANY(hv))->xhv_name +/* the number of keys (including any placeholers) */ +#define XHvTOTALKEYS(xhv) ((xhv)->xhv_keys) + +/* The number of placeholders in the enumerated-keys hash */ +#define XHvPLACEHOLDERS(xhv) ((xhv)->xhv_placeholders) + +/* the number of keys that exist() (i.e. excluding placeholers) */ +#define XHvUSEDKEYS(xhv) (XHvTOTALKEYS(xhv) - XHvPLACEHOLDERS(xhv)) + +/* + * HvKEYS gets the number of keys that actually exist(), and is provided + * for backwards compatibility with old XS code. The core uses HvUSEDKEYS + * (keys, excluding placeholdes) and HvTOTALKEYS (including placeholders) + */ +#define HvKEYS(hv) XHvUSEDKEYS((XPVHV*) SvANY(hv)) +#define HvUSEDKEYS(hv) XHvUSEDKEYS((XPVHV*) SvANY(hv)) +#define HvTOTALKEYS(hv) XHvTOTALKEYS((XPVHV*) SvANY(hv)) +#define HvPLACEHOLDERS(hv) XHvPLACEHOLDERS((XPVHV*) SvANY(hv)) + + #define HvSHAREKEYS(hv) (SvFLAGS(hv) & SVphv_SHAREKEYS) #define HvSHAREKEYS_on(hv) (SvFLAGS(hv) |= SVphv_SHAREKEYS) #define HvSHAREKEYS_off(hv) (SvFLAGS(hv) &= ~SVphv_SHAREKEYS) @@ -197,3 +217,7 @@ C. ? (size) * sizeof(HE*) \ : (size) * sizeof(HE*) * 2 - MALLOC_OVERHEAD) #endif + +/* available as a function in hv.c */ +#define Perl_sharepvn(sv, len, hash) HEK_KEY(share_hek(sv, len, hash)) +#define sharepvn(sv, len, hash) Perl_sharepvn(sv, len, hash)