* Merged with michi branch at rev 21fd42e049a3.
[cacao.git] / src / native / vm / gnu / java_lang_VMClass.c
1 /* src/native/vm/gnu/java_lang_VMClass.c
2
3    Copyright (C) 2006, 2007 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25 */
26
27
28 #include "config.h"
29
30 #include <stdint.h>
31
32 #include "vm/types.h"
33
34 #include "native/jni.h"
35 #include "native/llni.h"
36 #include "native/native.h"
37
38 #include "native/include/java_lang_Class.h"
39 #include "native/include/java_lang_ClassLoader.h"
40 #include "native/include/java_lang_Object.h"
41 #include "native/include/java_lang_Throwable.h"
42 #include "native/include/java_lang_reflect_Constructor.h"
43 #include "native/include/java_lang_reflect_Method.h"
44
45 #include "native/include/java_lang_VMClass.h"
46
47 #include "native/vm/java_lang_Class.h"
48
49 #include "vm/exceptions.h"
50 #include "vm/stringlocal.h"
51
52 #include "vmcore/class.h"
53
54
55 /* native methods implemented by this file ************************************/
56
57 static JNINativeMethod methods[] = {
58         { "isInstance",              "(Ljava/lang/Class;Ljava/lang/Object;)Z",                        (void *) (ptrint) &Java_java_lang_VMClass_isInstance              },
59         { "isAssignableFrom",        "(Ljava/lang/Class;Ljava/lang/Class;)Z",                         (void *) (ptrint) &Java_java_lang_VMClass_isAssignableFrom        },
60         { "isInterface",             "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isInterface             },
61         { "isPrimitive",             "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isPrimitive             },
62         { "getName",                 "(Ljava/lang/Class;)Ljava/lang/String;",                         (void *) (ptrint) &Java_java_lang_VMClass_getName                 },
63         { "getSuperclass",           "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getSuperclass           },
64         { "getInterfaces",           "(Ljava/lang/Class;)[Ljava/lang/Class;",                         (void *) (ptrint) &Java_java_lang_VMClass_getInterfaces           },
65         { "getComponentType",        "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getComponentType        },
66         { "getModifiers",            "(Ljava/lang/Class;Z)I",                                         (void *) (ptrint) &Java_java_lang_VMClass_getModifiers            },
67         { "getDeclaringClass",       "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getDeclaringClass       },
68         { "getDeclaredClasses",      "(Ljava/lang/Class;Z)[Ljava/lang/Class;",                        (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredClasses      },
69         { "getDeclaredFields",       "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",                (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredFields       },
70         { "getDeclaredMethods",      "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",               (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredMethods      },
71         { "getDeclaredConstructors", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",          (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredConstructors },
72         { "getClassLoader",          "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",                    (void *) (ptrint) &Java_java_lang_VMClass_getClassLoader          },
73         { "forName",                 "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClass_forName                 },
74         { "isArray",                 "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isArray                 },
75         { "throwException",          "(Ljava/lang/Throwable;)V",                                      (void *) (ptrint) &Java_java_lang_VMClass_throwException          },
76 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
77         { "getDeclaredAnnotations",  "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;",         (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredAnnotations  },
78 #endif
79         { "getEnclosingClass",       "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingClass       },
80         { "getEnclosingConstructor", "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",            (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingConstructor },
81         { "getEnclosingMethod",      "(Ljava/lang/Class;)Ljava/lang/reflect/Method;",                 (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingMethod      },
82         { "getClassSignature",       "(Ljava/lang/Class;)Ljava/lang/String;",                         (void *) (ptrint) &Java_java_lang_VMClass_getClassSignature       },
83         { "isAnonymousClass",        "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isAnonymousClass        },
84         { "isLocalClass",            "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isLocalClass            },
85         { "isMemberClass",           "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isMemberClass           },
86 };
87
88
89 /* _Jv_java_lang_VMClass_init **************************************************
90
91    Register native functions.
92
93 *******************************************************************************/
94
95 void _Jv_java_lang_VMClass_init(void)
96 {
97         utf *u;
98
99         u = utf_new_char("java/lang/VMClass");
100
101         native_method_register(u, methods, NATIVE_METHODS_COUNT);
102 }
103
104
105 /*
106  * Class:     java/lang/VMClass
107  * Method:    isInstance
108  * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
109  */
110 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
111 {
112         return _Jv_java_lang_Class_isInstance(klass, o);
113 }
114
115
116 /*
117  * Class:     java/lang/VMClass
118  * Method:    isAssignableFrom
119  * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
120  */
121 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
122 {
123         return _Jv_java_lang_Class_isAssignableFrom(klass, c);
124 }
125
126
127 /*
128  * Class:     java/lang/VMClass
129  * Method:    isInterface
130  * Signature: (Ljava/lang/Class;)Z
131  */
132 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
133 {
134         classinfo *c;
135
136         c = LLNI_classinfo_unwrap(klass);
137
138         return class_is_interface(c);
139 }
140
141
142 /*
143  * Class:     java/lang/VMClass
144  * Method:    isPrimitive
145  * Signature: (Ljava/lang/Class;)Z
146  */
147 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
148 {
149         classinfo *c;
150
151         c = LLNI_classinfo_unwrap(klass);
152
153         return class_is_primitive(c);
154 }
155
156
157 /*
158  * Class:     java/lang/VMClass
159  * Method:    getName
160  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
161  */
162 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
163 {
164         return _Jv_java_lang_Class_getName(klass);
165 }
166
167
168 /*
169  * Class:     java/lang/VMClass
170  * Method:    getSuperclass
171  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
172  */
173 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
174 {
175         classinfo *c;
176         classinfo *super;
177
178         c = LLNI_classinfo_unwrap(klass);
179
180         super = class_get_superclass(c);
181
182         return LLNI_classinfo_wrap(super);
183 }
184
185
186 /*
187  * Class:     java/lang/VMClass
188  * Method:    getInterfaces
189  * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
190  */
191 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
192 {
193         classinfo                 *c;
194         java_handle_objectarray_t *oa;
195
196         c = LLNI_classinfo_unwrap(klass);
197
198         oa = class_get_interfaces(c);
199
200         return oa;
201 }
202
203
204 /*
205  * Class:     java/lang/VMClass
206  * Method:    getComponentType
207  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
208  */
209 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
210 {
211         classinfo *c;
212         classinfo *component;
213         
214         c = LLNI_classinfo_unwrap(klass);
215         
216         component = class_get_componenttype(c);
217
218         return LLNI_classinfo_wrap(component);
219 }
220
221
222 /*
223  * Class:     java/lang/VMClass
224  * Method:    getModifiers
225  * Signature: (Ljava/lang/Class;Z)I
226  */
227 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 ignoreInnerClassesAttrib)
228 {
229         return _Jv_java_lang_Class_getModifiers(klass, ignoreInnerClassesAttrib);
230 }
231
232
233 /*
234  * Class:     java/lang/VMClass
235  * Method:    getDeclaringClass
236  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
237  */
238 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
239 {
240         classinfo *c;
241         classinfo *dc;
242
243         c = LLNI_classinfo_unwrap(klass);
244
245         dc = class_get_declaringclass(c);
246
247         return LLNI_classinfo_wrap(dc);
248 }
249
250
251 /*
252  * Class:     java/lang/VMClass
253  * Method:    getDeclaredClasses
254  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
255  */
256 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
257 {
258         classinfo                 *c;
259         java_handle_objectarray_t *oa;
260
261         c = LLNI_classinfo_unwrap(klass);
262
263         oa = class_get_declaredclasses(c, publicOnly);
264
265         return oa;
266 }
267
268
269 /*
270  * Class:     java/lang/VMClass
271  * Method:    getDeclaredFields
272  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
273  */
274 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
275 {
276         return _Jv_java_lang_Class_getDeclaredFields(klass, publicOnly);
277 }
278
279
280 /*
281  * Class:     java/lang/VMClass
282  * Method:    getDeclaredMethods
283  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
284  */
285 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
286 {
287         return _Jv_java_lang_Class_getDeclaredMethods(klass, publicOnly);
288 }
289
290
291 /*
292  * Class:     java/lang/VMClass
293  * Method:    getDeclaredConstructors
294  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
295  */
296 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
297 {
298         return _Jv_java_lang_Class_getDeclaredConstructors(klass, publicOnly);
299 }
300
301
302 /*
303  * Class:     java/lang/VMClass
304  * Method:    getClassLoader
305  * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
306  */
307 JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
308 {
309         classinfo   *c;
310         classloader *cl;
311
312         c  = LLNI_classinfo_unwrap(klass);
313         cl = class_get_classloader(c);
314
315         return (java_lang_ClassLoader *) cl;
316 }
317
318
319 /*
320  * Class:     java/lang/VMClass
321  * Method:    forName
322  * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
323  */
324 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *name, s4 initialize, java_lang_ClassLoader *loader)
325 {
326         return _Jv_java_lang_Class_forName(name, initialize, loader);
327 }
328
329
330 /*
331  * Class:     java/lang/VMClass
332  * Method:    isArray
333  * Signature: (Ljava/lang/Class;)Z
334  */
335 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
336 {
337         classinfo *c;
338
339         c = LLNI_classinfo_unwrap(klass);
340
341         return class_is_array(c);
342 }
343
344
345 /*
346  * Class:     java/lang/VMClass
347  * Method:    throwException
348  * Signature: (Ljava/lang/Throwable;)V
349  */
350 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
351 {
352         java_handle_t *o;
353
354         o = (java_handle_t *) t;
355
356         exceptions_set_exception(o);
357 }
358
359
360 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
361 /*
362  * Class:     java/lang/VMClass
363  * Method:    getDeclaredAnnotations
364  * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
365  */
366 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
367 {
368         return _Jv_java_lang_Class_getDeclaredAnnotations(klass);
369 }
370 #endif
371
372
373 /*
374  * Class:     java/lang/VMClass
375  * Method:    getEnclosingClass
376  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
377  */
378 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
379 {
380         classinfo *c;
381         classinfo *result;
382
383         c = LLNI_classinfo_unwrap(klass);
384
385         result = class_get_enclosingclass(c);
386
387         return LLNI_classinfo_wrap(result);
388 }
389
390
391 /*
392  * Class:     java/lang/VMClass
393  * Method:    getEnclosingConstructor
394  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
395  */
396 JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
397 {
398         return _Jv_java_lang_Class_getEnclosingConstructor(klass);
399 }
400
401
402 /*
403  * Class:     java/lang/VMClass
404  * Method:    getEnclosingMethod
405  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
406  */
407 JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
408 {
409         return _Jv_java_lang_Class_getEnclosingMethod(klass);
410 }
411
412
413 /*
414  * Class:     java/lang/VMClass
415  * Method:    getClassSignature
416  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
417  */
418 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
419 {
420         classinfo     *c;
421         utf           *u;
422         java_handle_t *s;
423
424         c = LLNI_classinfo_unwrap(klass);
425
426         u = class_get_signature(c);
427
428         if (u == NULL)
429                 return NULL;
430
431         s = javastring_new(u);
432
433         /* in error case s is NULL */
434
435         return (java_lang_String *) s;
436 }
437
438
439 /*
440  * Class:     java/lang/VMClass
441  * Method:    isAnonymousClass
442  * Signature: (Ljava/lang/Class;)Z
443  */
444 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
445 {
446         return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
447 }
448
449
450 /*
451  * Class:     java/lang/VMClass
452  * Method:    isLocalClass
453  * Signature: (Ljava/lang/Class;)Z
454  */
455 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
456 {
457         return class_is_localclass(LLNI_classinfo_unwrap(klass));
458 }
459
460
461 /*
462  * Class:     java/lang/VMClass
463  * Method:    isMemberClass
464  * Signature: (Ljava/lang/Class;)Z
465  */
466 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
467 {
468         return class_is_memberclass(LLNI_classinfo_unwrap(klass));
469 }
470
471
472 /*
473  * These are local overrides for various environment variables in Emacs.
474  * Please do not remove this and leave it at the end of the file, where
475  * Emacs will automagically detect them.
476  * ---------------------------------------------------------------------
477  * Local variables:
478  * mode: c
479  * indent-tabs-mode: t
480  * c-basic-offset: 4
481  * tab-width: 4
482  * End:
483  * vim:noexpandtab:sw=4:ts=4:
484  */