diff options
author | Andrew Haley <aph@redhat.com> | 2007-04-02 16:36:52 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2007-04-02 16:36:52 +0000 |
commit | a0036853d2b6260c0a322da8d411dcebd3ac4f9e (patch) | |
tree | 826918a6ab1985e623a1617586fc734818568de0 /libjava/java/lang/natClass.cc | |
parent | e6c45b1e3435efa993309f69654ac5411327d755 (diff) | |
download | gcc-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.cc | 34 |
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) |