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 */
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.
#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) (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1)
-#define HvEITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : 0)
+#define HvEITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : NULL)
#define HvNAME(hv) HvNAME_get(hv)
/* Checking that hv is a valid package stash is the
/* 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) (SvOOK(hv) ? HvAUX(hv)->xhv_name : 0)
+#define HvNAME_HEK(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_name : NULL)
#define HvNAME_get(hv) ((SvOOK(hv) && (HvAUX(hv)->xhv_name)) \
- ? HEK_KEY(HvAUX(hv)->xhv_name) : 0)
+ ? HEK_KEY(HvAUX(hv)->xhv_name) : NULL)
#define HvNAMELEN_get(hv) ((SvOOK(hv) && (HvAUX(hv)->xhv_name)) \
? HEK_LEN(HvAUX(hv)->xhv_name) : 0)
->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
/* 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
+
+/*
+=for apidoc newHV
+
+Creates a new HV. The reference count is set to 1.
+
+=cut
+*/
+
+#define newHV() ((HV*)newSV_type(SVt_PVHV))
/*
* Local variables: