* Merged with default branch at rev 8806c9bebf3e.
[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 "vmcore/class.h"
50
51
52 /* native methods implemented by this file ************************************/
53
54 static JNINativeMethod methods[] = {
55         { "isInstance",              "(Ljava/lang/Class;Ljava/lang/Object;)Z",                        (void *) (ptrint) &Java_java_lang_VMClass_isInstance              },
56         { "isAssignableFrom",        "(Ljava/lang/Class;Ljava/lang/Class;)Z",                         (void *) (ptrint) &Java_java_lang_VMClass_isAssignableFrom        },
57         { "isInterface",             "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isInterface             },
58         { "isPrimitive",             "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isPrimitive             },
59         { "getName",                 "(Ljava/lang/Class;)Ljava/lang/String;",                         (void *) (ptrint) &Java_java_lang_VMClass_getName                 },
60         { "getSuperclass",           "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getSuperclass           },
61         { "getInterfaces",           "(Ljava/lang/Class;)[Ljava/lang/Class;",                         (void *) (ptrint) &Java_java_lang_VMClass_getInterfaces           },
62         { "getComponentType",        "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getComponentType        },
63         { "getModifiers",            "(Ljava/lang/Class;Z)I",                                         (void *) (ptrint) &Java_java_lang_VMClass_getModifiers            },
64         { "getDeclaringClass",       "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getDeclaringClass       },
65         { "getDeclaredClasses",      "(Ljava/lang/Class;Z)[Ljava/lang/Class;",                        (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredClasses      },
66         { "getDeclaredFields",       "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",                (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredFields       },
67         { "getDeclaredMethods",      "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",               (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredMethods      },
68         { "getDeclaredConstructors", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",          (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredConstructors },
69         { "getClassLoader",          "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",                    (void *) (ptrint) &Java_java_lang_VMClass_getClassLoader          },
70         { "forName",                 "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void *) (ptrint) &Java_java_lang_VMClass_forName                 },
71         { "isArray",                 "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isArray                 },
72         { "throwException",          "(Ljava/lang/Throwable;)V",                                      (void *) (ptrint) &Java_java_lang_VMClass_throwException          },
73 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
74         { "getDeclaredAnnotations",  "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;",         (void *) (ptrint) &Java_java_lang_VMClass_getDeclaredAnnotations  },
75 #endif
76         { "getEnclosingClass",       "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingClass       },
77         { "getEnclosingConstructor", "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",            (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingConstructor },
78         { "getEnclosingMethod",      "(Ljava/lang/Class;)Ljava/lang/reflect/Method;",                 (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingMethod      },
79         { "getClassSignature",       "(Ljava/lang/Class;)Ljava/lang/String;",                         (void *) (ptrint) &Java_java_lang_VMClass_getClassSignature       },
80         { "isAnonymousClass",        "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isAnonymousClass        },
81         { "isLocalClass",            "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isLocalClass            },
82         { "isMemberClass",           "(Ljava/lang/Class;)Z",                                          (void *) (ptrint) &Java_java_lang_VMClass_isMemberClass           },
83 };
84
85
86 /* _Jv_java_lang_VMClass_init **************************************************
87
88    Register native functions.
89
90 *******************************************************************************/
91
92 void _Jv_java_lang_VMClass_init(void)
93 {
94         utf *u;
95
96         u = utf_new_char("java/lang/VMClass");
97
98         native_method_register(u, methods, NATIVE_METHODS_COUNT);
99 }
100
101
102 /*
103  * Class:     java/lang/VMClass
104  * Method:    isInstance
105  * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
106  */
107 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
108 {
109         return _Jv_java_lang_Class_isInstance(klass, o);
110 }
111
112
113 /*
114  * Class:     java/lang/VMClass
115  * Method:    isAssignableFrom
116  * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
117  */
118 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
119 {
120         return _Jv_java_lang_Class_isAssignableFrom(klass, c);
121 }
122
123
124 /*
125  * Class:     java/lang/VMClass
126  * Method:    isInterface
127  * Signature: (Ljava/lang/Class;)Z
128  */
129 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
130 {
131         return _Jv_java_lang_Class_isInterface(env, klass);
132 }
133
134
135 /*
136  * Class:     java/lang/VMClass
137  * Method:    isPrimitive
138  * Signature: (Ljava/lang/Class;)Z
139  */
140 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
141 {
142         classinfo *c;
143
144         c = LLNI_classinfo_unwrap(klass);
145
146         return class_is_primitive(c);
147 }
148
149
150 /*
151  * Class:     java/lang/VMClass
152  * Method:    getName
153  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
154  */
155 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
156 {
157         return _Jv_java_lang_Class_getName(klass);
158 }
159
160
161 /*
162  * Class:     java/lang/VMClass
163  * Method:    getSuperclass
164  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
165  */
166 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
167 {
168         classinfo *c;
169         classinfo *super;
170
171         c = LLNI_classinfo_unwrap(klass);
172
173         super = class_get_superclass(c);
174
175         return LLNI_classinfo_wrap(super);
176 }
177
178
179 /*
180  * Class:     java/lang/VMClass
181  * Method:    getInterfaces
182  * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
183  */
184 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
185 {
186         return _Jv_java_lang_Class_getInterfaces(klass);
187 }
188
189
190 /*
191  * Class:     java/lang/VMClass
192  * Method:    getComponentType
193  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
194  */
195 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
196 {
197         classinfo *c;
198         classinfo *component;
199         
200         c = LLNI_classinfo_unwrap(klass);
201         
202         component = class_get_componenttype(c);
203
204         return LLNI_classinfo_wrap(component);
205 }
206
207
208 /*
209  * Class:     java/lang/VMClass
210  * Method:    getModifiers
211  * Signature: (Ljava/lang/Class;Z)I
212  */
213 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 ignoreInnerClassesAttrib)
214 {
215         return _Jv_java_lang_Class_getModifiers(klass, ignoreInnerClassesAttrib);
216 }
217
218
219 /*
220  * Class:     java/lang/VMClass
221  * Method:    getDeclaringClass
222  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
223  */
224 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
225 {
226         classinfo *c;
227         classinfo *dc;
228
229         c = LLNI_classinfo_unwrap(klass);
230
231         dc = class_get_declaringclass(c);
232
233         return LLNI_classinfo_wrap(dc);
234 }
235
236
237 /*
238  * Class:     java/lang/VMClass
239  * Method:    getDeclaredClasses
240  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
241  */
242 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
243 {
244         return _Jv_java_lang_Class_getDeclaredClasses(klass, publicOnly);
245 }
246
247
248 /*
249  * Class:     java/lang/VMClass
250  * Method:    getDeclaredFields
251  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
252  */
253 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
254 {
255         return _Jv_java_lang_Class_getDeclaredFields(klass, publicOnly);
256 }
257
258
259 /*
260  * Class:     java/lang/VMClass
261  * Method:    getDeclaredMethods
262  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
263  */
264 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
265 {
266         return _Jv_java_lang_Class_getDeclaredMethods(klass, publicOnly);
267 }
268
269
270 /*
271  * Class:     java/lang/VMClass
272  * Method:    getDeclaredConstructors
273  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
274  */
275 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, s4 publicOnly)
276 {
277         return _Jv_java_lang_Class_getDeclaredConstructors(klass, publicOnly);
278 }
279
280
281 /*
282  * Class:     java/lang/VMClass
283  * Method:    getClassLoader
284  * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
285  */
286 JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
287 {
288         classinfo   *c;
289         classloader *cl;
290
291         c  = LLNI_classinfo_unwrap(klass);
292         cl = class_get_classloader(c);
293
294         return (java_lang_ClassLoader *) cl;
295 }
296
297
298 /*
299  * Class:     java/lang/VMClass
300  * Method:    forName
301  * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
302  */
303 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *name, s4 initialize, java_lang_ClassLoader *loader)
304 {
305         return _Jv_java_lang_Class_forName(name, initialize, loader);
306 }
307
308
309 /*
310  * Class:     java/lang/VMClass
311  * Method:    isArray
312  * Signature: (Ljava/lang/Class;)Z
313  */
314 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
315 {
316         classinfo *c;
317
318         c = LLNI_classinfo_unwrap(klass);
319
320         return class_is_array(c);
321 }
322
323
324 /*
325  * Class:     java/lang/VMClass
326  * Method:    throwException
327  * Signature: (Ljava/lang/Throwable;)V
328  */
329 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
330 {
331         _Jv_java_lang_Class_throwException(t);
332 }
333
334
335 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
336 /*
337  * Class:     java/lang/VMClass
338  * Method:    getDeclaredAnnotations
339  * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
340  */
341 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
342 {
343         return _Jv_java_lang_Class_getDeclaredAnnotations(klass);
344 }
345 #endif
346
347
348 /*
349  * Class:     java/lang/VMClass
350  * Method:    getEnclosingClass
351  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
352  */
353 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
354 {
355         classinfo *c;
356         classinfo *result;
357
358         c = LLNI_classinfo_unwrap(klass);
359
360         result = class_get_enclosingclass(c);
361
362         return LLNI_classinfo_wrap(result);
363 }
364
365
366 /*
367  * Class:     java/lang/VMClass
368  * Method:    getEnclosingConstructor
369  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
370  */
371 JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
372 {
373         return _Jv_java_lang_Class_getEnclosingConstructor(klass);
374 }
375
376
377 /*
378  * Class:     java/lang/VMClass
379  * Method:    getEnclosingMethod
380  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
381  */
382 JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
383 {
384         return _Jv_java_lang_Class_getEnclosingMethod(klass);
385 }
386
387
388 /*
389  * Class:     java/lang/VMClass
390  * Method:    getClassSignature
391  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
392  */
393 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
394 {
395         return _Jv_java_lang_Class_getClassSignature(klass);
396 }
397
398
399 /*
400  * Class:     java/lang/VMClass
401  * Method:    isAnonymousClass
402  * Signature: (Ljava/lang/Class;)Z
403  */
404 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
405 {
406         return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
407 }
408
409
410 /*
411  * Class:     java/lang/VMClass
412  * Method:    isLocalClass
413  * Signature: (Ljava/lang/Class;)Z
414  */
415 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
416 {
417         return class_is_localclass(LLNI_classinfo_unwrap(klass));
418 }
419
420
421 /*
422  * Class:     java/lang/VMClass
423  * Method:    isMemberClass
424  * Signature: (Ljava/lang/Class;)Z
425  */
426 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
427 {
428         return class_is_memberclass(LLNI_classinfo_unwrap(klass));
429 }
430
431
432 /*
433  * These are local overrides for various environment variables in Emacs.
434  * Please do not remove this and leave it at the end of the file, where
435  * Emacs will automagically detect them.
436  * ---------------------------------------------------------------------
437  * Local variables:
438  * mode: c
439  * indent-tabs-mode: t
440  * c-basic-offset: 4
441  * tab-width: 4
442  * End:
443  * vim:noexpandtab:sw=4:ts=4:
444  */