From: Andrew Haley Date: Mon, 2 Apr 2007 16:36:52 +0000 (+0000) Subject: natVMProxy.cc (run_proxy): Use _Jv_LookupProxyMethod to find the Method. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a0036853d2b6260c0a322da8d411dcebd3ac4f9e;p=gcc.git natVMProxy.cc (run_proxy): Use _Jv_LookupProxyMethod to find the Method. 2007-04-02 Andrew Haley * 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. From-SVN: r123431 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index bc7e3631957..dce810fa3ab 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,12 @@ +2007-04-02 Andrew Haley + + * 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. + 2007-04-02 Kyle Galloway * interpret-run.cc: Add code to properly set up variable slots diff --git a/libjava/headers.txt b/libjava/headers.txt index c7a4caa3bf4..3e08f175889 100644 --- a/libjava/headers.txt +++ b/libjava/headers.txt @@ -57,11 +57,13 @@ class java/lang/reflect/Method prepend jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *); prepend jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean); prepend ::java::lang::reflect::Method *_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*); +prepend ::java::lang::reflect::Method *_Jv_LookupProxyMethod (jclass, _Jv_Utf8Const *, _Jv_Utf8Const *); friend jmethodID (::_Jv_FromReflectedMethod) (java::lang::reflect::Method *); friend jobject (::_Jv_JNI_ToReflectedMethod) (_Jv_JNIEnv *, jclass, jmethodID, jboolean); 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 *); class gnu/gcj/runtime/ExtensionClassLoader friend class ::java::lang::ClassLoader; diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index af0219892f1..a1795f7e58c 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -237,6 +237,8 @@ _Jv_Method* _Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *, java::lang::reflect::Method *_Jv_GetReflectedMethod (jclass klass, _Jv_Utf8Const *name, _Jv_Utf8Const *signature); +java::lang::reflect::Method *_Jv_LookupProxyMethod (jclass, _Jv_Utf8Const *, + _Jv_Utf8Const *); jfieldID JvGetFirstInstanceField (jclass); jint JvNumInstanceFields (jclass); jfieldID JvGetFirstStaticField (jclass); @@ -545,6 +547,9 @@ private: friend java::lang::reflect::Method* ::_Jv_GetReflectedMethod (jclass klass, _Jv_Utf8Const *name, _Jv_Utf8Const *signature); + friend java::lang::reflect::Method *::_Jv_LookupProxyMethod (jclass, _Jv_Utf8Const *, + _Jv_Utf8Const *); + friend jfieldID (::JvGetFirstInstanceField) (jclass); friend jint (::JvNumInstanceFields) (jclass); friend jfieldID (::JvGetFirstStaticField) (jclass); diff --git a/libjava/java/lang/VMCompiler.h b/libjava/java/lang/VMCompiler.h index e81f694e196..9034bd3b826 100644 --- a/libjava/java/lang/VMCompiler.h +++ b/libjava/java/lang/VMCompiler.h @@ -41,6 +41,7 @@ public: private: VMCompiler(); static ::java::lang::Class * loadSharedLibrary(::java::lang::ClassLoader *, ::java::lang::String *, ::java::security::ProtectionDomain *, ::java::lang::String *); + static ::java::lang::String * bytesToString(JArray< jbyte > *); public: static ::java::lang::Class * compileClass(::java::lang::ClassLoader *, ::java::lang::String *, JArray< jbyte > *, jint, jint, ::java::security::ProtectionDomain *); static jboolean compileClass(::java::lang::Class *); diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index a6b353f2a95..a6955fcf4ff 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -29,6 +29,7 @@ details. */ #include #include #include +#include #include #include #include @@ -1652,6 +1653,39 @@ _Jv_LookupDeclaredMethod (jclass klass, _Jv_Utf8Const *name, return NULL; } +// The rules for finding proxy methods are different: first we search +// the interfaces implemented by a proxy, then the methods declared in +// class Proxy. + +java::lang::reflect::Method * +_Jv_LookupProxyMethod (jclass proxyClass, _Jv_Utf8Const *name, + _Jv_Utf8Const *signature) +{ + using namespace java::lang::reflect; + jclass declaringClass; + _Jv_Method * m; + + for (int i = 0; i < proxyClass->interface_count; i++) + { + declaringClass = proxyClass->interfaces[i]; + m = _Jv_GetMethodLocal (declaringClass, name, signature); + if (m) + break; + } + if (!m) + m = _Jv_LookupDeclaredMethod (&Proxy::class$, + name, + signature, + &declaringClass); + + Method *rmethod = new Method (); + rmethod->offset = (char*) m - (char*) declaringClass->methods; + rmethod->declaringClass = declaringClass; + return rmethod; +} + + + java::lang::reflect::Method * _Jv_GetReflectedMethod (jclass klass, _Jv_Utf8Const *name, _Jv_Utf8Const *signature) 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 *parameter_types = meth->internalGetParameterTypes (); JArray *exception_types = meth->internalGetExceptionTypes (); InvocationHandler *handler = proxy->h; - void *poo - = _Jv_NewObjectArray (parameter_types->length, &Object::class$, NULL); - JArray *argsArray = (JArray *) poo; - jobject *jargs = elements(argsArray); + JArray *argsArray = NULL; + jobject *jargs = NULL; + if (parameter_types->length) + { + void *poo + = _Jv_NewObjectArray (parameter_types->length, &Object::class$, NULL); + argsArray = (JArray *) 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.