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"
35 //#include "native/include/java_lang_VMClass.h"
37 #include "vm/exceptions.hpp"
38 #include "vm/initialize.h"
39 #include "vm/string.hpp"
41 #include "vmcore/class.h"
42 #include "vmcore/globals.hpp"
43 #include "vmcore/javaobjects.hpp"
45 #if defined(ENABLE_ANNOTATIONS)
48 #include "vmcore/annotation.h"
52 // Native functions are exported as C functions.
56 * Class: java/lang/VMClass
58 * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
60 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, jclass klass, jobject o)
65 c = LLNI_classinfo_unwrap(klass);
66 h = (java_handle_t *) o;
68 return class_is_instance(c, h);
73 * Class: java/lang/VMClass
74 * Method: isAssignableFrom
75 * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
77 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, jclass klass, jclass c)
82 to = LLNI_classinfo_unwrap(klass);
83 from = LLNI_classinfo_unwrap(c);
86 exceptions_throw_nullpointerexception();
90 return class_is_assignable_from(to, from);
95 * Class: java/lang/VMClass
97 * Signature: (Ljava/lang/Class;)Z
99 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, jclass klass)
103 c = LLNI_classinfo_unwrap(klass);
105 return class_is_interface(c);
110 * Class: java/lang/VMClass
111 * Method: isPrimitive
112 * Signature: (Ljava/lang/Class;)Z
114 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, jclass klass)
118 c = LLNI_classinfo_unwrap(klass);
120 return class_is_primitive(c);
125 * Class: java/lang/VMClass
127 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
129 JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, jclass klass)
133 c = LLNI_classinfo_unwrap(klass);
135 return (jstring) class_get_classname(c);
140 * Class: java/lang/VMClass
141 * Method: getSuperclass
142 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
144 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, jclass klass)
149 c = LLNI_classinfo_unwrap(klass);
151 super = class_get_superclass(c);
153 return (jclass) LLNI_classinfo_wrap(super);
158 * Class: java/lang/VMClass
159 * Method: getInterfaces
160 * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
162 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, jclass klass)
165 java_handle_objectarray_t *oa;
167 c = LLNI_classinfo_unwrap(klass);
169 oa = class_get_interfaces(c);
171 return (jobjectArray) oa;
176 * Class: java/lang/VMClass
177 * Method: getComponentType
178 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
180 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, jclass klass)
183 classinfo *component;
185 c = LLNI_classinfo_unwrap(klass);
187 component = class_get_componenttype(c);
189 return (jclass) LLNI_classinfo_wrap(component);
194 * Class: java/lang/VMClass
195 * Method: getModifiers
196 * Signature: (Ljava/lang/Class;Z)I
198 JNIEXPORT jint JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, jclass klass, jboolean ignoreInnerClassesAttrib)
203 c = LLNI_classinfo_unwrap(klass);
205 flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
212 * Class: java/lang/VMClass
213 * Method: getDeclaringClass
214 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
216 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, jclass klass)
221 c = LLNI_classinfo_unwrap(klass);
223 dc = class_get_declaringclass(c);
225 return (jclass) LLNI_classinfo_wrap(dc);
230 * Class: java/lang/VMClass
231 * Method: getDeclaredClasses
232 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
234 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
237 java_handle_objectarray_t *oa;
239 c = LLNI_classinfo_unwrap(klass);
241 oa = class_get_declaredclasses(c, publicOnly);
243 return (jobjectArray) oa;
248 * Class: java/lang/VMClass
249 * Method: getDeclaredFields
250 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
252 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
255 java_handle_objectarray_t *oa;
257 c = LLNI_classinfo_unwrap(klass);
259 oa = class_get_declaredfields(c, publicOnly);
261 return (jobjectArray) oa;
266 * Class: java/lang/VMClass
267 * Method: getDeclaredMethods
268 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
270 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
273 java_handle_objectarray_t *oa;
275 c = LLNI_classinfo_unwrap(klass);
277 oa = class_get_declaredmethods(c, publicOnly);
279 return (jobjectArray) oa;
284 * Class: java/lang/VMClass
285 * Method: getDeclaredConstructors
286 * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
288 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
291 java_handle_objectarray_t *oa;
293 c = LLNI_classinfo_unwrap(klass);
295 oa = class_get_declaredconstructors(c, publicOnly);
297 return (jobjectArray) oa;
302 * Class: java/lang/VMClass
303 * Method: getClassLoader
304 * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
306 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, jclass klass)
311 c = LLNI_classinfo_unwrap(klass);
312 cl = class_get_classloader(c);
319 * Class: java/lang/VMClass
321 * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
323 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, jstring name, jboolean initialize, jobject loader)
332 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
334 /* illegal argument */
337 exceptions_throw_nullpointerexception();
341 /* create utf string in which '.' is replaced by '/' */
343 ufile = javastring_toutf((java_handle_t *) name, true);
344 uname = javastring_toutf((java_handle_t *) name, false);
346 /* name must not contain '/' (mauve test) */
348 // FIXME Move this check into a function.
349 for (i = 0, pos = uname->text; i < uname->blength; i++, pos++) {
351 exceptions_throw_classnotfoundexception(uname);
356 /* try to load, ... */
358 c = load_class_from_classloader(ufile, cl);
368 /* ...and initialize it, if required */
371 if (!initialize_class(c))
374 return (jclass) LLNI_classinfo_wrap(c);
379 * Class: java/lang/VMClass
381 * Signature: (Ljava/lang/Class;)Z
383 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, jclass klass)
387 c = LLNI_classinfo_unwrap(klass);
389 return class_is_array(c);
394 * Class: java/lang/VMClass
395 * Method: throwException
396 * Signature: (Ljava/lang/Throwable;)V
398 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, jobject t)
402 o = (java_handle_t *) t;
404 exceptions_set_exception(o);
408 #if defined(ENABLE_ANNOTATIONS)
410 * Class: java/lang/VMClass
411 * Method: getDeclaredAnnotations
412 * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
414 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, jclass klass)
416 static methodinfo* m_parseAnnotationsIntoArray = NULL;
419 exceptions_throw_nullpointerexception();
423 classinfo* c = LLNI_classinfo_unwrap(klass);
425 /* get annotations: */
426 java_handle_bytearray_t* annotations = class_get_annotations(c);
428 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
433 sun_reflect_ConstantPool cp(h);
434 cp.set_constantPoolOop(klass);
436 /* only resolve the parser method the first time */
437 if (m_parseAnnotationsIntoArray == NULL) {
438 utf* utf_parseAnnotationsIntoArray = utf_new_char("parseAnnotationsIntoArray");
439 utf* utf_desc = utf_new_char("([BLsun/reflect/ConstantPool;Ljava/lang/Class;)"
440 "[Ljava/lang/annotation/Annotation;");
442 if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
447 m_parseAnnotationsIntoArray = class_resolveclassmethod(
448 class_sun_reflect_annotation_AnnotationParser,
449 utf_parseAnnotationsIntoArray,
451 class_java_lang_Class,
454 if (m_parseAnnotationsIntoArray == NULL) {
455 /* method not found */
460 java_handle_objectarray_t* oa = (java_handle_objectarray_t*) vm_call_method(m_parseAnnotationsIntoArray, NULL, annotations, cp.get_handle(), klass);
461 return (jobjectArray) oa;
467 * Class: java/lang/VMClass
468 * Method: getEnclosingClass
469 * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
471 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, jclass klass)
476 c = LLNI_classinfo_unwrap(klass);
478 result = class_get_enclosingclass(c);
480 return (jclass) LLNI_classinfo_wrap(result);
485 * Class: java/lang/VMClass
486 * Method: getEnclosingConstructor
487 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
489 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, jclass klass)
494 c = LLNI_classinfo_unwrap(klass);
495 h = class_get_enclosingconstructor(c);
502 * Class: java/lang/VMClass
503 * Method: getEnclosingMethod
504 * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
506 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, jclass klass)
511 c = LLNI_classinfo_unwrap(klass);
512 h = class_get_enclosingmethod(c);
519 * Class: java/lang/VMClass
520 * Method: getClassSignature
521 * Signature: (Ljava/lang/Class;)Ljava/lang/String;
523 JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, jclass klass)
529 c = LLNI_classinfo_unwrap(klass);
531 u = class_get_signature(c);
536 s = javastring_new(u);
538 /* in error case s is NULL */
545 * Class: java/lang/VMClass
546 * Method: isAnonymousClass
547 * Signature: (Ljava/lang/Class;)Z
549 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, jclass klass)
551 return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
556 * Class: java/lang/VMClass
557 * Method: isLocalClass
558 * Signature: (Ljava/lang/Class;)Z
560 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, jclass klass)
562 return class_is_localclass(LLNI_classinfo_unwrap(klass));
567 * Class: java/lang/VMClass
568 * Method: isMemberClass
569 * Signature: (Ljava/lang/Class;)Z
571 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, jclass klass)
573 return class_is_memberclass(LLNI_classinfo_unwrap(klass));
579 /* native methods implemented by this file ************************************/
581 static JNINativeMethod methods[] = {
582 { (char*) "isInstance", (char*) "(Ljava/lang/Class;Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isInstance },
583 { (char*) "isAssignableFrom", (char*) "(Ljava/lang/Class;Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isAssignableFrom },
584 { (char*) "isInterface", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isInterface },
585 { (char*) "isPrimitive", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isPrimitive },
586 { (char*) "getName", (char*) "(Ljava/lang/Class;)Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMClass_getName },
587 { (char*) "getSuperclass", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getSuperclass },
588 { (char*) "getInterfaces", (char*) "(Ljava/lang/Class;)[Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getInterfaces },
589 { (char*) "getComponentType", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getComponentType },
590 { (char*) "getModifiers", (char*) "(Ljava/lang/Class;Z)I", (void*) (uintptr_t) &Java_java_lang_VMClass_getModifiers },
591 { (char*) "getDeclaringClass", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaringClass },
592 { (char*) "getDeclaredClasses", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredClasses },
593 { (char*) "getDeclaredFields", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredFields },
594 { (char*) "getDeclaredMethods", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredMethods },
595 { (char*) "getDeclaredConstructors", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredConstructors },
596 { (char*) "getClassLoader", (char*) "(Ljava/lang/Class;)Ljava/lang/ClassLoader;", (void*) (uintptr_t) &Java_java_lang_VMClass_getClassLoader },
597 { (char*) "forName", (char*) "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_forName },
598 { (char*) "isArray", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isArray },
599 { (char*) "throwException", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_java_lang_VMClass_throwException },
600 #if defined(ENABLE_ANNOTATIONS)
601 { (char*) "getDeclaredAnnotations", (char*) "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;", (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredAnnotations },
603 { (char*) "getEnclosingClass", (char*) "(Ljava/lang/Class;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingClass },
604 { (char*) "getEnclosingConstructor", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingConstructor },
605 { (char*) "getEnclosingMethod", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Method;", (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingMethod },
606 { (char*) "getClassSignature", (char*) "(Ljava/lang/Class;)Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_VMClass_getClassSignature },
607 { (char*) "isAnonymousClass", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isAnonymousClass },
608 { (char*) "isLocalClass", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isLocalClass },
609 { (char*) "isMemberClass", (char*) "(Ljava/lang/Class;)Z", (void*) (uintptr_t) &Java_java_lang_VMClass_isMemberClass },
613 /* _Jv_java_lang_VMClass_init **************************************************
615 Register native functions.
617 *******************************************************************************/
621 void _Jv_java_lang_VMClass_init(void)
625 u = utf_new_char("java/lang/VMClass");
627 native_method_register(u, methods, NATIVE_METHODS_COUNT);
633 * These are local overrides for various environment variables in Emacs.
634 * Please do not remove this and leave it at the end of the file, where
635 * Emacs will automagically detect them.
636 * ---------------------------------------------------------------------
639 * indent-tabs-mode: t
643 * vim:noexpandtab:sw=4:ts=4: