OSDN Git Service

2004-12-10 Andrew Haley <aph@redhat.com>
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Dec 2004 15:13:44 +0000 (15:13 +0000)
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 17 Dec 2004 15:13:44 +0000 (15:13 +0000)
        PR java/15001
        * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Look up
        abstract methods by name.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92315 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/lang/reflect/natMethod.cc

index f91dd13..9273fc9 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-10  Andrew Haley  <aph@redhat.com>
+
+       PR java/15001
+       * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Look up
+       abstract methods by name.
+
 2004-12-08  Ranjit Mathew  <rmathew@hotmail.com>
 
        * java/util/IdentityHashMap.java (put): Replace mistaken use
index b194067..b4b3a7a 100644 (file)
@@ -30,6 +30,7 @@ details.  */
 #include <java/lang/Double.h>
 #include <java/lang/IllegalAccessException.h>
 #include <java/lang/IllegalArgumentException.h>
+#include <java/lang/IncompatibleClassChangeError.h>
 #include <java/lang/NullPointerException.h>
 #include <java/lang/ArrayIndexOutOfBoundsException.h>
 #include <java/lang/VirtualMachineError.h>
@@ -480,7 +481,27 @@ _Jv_CallAnyMethodA (jobject obj,
     {
       _Jv_VTable *vtable = *(_Jv_VTable **) obj;
       if (iface == NULL)
-       ncode = vtable->get_method (meth->index);
+       {
+         if (is_jni_call && Modifier::isAbstract (meth->accflags))
+           {
+             // With JNI we don't know if this is an interface call
+             // or a call to an abstract method.  Look up the method
+             // by name, the slow way.
+             _Jv_Method *concrete_meth
+               = _Jv_LookupDeclaredMethod (vtable->clas,
+                                           meth->name,
+                                           meth->signature,
+                                           NULL);
+             if (concrete_meth == NULL
+                 || concrete_meth->ncode == NULL
+                 || Modifier::isAbstract(concrete_meth->accflags))
+               throw new java::lang::IncompatibleClassChangeError
+                 (_Jv_GetMethodString (vtable->clas, meth->name));
+             ncode = concrete_meth->ncode;
+           }
+         else
+           ncode = vtable->get_method (meth->index);
+       }
       else
        ncode = _Jv_LookupInterfaceMethodIdx (vtable->clas, iface,
                                              meth->index);