* src/native/vm/gnu/java_lang_VMClass.c (getModifiers): Use
[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 int32_t JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t ignoreInnerClassesAttrib)
228 {
229         classinfo *c;
230         int32_t    flags;
231
232         c = LLNI_classinfo_unwrap(klass);
233
234         flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
235
236         return flags;
237 }
238
239
240 /*
241  * Class:     java/lang/VMClass
242  * Method:    getDeclaringClass
243  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
244  */
245 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
246 {
247         classinfo *c;
248         classinfo *dc;
249
250         c = LLNI_classinfo_unwrap(klass);
251
252         dc = class_get_declaringclass(c);
253
254         return LLNI_classinfo_wrap(dc);
255 }
256
257
258 /*
259  * Class:     java/lang/VMClass
260  * Method:    getDeclaredClasses
261  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
262  */
263 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
264 {
265         classinfo                 *c;
266         java_handle_objectarray_t *oa;
267
268         c = LLNI_classinfo_unwrap(klass);
269
270         oa = class_get_declaredclasses(c, publicOnly);
271
272         return oa;
273 }
274
275
276 /*
277  * Class:     java/lang/VMClass
278  * Method:    getDeclaredFields
279  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
280  */
281 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
282 {
283         return _Jv_java_lang_Class_getDeclaredFields(klass, publicOnly);
284 }
285
286
287 /*
288  * Class:     java/lang/VMClass
289  * Method:    getDeclaredMethods
290  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
291  */
292 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
293 {
294         return _Jv_java_lang_Class_getDeclaredMethods(klass, publicOnly);
295 }
296
297
298 /*
299  * Class:     java/lang/VMClass
300  * Method:    getDeclaredConstructors
301  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
302  */
303 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
304 {
305         return _Jv_java_lang_Class_getDeclaredConstructors(klass, publicOnly);
306 }
307
308
309 /*
310  * Class:     java/lang/VMClass
311  * Method:    getClassLoader
312  * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
313  */
314 JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
315 {
316         classinfo   *c;
317         classloader *cl;
318
319         c  = LLNI_classinfo_unwrap(klass);
320         cl = class_get_classloader(c);
321
322         return (java_lang_ClassLoader *) cl;
323 }
324
325
326 /*
327  * Class:     java/lang/VMClass
328  * Method:    forName
329  * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
330  */
331 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *name, s4 initialize, java_lang_ClassLoader *loader)
332 {
333         return _Jv_java_lang_Class_forName(name, initialize, loader);
334 }
335
336
337 /*
338  * Class:     java/lang/VMClass
339  * Method:    isArray
340  * Signature: (Ljava/lang/Class;)Z
341  */
342 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
343 {
344         classinfo *c;
345
346         c = LLNI_classinfo_unwrap(klass);
347
348         return class_is_array(c);
349 }
350
351
352 /*
353  * Class:     java/lang/VMClass
354  * Method:    throwException
355  * Signature: (Ljava/lang/Throwable;)V
356  */
357 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
358 {
359         java_handle_t *o;
360
361         o = (java_handle_t *) t;
362
363         exceptions_set_exception(o);
364 }
365
366
367 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
368 /*
369  * Class:     java/lang/VMClass
370  * Method:    getDeclaredAnnotations
371  * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
372  */
373 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
374 {
375         return _Jv_java_lang_Class_getDeclaredAnnotations(klass);
376 }
377 #endif
378
379
380 /*
381  * Class:     java/lang/VMClass
382  * Method:    getEnclosingClass
383  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
384  */
385 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
386 {
387         classinfo *c;
388         classinfo *result;
389
390         c = LLNI_classinfo_unwrap(klass);
391
392         result = class_get_enclosingclass(c);
393
394         return LLNI_classinfo_wrap(result);
395 }
396
397
398 /*
399  * Class:     java/lang/VMClass
400  * Method:    getEnclosingConstructor
401  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
402  */
403 JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
404 {
405         return _Jv_java_lang_Class_getEnclosingConstructor(klass);
406 }
407
408
409 /*
410  * Class:     java/lang/VMClass
411  * Method:    getEnclosingMethod
412  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
413  */
414 JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
415 {
416         return _Jv_java_lang_Class_getEnclosingMethod(klass);
417 }
418
419
420 /*
421  * Class:     java/lang/VMClass
422  * Method:    getClassSignature
423  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
424  */
425 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
426 {
427         classinfo     *c;
428         utf           *u;
429         java_handle_t *s;
430
431         c = LLNI_classinfo_unwrap(klass);
432
433         u = class_get_signature(c);
434
435         if (u == NULL)
436                 return NULL;
437
438         s = javastring_new(u);
439
440         /* in error case s is NULL */
441
442         return (java_lang_String *) s;
443 }
444
445
446 /*
447  * Class:     java/lang/VMClass
448  * Method:    isAnonymousClass
449  * Signature: (Ljava/lang/Class;)Z
450  */
451 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
452 {
453         return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
454 }
455
456
457 /*
458  * Class:     java/lang/VMClass
459  * Method:    isLocalClass
460  * Signature: (Ljava/lang/Class;)Z
461  */
462 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
463 {
464         return class_is_localclass(LLNI_classinfo_unwrap(klass));
465 }
466
467
468 /*
469  * Class:     java/lang/VMClass
470  * Method:    isMemberClass
471  * Signature: (Ljava/lang/Class;)Z
472  */
473 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
474 {
475         return class_is_memberclass(LLNI_classinfo_unwrap(klass));
476 }
477
478
479 /*
480  * These are local overrides for various environment variables in Emacs.
481  * Please do not remove this and leave it at the end of the file, where
482  * Emacs will automagically detect them.
483  * ---------------------------------------------------------------------
484  * Local variables:
485  * mode: c
486  * indent-tabs-mode: t
487  * c-basic-offset: 4
488  * tab-width: 4
489  * End:
490  * vim:noexpandtab:sw=4:ts=4:
491  */