Fixes to threads tests
[p5sagit/p5-mst-13.2.git] / hv.h
diff --git a/hv.h b/hv.h
index 7047ea0..f8e38a1 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -47,17 +47,12 @@ typedef enum {
 } 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 */
-    U32                sub_generation; /* Like PL_sub_generation, but stash-local */
-    mro_alg    mro_which;      /* which mro alg is in use? */
-    unsigned int is_universal : 1;  /* We are UNIVERSAL or a potentially
-                                      indirect member of @UNIVERSAL::ISA */
-    unsigned int fake : 1;          /* 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 */
+    mro_alg mro_which;       /* which mro alg is in use? */
 };
 
 /* Subject to change.
@@ -264,17 +259,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)  (SvOOK(hv) \
-                       ? (HvAUX(hv)->xhv_mro_meta ? HvAUX(hv)->xhv_mro_meta : mro_meta_init(hv)) \
-                       : NULL)
+
+/* 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)
 
@@ -480,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