-/* src/native/vm/Method.c - java/lang/reflect/Method
+/* src/native/vm/java_lang_reflect_Method.c
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ Copyright (C) 2007 R. Grafl, A. Krall, C. Kruegel,
C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
J. Wenninger, Institut f. Computersprachen - TU Wien
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Roman Obermaiser
- Joseph Wenninger
- Christian Thalinger
-
- $Id: java_lang_reflect_Method.c 5937 2006-11-08 22:00:57Z twisti $
-
*/
#include "vm/types.h"
#include "native/jni.h"
+#include "native/llni.h"
#include "native/native.h"
+
#include "native/include/java_lang_Object.h"
-#include "native/include/java_lang_Class.h"
+
#include "native/include/java_lang_reflect_Method.h"
+
#include "vm/access.h"
-#include "vm/global.h"
#include "vm/builtin.h"
-#include "vm/exceptions.h"
#include "vm/initialize.h"
-#include "vm/stringlocal.h"
-
-
-/*
- * Class: java/lang/reflect/Method
- * Method: getModifiersInternal
- * Signature: ()I
- */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Method_getModifiersInternal(JNIEnv *env, java_lang_reflect_Method *this)
-{
- classinfo *c;
- methodinfo *m;
-
- c = (classinfo *) this->declaringClass;
- m = &(c->methods[this->slot]);
-
- return m->flags;
-}
-
-
-/*
- * Class: java/lang/reflect/Method
- * Method: getReturnType
- * Signature: ()Ljava/lang/Class;
- */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Method_getReturnType(JNIEnv *env, java_lang_reflect_Method *this)
-{
- classinfo *c;
- methodinfo *m;
-
- c = (classinfo *) this->declaringClass;
- m = &(c->methods[this->slot]);
-
- return (java_lang_Class *) native_get_returntype(m);
-}
-
-
-/*
- * Class: java/lang/reflect/Method
- * Method: getParameterTypes
- * Signature: ()[Ljava/lang/Class;
- */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_reflect_Method_getParameterTypes(JNIEnv *env, java_lang_reflect_Method *this)
-{
- classinfo *c;
- methodinfo *m;
-
- c = (classinfo *) this->declaringClass;
- m = &(c->methods[this->slot]);
- return native_get_parametertypes(m);
-}
+#include "vmcore/class.h"
+#include "vmcore/method.h"
/*
* Class: java/lang/reflect/Method
- * Method: getExceptionTypes
- * Signature: ()[Ljava/lang/Class;
+ * Method: invoke
+ * Signature: (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_reflect_Method_getExceptionTypes(JNIEnv *env, java_lang_reflect_Method *this)
+java_lang_Object *_Jv_java_lang_reflect_Method_invoke(java_lang_reflect_Method *this, java_lang_Object *o, java_handle_objectarray_t *args)
{
classinfo *c;
methodinfo *m;
+ s4 override;
+ int32_t slot;
- c = (classinfo *) this->declaringClass;
- m = &(c->methods[this->slot]);
-
- return native_get_exceptiontypes(m);
-}
-
-
-/*
- * Class: java/lang/reflect/Method
- * Method: invokeNative
- * Signature: (Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Class;I)Ljava/lang/Object;
- */
-JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Method_invokeNative(JNIEnv *env, java_lang_reflect_Method *this, java_lang_Object *o, java_objectarray *args, java_lang_Class *declaringClass, s4 slot)
-{
- classinfo *c;
- methodinfo *m;
-
- c = (classinfo *) declaringClass;
+ LLNI_field_get_cls(this, clazz, c);
+ LLNI_field_get_val(this, slot , slot);
m = &(c->methods[slot]);
+
/* check method access */
+
/* check if we should bypass security checks (AccessibleObject) */
- if (this->flag == false) {
- if (!access_check_caller(c, m->flags, 1))
+#if defined(WITH_CLASSPATH_GNU)
+ LLNI_field_get_val(this, flag, override);
+#elif defined(WITH_CLASSPATH_SUN)
+ LLNI_field_get_val(this, override, override);
+#else
+# error unknown classpath configuration
+#endif
+
+ if (override == false) {
+ if (!access_check_method(m, 1))
return NULL;
}
/* call the Java method via a helper function */
- return (java_lang_Object *) _Jv_jni_invokeNative(m, (jobject) o, args);
-}
-
-
-/*
- * Class: java/lang/reflect/Method
- * Method: getSignature
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Method_getSignature(JNIEnv *env, java_lang_reflect_Method* this)
-{
- classinfo *c;
- methodinfo *m;
- java_lang_String *s;
-
- c = (classinfo *) this->declaringClass;
- m = &(c->methods[this->slot]);
-
- if (m->signature == NULL)
- return NULL;
-
- s = javastring_new(m->signature);
-
- /* in error case, s == NULL */
-
- return s;
+ return (java_lang_Object *) _Jv_jni_invokeNative(m, (java_handle_t *) o, args);
}