-/* src/native/vm/Constructor.c - java/lang/reflect/Constructor
+/* src/native/vm/java_lang_reflect_Constructor.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
-
- Changes: Joseph Wenninger
- Christian Thalinger
-
- $Id: java_lang_reflect_Constructor.c 5153 2006-07-18 08:19:24Z twisti $
-
*/
#include "vm/types.h"
#include "native/jni.h"
+#include "native/llni.h"
#include "native/native.h"
+
+#if defined(WITH_CLASSPATH_SUN)
+# include "native/include/java_lang_String.h" /* required by j.l.CL */
+# include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
+# include "native/include/java_lang_ClassLoader.h" /* required my j.l.C */
+#endif
+
+#include "native/include/java_lang_Object.h" /* required my j.l.C */
#include "native/include/java_lang_Class.h"
-#include "native/include/java_lang_Object.h"
+#include "native/include/java_lang_String.h"
+
#include "native/include/java_lang_reflect_Constructor.h"
+
+#include "native/vm/java_lang_reflect_Constructor.h"
+
#include "toolbox/logging.h"
-#include "vm/class.h"
+
+#include "vm/builtin.h"
#include "vm/exceptions.h"
-#include "vm/method.h"
+#include "vm/access.h"
#include "vm/stringlocal.h"
+#include "vmcore/class.h"
+#include "vmcore/method.h"
+
/*
* Class: java/lang/reflect/Constructor
- * Method: newInstance
- * Signature: ([Ljava/lang/Object;)Ljava/lang/Object;
+ * Method: getModifiers
+ * Signature: ()I
*/
-JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Constructor_constructNative(JNIEnv *env, java_lang_reflect_Constructor *this, java_objectarray *args, java_lang_Class *declaringClass, s4 slot)
+s4 _Jv_java_lang_reflect_Constructor_getModifiers(JNIEnv *env, java_lang_reflect_Constructor *this)
{
- classinfo *c;
- methodinfo *m;
- java_objectheader *o;
-
- c = (classinfo *) declaringClass;
-
-#if 0
- /* find initializer */
-
- if (!args) {
- if (this->parameterTypes->header.size != 0) {
- *exceptionptr =
- new_exception_message(string_java_lang_IllegalArgumentException,
- "wrong number of arguments");
- return NULL;
- }
-
- } else {
- if (this->parameterTypes->header.size != args->header.size) {
- *exceptionptr =
- new_exception_message(string_java_lang_IllegalArgumentException,
- "wrong number of arguments");
- return NULL;
- }
- }
-#endif
-
- if (this->slot >= c->methodscount) {
- log_text("illegal index in methods table");
- return NULL;
- }
-
- /* create object */
-
- o = builtin_new(c);
-
- if (!o)
- return NULL;
-
- m = &(c->methods[this->slot]);
-
- if (m->name != utf_init) {
- /* XXX throw an exception here, although this should never happen */
-
- assert(0);
- }
-
- /* call initializer */
+ classinfo *c;
+ methodinfo *m;
+ int32_t slot;
- (void) _Jv_jni_invokeNative(m, o, args);
+ LLNI_field_get_cls(this, clazz, c);
+ LLNI_field_get_val(this, slot , slot);
+ m = &(c->methods[slot]);
- return (java_lang_Object *) o;
+ return m->flags;
}
/*
* Class: java/lang/reflect/Constructor
- * Method: getModifiersInternal
- * Signature: ()I
+ * Method: getParameterTypes
+ * Signature: ()[Ljava/lang/Class;
*/
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Constructor_getModifiersInternal(JNIEnv *env, java_lang_reflect_Constructor *this)
+java_handle_objectarray_t *_Jv_java_lang_reflect_Constructor_getParameterTypes(JNIEnv *env, java_lang_reflect_Constructor *this)
{
classinfo *c;
methodinfo *m;
+ int32_t slot;
- c = (classinfo *) (this->clazz);
- m = &(c->methods[this->slot]);
+ LLNI_field_get_cls(this, clazz, c);
+ LLNI_field_get_val(this, slot , slot);
+ m = &(c->methods[slot]);
- return m->flags;
+ return method_get_parametertypearray(m);
}
/*
* Class: java/lang/reflect/Constructor
- * Method: getParameterTypes
+ * Method: getExceptionTypes
* Signature: ()[Ljava/lang/Class;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_reflect_Constructor_getParameterTypes(JNIEnv *env, java_lang_reflect_Constructor *this)
+java_handle_objectarray_t *_Jv_java_lang_reflect_Constructor_getExceptionTypes(JNIEnv *env, java_lang_reflect_Constructor *this)
{
classinfo *c;
methodinfo *m;
+ int32_t slot;
- c = (classinfo *) this->clazz;
+ LLNI_field_get_cls(this, clazz, c);
+ LLNI_field_get_val(this, slot , slot);
+ m = &(c->methods[slot]);
- if ((this->slot < 0) || (this->slot >= c->methodscount)) {
- log_text("error illegal slot for constructor in class");
- assert(0);
+ return method_get_exceptionarray(m);
+}
+
+
+/*
+ * Class: java/lang/reflect/Constructor
+ * Method: newInstance
+ * Signature: ([Ljava/lang/Object;)Ljava/lang/Object;
+ */
+java_lang_Object *_Jv_java_lang_reflect_Constructor_newInstance(JNIEnv *env, java_lang_reflect_Constructor *this, java_handle_objectarray_t *args)
+{
+ classinfo *c;
+ methodinfo *m;
+ s4 override;
+ java_handle_t *o;
+ int32_t slot;
+
+ 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 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;
}
- m = &(c->methods[this->slot]);
+ /* create object */
+
+ o = builtin_new(c);
+
+ if (o == NULL)
+ return NULL;
+
+ /* call initializer */
- return native_get_parametertypes(m);
+ (void) _Jv_jni_invokeNative(m, o, args);
+
+ return (java_lang_Object *) o;
}
/*
* Class: java/lang/reflect/Constructor
- * Method: getExceptionTypes
- * Signature: ()[Ljava/lang/Class;
+ * Method: getSignature
+ * Signature: ()Ljava/lang/String;
*/
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_reflect_Constructor_getExceptionTypes(JNIEnv *env, java_lang_reflect_Constructor *this)
+java_lang_String *_Jv_java_lang_reflect_Constructor_getSignature(JNIEnv *env, java_lang_reflect_Constructor *this)
{
- classinfo *c;
- methodinfo *m;
+ classinfo *c;
+ methodinfo *m;
+ java_handle_t *o;
+ int32_t slot;
- c = (classinfo *) this->clazz;
+ LLNI_field_get_cls(this, clazz, c);
+ LLNI_field_get_val(this, slot , slot);
+ m = &(c->methods[slot]);
- if ((this->slot < 0) || (this->slot >= c->methodscount)) {
- log_text("error illegal slot for constructor in class");
- assert(0);
- }
+ if (m->signature == NULL)
+ return NULL;
+
+ o = javastring_new(m->signature);
- m = &(c->methods[this->slot]);
+ /* in error case o is NULL */
- return native_get_exceptiontypes(m);
+ return (java_lang_String *) o;
}