[pylucene-dev] two different JCC modules in same VM; initVM()?

Andi Vajda vajda at osafoundation.org
Thu Mar 6 21:53:14 PST 2008


On Thu, 6 Mar 2008, Bill Janssen wrote:

>>>>> goodstuff.initVM(classpath=lucene.CLASSPATH, maxheap='2000m', env=lucene.getVMEnv())
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: <jcc.JCCEnv object at 0xb7ed0240>
>>>>>
>
> Hmmm, when I think about it, there's no way this can work.  The
> comparison in jcc.cpp is
>
>        if (!PyObject_TypeCheck((PyObject *) jccenv, &JCCEnvType))
>
> and PyObject_TypeCheck compares the two pointers for equality, but the
> two different "JCCEnvType" variables are in two different shared
> libraries.  So they'll never match.

Yeah, that's the bug.
I could check the type name strings instead, as a fallback workaround.

This surfaces the related issue that a Java object from one module is not 
going to be considered a Java object by another module since JObject, the 
root wrapper type, is also duplicated. So passing objects around across 
modules is not going to work well currently.

The way to properly fix this is to have a separate JCC runtime python 
extension that has all these common types. Instead of compiling the JCC 
runtime code into each module, make its own python extension and import 
these types from it.

This gets hairier, though, with Java classes that each module you build 
might have in common, in particular, as a dependency into the JRE.
java.lang.Object from one is not the same as java.lang.Object from the 
other, for example, so passing their instances across extensions is not 
going to work at the moment.

In the meantime, just compile all your java modules into one python 
extension. This is how lucene is built. All the jars included are compiled 
together into PyLucene's lucene python module.

Andi..


More information about the pylucene-dev mailing list