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;
}