X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=3898e124bd986162f54196452b5453763cfbf09e;hb=311a25d9bdebead7c924f8195b0287fe2a60a568;hp=81044c9097c9a753bcb32155e5e4fa2b299da137;hpb=27bcc0a7e6b15b7b0d6f632d5f31918abd005ef4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index 81044c9..3898e12 100644 --- a/hv.h +++ b/hv.h @@ -1,7 +1,7 @@ /* hv.h * * Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, - * 2000, 2001, 2002, by Larry Wall and others + * 2000, 2001, 2002, 2005, by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -29,24 +29,51 @@ struct hek { is UTF-8 */ }; + +/* Subject to change. + Don't access this directly. +*/ +struct xpvhv_aux { + HEK *xhv_name; /* name, if a symbol table */ + HE *xhv_eiter; /* current entry of iterator */ + I32 xhv_riter; /* current root of iterator */ +}; + /* hash structure: */ /* This structure must match the beginning of struct xpvmg in sv.h. */ struct xpvhv { - char * xhv_array; /* pointer to malloced string */ + NV xnv_nv; /* numeric value, if any */ STRLEN xhv_fill; /* how full xhv_array currently is */ 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 + union { + IV xivu_iv; /* integer value or pv offset */ + UV xivu_uv; + void * xivu_p1; + } xiv_u; MAGIC* xmg_magic; /* magic for scalar array */ HV* xmg_stash; /* class package */ - - I32 xhv_riter; /* current root of iterator */ - HE *xhv_eiter; /* current entry of iterator */ - PMOP *xhv_pmroot; /* list of pm's for this package */ - char *xhv_name; /* name, if a symbol table */ + struct xpvhv_aux *xhv_aux; }; +#define xhv_keys xiv_u.xivu_iv + +#if !defined(PERL_EXPERIMENTAL_LAYOUT) +typedef struct xpvhv xpvhv_allocated; +#else +typedef struct { + STRLEN xhv_fill; /* how full xhv_array currently is */ + STRLEN xhv_max; /* subscript of last element of xhv_array */ + union { + IV xivu_iv; /* integer value or pv offset */ + UV xivu_uv; + void * xivu_p1; + } xiv_u; + MAGIC* xmg_magic; /* magic for scalar array */ + HV* xmg_stash; /* class package */ + struct xpvhv_aux *xhv_aux; +} xpvhv_allocated; +#endif + /* hash a key */ /* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins * from requirements by Colin Plumb. @@ -64,7 +91,7 @@ struct xpvhv { * If USE_HASH_SEED_EXPLICIT is defined, hash randomisation is done * only if the environment variable PERL_HASH_SEED is set. * For maximal control, one can define PERL_HASH_SEED. - * (see also erl.c:perl_parse()). + * (see also perl.c:perl_parse()). */ #ifndef PERL_HASH_SEED # if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT) @@ -176,32 +203,41 @@ C. #define Nullhv Null(HV*) -#define HvARRAY(hv) (*(HE***)&((XPVHV*) SvANY(hv))->xhv_array) +#define HvARRAY(hv) (*(HE***)&((hv)->sv_u.svu_array)) #define HvFILL(hv) ((XPVHV*) SvANY(hv))->xhv_fill #define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max -#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 +#define HvRITER(hv) (*Perl_hv_riter_p(aTHX_ (HV*)(hv))) +#define HvEITER(hv) (*Perl_hv_eiter_p(aTHX_ (HV*)(hv))) +#define HvRITER_set(hv,r) Perl_hv_riter_set(aTHX_ (HV*)(hv), r) +#define HvEITER_set(hv,e) Perl_hv_eiter_set(aTHX_ (HV*)(hv), e) +#define HvRITER_get(hv) (((XPVHV *)SvANY(hv))->xhv_aux ? \ + ((struct xpvhv_aux*)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_riter : -1) +#define HvEITER_get(hv) (((XPVHV *)SvANY(hv))->xhv_aux ? \ + ((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_eiter : 0) +#define HvNAME(hv) HvNAME_get(hv) +/* FIXME - all of these should use a UTF8 aware API, which should also involve + getting the length. */ +/* This macro may go away without notice. */ +#define HvNAME_HEK(hv) (((XPVHV *)SvANY(hv))->xhv_aux && (((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_name) ? ((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_name: 0) +#define HvNAME_get(hv) (((XPVHV *)SvANY(hv))->xhv_aux ? \ + (((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_name) ? HEK_KEY(((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_name) : 0 : 0) +#define HvNAMELEN_get(hv) (((XPVHV *)SvANY(hv))->xhv_aux ? \ + (((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_name) ? HEK_LEN(((struct xpvhv_aux *)((XPVHV *)SvANY(hv))->xhv_aux)->xhv_name) : 0 : 0) /* 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 placeholders) */ -#define XHvUSEDKEYS(xhv) (XHvTOTALKEYS(xhv) - (IV)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 HvKEYS(hv) HvUSEDKEYS(hv) +#define HvUSEDKEYS(hv) (HvTOTALKEYS(hv) - HvPLACEHOLDERS_get(hv)) #define HvTOTALKEYS(hv) XHvTOTALKEYS((XPVHV*) SvANY(hv)) -#define HvPLACEHOLDERS(hv) XHvPLACEHOLDERS((XPVHV*) SvANY(hv)) +#define HvPLACEHOLDERS(hv) (*Perl_hv_placeholders_p(aTHX_ (HV*)hv)) +#define HvPLACEHOLDERS_get(hv) (SvMAGIC(hv) ? Perl_hv_placeholders_get(aTHX_ (HV*)hv) : 0) +#define HvPLACEHOLDERS_set(hv,p) Perl_hv_placeholders_set(aTHX_ (HV*)hv, p) #define HvSHAREKEYS(hv) (SvFLAGS(hv) & SVphv_SHAREKEYS) #define HvSHAREKEYS_on(hv) (SvFLAGS(hv) |= SVphv_SHAREKEYS) @@ -305,7 +341,10 @@ C. #define HEK_REHASH_on(hek) (HEK_FLAGS(hek) |= HVhek_REHASH) /* calculate HV array allocation */ -#if defined(STRANGE_MALLOC) || defined(MYMALLOC) +#ifndef PERL_USE_LARGE_HV_ALLOC +/* Default to allocating the correct size - default to assuming that malloc() + is not broken and is efficient at allocating blocks sized at powers-of-two. +*/ # define PERL_HV_ARRAY_ALLOC_BYTES(size) ((size) * sizeof(HE*)) #else # define MALLOC_OVERHEAD 16 @@ -321,3 +360,13 @@ C. /* 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) + +/* + * Local variables: + * c-indentation-style: bsd + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + * + * ex: set ts=8 sts=4 sw=4 noet: + */