X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=1aaee59a89012c9f3a3559a478b92bc521235bd2;hb=6fbaa68a2b566293f43f6d0d9e30e2cefc4d3164;hp=d6a036109e9361689d5b54e1a570078a3a6eaa30;hpb=44ebaf214d875023892e1fcbaf9e864b01c5c7e0;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index d6a0361..1aaee59 100644 --- a/hv.h +++ b/hv.h @@ -38,12 +38,33 @@ struct shared_he { /* Subject to change. Don't access this directly. + Use the funcs in mro.c */ + +typedef enum { + MRO_DFS, /* 0 */ + MRO_C3 /* 1 */ +} mro_alg; + +struct mro_meta { + AV *mro_linear_dfs; /* cached dfs @ISA linearization */ + AV *mro_linear_c3; /* cached c3 @ISA linearization */ + 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? */ +}; + +/* Subject to change. + Don't access this directly. +*/ + struct xpvhv_aux { HEK *xhv_name; /* name, if a symbol table */ AV *xhv_backreferences; /* back references for weak references */ HE *xhv_eiter; /* current entry of iterator */ I32 xhv_riter; /* current root of iterator */ + struct mro_meta *xhv_mro_meta; }; /* hash structure: */ @@ -240,6 +261,13 @@ C. #define HvRITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1) #define HvEITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : 0) #define HvNAME(hv) HvNAME_get(hv) + +/* Checking that hv is a valid package stash is the + caller's responsibility */ +#define HvMROMETA(hv) (HvAUX(hv)->xhv_mro_meta \ + ? HvAUX(hv)->xhv_mro_meta \ + : mro_meta_init(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. */ @@ -403,13 +431,13 @@ struct refcounted_he { #else HEK *refcounted_he_hek; /* hint key */ #endif - U32 refcounted_he_refcnt; /* reference count */ union { IV refcounted_he_u_iv; UV refcounted_he_u_uv; STRLEN refcounted_he_u_len; void *refcounted_he_u_ptr; /* Might be useful in future */ } refcounted_he_val; + U32 refcounted_he_refcnt; /* reference count */ /* First byte is flags. Then NUL-terminated value. Then for ithreads, non-NUL terminated key. */ char refcounted_he_data[1]; @@ -451,6 +479,15 @@ struct refcounted_he { # define HINTS_REFCNT_TERM NOOP #endif +/* 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 + /* * Local variables: * c-indentation-style: bsd