From 64d200483a9bb5597dd435c0206e052cf04a3b4c Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Fri, 17 Dec 2004 15:13:44 +0000 Subject: [PATCH] re PR libgcj/15001 ([3.4 only] Using JNI with interpreter and interface methods yields SIGSEGV) 2004-12-10 Andrew Haley PR java/15001 * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Look up abstract methods by name. From-SVN: r92315 --- libjava/ChangeLog | 6 ++++++ libjava/java/lang/reflect/natMethod.cc | 23 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index f91dd13c6e7..9273fc917b6 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2004-12-10 Andrew Haley + + PR java/15001 + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Look up + abstract methods by name. + 2004-12-08 Ranjit Mathew * java/util/IdentityHashMap.java (put): Replace mistaken use diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index b194067300b..b4b3a7a9b06 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -30,6 +30,7 @@ details. */ #include #include #include +#include #include #include #include @@ -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);