GNU header update.
[cacao.git] / src / native / vm / VMObject.c
index 6a02806b019cb3ccc8036a6fac1ff39892dbfbf5..13c3bf4fd6729e11a7e0e47b9ce88261c5860ed5 100644 (file)
-/* class: java/lang/Object */
+/* native/vm/VMObject.c - java/lang/Object
+
+   Copyright (C) 1996-2005 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
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Roman Obermaiser
+
+   Changes: Joseph Wenninger
+
+   $Id: VMObject.c 1735 2004-12-07 14:33:27Z twisti $
+
+*/
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "mm/boehm.h"
+#include "mm/memory.h"
+#include "toolbox/logging.h"
+#include "native/jni.h"
+#include "native/native.h"
+#include "native/include/java_lang_Cloneable.h"
+#include "native/include/java_lang_Object.h"
+#include "vm/builtin.h"
+#include "vm/exceptions.h"
+#include "vm/loader.h"
+#include "vm/options.h"
+
+#if defined(USE_THREADS)
+# if defined(NATIVE_THREADS)
+#  include "threads/native/threads.h"
+# else
+#  include "threads/green/threads.h"
+#  include "threads/green/locks.h"
+# endif
+#endif
+
 
 /*
  * Class:     java/lang/Object
  * Method:    clone
  * Signature: ()Ljava/lang/Object;
  */
-/* XXX delete */
-#if 0
-JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEnv *env ,  jclass clazz, struct java_lang_Cloneable* this)
+JNIEXPORT java_lang_Object* JNICALL Java_java_lang_VMObject_clone(JNIEnv *env, jclass clazz, java_lang_Cloneable *this)
 {
-/*     log_text("Java_java_lang_VMObject_clone called");
-       utf_display(((java_objectheader*)this)->vftbl->class->name);
-       log_text("starting cloning");     */
        classinfo *c;
        java_lang_Object *new;
-
-       if (((java_objectheader*)this)->vftbl->class == class_array)
-         {
-           static u4 multiplicator[10];
-           static int is_initialized = 0;
-
-           java_arrayheader *array = (java_arrayheader*)this;
-           u4 size;
-
-           if (!is_initialized)
-             {
-               multiplicator[ARRAYTYPE_INT] = sizeof(s4);
-               multiplicator[ARRAYTYPE_LONG] = sizeof(s8);
-               multiplicator[ARRAYTYPE_FLOAT] = sizeof(float);
-               multiplicator[ARRAYTYPE_DOUBLE] = sizeof(double);
-               multiplicator[ARRAYTYPE_BYTE] = sizeof(s1);
-               multiplicator[ARRAYTYPE_CHAR] = sizeof(u2);
-               multiplicator[ARRAYTYPE_SHORT] = sizeof(s2);
-               multiplicator[ARRAYTYPE_BOOLEAN] = sizeof(u1);
-               multiplicator[ARRAYTYPE_OBJECT] = sizeof(void*);
-               multiplicator[ARRAYTYPE_ARRAY] = sizeof(void*);
-               is_initialized = 1;
-             }
-
-           size = sizeof(java_arrayheader)
-             + array->size * multiplicator[array->arraytype];
-           if (array->arraytype == ARRAYTYPE_OBJECT /* elementtype */
-               || array->arraytype == ARRAYTYPE_ARRAY) /* elementdescriptor */
-               size += sizeof(void*);
-
-           if (array->arraytype==ARRAYTYPE_OBJECT || array->arraytype==ARRAYTYPE_OBJECT)
-               size+=sizeof(void*);
-
-           new = (java_lang_Object*)heap_allocate(size, false, NULL);
-           memcpy(new, this, size);
-
-           return new;
-         }
-       else
-         {
-            if (!class_java_lang_Cloneable)
-                  class_java_lang_Cloneable =
-                        class_new ( utf_new_char ("java/lang/Cloneable") );
-           if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
-               exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
-               return NULL;
-               }
-       
-       c = this -> header.vftbl -> class;
-       new = (java_lang_Object*) builtin_new (c);
-       if (!new) {
-               exceptionptr = proto_java_lang_OutOfMemoryError;
-               return NULL;
-               }
-
-           memcpy (new, this, c->instancesize);
-           return new;
-         }
-       return 0;
-}
-#endif
-JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEnv *env ,  jclass clazz, struct java_lang_Cloneable* this)
-{
-/*     log_text("Java_java_lang_VMObject_clone called");
-       utf_display(((java_objectheader*)this)->vftbl->class->name);
-       log_text("starting cloning");     */
-    classinfo *c;
-    java_lang_Object *new;
-    arraydescriptor *desc;
+       arraydescriptor *desc;
     
-    if ((desc = this->header.vftbl->arraydesc) != NULL) {
-        /* We are cloning an array */
+       if ((desc = this->header.vftbl->arraydesc) != NULL) {
+               /* We are cloning an array */
         
-        u4 size = desc->dataoffset + desc->componentsize * ((java_arrayheader*)this)->size;
+               u4 size = desc->dataoffset + desc->componentsize * ((java_arrayheader *) this)->size;
         
-        new = (java_lang_Object*)heap_allocate(size, (desc->arraytype == ARRAYTYPE_OBJECT), NULL);
-        memcpy(new, this, size);
+               new = (java_lang_Object *) heap_allocate(size, (desc->arraytype == ARRAYTYPE_OBJECT), NULL);
+               memcpy(new, this, size);
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+               initObjectLock((java_objectheader *) new);
+#endif
         
-        return new;
-    }
+               return new;
+       }
     
     /* We are cloning a non-array */
-    if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
-        exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
+    if (!builtin_instanceof((java_objectheader *) this, class_java_lang_Cloneable)) {
+        *exceptionptr =
+                       new_exception(string_java_lang_CloneNotSupportedException);
         return NULL;
     }
 
     /* XXX should use vftbl */
-    c = this -> header.vftbl -> class;
-    new = (java_lang_Object*) builtin_new (c);
-    if (!new) {
-        exceptionptr = proto_java_lang_OutOfMemoryError;
+    c = this->header.vftbl->class;
+    new = (java_lang_Object *) builtin_new(c);
+
+    if (!new)
         return NULL;
-    }
-    memcpy (new, this, c->instancesize);
+
+    memcpy(new, this, c->instancesize);
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       initObjectLock((java_objectheader *) new);
+#endif
+
     return new;
 }
 
