Loop in S_init_perllib(), only calling S_incpush*() with INCPUSH_ADD_OLD_VERS
[p5sagit/p5-mst-13.2.git] / hv.h
diff --git a/hv.h b/hv.h
index 1481d5b..9322377 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -41,15 +41,21 @@ struct shared_he {
    Use the funcs in mro.c
 */
 
-
-/* structure may change, so not public yet */
-struct mro_alg;
+struct mro_alg {
+    AV *(*resolve)(pTHX_ HV* stash, U32 level);
+    const char *name;
+    U16 length;
+    U16        kflags; /* For the hash API - set HVhek_UTF8 if name is UTF-8 */
+    U32 hash; /* or 0 */
+};
 
 struct mro_meta {
-    /* repurposed as a hash holding the different MROs private data. */
-    AV      *mro_linear_dfs; /* cached dfs @ISA linearization */
-    /* repurposed as a pointer directly to the current MROs private data.  */
-    AV      *mro_linear_c3;  /* cached c3 @ISA linearization */
+    /* a hash holding the different MROs private data.  */
+    HV      *mro_linear_all;
+    /* a pointer directly to the current MROs private data.  If mro_linear_all
+       is NULL, this owns the SV reference, else it is just a pointer to a
+       value stored in and owned by mro_linear_all.  */
+    SV      *mro_linear_current;
     HV      *mro_nextmethod; /* next::method caching */
     U32     cache_gen;       /* Bumping this invalidates our method cache */
     U32     pkg_gen;         /* Bumps when local methods/@ISA change */
@@ -59,7 +65,7 @@ struct mro_meta {
 
 #define MRO_GET_PRIVATE_DATA(smeta, which)                \
     (((smeta)->mro_which && (which) == (smeta)->mro_which) \
-     ? MUTABLE_SV((smeta)->mro_linear_c3)                 \
+     ? (smeta)->mro_linear_current                        \
      : Perl_mro_get_private_data(aTHX_ (smeta), (which)))
 
 /* Subject to change.
@@ -261,7 +267,7 @@ C<SV*>.
    caller's responsibility */
 #define HvMROMETA(hv) (HvAUX(hv)->xhv_mro_meta \
                        ? HvAUX(hv)->xhv_mro_meta \
-                       : mro_meta_init(hv))
+                       : Perl_mro_meta_init(aTHX_ hv))
 
 /* FIXME - all of these should use a UTF8 aware API, which should also involve
    getting the length. */
@@ -361,6 +367,9 @@ C<SV*>.
 #define HVhek_FREEKEY  0x100 /* Internal flag to say key is malloc()ed.  */
 #define HVhek_PLACEHOLD        0x200 /* Internal flag to create placeholder.
                                * (may change, but Storable is a core module) */
+#define HVhek_KEYCANONICAL 0x400 /* Internal flag - key is in canonical form.
+                                   If the string is UTF-8, it cannot be
+                                   converted to bytes. */
 #define HVhek_MASK     0xFF
 
 /* Which flags enable HvHASKFLAGS? Somewhat a hack on a hack, as