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/10/20 01:08:05 UTC

svn commit: r826864 - in /lucene/pylucene/trunk/jcc: CHANGES jcc/python.py jcc/sources/JArray.h jcc/sources/JCCEnv.cpp jcc/sources/JCCEnv.h jcc/sources/JObject.h jcc/sources/functions.cpp jcc/sources/functions.h jcc/sources/jcc.cpp

Author: vajda
Date: Mon Oct 19 23:08:04 2009
New Revision: 826864

URL: http://svn.apache.org/viewvc?rev=826864&view=rev
Log:
 - reworked iterator and enumeration 'next' templates to shortcut C++ wrappers

Modified:
    lucene/pylucene/trunk/jcc/CHANGES
    lucene/pylucene/trunk/jcc/jcc/python.py
    lucene/pylucene/trunk/jcc/jcc/sources/JArray.h
    lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp
    lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h
    lucene/pylucene/trunk/jcc/jcc/sources/JObject.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

Modified: lucene/pylucene/trunk/jcc/CHANGES
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/CHANGES?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/CHANGES (original)
+++ lucene/pylucene/trunk/jcc/CHANGES Mon Oct 19 23:08:04 2009
@@ -7,6 +7,7 @@
  - added (partial) support for Java generics
  - added 'string_' property to JArray('byte') instances to extract byte string
  - fixed bug with passing list of extension objects
+ - reworked iterator and enumeration 'next' templates to shortcut C++ wrappers
  - 
 
 Version 2.3 -> 2.4

Modified: lucene/pylucene/trunk/jcc/jcc/python.py
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/python.py?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/python.py (original)
+++ lucene/pylucene/trunk/jcc/jcc/python.py Mon Oct 19 23:08:04 2009
@@ -49,7 +49,7 @@
              'int': ('i', '(int) %s', False),
              'long': ('L', '(long long) %s', False),
              'short': ('i', '(int) %s', False),
-             'java.lang.String': ('O', 'env->fromJString((jstring) %s)', True) }
+             'java.lang.String': ('O', 'env->fromJString((jstring) %s, 0)', True) }
 
 
 def parseArgs(params, current, generics):
@@ -809,9 +809,9 @@
         if nextExt:
             tp_iternext = 'get_extension_next'
         elif generics and clsParams:
-            tp_iternext = '((PyObject *(*)(java::util::t_Iterator *)) get_generic_iterator_next<java::util::t_Iterator,%s%st_%s,%s>)' %(ns, sep, n, returnName)
+            tp_iternext = '((PyObject *(*)(java::util::t_Iterator *)) get_generic_iterator_next<java::util::t_Iterator,%s%st_%s>)' %(ns, sep, n)
         else:
-            tp_iternext = '((PyObject *(*)(java::util::t_Iterator *)) get_iterator_next<java::util::t_Iterator,%s%st_%s,%s>)' %(ns, sep, n, returnName)
+            tp_iternext = '((PyObject *(*)(java::util::t_Iterator *)) get_iterator_next<java::util::t_Iterator,%s%st_%s>)' %(ns, sep, n)
     elif nextElementMethod and enumeration.isAssignableFrom(cls):
         tp_iter = 'PyObject_SelfIter'
         returnName = typename(nextElementMethod.getReturnType(), cls, False)
@@ -819,9 +819,9 @@
         if nextElementExt:
             tp_iternext = 'get_extension_nextElement'
         elif generics and clsParams:
-            tp_iternext = '((PyObject *(*)(java::util::t_Enumeration *)) get_generic_enumeration_next<java::util::t_Enumeration,%s%st_%s,%s>)' %(ns, sep, n, returnName)
+            tp_iternext = '((PyObject *(*)(java::util::t_Enumeration *)) get_generic_enumeration_next<java::util::t_Enumeration,%s%st_%s>)' %(ns, sep, n)
         else:
-            tp_iternext = '((PyObject *(*)(java::util::t_Enumeration *)) get_enumeration_next<java::util::t_Enumeration,%s%st_%s,%s>)' %(ns, sep, n, returnName)
+            tp_iternext = '((PyObject *(*)(java::util::t_Enumeration *)) get_enumeration_next<java::util::t_Enumeration,%s%st_%s>)' %(ns, sep, n)
     elif nextMethod:
         tp_iter = 'PyObject_SelfIter'
         returnName = typename(nextMethod.getReturnType(), cls, False)

Modified: lucene/pylucene/trunk/jcc/jcc/sources/JArray.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/JArray.h?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/JArray.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/JArray.h Mon Oct 19 23:08:04 2009
@@ -272,9 +272,8 @@
         for (int i = lo; i < hi; i++) {
             jstring str = (jstring)
                 env->getObjectArrayElement((jobjectArray) this$, i);
-            PyObject *obj = env->fromJString(str);
+            PyObject *obj = env->fromJString(str, 1);
 
-            env->get_vm_env()->DeleteLocalRef(str);
             PyList_SET_ITEM(list, i - lo, obj);
         }
          
