re PR libgcj/15001 ([3.4 only] Using JNI with interpreter and interface methods yields SIGSEGV)
2004-12-10 Andrew Haley <aph@redhat.com> PR java/15001 * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Look up abstract methods by name. From-SVN: r92315
This commit is contained in:
parent
cd5fcd3366
commit
64d200483a
|
@ -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>
|
2004-12-08 Ranjit Mathew <rmathew@hotmail.com>
|
||||||
|
|
||||||
* java/util/IdentityHashMap.java (put): Replace mistaken use
|
* java/util/IdentityHashMap.java (put): Replace mistaken use
|
||||||
|
|
|
@ -30,6 +30,7 @@ details. */
|
||||||
#include <java/lang/Double.h>
|
#include <java/lang/Double.h>
|
||||||
#include <java/lang/IllegalAccessException.h>
|
#include <java/lang/IllegalAccessException.h>
|
||||||
#include <java/lang/IllegalArgumentException.h>
|
#include <java/lang/IllegalArgumentException.h>
|
||||||
|
#include <java/lang/IncompatibleClassChangeError.h>
|
||||||
#include <java/lang/NullPointerException.h>
|
#include <java/lang/NullPointerException.h>
|
||||||
#include <java/lang/ArrayIndexOutOfBoundsException.h>
|
#include <java/lang/ArrayIndexOutOfBoundsException.h>
|
||||||
#include <java/lang/VirtualMachineError.h>
|
#include <java/lang/VirtualMachineError.h>
|
||||||
|
@ -480,7 +481,27 @@ _Jv_CallAnyMethodA (jobject obj,
|
||||||
{
|
{
|
||||||
_Jv_VTable *vtable = *(_Jv_VTable **) obj;
|
_Jv_VTable *vtable = *(_Jv_VTable **) obj;
|
||||||
if (iface == NULL)
|
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
|
else
|
||||||
ncode = _Jv_LookupInterfaceMethodIdx (vtable->clas, iface,
|
ncode = _Jv_LookupInterfaceMethodIdx (vtable->clas, iface,
|
||||||
meth->index);
|
meth->index);
|
||||||
|
|
Loading…
Reference in New Issue