1 /* src/native/vm/gnuclasspath/java_lang_VMClass.cpp
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"
44 #include "native/include/java_lang_VMClass.h"
47 #include "vm/exceptions.h"
48 #include "vm/initialize.h"
49 #include "vm/stringlocal.h"
51 #include "vmcore/class.h"
52 #include "vmcore/globals.hpp"
54 #if defined(ENABLE_ANNOTATIONS)
55 #include "native/include/sun_reflect_ConstantPool.h"
59 #include "vmcore/annotation.h"
63 /* native methods implemented by this file ************************************/
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 },
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 },
97 /* _Jv_java_lang_VMClass_init **************************************************
99 Register native functions.
101 *******************************************************************************/
105 void _Jv_java_lang_VMClass_init(void)
109 u = utf_new_char("java/lang/VMClass");
111 native_method_register(u, methods, NATIVE_METHODS_COUNT);
116 // Native functions are exported as C functions.
120 * Class: java/lang/VMClass
122 * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
124 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
129 c = LLNI_classinfo_unwrap(klass);
130 h = (java_handle_t *) o;
132 return class_is_instance(c, h);
137 * Class: java/lang/VMClass
138 * Method: isAssignableFrom
139 * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
141 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
146 to = LLNI_classinfo_unwrap(klass);
147 from = LLNI_classinfo_unwrap(c);
150 exceptions_throw_nullpointerexception();
154 return class_is_assignable_from(to, from);
159 * Class: java/lang/VMClass
160 * Method: isInterface
161 * Signature: (Ljava/lang/Class;)Z
163 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
167 c = LLNI_classinfo_unwrap(klass);
169 return class_is_interface(c);
174 * Class: java/lang/VMClass
175 * Method: isPrimitive
176 * Signature: (Ljava/lang/Class;)Z
178 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
182 c = LLNI_classinfo_unwrap(klass);
184 return class_is_primitive(c);
189 * Class: java/lang/VMClass
191 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
193 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
197 c = LLNI_classinfo_unwrap(klass);
199 return (java_lang_String*) class_get_classname(c);
204 * Class: java/lang/VMClass
205 * Method: getSuperclass
206 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
208 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
213 c = LLNI_classinfo_unwrap(klass);
215 super = class_get_superclass(c);
217 return LLNI_classinfo_wrap(super);
222 * Class: java/lang/VMClass
223 * Method: getInterfaces
224 * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
226 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
229 java_handle_objectarray_t *oa;
231 c = LLNI_classinfo_unwrap(klass);
233 oa = class_get_interfaces(c);
240 * Class: java/lang/VMClass
241 * Method: getComponentType
242 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
244 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
247 classinfo *component;
249 c = LLNI_classinfo_unwrap(klass);
251 component = class_get_componenttype(c);
253 return LLNI_classinfo_wrap(component);
258 * Class: java/lang/VMClass
259 * Method: getModifiers
260 * Signature: (Ljava/lang/Class;Z)I
262 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t ignoreInnerClassesAttrib)
267 c = LLNI_classinfo_unwrap(klass);
269 flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
276 * Class: java/lang/VMClass
277 * Method: getDeclaringClass
278 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
280 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
285 c = LLNI_classinfo_unwrap(klass);
287 dc = class_get_declaringclass(c);
289 return LLNI_classinfo_wrap(dc);
294 * Class: java/lang/VMClass
295 * Method: getDeclaredClasses
296 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
298 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
301 java_handle_objectarray_t *oa;
303 c = LLNI_classinfo_unwrap(klass);
305 oa = class_get_declaredclasses(c, publicOnly);
312 * Class: java/lang/VMClass
313 * Method: getDeclaredFields
314 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
316 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
319 java_handle_objectarray_t *oa;
321 c = LLNI_classinfo_unwrap(klass);
323 oa = class_get_declaredfields(c, publicOnly);
330 * Class: java/lang/VMClass
331 * Method: getDeclaredMethods
332 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
334 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
337 java_handle_objectarray_t *oa;
339 c = LLNI_classinfo_unwrap(klass);
341 oa = class_get_declaredmethods(c, publicOnly);
348 * Class: java/lang/VMClass
349 * Method: getDeclaredConstructors
350 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
352 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
355 java_handle_objectarray_t *oa;
357 c = LLNI_classinfo_unwrap(klass);
359 oa = class_get_declaredconstructors(c, publicOnly);
366 * Class: java/lang/VMClass
367 * Method: getClassLoader
368 * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
370 JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
375 c = LLNI_classinfo_unwrap(klass);
376 cl = class_get_classloader(c);
378 return (java_lang_ClassLoader *) cl;
383 * Class: java/lang/VMClass
385 * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
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)
396 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
398 /* illegal argument */
401 exceptions_throw_nullpointerexception();
405 /* create utf string in which '.' is replaced by '/' */
407 ufile = javastring_toutf((java_handle_t *) name, true);
408 uname = javastring_toutf((java_handle_t *) name, false);
410 /* name must not contain '/' (mauve test) */
412 for (i = 0, pos = LLNI_field_direct(name, value)->data + LLNI_field_direct(name, offset); i < LLNI_field_direct(name, count); i++, pos++) {
414 exceptions_throw_classnotfoundexception(uname);
419 /* try to load, ... */
421 c = load_class_from_classloader(ufile, cl);
431 /* ...and initialize it, if required */
434 if (!initialize_class(c))
437 return LLNI_classinfo_wrap(c);
442 * Class: java/lang/VMClass
444 * Signature: (Ljava/lang/Class;)Z
446 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
450 c = LLNI_classinfo_unwrap(klass);
452 return class_is_array(c);
457 * Class: java/lang/VMClass
458 * Method: throwException
459 * Signature: (Ljava/lang/Throwable;)V
461 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
465 o = (java_handle_t *) t;
467 exceptions_set_exception(o);
471 #if defined(ENABLE_ANNOTATIONS)
473 * Class: java/lang/VMClass
474 * Method: getDeclaredAnnotations
475 * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
477 JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
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 */
489 exceptions_throw_nullpointerexception();
493 c = LLNI_classinfo_unwrap(klass);
495 /* get annotations: */
496 annotations = class_get_annotations(c);
499 (sun_reflect_ConstantPool*)native_new_and_init(
500 class_sun_reflect_ConstantPool);
502 if (constantPool == NULL) {
507 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
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;");
516 if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
521 m_parseAnnotationsIntoArray = class_resolveclassmethod(
522 class_sun_reflect_annotation_AnnotationParser,
523 utf_parseAnnotationsIntoArray,
525 class_java_lang_Class,
528 if (m_parseAnnotationsIntoArray == NULL) {
529 /* method not found */
534 return (java_handle_objectarray_t*)vm_call_method(
535 m_parseAnnotationsIntoArray, NULL,
536 annotations, constantPool, klass);
542 * Class: java/lang/VMClass
543 * Method: getEnclosingClass
544 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
546 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
551 c = LLNI_classinfo_unwrap(klass);
553 result = class_get_enclosingclass(c);
555 return LLNI_classinfo_wrap(result);
560 * Class: java/lang/VMClass
561 * Method: getEnclosingConstructor
562 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
564 JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
569 c = LLNI_classinfo_unwrap(klass);
570 h = class_get_enclosingconstructor(c);
572 return (java_lang_reflect_Constructor*) h;
577 * Class: java/lang/VMClass
578 * Method: getEnclosingMethod
579 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
581 JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
586 c = LLNI_classinfo_unwrap(klass);
587 h = class_get_enclosingmethod(c);
589 return (java_lang_reflect_Method*) h;
594 * Class: java/lang/VMClass
595 * Method: getClassSignature
596 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
598 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
604 c = LLNI_classinfo_unwrap(klass);
606 u = class_get_signature(c);
611 s = javastring_new(u);
613 /* in error case s is NULL */
615 return (java_lang_String *) s;
620 * Class: java/lang/VMClass
621 * Method: isAnonymousClass
622 * Signature: (Ljava/lang/Class;)Z
624 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
626 return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
631 * Class: java/lang/VMClass
632 * Method: isLocalClass
633 * Signature: (Ljava/lang/Class;)Z
635 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
637 return class_is_localclass(LLNI_classinfo_unwrap(klass));
642 * Class: java/lang/VMClass
643 * Method: isMemberClass
644 * Signature: (Ljava/lang/Class;)Z
646 JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
648 return class_is_memberclass(LLNI_classinfo_unwrap(klass));
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 * ---------------------------------------------------------------------
661 * indent-tabs-mode: t
665 * vim:noexpandtab:sw=4:ts=4: