This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: Fix PR libgcj/23739


I'm checking this in on the trunk.

Our JNI IsAssignableFrom implementation had its arguments reversed.
In the name of CNI/JNI API sanity, I reversed the arguments to the CNI
function as well, and updated all callers.  Note that this function is
not exported, so no documentation updates are required.

For 4.0, I am only going to check in the jni.cc part of the patch.
Even though using the CNI function outside of libgcj is not supported,
perhaps someone is doing it.  It is safer to wait until 4.1 to break
things.

Test case included.  No regressions on x86 FC2.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	PR libgcj/23739:
	* testsuite/libjava.jni/pr23739.c: New file.
	* testsuite/libjava.jni/pr23739.java: New file.
	* testsuite/libjava.jni/pr23739.out: New file.
	* jni.cc (_Jv_JNI_IsAssignableFrom): Reversed arguments.
	* java/lang/reflect/natMethod.cc (invoke): Updated.
	* java/lang/natClass.cc (isAssignableFrom): Updated.
	(isInstance): Likewise.
	(_Jv_IsAssignableFrom): Reversed arguments.
	(_Jv_IsInstanceOf): Updated.
	(_Jv_CheckCast): Likewise.
	(_Jv_CheckArrayStore): Likewise.
	(_Jv_IsAssignableFromSlow): Reversed arguments.
	(_Jv_InterfaceAssignableFrom): Likewise.
	* link.cc (verify_type_assertions): Updated.
	* prims.cc (_Jv_CheckAccess): Updated.

Index: jni.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni.cc,v
retrieving revision 1.99
diff -u -r1.99 jni.cc
--- jni.cc 13 Jun 2005 20:23:11 -0000 1.99
+++ jni.cc 6 Sep 2005 15:38:53 -0000
@@ -552,7 +552,7 @@
 static jboolean JNICALL
 _Jv_JNI_IsAssignableFrom (JNIEnv *, jclass clazz1, jclass clazz2)
 {
-  return unwrap (clazz1)->isAssignableFrom (unwrap (clazz2));
+  return unwrap (clazz2)->isAssignableFrom (unwrap (clazz1));
 }
 
 static jint JNICALL
Index: link.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/link.cc,v
retrieving revision 1.17
diff -u -r1.17 link.cc
--- link.cc 17 Aug 2005 20:43:59 -0000 1.17
+++ link.cc 6 Sep 2005 15:38:54 -0000
@@ -1620,7 +1620,7 @@
 	  if (cl1 == NULL || cl2 == NULL)
 	    continue;
 
-          if (! _Jv_IsAssignableFromSlow (cl2, cl1))
+          if (! _Jv_IsAssignableFromSlow (cl1, cl2))
 	    {
 	      jstring s = JvNewStringUTF ("Incompatible types: In class ");
 	      s = s->concat (klass->getName());
Index: prims.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.112
diff -u -r1.112 prims.cc
--- prims.cc 13 May 2005 01:02:33 -0000 1.112
+++ prims.cc 6 Sep 2005 15:38:54 -0000
@@ -1557,7 +1557,7 @@
   return ((self_klass == other_klass)
 	  || ((flags & Modifier::PUBLIC) != 0)
 	  || (((flags & Modifier::PROTECTED) != 0)
-	      && _Jv_IsAssignableFromSlow (other_klass, self_klass))
+	      && _Jv_IsAssignableFromSlow (self_klass, other_klass))
 	  || (((flags & Modifier::PRIVATE) == 0)
 	      && _Jv_ClassNameSamePackage (self_klass->name,
 					   other_klass->name)));
Index: java/lang/natClass.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClass.cc,v
retrieving revision 1.89
diff -u -r1.89 natClass.cc
--- java/lang/natClass.cc 14 Jun 2005 18:51:54 -0000 1.89
+++ java/lang/natClass.cc 6 Sep 2005 15:38:54 -0000
@@ -623,7 +623,7 @@
   // Arguments may not have been initialized, given ".class" syntax.
   _Jv_InitClass (this);
   _Jv_InitClass (klass);
-  return _Jv_IsAssignableFrom (this, klass);
+  return _Jv_IsAssignableFrom (klass, this);
 }
 
 jboolean
@@ -632,7 +632,7 @@
   if (! obj)
     return false;
   _Jv_InitClass (this);
-  return _Jv_IsAssignableFrom (this, JV_CLASS (obj));
+  return _Jv_IsAssignableFrom (JV_CLASS (obj), this);
 }
 
 jobject
@@ -964,7 +964,7 @@
 }
 
 jboolean
