OSDN Git Service

2007-04-02 Andrew Haley <aph@redhat.com>
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Apr 2007 16:36:52 +0000 (16:36 +0000)
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Apr 2007 16:36:52 +0000 (16:36 +0000)
        * 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

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 bc7e363..dce810f 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 c7a4caa..3e08f17 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 af02198..a1795f7 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 e81f694..9034bd3 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 a6b353f..a6955fc 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 8a843d5..17056c1 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 5704049..f019176 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.