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