X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=b8d6b7d243094077d2f7447aa652ddc5c97b0eec;hb=7a8275103724a565c49bc9103575d42057915b64;hp=f8e38a1dec696acdacdfb196feecbf9a353ae0d2;hpb=cef6ea9dde586d23f429802e75d22875450d6b68;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index f8e38a1..b8d6b7d 100644 --- a/hv.h +++ b/hv.h @@ -41,10 +41,9 @@ struct shared_he { Use the funcs in mro.c */ -typedef enum { - MRO_DFS, /* 0 */ - MRO_C3 /* 1 */ -} mro_alg; + +/* structure may change, so not public yet */ +struct mro_alg; struct mro_meta { AV *mro_linear_dfs; /* cached dfs @ISA linearization */ @@ -52,7 +51,7 @@ struct mro_meta { HV *mro_nextmethod; /* next::method caching */ U32 cache_gen; /* Bumping this invalidates our method cache */ U32 pkg_gen; /* Bumps when local methods/@ISA change */ - mro_alg mro_which; /* which mro alg is in use? */ + const struct mro_alg *mro_which; /* which mro alg is in use? */ }; /* Subject to change. @@ -412,6 +411,43 @@ C. ->shared_he_he.he_valu.hent_refcount), \ hek) +#define hv_store_ent(zlonk, awk, touche, zgruppp) \ + ((HE *) hv_common((zlonk), (awk), NULL, 0, 0, HV_FETCH_ISSTORE, \ + (touche), (zgruppp))) + +#define hv_exists_ent(zlonk, awk, zgruppp) \ + (hv_common((zlonk), (awk), NULL, 0, 0, HV_FETCH_ISEXISTS, 0, (zgruppp))\ + ? TRUE : FALSE) +#define hv_fetch_ent(zlonk, awk, touche, zgruppp) \ + ((HE *) hv_common((zlonk), (awk), NULL, 0, 0, \ + ((touche) ? HV_FETCH_LVALUE : 0), NULL, (zgruppp))) +#define hv_delete_ent(zlonk, awk, touche, zgruppp) \ + ((SV *) hv_common((zlonk), (awk), NULL, 0, 0, (touche) | HV_DELETE, \ + NULL, (zgruppp))) + +#define hv_store_flags(urkk, zamm, clunk, thwape, sploosh, eee_yow) \ + ((SV**) hv_common((urkk), NULL, (zamm), (clunk), (eee_yow), \ + (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (thwape), \ + (sploosh))) + +#define hv_store(urkk, zamm, clunk, thwape, sploosh) \ + ((SV**) hv_common_key_len((urkk), (zamm), (clunk), \ + (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), \ + (thwape), (sploosh))) + +#define hv_exists(urkk, zamm, clunk) \ + (hv_common_key_len((urkk), (zamm), (clunk), HV_FETCH_ISEXISTS, NULL, 0) \ + ? TRUE : FALSE) + +#define hv_fetch(urkk, zamm, clunk, pam) \ + ((SV**) hv_common_key_len((urkk), (zamm), (clunk), (pam) \ + ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \ + : HV_FETCH_JUST_SV, NULL, 0)) + +#define hv_delete(urkk, zamm, clunk, pam) \ + ((SV*) hv_common_key_len((urkk), (zamm), (clunk), \ + (pam) | HV_DELETE, NULL, 0)) + /* This refcounted he structure is used for storing the hints used for lexical pragmas. Without threads, it's basically struct he + refcount. With threads, life gets more complex as the structure needs to be shared @@ -482,11 +518,14 @@ struct refcounted_he { /* Hash actions * Passed in PERL_MAGIC_uvar calls */ -#define HV_DELETE -1 -#define HV_FETCH_ISSTORE 0x01 -#define HV_FETCH_ISEXISTS 0x02 -#define HV_FETCH_LVALUE 0x04 -#define HV_FETCH_JUST_SV 0x08 +#define HV_DISABLE_UVAR_XKEY 0x01 +/* We need to ensure that these don't clash with G_DISCARD, which is 2, as it + is documented as being passed to hv_delete(). */ +#define HV_FETCH_ISSTORE 0x04 +#define HV_FETCH_ISEXISTS 0x08 +#define HV_FETCH_LVALUE 0x10 +#define HV_FETCH_JUST_SV 0x20 +#define HV_DELETE 0x40 /* * Local variables: