Commit a29114a3 by Andrew Haley Committed by Andrew Haley

natVMProxy.cc (ncode_closure.meth): Delete.

2007-03-05  Andrew Haley  <aph@redhat.com>

	* java/lang/reflect/natVMProxy.cc (ncode_closure.meth): Delete.
	(generateProxyClass): Don't pass method to ncode.
	(run_proxy): Call _Jv_GetReflectedMethod to find the proxy method.
	* java/lang/reflect/Method.h: Rebuild.
	* java/lang/reflect/Method.java (internalGetParameterTypes,
	internalGetExceptionTypes): New methods.
	* headers.txt (class java/lang/reflect/Method): Declare
	_Jv_GetReflectedMethod.  Be its friend.
	* java/lang/natClass.cc (_Jv_GetReflectedMethod): New method.
	* java/lang/Class.h: Declare it.  Be its friend.

From-SVN: r122554
parent f4a2a1de
2007-03-05 Andrew Haley <aph@redhat.com>
* java/lang/reflect/natVMProxy.cc (ncode_closure.meth): Delete.
(generateProxyClass): Don't pass method to ncode.
(run_proxy): Call _Jv_GetReflectedMethod to find the proxy method.
* java/lang/reflect/Method.h: Rebuild.
* java/lang/reflect/Method.java (internalGetParameterTypes,
internalGetExceptionTypes): New methods.
* headers.txt (class java/lang/reflect/Method): Declare
_Jv_GetReflectedMethod. Be its friend.
* java/lang/natClass.cc (_Jv_GetReflectedMethod): New method.
* java/lang/Class.h: Declare it. Be its friend.
2007-03-05 Tom Tromey <tromey@redhat.com> 2007-03-05 Tom Tromey <tromey@redhat.com>
* sources.am, Makefile.in: Rebuilt. * sources.am, Makefile.in: Rebuilt.
......
...@@ -56,10 +56,12 @@ friend class java::lang::Class; ...@@ -56,10 +56,12 @@ friend class java::lang::Class;
class java/lang/reflect/Method class java/lang/reflect/Method
prepend jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *); prepend jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);
prepend jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean); prepend jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);
prepend ::java::lang::reflect::Method *_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
friend jmethodID (::_Jv_FromReflectedMethod) (java::lang::reflect::Method *); friend jmethodID (::_Jv_FromReflectedMethod) (java::lang::reflect::Method *);
friend jobject (::_Jv_JNI_ToReflectedMethod) (_Jv_JNIEnv *, jclass, jmethodID, jboolean); friend jobject (::_Jv_JNI_ToReflectedMethod) (_Jv_JNIEnv *, jclass, jmethodID, jboolean);
friend class java::lang::Class; friend class java::lang::Class;
friend class java::io::ObjectInputStream; friend class java::io::ObjectInputStream;
friend java::lang::reflect::Method* ::_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
class gnu/gcj/runtime/ExtensionClassLoader class gnu/gcj/runtime/ExtensionClassLoader
friend class ::java::lang::ClassLoader; friend class ::java::lang::ClassLoader;
...@@ -225,6 +225,9 @@ jboolean _Jv_InterfaceAssignableFrom (jclass, jclass); ...@@ -225,6 +225,9 @@ jboolean _Jv_InterfaceAssignableFrom (jclass, jclass);
_Jv_Method* _Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *, _Jv_Method* _Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*, jclass * = NULL); _Jv_Utf8Const*, jclass * = NULL);
java::lang::reflect::Method *_Jv_GetReflectedMethod (jclass klass,
_Jv_Utf8Const *name,
_Jv_Utf8Const *signature);
jfieldID JvGetFirstInstanceField (jclass); jfieldID JvGetFirstInstanceField (jclass);
jint JvNumInstanceFields (jclass); jint JvNumInstanceFields (jclass);
jfieldID JvGetFirstStaticField (jclass); jfieldID JvGetFirstStaticField (jclass);
...@@ -529,6 +532,9 @@ private: ...@@ -529,6 +532,9 @@ private:
friend _Jv_Method* ::_Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *, friend _Jv_Method* ::_Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*, jclass *); _Jv_Utf8Const*, jclass *);
friend java::lang::reflect::Method* ::_Jv_GetReflectedMethod (jclass klass,
_Jv_Utf8Const *name,
_Jv_Utf8Const *signature);
friend jfieldID (::JvGetFirstInstanceField) (jclass); friend jfieldID (::JvGetFirstInstanceField) (jclass);
friend jint (::JvNumInstanceFields) (jclass); friend jint (::JvNumInstanceFields) (jclass);
friend jfieldID (::JvGetFirstStaticField) (jclass); friend jfieldID (::JvGetFirstStaticField) (jclass);
......
...@@ -1630,6 +1630,26 @@ _Jv_LookupDeclaredMethod (jclass klass, _Jv_Utf8Const *name, ...@@ -1630,6 +1630,26 @@ _Jv_LookupDeclaredMethod (jclass klass, _Jv_Utf8Const *name,
return NULL; return NULL;
} }
java::lang::reflect::Method *
_Jv_GetReflectedMethod (jclass klass, _Jv_Utf8Const *name,
_Jv_Utf8Const *signature)
{
for (; klass; klass = klass->getSuperclass())
{
_Jv_Method *meth = _Jv_GetMethodLocal (klass, name, signature);
if (meth)
{
using namespace java::lang::reflect;
Method *rmethod = new Method ();
rmethod->offset = (char*) meth - (char*) klass->methods;
rmethod->declaringClass = klass;
return rmethod;
}
}
return NULL;
}
#ifdef HAVE_TLS #ifdef HAVE_TLS
// NOTE: MCACHE_SIZE should be a power of 2 minus one. // NOTE: MCACHE_SIZE should be a power of 2 minus one.
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *); jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);
jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean); jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);
::java::lang::reflect::Method *_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
class java::lang::reflect::Method : public ::java::lang::reflect::AccessibleObject class java::lang::reflect::Method : public ::java::lang::reflect::AccessibleObject
{ {
...@@ -29,7 +30,13 @@ public: ...@@ -29,7 +30,13 @@ public:
jboolean isVarArgs(); jboolean isVarArgs();
::java::lang::Class * getReturnType(); ::java::lang::Class * getReturnType();
JArray< ::java::lang::Class * > * getParameterTypes(); JArray< ::java::lang::Class * > * getParameterTypes();
public: // actually package-private
JArray< ::java::lang::Class * > * internalGetParameterTypes();
public:
JArray< ::java::lang::Class * > * getExceptionTypes(); JArray< ::java::lang::Class * > * getExceptionTypes();
public: // actually package-private
JArray< ::java::lang::Class * > * internalGetExceptionTypes();
public:
jboolean equals(::java::lang::Object *); jboolean equals(::java::lang::Object *);
jint hashCode(); jint hashCode();
::java::lang::String * toString(); ::java::lang::String * toString();
...@@ -71,6 +78,7 @@ public: ...@@ -71,6 +78,7 @@ public:
friend jobject (::_Jv_JNI_ToReflectedMethod) (_Jv_JNIEnv *, jclass, jmethodID, jboolean); friend jobject (::_Jv_JNI_ToReflectedMethod) (_Jv_JNIEnv *, jclass, jmethodID, jboolean);
friend class java::lang::Class; friend class java::lang::Class;
friend class java::io::ObjectInputStream; friend class java::io::ObjectInputStream;
friend java::lang::reflect::Method* ::_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
}; };
#endif // __java_lang_reflect_Method__ #endif // __java_lang_reflect_Method__
...@@ -153,6 +153,15 @@ public final class Method ...@@ -153,6 +153,15 @@ public final class Method
return (Class<?>[]) parameter_types.clone(); return (Class<?>[]) parameter_types.clone();
} }
// Just like getParameterTypes, but don't clone the array.
// Package private for use by VMProxy.
final Class<?>[] internalGetParameterTypes ()
{
if (parameter_types == null)
getType();
return (Class<?>[]) parameter_types;
}
/** /**
* Get the exception types this method says it throws, in no particular * Get the exception types this method says it throws, in no particular
* order. If the method has no throws clause, returns a 0-length array * order. If the method has no throws clause, returns a 0-length array
...@@ -167,6 +176,15 @@ public final class Method ...@@ -167,6 +176,15 @@ public final class Method
return (Class<?>[]) exception_types.clone(); return (Class<?>[]) exception_types.clone();
} }
// Just like getExceptionTypes, but don't clone the array.
// Package private for use by VMProxy.
final Class<?>[] internalGetExceptionTypes ()
{
if (exception_types == null)
getType();
return (Class<?>[]) exception_types;
}
/** /**
* Compare two objects to see if they are semantically equivalent. * Compare two objects to see if they are semantically equivalent.
* Two Methods are semantically equivalent if they have the same declaring * Two Methods are semantically equivalent if they have the same declaring
......
...@@ -66,7 +66,7 @@ using namespace java::lang::reflect; ...@@ -66,7 +66,7 @@ using namespace java::lang::reflect;
using namespace java::lang; using namespace java::lang;
typedef void (*closure_fun) (ffi_cif*, void*, void**, void*); typedef void (*closure_fun) (ffi_cif*, void*, void**, void*);
static void *ncode (_Jv_Method *self, closure_fun fun, Method *meth); static void *ncode (_Jv_Method *self, closure_fun fun);
static void run_proxy (ffi_cif*, void*, void**, void*); static void run_proxy (ffi_cif*, void*, void**, void*);
typedef jobject invoke_t (jobject, Proxy *, Method *, JArray< jobject > *); typedef jobject invoke_t (jobject, Proxy *, Method *, JArray< jobject > *);
...@@ -165,7 +165,7 @@ java::lang::reflect::VMProxy::generateProxyClass ...@@ -165,7 +165,7 @@ java::lang::reflect::VMProxy::generateProxyClass
// the interfaces of which it is a proxy will also be reachable, // the interfaces of which it is a proxy will also be reachable,
// so this is safe. // so this is safe.
method = imethod; method = imethod;
method.ncode = ncode (&method, run_proxy, elements(d->methods)[i]); method.ncode = ncode (&method, run_proxy);
method.accflags &= ~Modifier::ABSTRACT; method.accflags &= ~Modifier::ABSTRACT;
} }
...@@ -283,7 +283,6 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type) ...@@ -283,7 +283,6 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type)
JvFail ("Bad ffi type in proxy"); JvFail ("Bad ffi type in proxy");
} }
// run_proxy is the entry point for all proxy methods. It boxes up // run_proxy is the entry point for all proxy methods. It boxes up
// all the arguments and then invokes the invocation handler's invoke() // all the arguments and then invokes the invocation handler's invoke()
// method. Exceptions are caught and propagated. // method. Exceptions are caught and propagated.
...@@ -291,7 +290,6 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type) ...@@ -291,7 +290,6 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type)
typedef struct { typedef struct {
ffi_closure closure; ffi_closure closure;
ffi_cif cif; ffi_cif cif;
Method *meth;
_Jv_Method *self; _Jv_Method *self;
ffi_type *arg_types[0]; ffi_type *arg_types[0];
} ncode_closure; } ncode_closure;
...@@ -313,9 +311,15 @@ run_proxy (ffi_cif *cif, ...@@ -313,9 +311,15 @@ run_proxy (ffi_cif *cif,
Thread *thread = Thread::currentThread(); Thread *thread = Thread::currentThread();
_Jv_InterpFrame frame_desc (self->self, thread, proxy->getClass()); _Jv_InterpFrame frame_desc (self->self, thread, proxy->getClass());
Method *meth = _Jv_GetReflectedMethod (proxy->getClass(),
self->self->name,
self->self->signature);
JArray<jclass> *parameter_types = meth->internalGetParameterTypes ();
JArray<jclass> *exception_types = meth->internalGetExceptionTypes ();
InvocationHandler *handler = proxy->h; InvocationHandler *handler = proxy->h;
void *poo void *poo
= _Jv_NewObjectArray (self->meth->parameter_types->length, &Object::class$, NULL); = _Jv_NewObjectArray (parameter_types->length, &Object::class$, NULL);
JArray<jobject> *argsArray = (JArray<jobject> *) poo; JArray<jobject> *argsArray = (JArray<jobject> *) poo;
jobject *jargs = elements(argsArray); jobject *jargs = elements(argsArray);
...@@ -331,14 +335,14 @@ run_proxy (ffi_cif *cif, ...@@ -331,14 +335,14 @@ run_proxy (ffi_cif *cif,
// Copy and box all the args. // Copy and box all the args.
int index = 1; int index = 1;
for (int i = 0; i < self->meth->parameter_types->length; i++, index++) for (int i = 0; i < parameter_types->length; i++, index++)
jargs[i] = box (args[index], elements(self->meth->parameter_types)[i], jargs[i] = box (args[index], elements(parameter_types)[i],
cif->arg_types[index]->type); cif->arg_types[index]->type);
jobject ret; jobject ret;
try try
{ {
ret = invoke (handler, proxy, self->meth, argsArray); ret = invoke (handler, proxy, meth, argsArray);
} }
catch (Throwable *t) catch (Throwable *t)
{ {
...@@ -346,15 +350,15 @@ run_proxy (ffi_cif *cif, ...@@ -346,15 +350,15 @@ run_proxy (ffi_cif *cif,
|| _Jv_IsInstanceOf (t, &Error::class$)) || _Jv_IsInstanceOf (t, &Error::class$))
throw t; throw t;
Class **throwables = elements (self->meth->exception_types); Class **throwables = elements (exception_types);
for (int i = 0; i < self->meth->exception_types->length; i++) for (int i = 0; i < exception_types->length; i++)
if (_Jv_IsInstanceOf (t, throwables[i])) if (_Jv_IsInstanceOf (t, throwables[i]))
throw t; throw t;
throw new UndeclaredThrowableException (t); throw new UndeclaredThrowableException (t);
} }
unbox (ret, self->meth->return_type, rvalue, cif->rtype->type); unbox (ret, meth->return_type, rvalue, cif->rtype->type);
} }
...@@ -362,7 +366,7 @@ run_proxy (ffi_cif *cif, ...@@ -362,7 +366,7 @@ run_proxy (ffi_cif *cif,
// the address of its closure. // the address of its closure.
static void * static void *
ncode (_Jv_Method *self, closure_fun fun, Method *meth) ncode (_Jv_Method *self, closure_fun fun)
{ {
using namespace java::lang::reflect; using namespace java::lang::reflect;
...@@ -379,7 +383,6 @@ ncode (_Jv_Method *self, closure_fun fun, Method *meth) ...@@ -379,7 +383,6 @@ ncode (_Jv_Method *self, closure_fun fun, Method *meth)
&closure->cif, &closure->cif,
&closure->arg_types[0], &closure->arg_types[0],
NULL); NULL);
closure->meth = meth;
closure->self = self; closure->self = self;
JvAssert ((self->accflags & Modifier::NATIVE) == 0); JvAssert ((self->accflags & Modifier::NATIVE) == 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment