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