Hi,

jcl.c currently tries to turn a local reference into a global one after
having deleted the local reference.
      (*env)->DeleteLocalRef(env, rawDataClass);
      rawDataClass = (*env)->NewGlobalRef (env, rawDataClass);
Is my interpretation right that this is not allowed by the JNI spec?
(The attached patch works for me.)


d.
Index: native/jni/classpath/jcl.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/classpath/jcl.c,v
retrieving revision 1.16
diff -u -r1.16 jcl.c
--- native/jni/classpath/jcl.c  3 Aug 2005 14:48:32 -0000       1.16
+++ native/jni/classpath/jcl.c  11 Sep 2005 18:22:06 -0000
@@ -193,6 +193,8 @@
 {
   if (rawDataClass == NULL)
     {
+      jclass tmp;
+
 #ifdef POINTERS_ARE_64BIT
       rawDataClass = (*env)->FindClass (env, "gnu/classpath/Pointer64");
       if (rawDataClass == NULL)
@@ -243,14 +245,15 @@
        }
 
 #endif
-      (*env)->DeleteLocalRef(env, rawDataClass);
-      rawDataClass = (*env)->NewGlobalRef (env, rawDataClass);
-      if (rawDataClass == NULL)
+      tmp = (*env)->NewGlobalRef (env, rawDataClass);
+      if (tmp == NULL)
        {
          JCL_ThrowException (env, "java/lang/InternalError",
                              "unable to create an internal global ref");
          return NULL;
        }
+      (*env)->DeleteLocalRef(env, rawDataClass);
+      rawDataClass = tmp;
     }
 
 #ifdef POINTERS_ARE_64BIT
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to