Re: undefined symbol: mro_meta_init on 5.10.0

Dave Mitchell <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
On Mon, Feb 13, 2012 at 03:42:21PM +0000, Dave Mitchell wrote:
> On Mon, Feb 13, 2012 at 01:43:00PM +0000, Martin J. Evans wrote:
> > It seems to come from the following in DBI.xs:
> > 
> > #ifdef HvMROMETA /*introduced in 5.9.5 */
> >                 + HvMROMETA(stash)->cache_gen
> > #endif
> 
> It turns out that the function mro_meta_init wasn't exported in 5.10.0,
> only in 5.10.1 onwards. I'll work up a fix.

Now attached.

-- 
My get-up-and-go just got up and went.
mro_meta_init.diff (text/plain, 1.6 KB)
diff --git a/DBI.xs b/DBI.xs
index cc64857..7ce9326 100644
--- a/DBI.xs
+++ b/DBI.xs
@@ -29,6 +29,20 @@ static int use_xsbypass = 1; /* set in dbi_bootinit() */
 
 #define DBI_MAGIC '~'
 
+/* HvMROMETA introduced in 5.9.5, but mro_meta_init not exported in 5.10.0 */
+#if (PERL_VERSION < 10)
+#  define MY_cache_gen(stash) 0
+#else
+#  if ((PERL_VERSION == 10) && (PERL_SUBVERSION == 0))
+#    define MY_cache_gen(stash) \
+        (HvAUX(stash)->xhv_mro_meta \
+        ? HvAUX(stash)->xhv_mro_meta->cache_gen \
+        : 0)
+#  else
+#    define MY_cache_gen(stash) HvMROMETA(stash)->cache_gen
+#  endif
+#endif
+
 /* If the tests fail with errors about 'setlinebuf' then try    */
 /* deleting the lines in the block below except the setvbuf one */
 #ifndef PerlIO_setlinebuf
@@ -234,10 +248,7 @@ static GV* inner_method_lookup(pTHX_ HV *stash, CV *cv, const char *meth_name)
 
         if (  (c=(method_cache_t *)(mg->mg_ptr))
             && c->stash == stash
-            && c->generation == PL_sub_generation
-#ifdef HvMROMETA /*introduced in 5.9.5 */
-                + HvMROMETA(stash)->cache_gen
-#endif
+            && c->generation == PL_sub_generation + MY_cache_gen(stash)
         )
             return c->gv;
 
@@ -265,11 +276,7 @@ static GV* inner_method_lookup(pTHX_ HV *stash, CV *cv, const char *meth_name)
     SvREFCNT_inc(gv);
     c->stash = stash;
     c->gv    = gv;
-    c->generation = PL_sub_generation
-#ifdef HvMROMETA
-            + HvMROMETA(stash)->cache_gen
-#endif
-    ;
+    c->generation = PL_sub_generation + MY_cache_gen(stash);
     return gv;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.