aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/natClass.cc
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2007-04-02 16:36:52 +0000
committerAndrew Haley <aph@gcc.gnu.org>2007-04-02 16:36:52 +0000
commita0036853d2b6260c0a322da8d411dcebd3ac4f9e (patch)
tree826918a6ab1985e623a1617586fc734818568de0 /libjava/java/lang/natClass.cc
parente6c45b1e3435efa993309f69654ac5411327d755 (diff)
downloadgcc-a0036853d2b6260c0a322da8d411dcebd3ac4f9e.zip
gcc-a0036853d2b6260c0a322da8d411dcebd3ac4f9e.tar.gz
gcc-a0036853d2b6260c0a322da8d411dcebd3ac4f9e.tar.bz2
natVMProxy.cc (run_proxy): Use _Jv_LookupProxyMethod to find the Method.
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
Diffstat (limited to 'libjava/java/lang/natClass.cc')
-rw-r--r--libjava/java/lang/natClass.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index a6b353f..a6955fc 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -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)