[multiple changes]

2004-04-14  Andrew Haley  <aph@redhat.com>
            Bryce McKinlay  <mckinlay@redhat.com>

	* java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Use
	_Jv_LookupInterfaceMethodIdx for calls to interfaces.
	* include/jvm.h (_Jv_CallAnyMethodA): Add new 	face' arg.

	* testsuite/libjava.lang/InvokeInterface.java: New file.
	* testsuite/libjava.lang/InvokeInterface.out: New file.

2004-04-14  Bryce McKinlay  <mckinlay@redhat.com>

	* class.c (get_interface_method_index): New function. Return
	dispatch index for interface method.
	(make_method_value): For interface methods, set index field to
	iface dispatch index, not DECL_VINDEX.
	* expr.c (build_invokeinterface): Use get_interface_method_index.

From-SVN: r80684
This commit is contained in:
Bryce McKinlay 2004-04-14 18:45:20 +01:00
parent cd2b7af029
commit d7afe286b3
10 changed files with 126 additions and 24 deletions

View file

@ -143,14 +143,14 @@ jobject
java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
{
using namespace java::lang::reflect;
jclass iface = NULL;
if (parameter_types == NULL)
getType ();
jmethodID meth = _Jv_FromReflectedMethod (this);
jclass objClass;
if (Modifier::isStatic(meth->accflags))
{
// We have to initialize a static class. It is safe to do this
@ -188,8 +188,11 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
throw new IllegalAccessException;
}
if (declaringClass->isInterface())
iface = declaringClass;
return _Jv_CallAnyMethodA (obj, return_type, meth, false,
parameter_types, args);
parameter_types, args, iface);
}
jint
@ -341,7 +344,8 @@ _Jv_CallAnyMethodA (jobject obj,
JArray<jclass> *parameter_types,
jvalue *args,
jvalue *result,
jboolean is_jni_call)
jboolean is_jni_call,
jclass iface)
{
using namespace java::lang::reflect;
@ -478,7 +482,10 @@ _Jv_CallAnyMethodA (jobject obj,
&& (_Jv_ushort)-1 != meth->index)
{
_Jv_VTable *vtable = *(_Jv_VTable **) obj;
ncode = vtable->get_method (meth->index);
if (iface == NULL)
ncode = vtable->get_method (meth->index);
else
ncode = _Jv_LookupInterfaceMethodIdx (vtable->clas, iface, meth->index);
}
else
{
@ -553,7 +560,8 @@ _Jv_CallAnyMethodA (jobject obj,
jmethodID meth,
jboolean is_constructor,
JArray<jclass> *parameter_types,
jobjectArray args)
jobjectArray args,
jclass iface)
{
if (parameter_types->length == 0 && args == NULL)
{
@ -621,7 +629,7 @@ _Jv_CallAnyMethodA (jobject obj,
_Jv_CallAnyMethodA (obj, return_type, meth, is_constructor,
_Jv_isVirtualMethod (meth),
parameter_types, argvals, &ret_value,
false);
false, iface);
jobject r;
#define VAL(Wrapper, Field) (new Wrapper (ret_value.Field))