1 /* class: java/lang/Object */
4 * Class: java/lang/Object
6 * Signature: ()Ljava/lang/Object;
10 JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEnv *env , jclass clazz, struct java_lang_Cloneable* this)
12 /* log_text("Java_java_lang_VMObject_clone called");
13 utf_display(((java_objectheader*)this)->vftbl->class->name);
14 log_text("starting cloning"); */
16 java_lang_Object *new;
18 if (((java_objectheader*)this)->vftbl->class == class_array)
20 static u4 multiplicator[10];
21 static int is_initialized = 0;
23 java_arrayheader *array = (java_arrayheader*)this;
28 multiplicator[ARRAYTYPE_INT] = sizeof(s4);
29 multiplicator[ARRAYTYPE_LONG] = sizeof(s8);
30 multiplicator[ARRAYTYPE_FLOAT] = sizeof(float);
31 multiplicator[ARRAYTYPE_DOUBLE] = sizeof(double);
32 multiplicator[ARRAYTYPE_BYTE] = sizeof(s1);
33 multiplicator[ARRAYTYPE_CHAR] = sizeof(u2);
34 multiplicator[ARRAYTYPE_SHORT] = sizeof(s2);
35 multiplicator[ARRAYTYPE_BOOLEAN] = sizeof(u1);
36 multiplicator[ARRAYTYPE_OBJECT] = sizeof(void*);
37 multiplicator[ARRAYTYPE_ARRAY] = sizeof(void*);
41 size = sizeof(java_arrayheader)
42 + array->size * multiplicator[array->arraytype];
43 if (array->arraytype == ARRAYTYPE_OBJECT /* elementtype */
44 || array->arraytype == ARRAYTYPE_ARRAY) /* elementdescriptor */
45 size += sizeof(void*);
47 if (array->arraytype==ARRAYTYPE_OBJECT || array->arraytype==ARRAYTYPE_OBJECT)
50 new = (java_lang_Object*)heap_allocate(size, false, NULL);
51 memcpy(new, this, size);
57 if (!class_java_lang_Cloneable)
58 class_java_lang_Cloneable =
59 class_new ( utf_new_char ("java/lang/Cloneable") );
60 if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
61 exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
65 c = this -> header.vftbl -> class;
66 new = (java_lang_Object*) builtin_new (c);
68 exceptionptr = proto_java_lang_OutOfMemoryError;
72 memcpy (new, this, c->instancesize);
78 JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEnv *env , jclass clazz, struct java_lang_Cloneable* this)
80 /* log_text("Java_java_lang_VMObject_clone called");
81 utf_display(((java_objectheader*)this)->vftbl->class->name);
82 log_text("starting cloning"); */
84 java_lang_Object *new;
85 arraydescriptor *desc;
87 if ((desc = this->header.vftbl->arraydesc) != NULL) {
88 /* We are cloning an array */
90 u4 size = desc->dataoffset + desc->componentsize * ((java_arrayheader*)this)->size;
92 new = (java_lang_Object*)heap_allocate(size, (desc->arraytype == ARRAYTYPE_OBJECT), NULL);
93 memcpy(new, this, size);
98 /* We are cloning a non-array */
99 if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
100 exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
104 /* XXX should use vftbl */
105 c = this -> header.vftbl -> class;
106 new = (java_lang_Object*) builtin_new (c);
108 exceptionptr = proto_java_lang_OutOfMemoryError;
111 memcpy (new, this, c->instancesize);
117 * Class: java/lang/Object
121 JNIEXPORT void JNICALL Java_java_lang_VMObject_notify ( JNIEnv *env , jclass clazz, struct java_lang_Object* this)
124 log_text ("java_lang_Object_notify called");
127 signal_cond_for_object(&this->header);
132 * Class: java/lang/Object
136 JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll ( JNIEnv *env , jclass clazz, struct java_lang_Object* this)
139 log_text ("java_lang_Object_notifyAll called");
142 broadcast_cond_for_object(&this->header);
148 * Class: java/lang/Object
152 JNIEXPORT void JNICALL Java_java_lang_VMObject_wait ( JNIEnv *env , jclass clazz, struct java_lang_Object* this, s8 time,s4 par3)
155 log_text ("java_lang_Object_wait called");
158 wait_cond_for_object(&this->header, time);