886a3ced0efcc183ea17f09a06750c34e842862a
[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 "native/jni.h"
31 #include "native/llni.h"
32 #include "native/native.h"
33
34 #include "native/include/java_lang_Class.h"
35 #include "native/include/java_lang_ClassLoader.h"
36 #include "native/include/java_lang_Object.h"
37 #include "native/include/java_lang_String.h"
38 #include "native/include/java_lang_Throwable.h"
39 #include "native/include/java_lang_reflect_Constructor.h"
40 #include "native/include/java_lang_reflect_Method.h"
41
42 #include "native/include/java_lang_VMClass.h"
43
44 #include "vm/exceptions.h"
45 #include "vm/initialize.h"
46 #include "vm/stringlocal.h"
47
48 #include "vmcore/class.h"
49
50 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
51 #include "native/include/sun_reflect_ConstantPool.h"
52
53 #include "vm/vm.h"
54
55 #include "vmcore/annotation.h"
56 #endif
57
58
59 /* native methods implemented by this file ************************************/
60
61 static JNINativeMethod methods[] = {
62         { "isInstance",              "(Ljava/lang/Class;Ljava/lang/Object;)Z",                        (void *) (uintptr_t) &Java_java_lang_VMClass_isInstance              },
63         { "isAssignableFrom",        "(Ljava/lang/Class;Ljava/lang/Class;)Z",                         (void *) (uintptr_t) &Java_java_lang_VMClass_isAssignableFrom        },
64         { "isInterface",             "(Ljava/lang/Class;)Z",                                          (void *) (uintptr_t) &Java_java_lang_VMClass_isInterface             },
65         { "isPrimitive",             "(Ljava/lang/Class;)Z",                                          (void *) (uintptr_t) &Java_java_lang_VMClass_isPrimitive             },
66         { "getName",                 "(Ljava/lang/Class;)Ljava/lang/String;",                         (void *) (uintptr_t) &Java_java_lang_VMClass_getName                 },
67         { "getSuperclass",           "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (uintptr_t) &Java_java_lang_VMClass_getSuperclass           },
68         { "getInterfaces",           "(Ljava/lang/Class;)[Ljava/lang/Class;",                         (void *) (uintptr_t) &Java_java_lang_VMClass_getInterfaces           },
69         { "getComponentType",        "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (uintptr_t) &Java_java_lang_VMClass_getComponentType        },
70         { "getModifiers",            "(Ljava/lang/Class;Z)I",                                         (void *) (uintptr_t) &Java_java_lang_VMClass_getModifiers            },
71         { "getDeclaringClass",       "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (uintptr_t) &Java_java_lang_VMClass_getDeclaringClass       },
72         { "getDeclaredClasses",      "(Ljava/lang/Class;Z)[Ljava/lang/Class;",                        (void *) (uintptr_t) &Java_java_lang_VMClass_getDeclaredClasses      },
73         { "getDeclaredFields",       "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",                (void *) (uintptr_t) &Java_java_lang_VMClass_getDeclaredFields       },
74         { "getDeclaredMethods",      "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",               (void *) (uintptr_t) &Java_java_lang_VMClass_getDeclaredMethods      },
75         { "getDeclaredConstructors", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",          (void *) (uintptr_t) &Java_java_lang_VMClass_getDeclaredConstructors },
76         { "getClassLoader",          "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",                    (void *) (uintptr_t) &Java_java_lang_VMClass_getClassLoader          },
77         { "forName",                 "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void *) (uintptr_t) &Java_java_lang_VMClass_forName                 },
78         { "isArray",                 "(Ljava/lang/Class;)Z",                                          (void *) (uintptr_t) &Java_java_lang_VMClass_isArray                 },
79         { "throwException",          "(Ljava/lang/Throwable;)V",                                      (void *) (uintptr_t) &Java_java_lang_VMClass_throwException          },
80 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
81         { "getDeclaredAnnotations",  "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;",         (void *) (uintptr_t) &Java_java_lang_VMClass_getDeclaredAnnotations  },
82 #endif
83         { "getEnclosingClass",       "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void *) (uintptr_t) &Java_java_lang_VMClass_getEnclosingClass       },
84         { "getEnclosingConstructor", "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",            (void *) (uintptr_t) &Java_java_lang_VMClass_getEnclosingConstructor },
85         { "getEnclosingMethod",      "(Ljava/lang/Class;)Ljava/lang/reflect/Method;",                 (void *) (uintptr_t) &Java_java_lang_VMClass_getEnclosingMethod      },
86         { "getClassSignature",       "(Ljava/lang/Class;)Ljava/lang/String;",                         (void *) (uintptr_t) &Java_java_lang_VMClass_getClassSignature       },
87         { "isAnonymousClass",        "(Ljava/lang/Class;)Z",                                          (void *) (uintptr_t) &Java_java_lang_VMClass_isAnonymousClass        },
88         { "isLocalClass",            "(Ljava/lang/Class;)Z",                                          (void *) (uintptr_t) &Java_java_lang_VMClass_isLocalClass            },
89         { "isMemberClass",           "(Ljava/lang/Class;)Z",                                          (void *) (uintptr_t) &Java_java_lang_VMClass_isMemberClass           },
90 };
91
92
93 /* _Jv_java_lang_VMClass_init **************************************************
94
95    Register native functions.
96
97 *******************************************************************************/
98
99 void _Jv_java_lang_VMClass_init(void)
100 {
101         utf *u;
102
103         u = utf_new_char("java/lang/VMClass");
104
105         native_method_register(u, methods, NATIVE_METHODS_COUNT);
106 }
107
108
109 /*
110  * Class:     java/lang/VMClass
111  * Method:    isInstance
112  * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
113  */
114 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
115 {
116         classinfo     *c;
117         java_handle_t *h;
118
119         c = LLNI_classinfo_unwrap(klass);
120         h = (java_handle_t *) o;
121
122         return class_is_instance(c, h);
123 }
124
125
126 /*
127  * Class:     java/lang/VMClass
128  * Method:    isAssignableFrom
129  * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
130  */
131 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
132 {
133         classinfo *to;
134         classinfo *from;
135
136         to   = LLNI_classinfo_unwrap(klass);
137         from = LLNI_classinfo_unwrap(c);
138
139         if (from == NULL) {
140                 exceptions_throw_nullpointerexception();
141                 return 0;
142         }
143
144         return class_is_assignable_from(to, from);
145 }
146
147
148 /*
149  * Class:     java/lang/VMClass
150  * Method:    isInterface
151  * Signature: (Ljava/lang/Class;)Z
152  */
153 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
154 {
155         classinfo *c;
156
157         c = LLNI_classinfo_unwrap(klass);
158
159         return class_is_interface(c);
160 }
161
162
163 /*
164  * Class:     java/lang/VMClass
165  * Method:    isPrimitive
166  * Signature: (Ljava/lang/Class;)Z
167  */
168 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
169 {
170         classinfo *c;
171
172         c = LLNI_classinfo_unwrap(klass);
173
174         return class_is_primitive(c);
175 }
176
177
178 /*
179  * Class:     java/lang/VMClass
180  * Method:    getName
181  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
182  */
183 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
184 {
185         classinfo* c;
186
187         c = LLNI_classinfo_unwrap(klass);
188
189         return (java_lang_String*) class_get_classname(c);
190 }
191
192
193 /*
194  * Class:     java/lang/VMClass
195  * Method:    getSuperclass
196  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
197  */
198 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
199 {
200         classinfo *c;
201         classinfo *super;
202
203         c = LLNI_classinfo_unwrap(klass);
204
205         super = class_get_superclass(c);
206
207         return LLNI_classinfo_wrap(super);
208 }
209
210
211 /*
212  * Class:     java/lang/VMClass
213  * Method:    getInterfaces
214  * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
215  */
216 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
217 {
218         classinfo                 *c;
219         java_handle_objectarray_t *oa;
220
221         c = LLNI_classinfo_unwrap(klass);
222
223         oa = class_get_interfaces(c);
224
225         return oa;
226 }
227
228
229 /*
230  * Class:     java/lang/VMClass
231  * Method:    getComponentType
232  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
233  */
234 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
235 {
236         classinfo *c;
237         classinfo *component;
238         
239         c = LLNI_classinfo_unwrap(klass);
240         
241         component = class_get_componenttype(c);
242
243         return LLNI_classinfo_wrap(component);
244 }
245
246
247 /*
248  * Class:     java/lang/VMClass
249  * Method:    getModifiers
250  * Signature: (Ljava/lang/Class;Z)I
251  */
252 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t ignoreInnerClassesAttrib)
253 {
254         classinfo *c;
255         int32_t    flags;
256
257         c = LLNI_classinfo_unwrap(klass);
258
259         flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
260
261         return flags;
262 }
263
264
265 /*
266  * Class:     java/lang/VMClass
267  * Method:    getDeclaringClass
268  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
269  */
270 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
271 {
272         classinfo *c;
273         classinfo *dc;
274
275         c = LLNI_classinfo_unwrap(klass);
276
277         dc = class_get_declaringclass(c);
278
279         return LLNI_classinfo_wrap(dc);
280 }
281
282
283 /*
284  * Class:     java/lang/VMClass
285  * Method:    getDeclaredClasses
286  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
287  */
288 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
289 {
290         classinfo                 *c;
291         java_handle_objectarray_t *oa;
292
293         c = LLNI_classinfo_unwrap(klass);
294
295         oa = class_get_declaredclasses(c, publicOnly);
296
297         return oa;
298 }
299
300
301 /*
302  * Class:     java/lang/VMClass
303  * Method:    getDeclaredFields
304  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
305  */
306 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
307 {
308         classinfo                 *c;
309         java_handle_objectarray_t *oa;
310
311         c = LLNI_classinfo_unwrap(klass);
312
313         oa = class_get_declaredfields(c, publicOnly);
314
315         return oa;
316 }
317
318
319 /*
320  * Class:     java/lang/VMClass
321  * Method:    getDeclaredMethods
322  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
323  */
324 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
325 {
326         classinfo                 *c;
327         java_handle_objectarray_t *oa;
328
329         c = LLNI_classinfo_unwrap(klass);
330
331         oa = class_get_declaredmethods(c, publicOnly);
332
333         return oa;
334 }
335
336
337 /*
338  * Class:     java/lang/VMClass
339  * Method:    getDeclaredConstructors
340  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
341  */
342 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
343 {
344         classinfo                 *c;
345         java_handle_objectarray_t *oa;
346
347         c = LLNI_classinfo_unwrap(klass);
348
349         oa = class_get_declaredconstructors(c, publicOnly);
350
351         return oa;
352 }
353
354
355 /*
356  * Class:     java/lang/VMClass
357  * Method:    getClassLoader
358  * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
359  */
360 JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
361 {
362         classinfo     *c;
363         classloader_t *cl;
364
365         c  = LLNI_classinfo_unwrap(klass);
366         cl = class_get_classloader(c);
367
368         return (java_lang_ClassLoader *) cl;
369 }
370
371
372 /*
373  * Class:     java/lang/VMClass
374  * Method:    forName
375  * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
376  */
377 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *name, int32_t initialize, java_lang_ClassLoader *loader)
378 {
379         classloader_t *cl;
380         utf           *ufile;
381         utf           *uname;
382         classinfo     *c;
383         u2            *pos;
384         int32_t        i;
385
386         cl = loader_hashtable_classloader_add((java_handle_t *) loader);
387
388         /* illegal argument */
389
390         if (name == NULL) {
391                 exceptions_throw_nullpointerexception();
392                 return NULL;
393         }
394
395         /* create utf string in which '.' is replaced by '/' */
396
397         ufile = javastring_toutf((java_handle_t *) name, true);
398         uname = javastring_toutf((java_handle_t *) name, false);
399
400         /* name must not contain '/' (mauve test) */
401
402         for (i = 0, pos = LLNI_field_direct(name, value)->data + LLNI_field_direct(name, offset); i < LLNI_field_direct(name, count); i++, pos++) {
403                 if (*pos == '/') {
404                         exceptions_throw_classnotfoundexception(uname);
405                         return NULL;
406                 }
407         }
408
409         /* try to load, ... */
410
411         c = load_class_from_classloader(ufile, cl);
412
413         if (c == NULL)
414             return NULL;
415
416         /* link, ... */
417
418         if (!link_class(c))
419                 return NULL;
420         
421         /* ...and initialize it, if required */
422
423         if (initialize)
424                 if (!initialize_class(c))
425                         return NULL;
426
427         return LLNI_classinfo_wrap(c);
428 }
429
430
431 /*
432  * Class:     java/lang/VMClass
433  * Method:    isArray
434  * Signature: (Ljava/lang/Class;)Z
435  */
436 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
437 {
438         classinfo *c;
439
440         c = LLNI_classinfo_unwrap(klass);
441
442         return class_is_array(c);
443 }
444
445
446 /*
447  * Class:     java/lang/VMClass
448  * Method:    throwException
449  * Signature: (Ljava/lang/Throwable;)V
450  */
451 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
452 {
453         java_handle_t *o;
454
455         o = (java_handle_t *) t;
456
457         exceptions_set_exception(o);
458 }
459
460
461 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
462 /*
463  * Class:     java/lang/VMClass
464  * Method:    getDeclaredAnnotations
465  * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
466  */
467 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
468 {
469         classinfo                *c               = NULL; /* classinfo for the java.lang.Class object 'klass'       */
470         static methodinfo        *m_parseAnnotationsIntoArray   = NULL; /* parser method (cached, therefore static) */
471         utf                      *utf_parseAnnotationsIntoArray = NULL; /* parser method name     */
472         utf                      *utf_desc        = NULL;               /* parser method descriptor (signature)     */
473         java_handle_bytearray_t  *annotations     = NULL;               /* unparsed annotations   */
474         sun_reflect_ConstantPool *constantPool    = NULL;               /* constant pool of klass */
475         java_lang_Object         *constantPoolOop = (java_lang_Object*)klass; /* constantPoolOop field of */
476                                                                               /* sun.reflect.ConstantPool */
477
478         if (klass == NULL) {
479                 exceptions_throw_nullpointerexception();
480                 return NULL;
481         }
482         
483         c = LLNI_classinfo_unwrap(klass);
484
485         /* get annotations: */
486         annotations = class_get_annotations(c);
487
488         constantPool = 
489                 (sun_reflect_ConstantPool*)native_new_and_init(
490                         class_sun_reflect_ConstantPool);
491         
492         if (constantPool == NULL) {
493                 /* out of memory */
494                 return NULL;
495         }
496
497         LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
498
499         /* only resolve the parser method the first time */
500         if (m_parseAnnotationsIntoArray == NULL) {
501                 utf_parseAnnotationsIntoArray = utf_new_char("parseAnnotationsIntoArray");
502                 utf_desc = utf_new_char(
503                         "([BLsun/reflect/ConstantPool;Ljava/lang/Class;)"
504                         "[Ljava/lang/annotation/Annotation;");
505
506                 if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
507                         /* out of memory */
508                         return NULL;
509                 }
510
511                 m_parseAnnotationsIntoArray = class_resolveclassmethod(
512                         class_sun_reflect_annotation_AnnotationParser,
513                         utf_parseAnnotationsIntoArray,
514                         utf_desc,
515                         class_java_lang_Class,
516                         true);
517
518                 if (m_parseAnnotationsIntoArray == NULL) {
519                         /* method not found */
520                         return NULL;
521                 }
522         }
523
524         return (java_handle_objectarray_t*)vm_call_method(
525                 m_parseAnnotationsIntoArray, NULL,
526                 annotations, constantPool, klass);
527 }
528 #endif
529
530
531 /*
532  * Class:     java/lang/VMClass
533  * Method:    getEnclosingClass
534  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
535  */
536 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
537 {
538         classinfo *c;
539         classinfo *result;
540
541         c = LLNI_classinfo_unwrap(klass);
542
543         result = class_get_enclosingclass(c);
544
545         return LLNI_classinfo_wrap(result);
546 }
547
548
549 /*
550  * Class:     java/lang/VMClass
551  * Method:    getEnclosingConstructor
552  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
553  */
554 JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
555 {
556         classinfo*     c;
557         java_handle_t* h;
558
559         c = LLNI_classinfo_unwrap(klass);
560         h = class_get_enclosingconstructor(c);
561
562         return (java_lang_reflect_Constructor*) h;
563 }
564
565
566 /*
567  * Class:     java/lang/VMClass
568  * Method:    getEnclosingMethod
569  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
570  */
571 JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
572 {
573         classinfo*     c;
574         java_handle_t* h;
575
576         c = LLNI_classinfo_unwrap(klass);
577         h = class_get_enclosingmethod(c);
578
579         return (java_lang_reflect_Method*) h;
580 }
581
582
583 /*
584  * Class:     java/lang/VMClass
585  * Method:    getClassSignature
586  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
587  */
588 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
589 {
590         classinfo     *c;
591         utf           *u;
592         java_handle_t *s;
593
594         c = LLNI_classinfo_unwrap(klass);
595
596         u = class_get_signature(c);
597
598         if (u == NULL)
599                 return NULL;
600
601         s = javastring_new(u);
602
603         /* in error case s is NULL */
604
605         return (java_lang_String *) s;
606 }
607
608
609 /*
610  * Class:     java/lang/VMClass
611  * Method:    isAnonymousClass
612  * Signature: (Ljava/lang/Class;)Z
613  */
614 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
615 {
616         return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
617 }
618
619
620 /*
621  * Class:     java/lang/VMClass
622  * Method:    isLocalClass
623  * Signature: (Ljava/lang/Class;)Z
624  */
625 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
626 {
627         return class_is_localclass(LLNI_classinfo_unwrap(klass));
628 }
629
630
631 /*
632  * Class:     java/lang/VMClass
633  * Method:    isMemberClass
634  * Signature: (Ljava/lang/Class;)Z
635  */
636 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
637 {
638         return class_is_memberclass(LLNI_classinfo_unwrap(klass));
639 }
640
641
642 /*
643  * These are local overrides for various environment variables in Emacs.
644  * Please do not remove this and leave it at the end of the file, where
645  * Emacs will automagically detect them.
646  * ---------------------------------------------------------------------
647  * Local variables:
648  * mode: c
649  * indent-tabs-mode: t
650  * c-basic-offset: 4
651  * tab-width: 4
652  * End:
653  * vim:noexpandtab:sw=4:ts=4:
654  */