X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=390649605ac4a1e02ba910fa19ba1593af727827;hb=1ff5bc37303d3f603211be08e5e01dac62fcfa6c;hp=e75d75fd18a88cc384f20219af2682d1884d5032;hpb=b2685f0c86badfc357584d8dbfb2bf17057ea226;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index e75d75f..3906496 100644 --- a/hv.h +++ b/hv.h @@ -50,10 +50,12 @@ struct mro_alg { }; struct mro_meta { - /* repurposed as a hash holding the different MROs private data. */ - AV *mro_linear_dfs; /* cached dfs @ISA linearization */ - /* repurposed as a pointer directly to the current MROs private data. */ - AV *mro_linear_c3; /* cached c3 @ISA linearization */ + /* a hash holding the different MROs private data. */ + HV *mro_linear_all; + /* a pointer directly to the current MROs private data. If mro_linear_all + is NULL, this owns the SV reference, else it is just a pointer to a + value stored in and owned by mro_linear_all. */ + SV *mro_linear_current; HV *mro_nextmethod; /* next::method caching */ U32 cache_gen; /* Bumping this invalidates our method cache */ U32 pkg_gen; /* Bumps when local methods/@ISA change */ @@ -63,7 +65,7 @@ struct mro_meta { #define MRO_GET_PRIVATE_DATA(smeta, which) \ (((smeta)->mro_which && (which) == (smeta)->mro_which) \ - ? MUTABLE_SV((smeta)->mro_linear_c3) \ + ? (smeta)->mro_linear_current \ : Perl_mro_get_private_data(aTHX_ (smeta), (which))) /* Subject to change. @@ -78,31 +80,17 @@ struct xpvhv_aux { struct mro_meta *xhv_mro_meta; }; -#define _XPVHV_ALLOCATED_HEAD \ - STRLEN xhv_fill; /* how full xhv_array currently is */ \ - STRLEN xhv_max /* subscript of last element of xhv_array */ - -#define _XPVHV_HEAD \ - union _xnvu xnv_u; \ - _XPVHV_ALLOCATED_HEAD - /* hash structure: */ /* This structure must match the beginning of struct xpvmg in sv.h. */ struct xpvhv { - _XPVHV_HEAD; + union _xnvu xnv_u; + STRLEN xhv_fill; /* how full xhv_array currently is */ + STRLEN xhv_max; /* subscript of last element of xhv_array */ _XPVMG_HEAD; }; #define xhv_keys xiv_u.xivu_iv -typedef struct { - _XPVHV_ALLOCATED_HEAD; - _XPVMG_HEAD; -} xpvhv_allocated; - -#undef _XPVHV_ALLOCATED_HEAD -#undef _XPVHV_HEAD - /* hash a key */ /* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins * from requirements by Colin Plumb. @@ -365,6 +353,9 @@ C. #define HVhek_FREEKEY 0x100 /* Internal flag to say key is malloc()ed. */ #define HVhek_PLACEHOLD 0x200 /* Internal flag to create placeholder. * (may change, but Storable is a core module) */ +#define HVhek_KEYCANONICAL 0x400 /* Internal flag - key is in canonical form. + If the string is UTF-8, it cannot be + converted to bytes. */ #define HVhek_MASK 0xFF /* Which flags enable HvHASKFLAGS? Somewhat a hack on a hack, as