The new Archive::Tar tests are TODO on VMS for reasons unrelated
[p5sagit/p5-mst-13.2.git] / hv.h
diff --git a/hv.h b/hv.h
index 7fb9fc4..b8d6b7d 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -41,23 +41,17 @@ 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 */
-    AV          *mro_linear_c3; /* cached c3 @ISA linearization */
-    HV         *mro_isarev;    /* reverse @ISA dependencies (who depends on us?) */
-    HV         *mro_nextmethod; /* next::method caching */
-    mro_alg     mro_which;      /* which mro alg is in use? */
-    U32         sub_generation; /* Like PL_sub_generation, but stash-local */
-    I32         is_universal;   /* We are UNIVERSAL or a potentially indirect
-                                   member of @UNIVERSAL::ISA */
-    I32         fake;           /* setisa made this fake package,
-                                   gv_fetchmeth pays attention to this,
-                                   and "package" sets it back to zero */
+    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 */
+    const struct mro_alg *mro_which; /* which mro alg is in use? */
 };
 
 /* Subject to change.
@@ -264,15 +258,21 @@ C<SV*>.
 #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)
-#define HvMROMETA(hv)  (HvAUX(hv)->xhv_mro_meta ? HvAUX(hv)->xhv_mro_meta : mro_meta_init(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.  */
-#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)
 
@@ -411,6 +411,43 @@ C<SV*>.
        ->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
@@ -478,6 +515,18 @@ struct refcounted_he {
 #  define HINTS_REFCNT_TERM            NOOP
 #endif
 
+/* Hash actions
+ * Passed in PERL_MAGIC_uvar calls
+ */
+#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:
  * c-indentation-style: bsd