You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by va...@apache.org on 2009/03/18 20:15:48 UTC

svn commit: r755707 - in /lucene/pylucene/trunk: ./ jcc/ jcc/_jcc/ jcc/jcc/ jcc/jcc/sources/ test/

Author: vajda
Date: Wed Mar 18 19:15:48 2009
New Revision: 755707

URL: http://svn.apache.org/viewvc?rev=755707&view=rev
Log:
 - failure to call initVM() now reported with error instead of crash

Modified:
    lucene/pylucene/trunk/Makefile
    lucene/pylucene/trunk/jcc/CHANGES
    lucene/pylucene/trunk/jcc/_jcc/boot.cpp
    lucene/pylucene/trunk/jcc/jcc/cpp.py
    lucene/pylucene/trunk/jcc/jcc/python.py
    lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp
    lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h
    lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp
    lucene/pylucene/trunk/jcc/jcc/sources/functions.h
    lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp
    lucene/pylucene/trunk/test/test_PythonDirectory.py

Modified: lucene/pylucene/trunk/Makefile
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/Makefile?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/Makefile (original)
+++ lucene/pylucene/trunk/Makefile Wed Mar 18 19:15:48 2009
@@ -14,7 +14,7 @@
 # site-packages directory.
 #
 
-VERSION=2.4.1-rc4
+VERSION=2.4.1-rc5
 LUCENE_SVN_VER=HEAD
 LUCENE_VER=2.4.1
 LUCENE_SVN=http://svn.apache.org/repos/asf/lucene/java/tags/lucene_2_4_1

Modified: lucene/pylucene/trunk/jcc/CHANGES
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/CHANGES?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/CHANGES (original)
+++ lucene/pylucene/trunk/jcc/CHANGES Wed Mar 18 19:15:48 2009
@@ -16,6 +16,7 @@
  - added isCurrentThreadAttached() method to VMEnv
  - added MANIFEST.in to exclude generated jcc/config.py (Christian Heimes)
  - passing strings for byte[] or char[] is no longer supported, use JArray
+ - failure to call initVM() now reported with error instead of crash
 
 Version 2.0 -> 2.1
 ------------------

Modified: lucene/pylucene/trunk/jcc/_jcc/boot.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/boot.cpp?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/boot.cpp (original)
+++ lucene/pylucene/trunk/jcc/_jcc/boot.cpp Wed Mar 18 19:15:48 2009
@@ -18,8 +18,9 @@
 #include "java/lang/RuntimeException.h"
 #include "macros.h"
 
-extern PyTypeObject JObject$$Type, JCCEnv$$Type, ConstVariableDescriptor$$Type;
+extern PyTypeObject JObject$$Type, ConstVariableDescriptor$$Type;
 
