java.net implemented.
[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             if (array->arraytype == ARRAYTYPE_OBJECT /* elementtype */
39                 || array->arraytype == ARRAYTYPE_ARRAY) /* elementdescriptor */
40                 size += sizeof(void*);
41
42             if (array->arraytype==ARRAYTYPE_OBJECT || array->arraytype==ARRAYTYPE_OBJECT)
43                 size+=sizeof(void*);
44
45             new = (java_lang_Object*)heap_allocate(size, false, NULL);
46             memcpy(new, this, size);
47
48             return new;
49           }
50         else
51           {
52             if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
53                 exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
54                 return NULL;
55                 }
56         
57         c = this -> header.vftbl -> class;
58         new = (java_lang_Object*) builtin_new (c);
59         if (!new) {
60                 exceptionptr = proto_java_lang_OutOfMemoryError;
61                 return NULL;
62                 }
63
64             memcpy (new, this, c->instancesize);
65             return new;
66           }
67 }
68
69 /*
70  * Class:     java/lang/Object
71  * Method:    getClass
72  * Signature: ()Ljava/lang/Class;
73  */
74 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_Object_getClass ( JNIEnv *env ,  struct java_lang_Object* this)
75 {
76         classinfo *c = this->header.vftbl -> class;
77         use_class_as_object (c);
78         return (java_lang_Class*) c;
79 }
80
81 /*
82  * Class:     java/lang/Object
83  * Method:    hashCode
84  * Signature: ()I
85  */
86 JNIEXPORT s4 JNICALL Java_java_lang_Object_hashCode ( JNIEnv *env ,  struct java_lang_Object* this)
87 {
88         return ((char*) this) - ((char*) 0);    
89 }
90
91 /*
92  * Class:     java/lang/Object
93  * Method:    notify
94  * Signature: ()V
95  */
96 JNIEXPORT void JNICALL Java_java_lang_Object_notify ( JNIEnv *env ,  struct java_lang_Object* this)
97 {
98         if (runverbose)
99                 log_text ("java_lang_Object_notify called");
100
101         #ifdef USE_THREADS
102                 signal_cond_for_object(&this->header);
103         #endif
104 }
105
106 /*
107  * Class:     java/lang/Object
108  * Method:    notifyAll
109  * Signature: ()V
110  */
111 JNIEXPORT void JNICALL Java_java_lang_Object_notifyAll ( JNIEnv *env ,  struct java_lang_Object* this)
112 {
113         if (runverbose)
114                 log_text ("java_lang_Object_notifyAll called");
115
116         #ifdef USE_THREADS
117                 broadcast_cond_for_object(&this->header);
118         #endif
119 }
120
121 /*
122  * Class:     java/lang/Object
123  * Method:    registerNatives
124  * Signature: ()V
125  */
126 JNIEXPORT void JNICALL Java_java_lang_Object_registerNatives ( JNIEnv *env  )
127 {
128     /* empty */
129 }
130
131 /*
132  * Class:     java/lang/Object
133  * Method:    wait
134  * Signature: (J)V
135  */
136 JNIEXPORT void JNICALL Java_java_lang_Object_wait ( JNIEnv *env ,  struct java_lang_Object* this, s8 time)
137 {
138         if (runverbose)
139                 log_text ("java_lang_Object_wait called");
140
141         #ifdef USE_THREADS
142                 wait_cond_for_object(&this->header, time);
143         #endif
144 }
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160