1 /* src/native/vm/gnu/java_lang_VMClass.c
3 Copyright (C) 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
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.
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.
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
30 #include "native/jni.h"
31 #include "native/llni.h"
32 #include "native/native.h"
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"
42 #include "native/include/java_lang_VMClass.h"
44 #include "vm/exceptions.h"
45 #include "vm/initialize.h"
46 #include "vm/stringlocal.h"
48 #include "vmcore/class.h"
50 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
51 #include "native/include/sun_reflect_ConstantPool.h"
55 #include "vmcore/annotation.h"
59 /* native methods implemented by this file ************************************/
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 },
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 },
93 /* _Jv_java_lang_VMClass_init **************************************************
95 Register native functions.
97 *******************************************************************************/
99 void _Jv_java_lang_VMClass_init(void)
103 u = utf_new_char("java/lang/VMClass");
105 native_method_register(u, methods, NATIVE_METHODS_COUNT);
110 * Class: java/lang/VMClass
112 * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
114 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
119 c = LLNI_classinfo_unwrap(klass);
120 h = (java_handle_t *) o;
122 return class_is_instance(c, h);
127 * Class: java/lang/VMClass
128 * Method: isAssignableFrom
129 * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
131 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
136 to = LLNI_classinfo_unwrap(klass);
137 from = LLNI_classinfo_unwrap(c);
140 exceptions_throw_nullpointerexception();
144 return class_is_assignable_from(to, from);
149 * Class: java/lang/VMClass
150 * Method: isInterface
151 * Signature: (Ljava/lang/Class;)Z
153 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
157 c = LLNI_classinfo_unwrap(klass);
159 return class_is_interface(c);
164 * Class: java/lang/VMClass
165 * Method: isPrimitive
166 * Signature: (Ljava/lang/Class;)Z
168 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
172 c = LLNI_classinfo_unwrap(klass);
174 return class_is_primitive(c);
179 * Class: java/lang/VMClass
181 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
183 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
187 c = LLNI_classinfo_unwrap(klass);
189 return (java_lang_String*) class_get_classname(c);
194 * Class: java/lang/VMClass
195 * Method: getSuperclass
196 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
198 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
203 c = LLNI_classinfo_unwrap(klass);
205 super = class_get_superclass(c);
207 return LLNI_classinfo_wrap(super);
212 * Class: java/lang/VMClass
213 * Method: getInterfaces
214 * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
216 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
219 java_handle_objectarray_t *oa;
221 c = LLNI_classinfo_unwrap(klass);
223 oa = class_get_interfaces(c);
230 * Class: java/lang/VMClass
231 * Method: getComponentType
232 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
234 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
237 classinfo *component;
239 c = LLNI_classinfo_unwrap(klass);
241 component = class_get_componenttype(c);
243 return LLNI_classinfo_wrap(component);
248 * Class: java/lang/VMClass
249 * Method: getModifiers
250 * Signature: (Ljava/lang/Class;Z)I
252 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t ignoreInnerClassesAttrib)
257 c = LLNI_classinfo_unwrap(klass);
259 flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
266 * Class: java/lang/VMClass
267 * Method: getDeclaringClass
268 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
270 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
275 c = LLNI_classinfo_unwrap(klass);
277 dc = class_get_declaringclass(c);
279 return LLNI_classinfo_wrap(dc);
284 * Class: java/lang/VMClass
285 * Method: getDeclaredClasses
286 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
288 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
291 java_handle_objectarray_t *oa;
293 c = LLNI_classinfo_unwrap(klass);
295 oa = class_get_declaredclasses(c, publicOnly);
302 * Class: java/lang/VMClass
303 * Method: getDeclaredFields
304 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
306 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
309 java_handle_objectarray_t *oa;
311 c = LLNI_classinfo_unwrap(klass);
313 oa = class_get_declaredfields(c, publicOnly);
320 * Class: java/lang/VMClass
321 * Method: getDeclaredMethods
322 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
324 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
327 java_handle_objectarray_t *oa;
329 c = LLNI_classinfo_unwrap(klass);
331 oa = class_get_declaredmethods(c, publicOnly);
338 * Class: java/lang/VMClass
339 * Method: getDeclaredConstructors
340 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
342 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
345 java_handle_objectarray_t *oa;
347 c = LLNI_classinfo_unwrap(klass);
349 oa = class_get_declaredconstructors(c, publicOnly);
356 * Class: java/lang/VMClass
357 * Method: getClassLoader
358 * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
360 JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
365 c = LLNI_classinfo_unwrap(klass);
366 cl = class_get_classloader(c);
368 return (java_lang_ClassLoader *) cl;
373 * Class: java/lang/VMClass
375 * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
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)
386 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
388 /* illegal argument */
391 exceptions_throw_nullpointerexception();
395 /* create utf string in which '.' is replaced by '/' */
397 ufile = javastring_toutf((java_handle_t *) name, true);
398 uname = javastring_toutf((java_handle_t *) name, false);
400 /* name must not contain '/' (mauve test) */
402 for (i = 0, pos = LLNI_field_direct(name, value)->data + LLNI_field_direct(name, offset); i < LLNI_field_direct(name, count); i++, pos++) {
404 exceptions_throw_classnotfoundexception(uname);
409 /* try to load, ... */
411 c = load_class_from_classloader(ufile, cl);
421 /* ...and initialize it, if required */
424 if (!initialize_class(c))
427 return LLNI_classinfo_wrap(c);
432 * Class: java/lang/VMClass
434 * Signature: (Ljava/lang/Class;)Z
436 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
440 c = LLNI_classinfo_unwrap(klass);
442 return class_is_array(c);
447 * Class: java/lang/VMClass
448 * Method: throwException
449 * Signature: (Ljava/lang/Throwable;)V
451 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
455 o = (java_handle_t *) t;
457 exceptions_set_exception(o);
461 #if defined(WITH_CLASSPATH_GNU) && defined(ENABLE_ANNOTATIONS)
463 * Class: java/lang/VMClass
464 * Method: getDeclaredAnnotations
465 * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
467 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
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 */
479 exceptions_throw_nullpointerexception();
483 c = LLNI_classinfo_unwrap(klass);
485 /* get annotations: */
486 annotations = class_get_annotations(c);
489 (sun_reflect_ConstantPool*)native_new_and_init(
490 class_sun_reflect_ConstantPool);
492 if (constantPool == NULL) {
497 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
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;");
506 if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
511 m_parseAnnotationsIntoArray = class_resolveclassmethod(
512 class_sun_reflect_annotation_AnnotationParser,
513 utf_parseAnnotationsIntoArray,
515 class_java_lang_Class,
518 if (m_parseAnnotationsIntoArray == NULL) {
519 /* method not found */
524 return (java_handle_objectarray_t*)vm_call_method(
525 m_parseAnnotationsIntoArray, NULL,
526 annotations, constantPool, klass);
532 * Class: java/lang/VMClass
533 * Method: getEnclosingClass
534 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
536 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
541 c = LLNI_classinfo_unwrap(klass);
543 result = class_get_enclosingclass(c);
545 return LLNI_classinfo_wrap(result);
550 * Class: java/lang/VMClass
551 * Method: getEnclosingConstructor
552 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
554 JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
559 c = LLNI_classinfo_unwrap(klass);
560 h = class_get_enclosingconstructor(c);
562 return (java_lang_reflect_Constructor*) h;
567 * Class: java/lang/VMClass
568 * Method: getEnclosingMethod
569 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
571 JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
576 c = LLNI_classinfo_unwrap(klass);
577 h = class_get_enclosingmethod(c);
579 return (java_lang_reflect_Method*) h;
584 * Class: java/lang/VMClass
585 * Method: getClassSignature
586 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
588 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
594 c = LLNI_classinfo_unwrap(klass);
596 u = class_get_signature(c);
601 s = javastring_new(u);
603 /* in error case s is NULL */
605 return (java_lang_String *) s;
610 * Class: java/lang/VMClass
611 * Method: isAnonymousClass
612 * Signature: (Ljava/lang/Class;)Z
614 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
616 return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
621 * Class: java/lang/VMClass
622 * Method: isLocalClass
623 * Signature: (Ljava/lang/Class;)Z
625 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
627 return class_is_localclass(LLNI_classinfo_unwrap(klass));
632 * Class: java/lang/VMClass
633 * Method: isMemberClass
634 * Signature: (Ljava/lang/Class;)Z
636 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
638 return class_is_memberclass(LLNI_classinfo_unwrap(klass));
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 * ---------------------------------------------------------------------
649 * indent-tabs-mode: t
653 * vim:noexpandtab:sw=4:ts=4: