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.hpp"
31 #include "native/llni.h"
32 #include "native/native.h"
34 #if defined(ENABLE_JNI_HEADERS)
35 # include "native/vm/include/java_lang_VMClass.h"
39 #include "vm/exceptions.hpp"
40 #include "vm/globals.hpp"
41 #include "vm/initialize.h"
42 #include "vm/javaobjects.hpp"
43 #include "vm/string.hpp"
45 #if defined(ENABLE_ANNOTATIONS)
46 #include "vm/annotation.h"
51 // Native functions are exported as C functions.
55 * Class: java/lang/VMClass
57 * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
59 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, jclass klass, jobject o)
64 c = LLNI_classinfo_unwrap(klass);
65 h = (java_handle_t *) o;
67 return class_is_instance(c, h);
72 * Class: java/lang/VMClass
73 * Method: isAssignableFrom
74 * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
76 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, jclass klass, jclass c)
81 to = LLNI_classinfo_unwrap(klass);
82 from = LLNI_classinfo_unwrap(c);
85 exceptions_throw_nullpointerexception();
89 return class_is_assignable_from(to, from);
94 * Class: java/lang/VMClass
96 * Signature: (Ljava/lang/Class;)Z
98 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, jclass klass)
102 c = LLNI_classinfo_unwrap(klass);
104 return class_is_interface(c);
109 * Class: java/lang/VMClass
110 * Method: isPrimitive
111 * Signature: (Ljava/lang/Class;)Z
113 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, jclass klass)
117 c = LLNI_classinfo_unwrap(klass);
119 return class_is_primitive(c);
124 * Class: java/lang/VMClass
126 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
128 JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, jclass klass)
132 c = LLNI_classinfo_unwrap(klass);
134 return (jstring) class_get_classname(c);
139 * Class: java/lang/VMClass
140 * Method: getSuperclass
141 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
143 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, jclass klass)
148 c = LLNI_classinfo_unwrap(klass);
150 super = class_get_superclass(c);
152 return (jclass) LLNI_classinfo_wrap(super);
157 * Class: java/lang/VMClass
158 * Method: getInterfaces
159 * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
161 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, jclass klass)
164 java_handle_objectarray_t *oa;
166 c = LLNI_classinfo_unwrap(klass);
168 oa = class_get_interfaces(c);
170 return (jobjectArray) oa;
175 * Class: java/lang/VMClass
176 * Method: getComponentType
177 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
179 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, jclass klass)
182 classinfo *component;
184 c = LLNI_classinfo_unwrap(klass);
186 component = class_get_componenttype(c);
188 return (jclass) LLNI_classinfo_wrap(component);
193 * Class: java/lang/VMClass
194 * Method: getModifiers
195 * Signature: (Ljava/lang/Class;Z)I
197 JNIEXPORT jint JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, jclass klass, jboolean ignoreInnerClassesAttrib)
202 c = LLNI_classinfo_unwrap(klass);
204 flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
211 * Class: java/lang/VMClass
212 * Method: getDeclaringClass
213 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
215 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, jclass klass)
220 c = LLNI_classinfo_unwrap(klass);
222 dc = class_get_declaringclass(c);
224 return (jclass) LLNI_classinfo_wrap(dc);
229 * Class: java/lang/VMClass
230 * Method: getDeclaredClasses
231 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
233 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
236 java_handle_objectarray_t *oa;
238 c = LLNI_classinfo_unwrap(klass);
240 oa = class_get_declaredclasses(c, publicOnly);
242 return (jobjectArray) oa;
247 * Class: java/lang/VMClass
248 * Method: getDeclaredFields
249 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
251 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
254 java_handle_objectarray_t *oa;
256 c = LLNI_classinfo_unwrap(klass);
258 oa = class_get_declaredfields(c, publicOnly);
260 return (jobjectArray) oa;
265 * Class: java/lang/VMClass
266 * Method: getDeclaredMethods
267 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
269 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
272 java_handle_objectarray_t *oa;
274 c = LLNI_classinfo_unwrap(klass);
276 oa = class_get_declaredmethods(c, publicOnly);
278 return (jobjectArray) oa;
283 * Class: java/lang/VMClass
284 * Method: getDeclaredConstructors
285 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
287 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
290 java_handle_objectarray_t *oa;
292 c = LLNI_classinfo_unwrap(klass);
294 oa = class_get_declaredconstructors(c, publicOnly);
296 return (jobjectArray) oa;
301 * Class: java/lang/VMClass
302 * Method: getClassLoader
303 * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
305 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, jclass klass)
310 c = LLNI_classinfo_unwrap(klass);
311 cl = class_get_classloader(c);
318 * Class: java/lang/VMClass
320 * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
322 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, jstring name, jboolean initialize, jobject loader)
331 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
333 /* illegal argument */
336 exceptions_throw_nullpointerexception();
340 /* create utf string in which '.' is replaced by '/' */
342 ufile = javastring_toutf((java_handle_t *) name, true);
343 uname = javastring_toutf((java_handle_t *) name, false);
345 /* name must not contain '/' (mauve test) */
347 // FIXME Move this check into a function.
348 for (i = 0, pos = uname->text; i < uname->blength; i++, pos++) {
350 exceptions_throw_classnotfoundexception(uname);
355 /* try to load, ... */
357 c = load_class_from_classloader(ufile, cl);
367 /* ...and initialize it, if required */
370 if (!initialize_class(c))
373 return (jclass) LLNI_classinfo_wrap(c);
378 * Class: java/lang/VMClass
380 * Signature: (Ljava/lang/Class;)Z
382 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, jclass klass)
386 c = LLNI_classinfo_unwrap(klass);
388 return class_is_array(c);
393 * Class: java/lang/VMClass
394 * Method: throwException
395 * Signature: (Ljava/lang/Throwable;)V
397 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, jobject t)
401 o = (java_handle_t *) t;
403 exceptions_set_exception(o);
407 #if defined(ENABLE_ANNOTATIONS)
409 * Class: java/lang/VMClass
410 * Method: getDeclaredAnnotations
411 * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
413 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, jclass klass)
415 static methodinfo* m_parseAnnotationsIntoArray = NULL;
418 exceptions_throw_nullpointerexception();
422 classinfo* c = LLNI_classinfo_unwrap(klass);
424 /* get annotations: */
425 java_handle_bytearray_t* annotations = class_get_annotations(c);
427 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
432 sun_reflect_ConstantPool cp(h);
433 cp.set_constantPoolOop(klass);
435 /* only resolve the parser method the first time */
436 if (m_parseAnnotationsIntoArray == NULL) {
437 utf* utf_parseAnnotationsIntoArray = utf_new_char("parseAnnotationsIntoArray");
438 utf* utf_desc = utf_new_char("([BLsun/reflect/ConstantPool;Ljava/lang/Class;)"
439 "[Ljava/lang/annotation/Annotation;");
441 if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
446 m_parseAnnotationsIntoArray = class_resolveclassmethod(
447 class_sun_reflect_annotation_AnnotationParser,
448 utf_parseAnnotationsIntoArray,
450 class_java_lang_Class,
453 if (m_parseAnnotationsIntoArray == NULL) {
454 /* method not found */
459 java_handle_objectarray_t* oa = (java_handle_objectarray_t*) vm_call_method(m_parseAnnotationsIntoArray, NULL, annotations, cp.get_handle(), klass);
460 return (jobjectArray) oa;
466 * Class: java/lang/VMClass
467 * Method: getEnclosingClass
468 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
470 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, jclass klass)
475 c = LLNI_classinfo_unwrap(klass);
477 result = class_get_enclosingclass(c);
479 return (jclass) LLNI_classinfo_wrap(result);
484 * Class: java/lang/VMClass
485 * Method: getEnclosingConstructor
486 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
488 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, jclass klass)
493 c = LLNI_classinfo_unwrap(klass);
494 h = class_get_enclosingconstructor(c);
501 * Class: java/lang/VMClass
502 * Method: getEnclosingMethod
503 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
505 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, jclass klass)
510 c = LLNI_classinfo_unwrap(klass);
511 h = class_get_enclosingmethod(c);
518 * Class: java/lang/VMClass
519 * Method: getClassSignature
520 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
522 JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, jclass klass)
528 c = LLNI_classinfo_unwrap(klass);
530 u = class_get_signature(c);
535 s = javastring_new(u);
537 /* in error case s is NULL */
544 * Class: java/lang/VMClass
545 * Method: isAnonymousClass
546 * Signature: (Ljava/lang/Class;)Z
548 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, jclass klass)
550 return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
555 * Class: java/lang/VMClass
556 * Method: isLocalClass
557 * Signature: (Ljava/lang/Class;)Z
559 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, jclass klass)
561 return class_is_localclass(LLNI_classinfo_unwrap(klass));
566 * Class: java/lang/VMClass
567 * Method: isMemberClass
568 * Signature: (Ljava/lang/Class;)Z
570 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, jclass klass)
572 return class_is_memberclass(LLNI_classinfo_unwrap(klass));
578 /* native methods implemented by this file ************************************/
580 static JNINativeMethod methods[] = {
581 { (char*) "isInstance", (char*) "(Ljava/lang/Class;Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isInstance },
582 { (char*) "isAssignableFrom", (char*) "(Ljava/lang/Class;Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isAssignableFrom },
583 { (char*) "isInterface", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isInterface },
584 { (char*) "isPrimitive", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isPrimitive },
585 { (char*) "getName", (char*) "(Ljava/lang/Class;)Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMClass_getName },
586 { (char*) "getSuperclass", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getSuperclass },
587 { (char*) "getInterfaces", (char*) "(Ljava/lang/Class;)[Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getInterfaces },
588 { (char*) "getComponentType", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getComponentType },
589 { (char*) "getModifiers", (char*) "(Ljava/lang/Class;Z)I", (void*) (uintptr_t) &Java_java_lang_VMClass_getModifiers },
590 { (char*) "getDeclaringClass", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaringClass },
591 { (char*) "getDeclaredClasses", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredClasses },
592 { (char*) "getDeclaredFields", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredFields },
593 { (char*) "getDeclaredMethods", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredMethods },
594 { (char*) "getDeclaredConstructors", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredConstructors },
595 { (char*) "getClassLoader", (char*) "(Ljava/lang/Class;)Ljava/lang/ClassLoader;", (void*) (uintptr_t) &Java_java_lang_VMClass_getClassLoader },
596 { (char*) "forName", (char*) "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_forName },
597 { (char*) "isArray", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isArray },
598 { (char*) "throwException", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_java_lang_VMClass_throwException },
599 #if defined(ENABLE_ANNOTATIONS)
600 { (char*) "getDeclaredAnnotations", (char*) "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredAnnotations },
602 { (char*) "getEnclosingClass", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingClass },
603 { (char*) "getEnclosingConstructor", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingConstructor },
604 { (char*) "getEnclosingMethod", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Method;", (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingMethod },
605 { (char*) "getClassSignature", (char*) "(Ljava/lang/Class;)Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMClass_getClassSignature },
606 { (char*) "isAnonymousClass", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isAnonymousClass },
607 { (char*) "isLocalClass", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isLocalClass },
608 { (char*) "isMemberClass", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isMemberClass },
612 /* _Jv_java_lang_VMClass_init **************************************************
614 Register native functions.
616 *******************************************************************************/
620 void _Jv_java_lang_VMClass_init(void)
624 u = utf_new_char("java/lang/VMClass");
626 native_method_register(u, methods, NATIVE_METHODS_COUNT);
632 * These are local overrides for various environment variables in Emacs.
633 * Please do not remove this and leave it at the end of the file, where
634 * Emacs will automagically detect them.
635 * ---------------------------------------------------------------------
638 * indent-tabs-mode: t
642 * vim:noexpandtab:sw=4:ts=4: