X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=9322377f2d75110bd73d547e3890bcd85892a668;hb=a26c0e281cb6068a8d148933281d8186f1eb4206;hp=1481d5b8e9c77d4c3a981e7b918c75f1570a8b26;hpb=123892d916359369839f3896f283189be71dc32c;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index 1481d5b..9322377 100644 --- a/hv.h +++ b/hv.h @@ -41,15 +41,21 @@ struct shared_he { Use the funcs in mro.c */ - -/* structure may change, so not public yet */ -struct mro_alg; +struct mro_alg { + AV *(*resolve)(pTHX_ HV* stash, U32 level); + const char *name; + U16 length; + U16 kflags; /* For the hash API - set HVhek_UTF8 if name is UTF-8 */ + U32 hash; /* or 0 */ +}; 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 */ @@ -59,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. @@ -261,7 +267,7 @@ C. caller's responsibility */ #define HvMROMETA(hv) (HvAUX(hv)->xhv_mro_meta \ ? HvAUX(hv)->xhv_mro_meta \ - : mro_meta_init(hv)) + : Perl_mro_meta_init(aTHX_ hv)) /* FIXME - all of these should use a UTF8 aware API, which should also involve getting the length. */ @@ -361,6 +367,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