summaryrefslogtreecommitdiffstats
path: root/libjava/java/lang/reflect
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-02 16:36:52 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2007-04-02 16:36:52 +0000
commitca74084af0f4e73002f844996b7d28a583c92d2a (patch)
tree826918a6ab1985e623a1617586fc734818568de0 /libjava/java/lang/reflect
parent3e960c14f5d68540abe6606c4eccad723294b124 (diff)
downloadppe42-gcc-ca74084af0f4e73002f844996b7d28a583c92d2a.tar.gz
ppe42-gcc-ca74084af0f4e73002f844996b7d28a583c92d2a.zip
2007-04-02 Andrew Haley <aph@redhat.com>
* java/lang/reflect/natVMProxy.cc (run_proxy): Use _Jv_LookupProxyMethod to find the Method. If parameter_types->length == 0, pass a null paramameter list, not a zero-length parameter list. * java/lang/natClass.cc (_Jv_LookupProxyMethod): New function. * java/lang/Class.h (_Jv_LookupProxyMethod): Declare. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123431 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/lang/reflect')
-rw-r--r--libjava/java/lang/reflect/Method.h2
-rw-r--r--libjava/java/lang/reflect/natVMProxy.cc21
2 files changed, 16 insertions, 7 deletions
diff --git a/libjava/java/lang/reflect/Method.h b/libjava/java/lang/reflect/Method.h
index 8a843d5d154..17056c119e9 100644
--- a/libjava/java/lang/reflect/Method.h
+++ b/libjava/java/lang/reflect/Method.h
@@ -13,6 +13,7 @@
jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);
jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);
::java::lang::reflect::Method *_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
+::java::lang::reflect::Method *_Jv_LookupProxyMethod (jclass, _Jv_Utf8Const *, _Jv_Utf8Const *);
class java::lang::reflect::Method : public ::java::lang::reflect::AccessibleObject
{
@@ -79,6 +80,7 @@ public:
friend class java::lang::Class;
friend class java::io::ObjectInputStream;
friend java::lang::reflect::Method* ::_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
+ friend java::lang::reflect::Method* ::_Jv_LookupProxyMethod (jclass, _Jv_Utf8Const *, _Jv_Utf8Const *);
};
#endif // __java_lang_reflect_Method__
diff --git a/libjava/java/lang/reflect/natVMProxy.cc b/libjava/java/lang/reflect/natVMProxy.cc
index 5704049909a..f0191760794 100644
--- a/libjava/java/lang/reflect/natVMProxy.cc
+++ b/libjava/java/lang/reflect/natVMProxy.cc
@@ -301,6 +301,8 @@ run_proxy (ffi_cif *cif,
void **args,
void*user_data)
{
+ using namespace java::lang::reflect;
+
Proxy *proxy = *(Proxy**)args[0];
ncode_closure *self = (ncode_closure *) user_data;
@@ -312,17 +314,22 @@ run_proxy (ffi_cif *cif,
Thread *thread = Thread::currentThread();
_Jv_InterpFrame frame_desc (self->self, thread, proxy->getClass());
- Method *meth = _Jv_GetReflectedMethod (proxy->getClass(),
- self->self->name,
- self->self->signature);
+ Method *meth = _Jv_LookupProxyMethod (proxy->getClass(),
+ self->self->name,
+ self->self->signature);
JArray<jclass> *parameter_types = meth->internalGetParameterTypes ();
JArray<jclass> *exception_types = meth->internalGetExceptionTypes ();
InvocationHandler *handler = proxy->h;
- void *poo
- = _Jv_NewObjectArray (parameter_types->length, &Object::class$, NULL);
- JArray<jobject> *argsArray = (JArray<jobject> *) poo;
- jobject *jargs = elements(argsArray);
+ JArray<jobject> *argsArray = NULL;
+ jobject *jargs = NULL;
+ if (parameter_types->length)
+ {
+ void *poo
+ = _Jv_NewObjectArray (parameter_types->length, &Object::class$, NULL);
+ argsArray = (JArray<jobject> *) poo;
+ jargs = elements(argsArray);
+ }
// FIXME: It must be possible to use fast interface dispatch here,
// but I've not quite figured out how to do it.
OpenPOWER on IntegriCloud