From 2abaa5a3b86121453d7be0000f70418c08784c0d Mon Sep 17 00:00:00 2001 From: aph Date: Mon, 5 Mar 2007 16:06:27 +0000 Subject: [PATCH] 2007-03-05 Andrew Haley * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122554 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 13 ++++++++ .../lib/java/lang/reflect/Method.class | Bin 6184 -> 6416 bytes libjava/headers.txt | 2 ++ libjava/java/lang/Class.h | 6 ++++ libjava/java/lang/natClass.cc | 20 ++++++++++++ libjava/java/lang/reflect/Method.h | 8 +++++ libjava/java/lang/reflect/Method.java | 18 +++++++++++ libjava/java/lang/reflect/natVMProxy.cc | 29 ++++++++++-------- 8 files changed, 83 insertions(+), 13 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 3f940e242ef2..2b4f38be8e33 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,16 @@ +2007-03-05 Andrew Haley + + * 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 * sources.am, Makefile.in: Rebuilt. diff --git a/libjava/classpath/lib/java/lang/reflect/Method.class b/libjava/classpath/lib/java/lang/reflect/Method.class index 0eda2ee759029c1bd99fe8e1f248d5aa42d2e63c..2e61b96e5923ab0a4710aa568c5ffaa9a81af37b 100644 GIT binary patch literal 6416 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 delta 2500 zc-oCtd0bRg6#nkKnfGRfCyXF7prQyaz~F8!<%VRYf*UH5OM;F#nt(9w=qOp5TB)~1 z-1jB-#0RdqWTs{2l4z{YexpU9=-TR$;&Yjtf);6#meY|ro zfQERez`zi~=U76vMpct|nq-&TsR)3L&zEYk*Z4lEv44V!>Ik=@3%V)j%9$}#?tz{P zl6bf=*xm_IRxos9FncnSJlXDybOn8QXJeI+WKr&B&%9 z+6)hohkJ%*XO79y5k?a#&o{L-PGoTK`m&>n6}j-LuwycVF{)#9Z?T;`LH;%mkY6_E z;vK>IF7GZ!%F|W6hZ%gl+)|!}4-~x5cgqpdhnUT;%6;UyDmXskZIq@I^@)i3luuL| z`Q;*CIP)3m@(0E`Jku=mEZHb8RIvz)`9q~uy`?IaVKE7w?(%eSWw^54gW8WB7Td@xS?aLOyrsoc<#QF=P@6#|pd@#C zMyh92woAcwhH8AIrJAImkl(R1P&Mojhu+ChKZ;K=2XU`e=5bbsq+vSmYi%99Peofa zvqHmCk*b3#n)=*@!u?7`1CevC;3*tn(Q<` zK8D;SrLUafc^W7{|i49jlOLkQmzX8Md(axWiCl3eh;G0C5^#*@u=} z=t3J%g}(lf=(`FER>Kc#P?bEDP6JXR4Ap34h{vnEUB%cQ?PCkjekn}G4bp}ZfIt}O zyPW_uSWrlSMLI~h4jfesBCHO0oxuE2869cPKz1j-uVQf1&KeRmbdS-{i-x>XXj$LK z!DsdqRI;bu+%K@YH#wycDG3z$Mysm%uvK*ypc#_g^nhyE{LU4wTeijipM?K*@b)XAqj*D~$FOim) z(G4xGQ2ky-KU~8QT*pY0Qjpput{KS=FA5sJT11An7F{vmZAQHec95}u$BV;IN` za50IxrvVd~33*J$G^St{vml>YsYCf;J&gsdf__n(z$7FpzNmiKgcVpx0wz(4R#A}| zkVbq$T(5)$#iqojQ0=XyW$P%&Ogevt4HU{mZ>5kL`o6b_EMPe0K$KP(mGssG=V6$o zJt)|+3tCEyvk*mzbogDR2epg+u+A{C1Xx%i{8<--u&%UM?g_3mY&R9K$gT-{u$SI9 zgXoodg;DeM<^4YxN&PR%GVU+WID{C}iE$_~x`}ZZ9~taOD@RB6q8HN~C`8O*oO@+)}nVvkk<)ku=&w8g1r}9FC3`30Xv6qBi1F zr3XbAL^kSAsD#jc62#%rgCbi0#z}uofu7N6M5{13BT%zd>V@D9cjv|zuKmgetSuperclass()) + { + _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 // NOTE: MCACHE_SIZE should be a power of 2 minus one. diff --git a/libjava/java/lang/reflect/Method.h b/libjava/java/lang/reflect/Method.h index 7d4b46d3e27a..8a843d5d154b 100644 --- a/libjava/java/lang/reflect/Method.h +++ b/libjava/java/lang/reflect/Method.h @@ -12,6 +12,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*); class java::lang::reflect::Method : public ::java::lang::reflect::AccessibleObject { @@ -29,7 +30,13 @@ public: jboolean isVarArgs(); ::java::lang::Class * getReturnType(); JArray< ::java::lang::Class * > * getParameterTypes(); +public: // actually package-private + JArray< ::java::lang::Class * > * internalGetParameterTypes(); +public: JArray< ::java::lang::Class * > * getExceptionTypes(); +public: // actually package-private + JArray< ::java::lang::Class * > * internalGetExceptionTypes(); +public: jboolean equals(::java::lang::Object *); jint hashCode(); ::java::lang::String * toString(); @@ -71,6 +78,7 @@ public: 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*); }; #endif // __java_lang_reflect_Method__ diff --git a/libjava/java/lang/reflect/Method.java b/libjava/java/lang/reflect/Method.java index 6fa2956e40e8..878210abbd2e 100644 --- a/libjava/java/lang/reflect/Method.java +++ b/libjava/java/lang/reflect/Method.java @@ -153,6 +153,15 @@ public final class Method 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 * order. If the method has no throws clause, returns a 0-length array @@ -167,6 +176,15 @@ public final class Method 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. * Two Methods are semantically equivalent if they have the same declaring diff --git a/libjava/java/lang/reflect/natVMProxy.cc b/libjava/java/lang/reflect/natVMProxy.cc index 8d803a859717..c83880ccf1ee 100644 --- a/libjava/java/lang/reflect/natVMProxy.cc +++ b/libjava/java/lang/reflect/natVMProxy.cc @@ -66,7 +66,7 @@ using namespace java::lang::reflect; using namespace java::lang; 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*); typedef jobject invoke_t (jobject, Proxy *, Method *, JArray< jobject > *); @@ -165,7 +165,7 @@ java::lang::reflect::VMProxy::generateProxyClass // the interfaces of which it is a proxy will also be reachable, // so this is safe. method = imethod; - method.ncode = ncode (&method, run_proxy, elements(d->methods)[i]); + method.ncode = ncode (&method, run_proxy); method.accflags &= ~Modifier::ABSTRACT; } @@ -283,7 +283,6 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type) JvFail ("Bad ffi type in proxy"); } - // run_proxy is the entry point for all proxy methods. It boxes up // all the arguments and then invokes the invocation handler's invoke() // method. Exceptions are caught and propagated. @@ -291,7 +290,6 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type) typedef struct { ffi_closure closure; ffi_cif cif; - Method *meth; _Jv_Method *self; ffi_type *arg_types[0]; } ncode_closure; @@ -313,9 +311,15 @@ 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); + JArray *parameter_types = meth->internalGetParameterTypes (); + JArray *exception_types = meth->internalGetExceptionTypes (); + InvocationHandler *handler = proxy->h; void *poo - = _Jv_NewObjectArray (self->meth->parameter_types->length, &Object::class$, NULL); + = _Jv_NewObjectArray (parameter_types->length, &Object::class$, NULL); JArray *argsArray = (JArray *) poo; jobject *jargs = elements(argsArray); @@ -331,14 +335,14 @@ run_proxy (ffi_cif *cif, // Copy and box all the args. int index = 1; - for (int i = 0; i < self->meth->parameter_types->length; i++, index++) - jargs[i] = box (args[index], elements(self->meth->parameter_types)[i], + for (int i = 0; i < parameter_types->length; i++, index++) + jargs[i] = box (args[index], elements(parameter_types)[i], cif->arg_types[index]->type); jobject ret; try { - ret = invoke (handler, proxy, self->meth, argsArray); + ret = invoke (handler, proxy, meth, argsArray); } catch (Throwable *t) { @@ -346,15 +350,15 @@ run_proxy (ffi_cif *cif, || _Jv_IsInstanceOf (t, &Error::class$)) throw t; - Class **throwables = elements (self->meth->exception_types); - for (int i = 0; i < self->meth->exception_types->length; i++) + Class **throwables = elements (exception_types); + for (int i = 0; i < exception_types->length; i++) if (_Jv_IsInstanceOf (t, throwables[i])) throw 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, // the address of its closure. static void * -ncode (_Jv_Method *self, closure_fun fun, Method *meth) +ncode (_Jv_Method *self, closure_fun fun) { using namespace java::lang::reflect; @@ -379,7 +383,6 @@ ncode (_Jv_Method *self, closure_fun fun, Method *meth) &closure->cif, &closure->arg_types[0], NULL); - closure->meth = meth; closure->self = self; JvAssert ((self->accflags & Modifier::NATIVE) == 0); -- 2.47.3