78a46d1ee8e01218813e9417f5b87fb31833ae17
[cacao.git] / nat / Object.c
1 /* class: java/lang/Object */
2
3 /*
4  * Class:     java/lang/Object
5  * Method:    clone
6  * Signature: ()Ljava/lang/Object;
7  */
8 JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_Object_clone ( JNIEnv *env ,  struct java_lang_Object* this)
9 {
10         classinfo *c;
11         java_lang_Object *new;
12
13         if (((java_objectheader*)this)->vftbl->class == class_array)
14           {
15             static u4 multiplicator[10];
16             static int is_initialized = 0;
17
18             java_arrayheader *array = (java_arrayheader*)this;
19             u4 size;
20
21             if (!is_initialized)
22               {
23                 multiplicator[ARRAYTYPE_INT] = sizeof(s4);
24                 multiplicator[ARRAYTYPE_LONG] = sizeof(s8);
25                 multiplicator[ARRAYTYPE_FLOAT] = sizeof(float);
26                 multiplicator[ARRAYTYPE_DOUBLE] = sizeof(double);
27                 multiplicator[ARRAYTYPE_BYTE] = sizeof(s1);
28                 multiplicator[ARRAYTYPE_CHAR] = sizeof(u2);
29                 multiplicator[ARRAYTYPE_SHORT] = sizeof(s2);
30                 multiplicator[ARRAYTYPE_BOOLEAN] = sizeof(u1);
31                 multiplicator[ARRAYTYPE_OBJECT] = sizeof(void*);
32                 multiplicator[ARRAYTYPE_ARRAY] = sizeof(void*);
33                 is_initialized = 1;
34               }
35
36             size = sizeof(java_arrayheader)
37               + array->size * multiplicator[array->arraytype];
38
39             if (array->arraytype==ARRAYTYPE_OBJECT || array->arraytype==ARRAYTYPE_OBJECT)
40                 size+=sizeof(void*);
41
42             new = (java_lang_Object*)heap_allocate(size, false, NULL);
43             memcpy(new, this, size);
44
45             return new;
46           }
47         else
48           {
49             if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
50                 exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
51                 return NULL;
52                 }
53         
54         c = this -> header.vftbl -> class;
55         new = (java_lang_Object*) builtin_new (c);
56         if (!new) {
57                 exceptionptr = proto_java_lang_OutOfMemoryError;
58                 return NULL;
59                 }
60
61             memcpy (new, this, c->instancesize);
62             return new;
63           }
64 }
65
66 /*
67  * Class:     java/lang/Object
68  * Method:    getClass
69  * Signature: ()Ljava/lang/Class;
70  */
71 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_Object_getClass ( JNIEnv *env ,  struct java_lang_Object* this)
72 {
73         classinfo *c = this->header.vftbl -> class;
74         use_class_as_object (c);
75         return (java_lang_Class*) c;
76 }
77
78 /*
79  * Class:     java/lang/Object
80  * Method:    hashCode
81  * Signature: ()I
82  */
83 JNIEXPORT s4 JNICALL Java_java_lang_Object_hashCode ( JNIEnv *env ,  struct java_lang_Object* this)
84 {
85         return ((char*) this) - ((char*) 0);    
86 }
87
88 /*
89  * Class:     java/lang/Object
90  * Method:    notify
91  * Signature: ()V
92  */
93 JNIEXPORT void JNICALL Java_java_lang_Object_notify ( JNIEnv *env ,  struct java_lang_Object* this)
94 {
95         if (runverbose)
96                 log_text ("java_lang_Object_notify called");
97
98         #ifdef USE_THREADS
99                 signal_cond_for_object(&this->header);
100         #endif
101 }
102
103 /*
104  * Class:     java/lang/Object
105  * Method:    notifyAll
106  * Signature: ()V
107  */
108 JNIEXPORT void JNICALL Java_java_lang_Object_notifyAll ( JNIEnv *env ,  struct java_lang_Object* this)
109 {
110         if (runverbose)
111                 log_text ("java_lang_Object_notifyAll called");
112
113         #ifdef USE_THREADS
114                 broadcast_cond_for_object(&this->header);
115         #endif
116 }
117
118 /*
119  * Class:     java/lang/Object
120  * Method:    registerNatives
121  * Signature: ()V
122  */
123 JNIEXPORT void JNICALL Java_java_lang_Object_registerNatives ( JNIEnv *env  )
124 {
125     /* empty */
126 }
127
128 /*
129  * Class:     java/lang/Object
130  * Method:    wait
131  * Signature: (J)V
132  */
133 JNIEXPORT void JNICALL Java_java_lang_Object_wait ( JNIEnv *env ,  struct java_lang_Object* this, s8 time)
134 {
135         if (runverbose)
136                 log_text ("java_lang_Object_wait called");
137
138         #ifdef USE_THREADS
139                 wait_cond_for_object(&this->header, time);
140         #endif
141 }
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157