@@ -118,29 +111,30 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEn
  * Method:    notify
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMObject_notify ( JNIEnv *env ,  jclass clazz, struct java_lang_Object* this)
+JNIEXPORT void JNICALL Java_java_lang_VMObject_notify(JNIEnv *env, jclass clazz, java_lang_Object *this)
 {
        if (runverbose)
-               log_text ("java_lang_Object_notify called");
+               log_text("java_lang_Object_notify called");
 
-        #ifdef USE_THREADS
-                signal_cond_for_object(&this->header);
-        #endif
+#if defined(USE_THREADS)
+       signal_cond_for_object(&this->header);
+#endif
 }
 
+
 /*
  * Class:     java/lang/Object
  * Method:    notifyAll
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll ( JNIEnv *env ,  jclass clazz, struct java_lang_Object* this)
+JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll(JNIEnv *env, jclass clazz, java_lang_Object *this)
 {
        if (runverbose)
-               log_text ("java_lang_Object_notifyAll called");
+               log_text("java_lang_Object_notifyAll called");
 
-       #ifdef USE_THREADS
-               broadcast_cond_for_object(&this->header);
-       #endif
+#if defined(USE_THREADS)
+       broadcast_cond_for_object(&this->header);
+#endif
 }
 
 
@@ -149,14 +143,26 @@ JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll ( JNIEnv *env ,  jclass
  * Method:    wait
  * Signature: (J)V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMObject_wait ( JNIEnv *env , jclass clazz, struct java_lang_Object* this, s8 time,s4 par3)
+JNIEXPORT void JNICALL Java_java_lang_VMObject_wait(JNIEnv *env, jclass clazz, java_lang_Object *this, s8 time, s4 par3)
 {
        if (runverbose)
-               log_text ("java_lang_Object_wait called");
+               log_text("java_lang_VMObject_wait called");
 
-       #ifdef USE_THREADS
-               wait_cond_for_object(&this->header, time);
-       #endif
+#if defined(USE_THREADS)
+       wait_cond_for_object(&this->header, time, par3);
+#endif
 }
 
 
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */