-/* 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;
}
* 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
}
* 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:
+ */