-_Jv_IsAssignableFrom (jclass target, jclass source)
+_Jv_IsAssignableFrom (jclass source, jclass target)
 {
   if (source == target)
     return true;
@@ -984,7 +984,7 @@
       // two interfaces for assignability.
       if (__builtin_expect 
           (source->idt == NULL || source->isInterface(), false))
-        return _Jv_InterfaceAssignableFrom (target, source);
+        return _Jv_InterfaceAssignableFrom (source, target);
 
       _Jv_IDispatchTable *cl_idt = source->idt;
       _Jv_IDispatchTable *if_idt = target->idt;
@@ -1033,19 +1033,19 @@
 // superinterface of SOURCE. This is used when SOURCE is also an interface,
 // or a class with no interface dispatch table.
 jboolean
-_Jv_InterfaceAssignableFrom (jclass iface, jclass source)
+_Jv_InterfaceAssignableFrom (jclass source, jclass iface)
 {
   for (int i = 0; i < source->interface_count; i++)
     {
       jclass interface = source->interfaces[i];
       if (iface == interface
-          || _Jv_InterfaceAssignableFrom (iface, interface))
+          || _Jv_InterfaceAssignableFrom (interface, iface))
         return true;      
     }
     
   if (!source->isInterface()
       && source->superclass 
-      && _Jv_InterfaceAssignableFrom (iface, source->superclass))
+      && _Jv_InterfaceAssignableFrom (source->superclass, iface))
     return true;
         
   return false;
@@ -1056,14 +1056,14 @@
 {
   if (__builtin_expect (!obj, false))
     return false;
-  return (_Jv_IsAssignableFrom (cl, JV_CLASS (obj)));
+  return _Jv_IsAssignableFrom (JV_CLASS (obj), cl);
 }
 
 void *
 _Jv_CheckCast (jclass c, jobject obj)
 {
   if (__builtin_expect 
-       (obj != NULL && ! _Jv_IsAssignableFrom(c, JV_CLASS (obj)), false))
+      (obj != NULL && ! _Jv_IsAssignableFrom(JV_CLASS (obj), c), false))
     throw new java::lang::ClassCastException
       ((new java::lang::StringBuffer
 	(obj->getClass()->getName()))->append
@@ -1084,7 +1084,7 @@
 	return;
       jclass obj_class = JV_CLASS (obj);
       if (__builtin_expect 
-          (! _Jv_IsAssignableFrom (elt_class, obj_class), false))
+          (! _Jv_IsAssignableFrom (obj_class, elt_class), false))
 	throw new java::lang::ArrayStoreException
 		((new java::lang::StringBuffer
 		 (JvNewStringUTF("Cannot store ")))->append
@@ -1095,7 +1095,7 @@
 }
 
 jboolean
-_Jv_IsAssignableFromSlow (jclass target, jclass source)
+_Jv_IsAssignableFromSlow (jclass source, jclass target)
 {
   // First, strip arrays.
   while (target->isArray ())
@@ -1129,7 +1129,7 @@
            {
              // We use a recursive call because we also need to
              // check superinterfaces.
-             if (_Jv_IsAssignableFromSlow (target, source->getInterface (i)))
+             if (_Jv_IsAssignableFromSlow (source->getInterface (i), target))
                return true;
            }
        }
Index: java/lang/reflect/natMethod.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/natMethod.cc,v
retrieving revision 1.46
diff -u -r1.46 natMethod.cc
--- java/lang/reflect/natMethod.cc 5 Apr 2005 22:26:26 -0000 1.46
+++ java/lang/reflect/natMethod.cc 6 Sep 2005 15:38:55 -0000
@@ -163,7 +163,7 @@
   else
     {
       jclass objClass = JV_CLASS (obj);
-      if (! _Jv_IsAssignableFrom (declaringClass, objClass))
+      if (! _Jv_IsAssignableFrom (objClass, declaringClass))
         throw new java::lang::IllegalArgumentException;
     }
 
Index: testsuite/libjava.jni/pr23739.c
===================================================================
RCS file: testsuite/libjava.jni/pr23739.c
diff -N testsuite/libjava.jni/pr23739.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.jni/pr23739.c 6 Sep 2005 15:38:55 -0000
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include "pr23739.h"
+
+JNIEXPORT void JNICALL
+Java_pr23739_checkOrder (JNIEnv *env, jclass cls, jclass clazz1, jclass clazz2)
+{
+  printf ("B extends A\n");
+  printf ("isAssignableFrom (A, B): %d\n",
+          (*env)->IsAssignableFrom (env, clazz1, clazz2));
+  printf ("isAssignableFrom (B, A): %d\n",
+          (*env)->IsAssignableFrom (env, clazz2, clazz1));
+}
Index: testsuite/libjava.jni/pr23739.java
===================================================================
RCS file: testsuite/libjava.jni/pr23739.java
diff -N testsuite/libjava.jni/pr23739.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.jni/pr23739.java 6 Sep 2005 15:38:55 -0000
@@ -0,0 +1,22 @@
+public class pr23739
+{
+  static
+  {
+    System.loadLibrary ("pr23739");
+  }
+
+  public static class A
+  {
+  }
+
+  public static class B extends A
+  {
+  }
+
+  static native void checkOrder (Class clazz1, Class clazz2);
+
+  public static void main (String[] args)
+  {
+    checkOrder (A.class, B.class);
+  }
+}
Index: testsuite/libjava.jni/pr23739.out
===================================================================
RCS file: testsuite/libjava.jni/pr23739.out
diff -N testsuite/libjava.jni/pr23739.out
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.jni/pr23739.out 6 Sep 2005 15:38:55 -0000
@@ -0,0 +1,3 @@
+B extends A
+isAssignableFrom (A, B): 0
+isAssignableFrom (B, A): 1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]