* Removed all Id tags.
[cacao.git] / src / native / vm / java_lang_reflect_Constructor.c
index 60905b28f0a24f5dcc24b4c8c113e439927a4380..72deed80334fe156c867bf8fefd2408564fa0f1f 100644 (file)
@@ -1,6 +1,6 @@
-/* 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;
 }