@@ -292,9 +291,8 @@
             {
                 jstring str = (jstring)
                     env->getObjectArrayElement((jobjectArray) this$, n);
-                PyObject *obj = env->fromJString(str);
+                PyObject *obj = env->fromJString(str, 1);
 
-                env->get_vm_env()->DeleteLocalRef(str);
                 return obj;
             }
         }

Modified: lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.cpp Mon Oct 19 23:08:04 2009
@@ -109,6 +109,13 @@
     _mids[mid_obj_getClass] =
         vm_env->GetMethodID(_obj, "getClass",
                             "()Ljava/lang/Class;");
+
+    _mids[mid_iterator_next] =
+        vm_env->GetMethodID(vm_env->FindClass("java/util/Iterator"),
+                            "next", "()Ljava/lang/Object;");
+    _mids[mid_enumeration_nextElement] =
+        vm_env->GetMethodID(vm_env->FindClass("java/util/Enumeration"),
+                            "nextElement", "()Ljava/lang/Object;");
 }
 
 #if defined(_MSC_VER) || defined(__WIN32)
@@ -131,19 +138,29 @@
 
 #endif
 
-jint JCCEnv::getJNIVersion()
+jint JCCEnv::getJNIVersion() const
 {
     return get_vm_env()->GetVersion();
 }
 
-jstring JCCEnv::getJavaVersion()
+jstring JCCEnv::getJavaVersion() const
 {
     return (jstring)
         callStaticObjectMethod(_sys, _mids[mid_sys_getProperty],
                                get_vm_env()->NewStringUTF("java.version"));
 }
 
-jclass JCCEnv::findClass(const char *className)
+jobject JCCEnv::iteratorNext(jobject obj) const
+{
+    return callObjectMethod(obj, _mids[mid_iterator_next]);
+}
+
+jobject JCCEnv::enumerationNext(jobject obj) const
+{
+    return callObjectMethod(obj, _mids[mid_enumeration_nextElement]);
+}
+
+jclass JCCEnv::findClass(const char *className) const
 {
     jclass cls = NULL;
 
@@ -184,7 +201,7 @@
     return cls;
 }
 
-void JCCEnv::registerNatives(jclass cls, JNINativeMethod *methods, int n)
+void JCCEnv::registerNatives(jclass cls, JNINativeMethod *methods, int n) const
 {
     get_vm_env()->RegisterNatives(cls, methods, n);
 }
@@ -309,13 +326,14 @@
     return array;
 }
 
-void JCCEnv::setObjectArrayElement(jobjectArray array, int n, jobject obj)
+void JCCEnv::setObjectArrayElement(jobjectArray array, int n,
+                                   jobject obj) const
 {
     get_vm_env()->SetObjectArrayElement(array, n, obj);
     reportException();
 }
 
-jobject JCCEnv::getObjectArrayElement(jobjectArray array, int n)
+jobject JCCEnv::getObjectArrayElement(jobjectArray array, int n) const
 {
     jobject obj = get_vm_env()->GetObjectArrayElement(array, n);
 
@@ -323,7 +341,7 @@
     return obj;
 }
 
-int JCCEnv::getArrayLength(jarray array)
+int JCCEnv::getArrayLength(jarray array) const
 {
     int len = get_vm_env()->GetArrayLength(array);
 
@@ -331,12 +349,14 @@
     return len;
 }
 
-jclass JCCEnv::getPythonExceptionClass()
+#ifdef PYTHON
+jclass JCCEnv::getPythonExceptionClass() const
 {
     return _thr;
 }
+#endif
 
-void JCCEnv::reportException()
+void JCCEnv::reportException() const
 {
     JNIEnv *vm_env = get_vm_env();
     jthrowable throwable = vm_env->ExceptionOccurred();
@@ -368,42 +388,42 @@
 }
 
 
-#define DEFINE_CALL(jtype, Type)                                        \
-    jtype JCCEnv::call##Type##Method(jobject obj,                       \
-                                     jmethodID mid, ...)                \
-    {                                                                   \
-        va_list ap;                                                     \
-        jtype result;                                                   \
-                                                                        \
-        va_start(ap, mid);                                              \
-        result = get_vm_env()->Call##Type##MethodV(obj, mid, ap);       \
-        va_end(ap);                                                     \
-                                                                        \
-        reportException();                                              \
-                                                                        \
-        return result;                                                  \
+#define DEFINE_CALL(jtype, Type)                                         \
+    jtype JCCEnv::call##Type##Method(jobject obj,                        \
+                                     jmethodID mid, ...) const           \
+    {                                                                    \
+        va_list ap;                                                      \
+        jtype result;                                                    \
+                                                                         \
+        va_start(ap, mid);                                               \
+        result = get_vm_env()->Call##Type##MethodV(obj, mid, ap);        \
+        va_end(ap);                                                      \
+                                                                         \
+        reportException();                                               \
+                                                                         \
+        return result;                                                   \
     }
 
-#define DEFINE_NONVIRTUAL_CALL(jtype, Type)                             \
-    jtype JCCEnv::callNonvirtual##Type##Method(jobject obj, jclass cls, \
-                                               jmethodID mid, ...)      \
-    {                                                                   \
-        va_list ap;                                                     \
-        jtype result;                                                   \
-                                                                        \
-        va_start(ap, mid);                                              \
-        result = get_vm_env()->CallNonvirtual##Type##MethodV(obj, cls,  \
-                                                             mid, ap);  \
-        va_end(ap);                                                     \
-                                                                        \
-        reportException();                                              \
-                                                                        \
-        return result;                                                  \
+#define DEFINE_NONVIRTUAL_CALL(jtype, Type)                              \
+    jtype JCCEnv::callNonvirtual##Type##Method(jobject obj, jclass cls,  \
+                                               jmethodID mid, ...) const \
+    {                                                                    \
+        va_list ap;                                                      \
+        jtype result;                                                    \
+                                                                         \
+        va_start(ap, mid);                                               \
+        result = get_vm_env()->CallNonvirtual##Type##MethodV(obj, cls,   \
+                                                             mid, ap);   \
+        va_end(ap);                                                      \
+                                                                         \
+        reportException();                                               \
+                                                                         \
+        return result;                                                   \
     }
 
 #define DEFINE_STATIC_CALL(jtype, Type)                                 \
     jtype JCCEnv::callStatic##Type##Method(jclass cls,                  \
-                                           jmethodID mid, ...)          \
+                                           jmethodID mid, ...) const    \
     {                                                                   \
         va_list ap;                                                     \
         jtype result;                                                   \
@@ -447,7 +467,7 @@
 DEFINE_STATIC_CALL(jlong, Long)
 DEFINE_STATIC_CALL(jshort, Short)
 
-void JCCEnv::callVoidMethod(jobject obj, jmethodID mid, ...)
+void JCCEnv::callVoidMethod(jobject obj, jmethodID mid, ...) const
 {
     va_list ap;
 
@@ -459,7 +479,7 @@
 }
 
 void JCCEnv::callNonvirtualVoidMethod(jobject obj, jclass cls,
-                                      jmethodID mid, ...)
+                                      jmethodID mid, ...) const
 {
     va_list ap;
 
@@ -470,7 +490,7 @@
     reportException();
 }
 
-void JCCEnv::callStaticVoidMethod(jclass cls, jmethodID mid, ...)
+void JCCEnv::callStaticVoidMethod(jclass cls, jmethodID mid, ...) const
 {
     va_list ap;
 
@@ -483,7 +503,7 @@
 
 
 jmethodID JCCEnv::getMethodID(jclass cls, const char *name,
-                              const char *signature)
+                              const char *signature) const
 {
     jmethodID id = get_vm_env()->GetMethodID(cls, name, signature);
 
@@ -493,7 +513,7 @@
 }
 
 jfieldID JCCEnv::getFieldID(jclass cls, const char *name,
-                            const char *signature)
+                            const char *signature) const
 {
     jfieldID id = get_vm_env()->GetFieldID(cls, name, signature);
 
@@ -504,7 +524,7 @@
 
 
 jmethodID JCCEnv::getStaticMethodID(jclass cls, const char *name,
-                                    const char *signature)
+                                    const char *signature) const
 {
     jmethodID id = get_vm_env()->GetStaticMethodID(cls, name, signature);
 
@@ -514,7 +534,7 @@
 }
 
 jobject JCCEnv::getStaticObjectField(jclass cls, const char *name,
-                                     const char *signature)
+                                     const char *signature) const
 {
     JNIEnv *vm_env = get_vm_env();
     jfieldID id = vm_env->GetStaticFieldID(cls, name, signature);
@@ -525,7 +545,8 @@
 }
 
 #define DEFINE_GET_STATIC_FIELD(jtype, Type, signature)                 \
