natVMProxy.cc (run_proxy): Use _Jv_LookupProxyMethod to find the Method.
authorAndrew Haley <aph@redhat.com>
Mon, 2 Apr 2007 16:36:52 +0000 (16:36 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Mon, 2 Apr 2007 16:36:52 +0000 (16:36 +0000)
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.

From-SVN: r123431

libjava/ChangeLog
libjava/headers.txt
libjava/java/lang/Class.h
libjava/java/lang/VMCompiler.h
libjava/java/lang/natClass.cc
libjava/java/lang/reflect/Method.h
libjava/java/lang/reflect/natVMProxy.cc

index bc7e363195719ac905d30b1ad96a3503a6c90a4e..dce810fa3ab29c8aada211a39af1a9e53aaf610e 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2007-04-02  Kyle Galloway  <kgallowa@redhat.com>
 
        * interpret-run.cc: Add code to properly set up variable slots
index c7a4caa3bf4f73c0b85aa0c7a8d8a30844e028f5..3e08f175889b82162353bb81e7f3f8f290c50f38 100644 (file)
@@ -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;
index af0219892f1ec102f2779a3ba994a4e8f1cd11c3..a1795f7e58c6666a3ef2d46afdbd9eebbbe00ed9 100644 (file)
@@ -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);
index e81f694e196dab0eeda818c89f72a8ade4ef3922..9034bd3b8263c67ca5901f2712043930daa5820a 100644 (file)
@@ -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 *);
index a6b353f2a957158e65fb40226ca0e289e1393ddd..a6955fcf4ffa723fc3d5a42df82ada06df965b80 100644 (file)
@@ -29,6 +29,7 @@ details.  */
 #include <java/lang/reflect/Member.h>
 #include <java/lang/reflect/Method.h>
 #include <java/lang/reflect/Field.h>
+#include <java/lang/reflect/Proxy.h>
 #include <java/lang/reflect/Constructor.h>
 #include <java/lang/AbstractMethodError.h>
 #include <java/lang/ArrayStoreException.h>
@@ -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)
index 8a843d5d154b1b7b0c0514c664a1637a5e019340..17056c119e9346e3b28376c687d5c72086d9f1b6 100644 (file)
@@ -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__
index 5704049909a4ff7b36909b60131f3dcacb6aac4a..f019176079466559c8fc52db24bb7348422fdb46 100644 (file)
@@ -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.