+PyObject *initJCC(PyObject *module);
 PyObject *initVM(PyObject *self, PyObject *args, PyObject *kwds);
 
 namespace java {
@@ -49,8 +50,9 @@
     {
         PyObject *m = Py_InitModule3("_jcc", jcc_funcs, "_jcc");
 
+        initJCC(m);
+
         INSTALL_TYPE(JObject, m);
-        INSTALL_TYPE(JCCEnv, m);
         INSTALL_TYPE(ConstVariableDescriptor, m);
         java::lang::__install__(m);
     }

Modified: lucene/pylucene/trunk/jcc/jcc/cpp.py
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/cpp.py?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/cpp.py (original)
+++ lucene/pylucene/trunk/jcc/jcc/cpp.py Wed Mar 18 19:15:48 2009
@@ -637,16 +637,11 @@
         line(out, indent, 'static jfieldID *fids$;');
     line(out, indent, 'static jclass initializeClass();');
     line(out)
-    line(out, indent, 'static inline java::lang::Class *getclass$() {')
-    line(out, indent + 1, 'initializeClass();')
-    line(out, indent + 1, 'return class$;');
-    line(out, indent, '}')
-
-    line(out)
 
     line(out, indent, 'explicit %s(jobject obj) : %s(obj) {',
          cppname(names[-1]), '::'.join(cppnames(superNames)))
-    line(out, indent + 1, 'initializeClass();')
+    line(out, indent + 1, 'if (obj != NULL)');
+    line(out, indent + 2, 'initializeClass();')
     line(out, indent, '}')
     line(out, indent, '%s(const %s& obj) : %s(obj) {}',
          cppname(names[-1]), cppname(names[-1]),

Modified: lucene/pylucene/trunk/jcc/jcc/python.py
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/python.py?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/python.py (original)
+++ lucene/pylucene/trunk/jcc/jcc/python.py Wed Mar 18 19:15:48 2009
@@ -61,7 +61,7 @@
             return array + 's'
         if clsName == 'java.lang.Object':
             return array + 'o'
-        return array + 'j'
+        return array + 'k'
 
     def checkarg(cls):
         while cls.isArray():
@@ -69,7 +69,7 @@
         if (cls.isPrimitive() or
             cls.getName() in ('java.lang.String', 'java.lang.Object')):
             return ''
-        return ', %s::getclass$()' %(typename(cls, current, False))
+        return ', %s::initializeClass' %(typename(cls, current, False))
 
     def callarg(cls, i):
         return ', &a%d' %(i)
@@ -858,14 +858,14 @@
         line(out)
         line(out, indent, 'static PyObject *t_%s_cast_(PyTypeObject *type, PyObject *arg)', names[-1])
         line(out, indent, '{')
-        line(out, indent + 1, 'if (!(arg = castCheck(arg, %s::initializeClass(), 1)))', cppname(names[-1]))
+        line(out, indent + 1, 'if (!(arg = castCheck(arg, %s::initializeClass, 1)))', cppname(names[-1]))
         line(out, indent + 2, 'return NULL;')
         line(out, indent + 1, 'return t_%s::wrap_Object(%s(((t_%s *) arg)->object.this$));', names[-1], cppname(names[-1]), names[-1])
         line(out, indent, '}')
 
         line(out, indent, 'static PyObject *t_%s_instance_(PyTypeObject *type, PyObject *arg)', names[-1])
         line(out, indent, '{')
-        line(out, indent + 1, 'if (!castCheck(arg, %s::initializeClass(), 0))', cppname(names[-1]))
+        line(out, indent + 1, 'if (!castCheck(arg, %s::initializeClass, 0))', cppname(names[-1]))
         line(out, indent + 2, 'Py_RETURN_FALSE;')
         line(out, indent + 1, 'Py_RETURN_TRUE;')
         line(out, indent, '}')
@@ -1243,18 +1243,11 @@
         package(None, False, cppdir, namespaces, ())
 
     line(out)
+    line(out, 0, 'PyObject *initJCC(PyObject *module);')
     line(out, 0, 'void __install__(PyObject *module);')
     line(out, 0, 'extern PyTypeObject JObject$$Type, ConstVariableDescriptor$$Type, FinalizerClass$$Type, FinalizerProxy$$Type;')
     line(out, 0, 'extern void _install_jarray(PyObject *);')
     line(out)
-    line(out, 0, '#if defined(_jcc_shared) && (defined(_MSC_VER) || defined(__WIN32))')
-    line(out, 0, '#define _DLL_IMPORT __declspec(dllimport)')
-    line(out, 0, '#else')
-    line(out, 0, '#define _DLL_IMPORT')
-    line(out, 0, '#endif')
-    line(out, 0, '_DLL_IMPORT extern PyTypeObject JCCEnv$$Type;')
-
-    line(out)
     line(out, 0, 'extern "C" {')
 
     line(out)
@@ -1263,10 +1256,9 @@
     line(out, 2, 'PyObject *module = Py_InitModule3("%s", jcc_funcs, "");',
          extname);
     line(out)
-    line(out, 2, 'PyEval_InitThreads();')
+    line(out, 2, 'initJCC(module);')
     line(out)
     line(out, 2, 'INSTALL_TYPE(JObject, module);')
-    line(out, 2, 'INSTALL_TYPE(JCCEnv, module);')
     line(out, 2, 'INSTALL_TYPE(ConstVariableDescriptor, module);')
     line(out, 2, 'INSTALL_TYPE(FinalizerClass, module);')
     line(out, 2, 'INSTALL_TYPE(FinalizerProxy, module);')

Modified: lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp Wed Mar 18 19:15:48 2009
@@ -18,7 +18,6 @@
 
 #include "JCCEnv.h"
 
-extern JCCEnv *env;
 
 #if defined(_MSC_VER) || defined(__WIN32)
 _DLL_EXPORT DWORD VM_ENV = 0;
@@ -72,9 +71,16 @@
     }
 #endif
 
+    if (vm != NULL)
+        set_vm(vm, vm_env);
+    else
+        this->vm = NULL;
+}
+
+void JCCEnv::set_vm(JavaVM *vm, JNIEnv *vm_env)
+{
     this->vm = vm;
     set_vm_env(vm_env);
-    env = this;
 
     _sys = (jclass) vm_env->NewGlobalRef(vm_env->FindClass("java/lang/System"));
     _obj = (jclass) vm_env->NewGlobalRef(vm_env->FindClass("java/lang/Object"));
@@ -126,8 +132,20 @@
 {
     jclass cls = NULL;
 
-    if (env)
+    if (env->vm)
         cls = get_vm_env()->FindClass(className);
+#ifdef PYTHON
+    else
+    {
+        PythonGIL gil;
+
+        PyErr_SetString(PyExc_RuntimeError, "initVM() must be called first");
+        throw pythonError(NULL);
+    }
+#else
+    else
+        throw exception(NULL);
+#endif
 
     reportException();
 

Modified: lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h Wed Mar 18 19:15:48 2009
@@ -127,6 +127,7 @@
         return (JNIEnv *) pthread_getspecific(VM_ENV);
     }
 #endif
+    virtual void set_vm(JavaVM *vm, JNIEnv *vm_env);
     virtual void set_vm_env(JNIEnv *vm_env);
 
     virtual jclass findClass(const char *className);

Modified: lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp Wed Mar 18 19:15:48 2009
@@ -55,6 +55,8 @@
 
         if (cls)
             return t_Class::wrap_Object(Class(cls));
+    } catch (JCCEnv::pythonError e) {
+        return NULL;
     } catch (JCCEnv::exception e) {
         PyErr_SetJavaError(e.throwable);
         return NULL;
@@ -124,10 +126,25 @@
               break;
           }
 
-          case 'j':           /* Java object */
+          case 'j':           /* Java object, with class$    */
+          case 'k':           /* Java object, with initializeClass */
           {
-              Class *cls = va_arg(list, Class *);
-              
+              jclass cls = NULL;
+
+              switch (types[pos]) {
+                case 'j':
+                  cls = (jclass) va_arg(list, Class *)->this$;
+                  break;
+                case 'k':
+                  try {
+                      jclass (*initializeClass)() = va_arg(list, jclass (*)());
+                      cls = (*initializeClass)();
+                  } catch (JCCEnv::pythonError e) {
+                      return -1;
+                  }
+                  break;
+              }
+
               if (arg == Py_None)
                   break;
 
@@ -151,7 +168,7 @@
                           int ok =
                               (obj == Py_None ||
                                (PyObject_TypeCheck(obj, &Object$$Type) &&
-                                cls->isInstance(((t_Object *) obj)->object)));
+                                env->get_vm_env()->IsInstanceOf(((t_Object *) obj)->object.this$, cls)));
 
                           Py_DECREF(obj);
                           if (ok)
@@ -162,13 +179,13 @@
                   }
               }
               else if (PyObject_TypeCheck(arg, &Object$$Type) &&
-                       cls->isInstance(((t_Object *) arg)->object))
+                       env->get_vm_env()->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
                   break;
               else if (PyObject_TypeCheck(arg, &FinalizerProxy$$Type))
               {
                   arg = ((t_fp *) arg)->object;
                   if (PyObject_TypeCheck(arg, &Object$$Type) &&
-                      cls->isInstance(((t_Object *) arg)->object))
+                      env->get_vm_env()->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
                       break;
               }
 
@@ -454,8 +471,18 @@
           }
 
           case 'j':           /* Java object except String and Object */
+          case 'k':           /* Java object, with initializeClass    */
           {
-              Class *cls = va_arg(check, Class *);
+              jclass cls = NULL;
+
+              switch (types[pos]) {
+                case 'j':
+                  cls = (jclass) va_arg(check, Class *)->this$;
+                  break;
+                case 'k':
+                  jclass (*initializeClass)() = va_arg(check, jclass (*)());
+                  cls = (*initializeClass)();
+              }
 
               if (array)
               {
@@ -466,7 +493,7 @@
                   else if (PyObject_TypeCheck(arg, JArrayObject$$Type))
                       *array = ((t_jarray<jobject> *) arg)->array;
                   else 
-                      *array = JArray<jobject>((jclass) cls->this$, arg);
+                      *array = JArray<jobject>(cls, arg);
 
                   if (PyErr_Occurred())
                       return -1;
@@ -796,31 +823,40 @@
 
 PyObject *PyErr_SetArgsError(char *name, PyObject *args)
 {
-    PyObject *err = Py_BuildValue("(sO)", name, args);
+    if (!PyErr_Occurred())
+    {
+        PyObject *err = Py_BuildValue("(sO)", name, args);
 
-    PyErr_SetObject(PyExc_InvalidArgsError, err);
-    Py_DECREF(err);
+        PyErr_SetObject(PyExc_InvalidArgsError, err);
+        Py_DECREF(err);
+    }
 
     return NULL;
 }
 
 PyObject *PyErr_SetArgsError(PyObject *self, char *name, PyObject *args)
 {
-    PyObject *type = (PyObject *) self->ob_type;
-    PyObject *err = Py_BuildValue("(OsO)", type, name, args);
+    if (!PyErr_Occurred())
+    {
+        PyObject *type = (PyObject *) self->ob_type;
+        PyObject *err = Py_BuildValue("(OsO)", type, name, args);
 
-    PyErr_SetObject(PyExc_InvalidArgsError, err);
-    Py_DECREF(err);
+        PyErr_SetObject(PyExc_InvalidArgsError, err);
+        Py_DECREF(err);
+    }
 
     return NULL;
 }
 
 PyObject *PyErr_SetArgsError(PyTypeObject *type, char *name, PyObject *args)
 {
-    PyObject *err = Py_BuildValue("(OsO)", type, name, args);
+    if (!PyErr_Occurred())
+    {
+        PyObject *err = Py_BuildValue("(OsO)", type, name, args);
 
-    PyErr_SetObject(PyExc_InvalidArgsError, err);
-    Py_DECREF(err);
+        PyErr_SetObject(PyExc_InvalidArgsError, err);
+        Py_DECREF(err);
+    }
 
     return NULL;
 }
@@ -981,7 +1017,8 @@
     return value;
 }
 
-PyObject *castCheck(PyObject *obj, jclass cls, int reportError)
+PyObject *castCheck(PyObject *obj, jclass (*initializeClass)(),
+                    int reportError)
 {
     if (PyObject_TypeCheck(obj, &FinalizerProxy$$Type))
         obj = ((t_fp *) obj)->object;
@@ -994,12 +1031,24 @@
     }
 
     jobject jobj = ((t_Object *) obj)->object.this$;
-    
-    if (jobj && !env->get_vm_env()->IsInstanceOf(jobj, cls))
+
+    if (jobj)
     {
-        if (reportError)
-            PyErr_SetObject(PyExc_TypeError, obj);
-        return NULL;
+        jclass cls;
+
+        try {
+            cls = (*initializeClass)();
+        } catch (JCCEnv::pythonError e) {
+            return NULL;
+        }
+
+        if (!env->get_vm_env()->IsInstanceOf(jobj, cls))
+        {
+            if (reportError)
+                PyErr_SetObject(PyExc_TypeError, obj);
+
+            return NULL;
+        }
     }
 
     return obj;

Modified: lucene/pylucene/trunk/jcc/jcc/sources/functions.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/functions.h?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/functions.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/functions.h Wed Mar 18 19:15:48 2009
@@ -167,7 +167,8 @@
 PyObject *get_extension_nextElement(PyObject *self);
 
 jobjectArray fromPySequence(jclass cls, PyObject *sequence);
-PyObject *castCheck(PyObject *obj, jclass cls, int reportError);
+PyObject *castCheck(PyObject *obj, jclass (*initializeClass)(),
+                    int reportError);
 
 extern PyTypeObject FinalizerClass$$Type;
 extern PyTypeObject FinalizerProxy$$Type;

Modified: lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp Wed Mar 18 19:15:48 2009
@@ -25,7 +25,7 @@
 
 #include "JObject.h"
 #include "JCCEnv.h"
-
+#include "macros.h"
 
 _DLL_EXPORT JCCEnv *env;
 
@@ -64,7 +64,7 @@
     { NULL, NULL, 0, NULL }
 };
 
-_DLL_EXPORT PyTypeObject JCCEnv$$Type = {
+PyTypeObject JCCEnv$$Type = {
     PyObject_HEAD_INIT(NULL)
     0,                                   /* ob_size */
     "jcc.JCCEnv",                        /* tp_name */
@@ -261,7 +261,7 @@
 
 _DLL_EXPORT PyObject *getVMEnv(PyObject *self)
 {
-    if (env)
+    if (env->vm != NULL)
     {
         t_jccenv *jccenv = (t_jccenv *) JCCEnv$$Type.tp_alloc(&JCCEnv$$Type, 0);
         jccenv->env = env;
@@ -276,6 +276,21 @@
 static void registerNatives(JNIEnv *vm_env);
 #endif
 
+_DLL_EXPORT PyObject *initJCC(PyObject *module)
+{
+    if (env == NULL)
+    {
+        PyEval_InitThreads();
+        INSTALL_TYPE(JCCEnv, module);
+
+        env = new JCCEnv(NULL, NULL);
+
+        Py_RETURN_TRUE;
+    }
+
+    Py_RETURN_FALSE;
+}
+
 _DLL_EXPORT PyObject *initVM(PyObject *self, PyObject *args, PyObject *kwds)
 {
     static char *kwnames[] = {
@@ -292,7 +307,7 @@
                                      &vmargs))
         return NULL;
 
-    if (env)
+    if (env->vm)
     {
         if (initialheap || maxheap || maxstack || vmargs)
         {
@@ -382,11 +397,13 @@
             return NULL;
         }
 
+        env->set_vm(vm, vm_env);
+
         for (unsigned int i = 0; i < nOptions; i++)
             delete vm_options[i].optionString;
 
         t_jccenv *jccenv = (t_jccenv *) JCCEnv$$Type.tp_alloc(&JCCEnv$$Type, 0);
-        jccenv->env = new JCCEnv(vm, vm_env);
+        jccenv->env = env;
 
 #ifdef _jcc_lib
         registerNatives(vm_env);

Modified: lucene/pylucene/trunk/test/test_PythonDirectory.py
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/test/test_PythonDirectory.py?rev=755707&r1=755706&r2=755707&view=diff
==============================================================================
--- lucene/pylucene/trunk/test/test_PythonDirectory.py (original)
+++ lucene/pylucene/trunk/test/test_PythonDirectory.py Wed Mar 18 19:15:48 2009
@@ -147,7 +147,7 @@
 
     def createOutput(self, name):
         file_path = os.path.join(self.path, name)
-        fh = open(file_path, "w")
+        fh = open(file_path, "wb")
         stream = PythonFileStreamOutput(name, fh)
         self._streams.append(stream)
         return stream
@@ -180,7 +180,7 @@
     def openInput(self, name, bufferSize=0):
         file_path = os.path.join(self.path, name)
         try:
-            fh = open(file_path, 'r')
+            fh = open(file_path, "rb")
         except IOError:
             raise JavaError, IOException(name)
         stream = PythonFileStreamInput(name, fh, os.path.getsize(file_path))