-    jtype JCCEnv::getStatic##Type##Field(jclass cls, const char *name)  \
+    jtype JCCEnv::getStatic##Type##Field(jclass cls,                    \
+                                         const char *name) const        \
     {                                                                   \
         JNIEnv *vm_env = get_vm_env();                                  \
         jfieldID id = vm_env->GetStaticFieldID(cls, name, #signature);  \
@@ -543,7 +564,7 @@
 DEFINE_GET_STATIC_FIELD(jshort, Short, S)
 
 #define DEFINE_GET_FIELD(jtype, Type)                                   \
-    jtype JCCEnv::get##Type##Field(jobject obj, jfieldID id)            \
+    jtype JCCEnv::get##Type##Field(jobject obj, jfieldID id) const      \
     {                                                                   \
         jtype value = get_vm_env()->Get##Type##Field(obj, id);          \
         reportException();                                              \
@@ -560,11 +581,12 @@
 DEFINE_GET_FIELD(jlong, Long)
 DEFINE_GET_FIELD(jshort, Short)
 
-#define DEFINE_SET_FIELD(jtype, Type)                                    \
-    void JCCEnv::set##Type##Field(jobject obj, jfieldID id, jtype value) \
-    {                                                                    \
-        get_vm_env()->Set##Type##Field(obj, id, value);                  \
-        reportException();                                               \
+#define DEFINE_SET_FIELD(jtype, Type)                                   \
+    void JCCEnv::set##Type##Field(jobject obj, jfieldID id,             \
+                                  jtype value) const                    \
+    {                                                                   \
+        get_vm_env()->Set##Type##Field(obj, id, value);                 \
+        reportException();                                              \
     }
 
 DEFINE_SET_FIELD(jobject, Object)
@@ -607,7 +629,7 @@
     free(path);
 }
 
-jstring JCCEnv::fromUTF(const char *bytes)
+jstring JCCEnv::fromUTF(const char *bytes) const
 {
     jstring str = get_vm_env()->NewStringUTF(bytes);
 
@@ -616,7 +638,7 @@
     return str;
 }
 
-char *JCCEnv::toUTF(jstring str)
+char *JCCEnv::toUTF(jstring str) const
 {
     JNIEnv *vm_env = get_vm_env();
     int len = vm_env->GetStringUTFLength(str);
@@ -635,14 +657,14 @@
     return bytes;
 }
 
-char *JCCEnv::toString(jobject obj)
+char *JCCEnv::toString(jobject obj) const
 {
     return obj
         ? toUTF((jstring) callObjectMethod(obj, _mids[mid_obj_toString]))
         : NULL;
 }
 
-char *JCCEnv::getClassName(jobject obj)
+char *JCCEnv::getClassName(jobject obj) const
 {
     return obj
         ? toString(callObjectMethod(obj, _mids[mid_obj_getClass]))
@@ -651,7 +673,7 @@
 
 #ifdef PYTHON
 
-jstring JCCEnv::fromPyString(PyObject *object)
+jstring JCCEnv::fromPyString(PyObject *object) const
 {
     if (object == Py_None)
         return NULL;
@@ -694,43 +716,48 @@
     }
 }
 
-PyObject *JCCEnv::fromJString(jstring js)
+PyObject *JCCEnv::fromJString(jstring js, int delete_local_ref) const
 {
     if (!js)
         Py_RETURN_NONE;
 
     JNIEnv *vm_env = get_vm_env();
+    PyObject *string;
 
     if (sizeof(Py_UNICODE) == sizeof(jchar))
     {
         jboolean isCopy;
         const jchar *buf = vm_env->GetStringChars(js, &isCopy);
         jsize len = vm_env->GetStringLength(js);
-        PyObject *string = PyUnicode_FromUnicode((const Py_UNICODE *) buf, len);
 
+        string = PyUnicode_FromUnicode((const Py_UNICODE *) buf, len);
         vm_env->ReleaseStringChars(js, buf);
-        return string;
     }
     else
     {
         jsize len = vm_env->GetStringLength(js);
-        PyObject *string = PyUnicode_FromUnicode(NULL, len);
 
-        if (!string)
-            return NULL;
-
-        jboolean isCopy;
-        const jchar *jchars = vm_env->GetStringChars(js, &isCopy);
-        Py_UNICODE *pchars = PyUnicode_AS_UNICODE(string);
+        string = PyUnicode_FromUnicode(NULL, len);
+        if (string)
+        {
+            jboolean isCopy;
+            const jchar *jchars = vm_env->GetStringChars(js, &isCopy);
+            Py_UNICODE *pchars = PyUnicode_AS_UNICODE(string);
 
-        for (int i = 0; i < len; i++)
-            pchars[i] = (Py_UNICODE) jchars[i];
+            for (int i = 0; i < len; i++)
+                pchars[i] = (Py_UNICODE) jchars[i];
         
-        vm_env->ReleaseStringChars(js, jchars);
-        return string;
+            vm_env->ReleaseStringChars(js, jchars);
+        }
     }
+
+    if (delete_local_ref)
+        vm_env->DeleteLocalRef((jobject) js);
+
+    return string;
 }
 
+
 /* may be called from finalizer thread which has no vm_env thread local */
 void JCCEnv::finalizeObject(JNIEnv *jenv, PyObject *obj)
 {

Modified: lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/JCCEnv.h Mon Oct 19 23:08:04 2009
@@ -86,6 +86,8 @@
         mid_obj_toString,
         mid_obj_hashCode,
         mid_obj_getClass,
+        mid_iterator_next,
+        mid_enumeration_nextElement,
         max_mid
     };
 
@@ -116,14 +118,14 @@
     virtual ~JCCEnv() {};
 
 #if defined(_MSC_VER) || defined(__WIN32)
-    inline JNIEnv *get_vm_env()
+    inline JNIEnv *get_vm_env() const
     {
         return (JNIEnv *) TlsGetValue(VM_ENV);
     }
 #else
     static pthread_key_t VM_ENV;
 
-    inline JNIEnv *get_vm_env()
+    inline JNIEnv *get_vm_env() const
     {
         return (JNIEnv *) pthread_getspecific(VM_ENV);
     }
@@ -131,11 +133,16 @@
     virtual void set_vm(JavaVM *vm, JNIEnv *vm_env);
     virtual void set_vm_env(JNIEnv *vm_env);
 
-    virtual jint getJNIVersion();
-    virtual jstring getJavaVersion();
+    virtual jint getJNIVersion() const;
+    virtual jstring getJavaVersion() const;
+
+    virtual jclass findClass(const char *className) const;
+    virtual void registerNatives(jclass cls, JNINativeMethod *methods,
+                                 int n) const;
+
+    virtual jobject iteratorNext(jobject obj) const;
+    virtual jobject enumerationNext(jobject obj) const;
 
-    virtual jclass findClass(const char *className);
-    virtual void registerNatives(jclass cls, JNINativeMethod *methods, int n);
     virtual jobject newGlobalRef(jobject obj, int id);
     virtual jobject deleteGlobalRef(jobject obj, int id);
 
@@ -143,85 +150,105 @@
                               int m, ...);
 
     virtual jobjectArray newObjectArray(jclass cls, int size);
-    virtual void setObjectArrayElement(jobjectArray a, int n, jobject obj);
-    virtual jobject getObjectArrayElement(jobjectArray a, int n);
-    virtual int getArrayLength(jarray a);
-
-    virtual jclass getPythonExceptionClass();
-    virtual void reportException();
-
-    virtual jobject callObjectMethod(jobject obj, jmethodID mid, ...);
-    virtual jboolean callBooleanMethod(jobject obj, jmethodID mid, ...);
-    virtual jbyte callByteMethod(jobject obj, jmethodID mid, ...);
-    virtual jchar callCharMethod(jobject obj, jmethodID mid, ...);
-    virtual jdouble callDoubleMethod(jobject obj, jmethodID mid, ...);
-    virtual jfloat callFloatMethod(jobject obj, jmethodID mid, ...);
-    virtual jint callIntMethod(jobject obj, jmethodID mid, ...);
-    virtual jlong callLongMethod(jobject obj, jmethodID mid, ...);
-    virtual jshort callShortMethod(jobject obj, jmethodID mid, ...);
-    virtual void callVoidMethod(jobject obj, jmethodID mid, ...);
-
-    virtual jobject callNonvirtualObjectMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jboolean callNonvirtualBooleanMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jbyte callNonvirtualByteMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jchar callNonvirtualCharMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jdouble callNonvirtualDoubleMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jfloat callNonvirtualFloatMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jint callNonvirtualIntMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jlong callNonvirtualLongMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual jshort callNonvirtualShortMethod(jobject obj, jclass cls, jmethodID mid, ...);
-    virtual void callNonvirtualVoidMethod(jobject obj, jclass cls, jmethodID mid, ...);
-
-    virtual jobject callStaticObjectMethod(jclass cls, jmethodID mid, ...);
-    virtual jboolean callStaticBooleanMethod(jclass cls, jmethodID mid, ...);
-    virtual jbyte callStaticByteMethod(jclass cls, jmethodID mid, ...);
-    virtual jchar callStaticCharMethod(jclass cls, jmethodID mid, ...);
-    virtual jdouble callStaticDoubleMethod(jclass cls, jmethodID mid, ...);
-    virtual jfloat callStaticFloatMethod(jclass cls, jmethodID mid, ...);
-    virtual jint callStaticIntMethod(jclass cls, jmethodID mid, ...);
-    virtual jlong callStaticLongMethod(jclass cls, jmethodID mid, ...);
-    virtual jshort callStaticShortMethod(jclass cls, jmethodID mid, ...);
-    virtual void callStaticVoidMethod(jclass cls, jmethodID mid, ...);
+    virtual void setObjectArrayElement(jobjectArray a, int n,
+                                       jobject obj) const;
+    virtual jobject getObjectArrayElement(jobjectArray a, int n) const;
+    virtual int getArrayLength(jarray a) const;
+
+    virtual void reportException() const;
+
+    virtual jobject callObjectMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jboolean callBooleanMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jbyte callByteMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jchar callCharMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jdouble callDoubleMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jfloat callFloatMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jint callIntMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jlong callLongMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jshort callShortMethod(jobject obj, jmethodID mid, ...) const;
+    virtual void callVoidMethod(jobject obj, jmethodID mid, ...) const;
+
+    virtual jobject callNonvirtualObjectMethod(jobject obj, jclass cls,
+                                               jmethodID mid, ...) const;
+    virtual jboolean callNonvirtualBooleanMethod(jobject obj, jclass cls,
+                                                 jmethodID mid, ...) const;
+    virtual jbyte callNonvirtualByteMethod(jobject obj, jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jchar callNonvirtualCharMethod(jobject obj, jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jdouble callNonvirtualDoubleMethod(jobject obj, jclass cls,
+                                               jmethodID mid, ...) const;
+    virtual jfloat callNonvirtualFloatMethod(jobject obj, jclass cls,
+                                             jmethodID mid, ...) const;
+    virtual jint callNonvirtualIntMethod(jobject obj, jclass cls,
+                                         jmethodID mid, ...) const;
+    virtual jlong callNonvirtualLongMethod(jobject obj, jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jshort callNonvirtualShortMethod(jobject obj, jclass cls,
+                                             jmethodID mid, ...) const;
+    virtual void callNonvirtualVoidMethod(jobject obj, jclass cls,
+                                          jmethodID mid, ...) const;
+
+    virtual jobject callStaticObjectMethod(jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jboolean callStaticBooleanMethod(jclass cls,
+                                             jmethodID mid, ...) const;
+    virtual jbyte callStaticByteMethod(jclass cls,
+                                       jmethodID mid, ...) const;
+    virtual jchar callStaticCharMethod(jclass cls,
+                                       jmethodID mid, ...) const;
+    virtual jdouble callStaticDoubleMethod(jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jfloat callStaticFloatMethod(jclass cls,
+                                         jmethodID mid, ...) const;
+    virtual jint callStaticIntMethod(jclass cls,
+                                     jmethodID mid, ...) const;
+    virtual jlong callStaticLongMethod(jclass cls,
+                                       jmethodID mid, ...) const;
+    virtual jshort callStaticShortMethod(jclass cls,
+                                         jmethodID mid, ...) const;
+    virtual void callStaticVoidMethod(jclass cls,
+                                      jmethodID mid, ...) const;
 
     virtual jmethodID getMethodID(jclass cls, const char *name,
-                                  const char *signature);
+                                  const char *signature) const;
     virtual jfieldID getFieldID(jclass cls, const char *name,
-                                const char *signature);
+                                const char *signature) const;
     virtual jmethodID getStaticMethodID(jclass cls, const char *name,
-                                        const char *signature);
+                                        const char *signature) const;
 
     virtual jobject getStaticObjectField(jclass cls, const char *name,
-                                         const char *signature);
-    virtual jboolean getStaticBooleanField(jclass cls, const char *name);
-    virtual jbyte getStaticByteField(jclass cls, const char *name);
-    virtual jchar getStaticCharField(jclass cls, const char *name);
-    virtual jdouble getStaticDoubleField(jclass cls, const char *name);
-    virtual jfloat getStaticFloatField(jclass cls, const char *name);
-    virtual jint getStaticIntField(jclass cls, const char *name);
-    virtual jlong getStaticLongField(jclass cls, const char *name);
-    virtual jshort getStaticShortField(jclass cls, const char *name);
-
-    virtual jobject getObjectField(jobject obj, jfieldID id);
-    virtual jboolean getBooleanField(jobject obj, jfieldID id);
-    virtual jbyte getByteField(jobject obj, jfieldID id);
-    virtual jchar getCharField(jobject obj, jfieldID id);
-    virtual jdouble getDoubleField(jobject obj, jfieldID id);
-    virtual jfloat getFloatField(jobject obj, jfieldID id);
-    virtual jint getIntField(jobject obj, jfieldID id);
-    virtual jlong getLongField(jobject obj, jfieldID id);
-    virtual jshort getShortField(jobject obj, jfieldID id);
-
-    virtual void setObjectField(jobject obj, jfieldID id, jobject value);
-    virtual void setBooleanField(jobject obj, jfieldID id, jboolean value);
-    virtual void setByteField(jobject obj, jfieldID id, jbyte value);
-    virtual void setCharField(jobject obj, jfieldID id, jchar value);
-    virtual void setDoubleField(jobject obj, jfieldID id, jdouble value);
-    virtual void setFloatField(jobject obj, jfieldID id, jfloat value);
-    virtual void setIntField(jobject obj, jfieldID id, jint value);
-    virtual void setLongField(jobject obj, jfieldID id, jlong value);
-    virtual void setShortField(jobject obj, jfieldID id, jshort value);
+                                         const char *signature) const;
+    virtual jboolean getStaticBooleanField(jclass cls, const char *name) const;
+    virtual jbyte getStaticByteField(jclass cls, const char *name) const;
+    virtual jchar getStaticCharField(jclass cls, const char *name) const;
+    virtual jdouble getStaticDoubleField(jclass cls, const char *name) const;
+    virtual jfloat getStaticFloatField(jclass cls, const char *name) const;
+    virtual jint getStaticIntField(jclass cls, const char *name) const;
+    virtual jlong getStaticLongField(jclass cls, const char *name) const;
+    virtual jshort getStaticShortField(jclass cls, const char *name) const;
+
+    virtual jobject getObjectField(jobject obj, jfieldID id) const;
+    virtual jboolean getBooleanField(jobject obj, jfieldID id) const;
+    virtual jbyte getByteField(jobject obj, jfieldID id) const;
+    virtual jchar getCharField(jobject obj, jfieldID id) const;
+    virtual jdouble getDoubleField(jobject obj, jfieldID id) const;
+    virtual jfloat getFloatField(jobject obj, jfieldID id) const;
+    virtual jint getIntField(jobject obj, jfieldID id) const;
+    virtual jlong getLongField(jobject obj, jfieldID id) const;
+    virtual jshort getShortField(jobject obj, jfieldID id) const;
+
+    virtual void setObjectField(jobject obj, jfieldID id, jobject value) const;
+    virtual void setBooleanField(jobject obj, jfieldID id, jboolean value) const;
+    virtual void setByteField(jobject obj, jfieldID id, jbyte value) const;
+    virtual void setCharField(jobject obj, jfieldID id, jchar value) const;
+    virtual void setDoubleField(jobject obj, jfieldID id, jdouble value) const;
+    virtual void setFloatField(jobject obj, jfieldID id, jfloat value) const;
+    virtual void setIntField(jobject obj, jfieldID id, jint value) const;
+    virtual void setLongField(jobject obj, jfieldID id, jlong value) const;
+    virtual void setShortField(jobject obj, jfieldID id, jshort value) const;
 
-    int id(jobject obj) {
+    int id(jobject obj) const {
         return obj
             ? get_vm_env()->CallStaticIntMethod(_sys,
                                                 _mids[mid_sys_identityHashCode],
@@ -229,24 +256,26 @@
             : 0;
     }
 
-    int hash(jobject obj) {
+    int hash(jobject obj) const {
         return obj
             ? get_vm_env()->CallIntMethod(obj, _mids[mid_obj_hashCode])
             : 0;
     }
 
     virtual void setClassPath(const char *classPath);
-    virtual jstring fromUTF(const char *bytes);
-    virtual char *toUTF(jstring str);
-    virtual char *toString(jobject obj);
-    virtual char *getClassName(jobject obj);
+
+    virtual jstring fromUTF(const char *bytes) const;
+    virtual char *toUTF(jstring str) const;
+    virtual char *toString(jobject obj) const;
+    virtual char *getClassName(jobject obj) const;
 #ifdef PYTHON
-    virtual jstring fromPyString(PyObject *object);
-    virtual PyObject *fromJString(jstring js);
+    virtual jclass getPythonExceptionClass() const;
+    virtual jstring fromPyString(PyObject *object) const;
+    virtual PyObject *fromJString(jstring js, int delete_local_ref) const;
     virtual void finalizeObject(JNIEnv *jenv, PyObject *obj);
 #endif
 
-    virtual inline int isSame(jobject o1, jobject o2)
+    virtual inline int isSame(jobject o1, jobject o2) const
     {
         return o1 == o2 || get_vm_env()->IsSameObject(o1, o2);
     }

Modified: lucene/pylucene/trunk/jcc/jcc/sources/JObject.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/JObject.h?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/JObject.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/JObject.h Mon Oct 19 23:08:04 2009
@@ -27,8 +27,16 @@
 
     inline explicit JObject(jobject obj)
     {
-        id = env->id(obj);
-        this$ = env->newGlobalRef(obj, id);
+        if (obj)
+        {
+            id = env->id(obj);
+            this$ = env->newGlobalRef(obj, id);
+        }
+        else
+        {
+            id = 0;
+            this$ = NULL;
+        }
     }
 
     inline JObject(const JObject& obj)

Modified: lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp Mon Oct 19 23:08:04 2009
@@ -903,7 +903,7 @@
 
 PyObject *j2p(const String& js)
 {
-    return env->fromJString((jstring) js.this$);
+    return env->fromJString((jstring) js.this$, 0);
 }
 
 PyObject *PyErr_SetArgsError(char *name, PyObject *args)

Modified: lucene/pylucene/trunk/jcc/jcc/sources/functions.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/functions.h?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/functions.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/functions.h Mon Oct 19 23:08:04 2009
@@ -69,6 +69,7 @@
 #endif
 
 int abstract_init(PyObject *self, PyObject *args, PyObject *kwds);
+PyObject *wrapType(PyTypeObject *type, const jobject& obj);
 
 PyObject *j2p(const java::lang::String& js);
 java::lang::String p2j(PyObject *object);
@@ -113,10 +114,9 @@
 }
 #endif
 
-template<class T, class U, class V> PyObject *get_iterator_next(T *self)
+template<class T, class U> PyObject *get_iterator_next(T *self)
 {
     jboolean hasNext;
-
     OBJ_CALL(hasNext = self->object.hasNext());
     if (!hasNext)
     {
@@ -124,21 +124,20 @@
         return NULL;
     }
 
-    V next((jobject) NULL);
-    OBJ_CALL(next = self->object.next());
+    jobject next;
+    OBJ_CALL(next = env->iteratorNext(self->object.this$));
 
     jclass cls = java::lang::String::initializeClass();
-    if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
-        return env->fromJString((jstring) next.this$);
+    if (env->get_vm_env()->IsInstanceOf(next, cls))
+        return env->fromJString((jstring) next, 1);
 
-    return U::wrap_Object(next);
+    return U::wrap_jobject(next);
 }
 
 #ifdef _java_generics
-template<class T, class U, class V> PyObject *get_generic_iterator_next(T *self)
+template<class T, class U> PyObject *get_generic_iterator_next(T *self)
 {
     jboolean hasNext;
-
     OBJ_CALL(hasNext = self->object.hasNext());
     if (!hasNext)
     {
@@ -146,26 +145,24 @@
         return NULL;
     }
 
-    V next((jobject) NULL);
-    OBJ_CALL(next = self->object.next());
+    jobject next;
+    OBJ_CALL(next = env->iteratorNext(self->object.this$));
 
     jclass cls = java::lang::String::initializeClass();
-    if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
-        return env->fromJString((jstring) next.this$);
+    if (env->get_vm_env()->IsInstanceOf(next, cls))
+        return env->fromJString((jstring) next, 1);
 
     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
-
     if (param != NULL)
-        return wrapType(param, next.this$);
+        return wrapType(param, next);
 
-    return U::wrap_Object(next);
+    return U::wrap_jobject(next);
 }
 #endif
 
-template<class T, class U, class V> PyObject *get_enumeration_next(T *self)
+template<class T, class U> PyObject *get_enumeration_next(T *self)
 {
     jboolean hasMoreElements;
-
     OBJ_CALL(hasMoreElements = self->object.hasMoreElements());
     if (!hasMoreElements)
     {
@@ -173,21 +170,20 @@
         return NULL;
     }
 
-    V next((jobject) NULL);
-    OBJ_CALL(next = self->object.nextElement());
+    jobject next;
+    OBJ_CALL(next = env->enumerationNext(self->object.this$));
 
     jclass cls = java::lang::String::initializeClass();
-    if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
-        return env->fromJString((jstring) next.this$);
+    if (env->get_vm_env()->IsInstanceOf(next, cls))
+        return env->fromJString((jstring) next, 1);
 
-    return U::wrap_Object(next);
+    return U::wrap_jobject(next);
 }
 
 #ifdef _java_generics
-template<class T, class U, class V> PyObject *get_generic_enumeration_next(T *self)
+template<class T, class U> PyObject *get_generic_enumeration_next(T *self)
 {
     jboolean hasMoreElements;
-
     OBJ_CALL(hasMoreElements = self->object.hasMoreElements());
     if (!hasMoreElements)
     {
@@ -195,26 +191,24 @@
         return NULL;
     }
 
-    V next((jobject) NULL);
-    OBJ_CALL(next = self->object.nextElement());
+    jobject next;
+    OBJ_CALL(next = env->enumerationNext(self->object.this$));
 
     jclass cls = java::lang::String::initializeClass();
-    if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
-        return env->fromJString((jstring) next.this$);
+    if (env->get_vm_env()->IsInstanceOf(next, cls))
+        return env->fromJString((jstring) next, 1);
 
     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
-
     if (param != NULL)
-        return wrapType(param, next.this$);
+        return wrapType(param, next);
 
-    return U::wrap_Object(next);
+    return U::wrap_jobject(next);
 }
 #endif
 
 template<class T, class U, class V> PyObject *get_next(T *self)
 {
     V next((jobject) NULL);
-
     OBJ_CALL(next = self->object.next());
     if (!next)
     {
@@ -224,7 +218,7 @@
         
     jclass cls = java::lang::String::initializeClass();
     if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
-        return env->fromJString((jstring) next.this$);
+        return env->fromJString((jstring) next.this$, 0);
 
     return U::wrap_Object(next);
 }
@@ -233,7 +227,6 @@
 template<class T, class U, class V> PyObject *get_generic_next(T *self)
 {
     V next((jobject) NULL);
-
     OBJ_CALL(next = self->object.next());
     if (!next)
     {
@@ -243,10 +236,9 @@
         
     jclass cls = java::lang::String::initializeClass();
     if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
-        return env->fromJString((jstring) next.this$);
+        return env->fromJString((jstring) next.this$, 0);
 
     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
-
     if (param != NULL)
         return wrapType(param, next.this$);
 
@@ -263,7 +255,6 @@
                     int reportError);
 void installType(PyTypeObject *type, PyObject *module, char *name,
                  int isExtension);
-PyObject *wrapType(PyTypeObject *type, const jobject& obj);
 
 #ifdef _java_generics
 PyObject *typeParameters(PyTypeObject *types[], size_t size);

Modified: lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp?rev=826864&r1=826863&r2=826864&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/jcc.cpp Mon Oct 19 23:08:04 2009
@@ -275,7 +275,7 @@
 
 static PyObject *t_jccenv__get_java_version(PyObject *self, void *data)
 {
-    return env->fromJString(env->getJavaVersion());
+    return env->fromJString(env->getJavaVersion(), 1);
 }
 
 _DLL_EXPORT PyObject *getVMEnv(PyObject *self)