This commit introduces C++ wrapper classes for Java heap objects.
[cacao.git] / src / native / vm / gnuclasspath / java_lang_VMClass.cpp
index 0714944b2ab1b7c34956d57236e48880693dcc2d..8e7e6cd148b284df9b7e606a2bb0025d38a2edc2 100644 (file)
 #include "native/llni.h"
 #include "native/native.h"
 
-#include "native/include/java_lang_Class.h"
-#include "native/include/java_lang_ClassLoader.h"
-#include "native/include/java_lang_Object.h"
-#include "native/include/java_lang_String.h"
-#include "native/include/java_lang_Throwable.h"
-#include "native/include/java_lang_reflect_Constructor.h"
-#include "native/include/java_lang_reflect_Method.h"
-
-//FIXME
-extern "C" {
-#include "native/include/java_lang_VMClass.h"
-}
+// FIXME
+//#include "native/include/java_lang_VMClass.h"
 
 #include "vm/exceptions.hpp"
 #include "vm/initialize.h"
@@ -50,69 +40,15 @@ extern "C" {
 
 #include "vmcore/class.h"
 #include "vmcore/globals.hpp"
+#include "vmcore/javaobjects.hpp"
 
 #if defined(ENABLE_ANNOTATIONS)
-#include "native/include/sun_reflect_ConstantPool.h"
-
 #include "vm/vm.hpp"
 
 #include "vmcore/annotation.h"
 #endif
 
 
-/* native methods implemented by this file ************************************/
-
-static JNINativeMethod methods[] = {
-       { (char*) "isInstance",              (char*) "(Ljava/lang/Class;Ljava/lang/Object;)Z",                        (void*) (uintptr_t) &Java_java_lang_VMClass_isInstance              },
-       { (char*) "isAssignableFrom",        (char*) "(Ljava/lang/Class;Ljava/lang/Class;)Z",                         (void*) (uintptr_t) &Java_java_lang_VMClass_isAssignableFrom        },
-       { (char*) "isInterface",             (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isInterface             },
-       { (char*) "isPrimitive",             (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isPrimitive             },
-       { (char*) "getName",                 (char*) "(Ljava/lang/Class;)Ljava/lang/String;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getName                 },
-       { (char*) "getSuperclass",           (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getSuperclass           },
-       { (char*) "getInterfaces",           (char*) "(Ljava/lang/Class;)[Ljava/lang/Class;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getInterfaces           },
-       { (char*) "getComponentType",        (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getComponentType        },
-       { (char*) "getModifiers",            (char*) "(Ljava/lang/Class;Z)I",                                         (void*) (uintptr_t) &Java_java_lang_VMClass_getModifiers            },
-       { (char*) "getDeclaringClass",       (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaringClass       },
-       { (char*) "getDeclaredClasses",      (char*) "(Ljava/lang/Class;Z)[Ljava/lang/Class;",                        (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredClasses      },
-       { (char*) "getDeclaredFields",       (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",                (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredFields       },
-       { (char*) "getDeclaredMethods",      (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",               (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredMethods      },
-       { (char*) "getDeclaredConstructors", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",          (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredConstructors },
-       { (char*) "getClassLoader",          (char*) "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",                    (void*) (uintptr_t) &Java_java_lang_VMClass_getClassLoader          },
-       { (char*) "forName",                 (char*) "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_forName                 },
-       { (char*) "isArray",                 (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isArray                 },
-       { (char*) "throwException",          (char*) "(Ljava/lang/Throwable;)V",                                      (void*) (uintptr_t) &Java_java_lang_VMClass_throwException          },
-#if defined(ENABLE_ANNOTATIONS)
-       { (char*) "getDeclaredAnnotations",  (char*) "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;",         (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredAnnotations  },
-#endif
-       { (char*) "getEnclosingClass",       (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingClass       },
-       { (char*) "getEnclosingConstructor", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",            (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingConstructor },
-       { (char*) "getEnclosingMethod",      (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Method;",                 (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingMethod      },
-       { (char*) "getClassSignature",       (char*) "(Ljava/lang/Class;)Ljava/lang/String;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getClassSignature       },
-       { (char*) "isAnonymousClass",        (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isAnonymousClass        },
-       { (char*) "isLocalClass",            (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isLocalClass            },
-       { (char*) "isMemberClass",           (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isMemberClass           },
-};
-
-
-/* _Jv_java_lang_VMClass_init **************************************************
-
-   Register native functions.
-
-*******************************************************************************/
-
-// FIXME
-extern "C" {
-void _Jv_java_lang_VMClass_init(void)
-{
-       utf *u;
-
-       u = utf_new_char("java/lang/VMClass");
-
-       native_method_register(u, methods, NATIVE_METHODS_COUNT);
-}
-}
-
-
 // Native functions are exported as C functions.
 extern "C" {
 
@@ -121,7 +57,7 @@ extern "C" {
  * Method:    isInstance
  * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Object *o)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, jclass klass, jobject o)
 {
        classinfo     *c;
        java_handle_t *h;
@@ -138,7 +74,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass
  * Method:    isAssignableFrom
  * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *klass, java_lang_Class *c)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, jclass klass, jclass c)
 {
        classinfo *to;
        classinfo *from;
@@ -160,7 +96,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, j
  * Method:    isInterface
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
 
@@ -175,7 +111,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass
  * Method:    isPrimitive
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
 
@@ -190,13 +126,13 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass
  * Method:    getName
  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
  */
-JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo* c;
 
        c = LLNI_classinfo_unwrap(klass);
 
-       return (java_lang_String*) class_get_classname(c);
+       return (jstring) class_get_classname(c);
 }
 
 
@@ -205,7 +141,7 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env,
  * Method:    getSuperclass
  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
        classinfo *super;
@@ -214,7 +150,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *
 
        super = class_get_superclass(c);
 
-       return LLNI_classinfo_wrap(super);
+       return (jclass) LLNI_classinfo_wrap(super);
 }
 
 
@@ -223,7 +159,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *
  * Method:    getInterfaces
  * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
  */
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo                 *c;
        java_handle_objectarray_t *oa;
@@ -232,7 +168,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterface
 
        oa = class_get_interfaces(c);
 
-       return oa;
+       return (jobjectArray) oa;
 }
 
 
@@ -241,7 +177,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getInterface
  * Method:    getComponentType
  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
        classinfo *component;
@@ -250,7 +186,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEn
        
        component = class_get_componenttype(c);
 
-       return LLNI_classinfo_wrap(component);
+       return (jclass) LLNI_classinfo_wrap(component);
 }
 
 
@@ -259,7 +195,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEn
  * Method:    getModifiers
  * Signature: (Ljava/lang/Class;Z)I
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t ignoreInnerClassesAttrib)
+JNIEXPORT jint JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, jclass klass, jboolean ignoreInnerClassesAttrib)
 {
        classinfo *c;
        int32_t    flags;
@@ -277,7 +213,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclas
  * Method:    getDeclaringClass
  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
        classinfo *dc;
@@ -286,7 +222,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIE
 
        dc = class_get_declaringclass(c);
 
-       return LLNI_classinfo_wrap(dc);
+       return (jclass) LLNI_classinfo_wrap(dc);
 }
 
 
@@ -295,7 +231,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIE
  * Method:    getDeclaredClasses
  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
  */
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
+JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
 {
        classinfo                 *c;
        java_handle_objectarray_t *oa;
@@ -304,7 +240,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredC
 
        oa = class_get_declaredclasses(c, publicOnly);
 
-       return oa;
+       return (jobjectArray) oa;
 }
 
 
@@ -313,7 +249,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredC
  * Method:    getDeclaredFields
  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
  */
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
+JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
 {
        classinfo                 *c;
        java_handle_objectarray_t *oa;
@@ -322,7 +258,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredF
 
        oa = class_get_declaredfields(c, publicOnly);
 
-       return oa;
+       return (jobjectArray) oa;
 }
 
 
@@ -331,7 +267,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredF
  * Method:    getDeclaredMethods
  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
  */
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
+JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
 {
        classinfo                 *c;
        java_handle_objectarray_t *oa;
@@ -340,7 +276,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredM
 
        oa = class_get_declaredmethods(c, publicOnly);
 
-       return oa;
+       return (jobjectArray) oa;
 }
 
 
@@ -349,7 +285,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredM
  * Method:    getDeclaredConstructors
  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
  */
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, java_lang_Class *klass, int32_t publicOnly)
+JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
 {
        classinfo                 *c;
        java_handle_objectarray_t *oa;
@@ -358,7 +294,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredC
 
        oa = class_get_declaredconstructors(c, publicOnly);
 
-       return oa;
+       return (jobjectArray) oa;
 }
 
 
@@ -367,7 +303,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredC
  * Method:    getClassLoader
  * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
  */
-JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo     *c;
        classloader_t *cl;
@@ -375,7 +311,7 @@ JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(J
        c  = LLNI_classinfo_unwrap(klass);
        cl = class_get_classloader(c);
 
-       return (java_lang_ClassLoader *) cl;
+       return (jobject) cl;
 }
 
 
@@ -384,13 +320,13 @@ JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(J
  * Method:    forName
  * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
  */
-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)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, jstring name, jboolean initialize, jobject loader)
 {
        classloader_t *cl;
        utf           *ufile;
        utf           *uname;
        classinfo     *c;
-       u2            *pos;
+       char*          pos;
        int32_t        i;
 
        cl = loader_hashtable_classloader_add((java_handle_t *) loader);
@@ -409,7 +345,8 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, j
 
        /* name must not contain '/' (mauve test) */
 
-       for (i = 0, pos = LLNI_field_direct(name, value)->data + LLNI_field_direct(name, offset); i < LLNI_field_direct(name, count); i++, pos++) {
+       // FIXME Move this check into a function.
+       for (i = 0, pos = uname->text; i < uname->blength; i++, pos++) {
                if (*pos == '/') {
                        exceptions_throw_classnotfoundexception(uname);
                        return NULL;
@@ -434,7 +371,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, j
                if (!initialize_class(c))
                        return NULL;
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -443,7 +380,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, j
  * Method:    isArray
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
 
@@ -458,7 +395,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass cla
  * Method:    throwException
  * Signature: (Ljava/lang/Throwable;)V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
+JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, jobject t)
 {
        java_handle_t *o;
 
@@ -474,44 +411,33 @@ JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass
  * Method:    getDeclaredAnnotations
  * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
  */
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, java_lang_Class* klass)
+JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, jclass klass)
 {
-       classinfo                *c               = NULL; /* classinfo for the java.lang.Class object 'klass'       */
-       static methodinfo        *m_parseAnnotationsIntoArray   = NULL; /* parser method (cached, therefore static) */
-       utf                      *utf_parseAnnotationsIntoArray = NULL; /* parser method name     */
-       utf                      *utf_desc        = NULL;               /* parser method descriptor (signature)     */
-       java_handle_bytearray_t  *annotations     = NULL;               /* unparsed annotations   */
-       sun_reflect_ConstantPool *constantPool    = NULL;               /* constant pool of klass */
-       java_lang_Object         *constantPoolOop = (java_lang_Object*)klass; /* constantPoolOop field of */
-                                                                             /* sun.reflect.ConstantPool */
+       static methodinfo* m_parseAnnotationsIntoArray = NULL;
 
        if (klass == NULL) {
                exceptions_throw_nullpointerexception();
                return NULL;
        }
        
-       c = LLNI_classinfo_unwrap(klass);
+       classinfo* c = LLNI_classinfo_unwrap(klass);
 
        /* get annotations: */
-       annotations = class_get_annotations(c);
+       java_handle_bytearray_t* annotations = class_get_annotations(c);
 
-       constantPool = 
-               (sun_reflect_ConstantPool*)native_new_and_init(
-                       class_sun_reflect_ConstantPool);
+       java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
        
-       if (constantPool == NULL) {
-               /* out of memory */
+       if (h == NULL)
                return NULL;
-       }
 
-       LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
+       sun_reflect_ConstantPool cp(h);
+       cp.set_constantPoolOop(klass);
 
        /* only resolve the parser method the first time */
        if (m_parseAnnotationsIntoArray == NULL) {
-               utf_parseAnnotationsIntoArray = utf_new_char("parseAnnotationsIntoArray");
-               utf_desc = utf_new_char(
-                       "([BLsun/reflect/ConstantPool;Ljava/lang/Class;)"
-                       "[Ljava/lang/annotation/Annotation;");
+               utf* utf_parseAnnotationsIntoArray = utf_new_char("parseAnnotationsIntoArray");
+               utf* utf_desc = utf_new_char("([BLsun/reflect/ConstantPool;Ljava/lang/Class;)"
+                                                                        "[Ljava/lang/annotation/Annotation;");
 
                if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
                        /* out of memory */
@@ -531,9 +457,8 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredA
                }
        }
 
-       return (java_handle_objectarray_t*)vm_call_method(
-               m_parseAnnotationsIntoArray, NULL,
-               annotations, constantPool, klass);
+       java_handle_objectarray_t* oa = (java_handle_objectarray_t*) vm_call_method(m_parseAnnotationsIntoArray, NULL, annotations, cp.get_handle(), klass);
+       return (jobjectArray) oa;
 }
 #endif
 
@@ -543,7 +468,7 @@ JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMClass_getDeclaredA
  * Method:    getEnclosingClass
  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo *c;
        classinfo *result;
@@ -552,7 +477,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIE
 
        result = class_get_enclosingclass(c);
 
-       return LLNI_classinfo_wrap(result);
+       return (jclass) LLNI_classinfo_wrap(result);
 }
 
 
@@ -561,7 +486,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIE
  * Method:    getEnclosingConstructor
  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
  */
-JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo*     c;
        java_handle_t* h;
@@ -569,7 +494,7 @@ JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclo
        c = LLNI_classinfo_unwrap(klass);
        h = class_get_enclosingconstructor(c);
 
-       return (java_lang_reflect_Constructor*) h;
+       return (jobject) h;
 }
 
 
@@ -578,7 +503,7 @@ JNIEXPORT java_lang_reflect_Constructor* JNICALL Java_java_lang_VMClass_getEnclo
  * Method:    getEnclosingMethod
  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
  */
-JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo*     c;
        java_handle_t* h;
@@ -586,7 +511,7 @@ JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingM
        c = LLNI_classinfo_unwrap(klass);
        h = class_get_enclosingmethod(c);
 
-       return (java_lang_reflect_Method*) h;
+       return (jobject) h;
 }
 
 
@@ -595,7 +520,7 @@ JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getEnclosingM
  * Method:    getClassSignature
  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
  */
-JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, java_lang_Class* klass)
+JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, jclass klass)
 {
        classinfo     *c;
        utf           *u;
@@ -612,7 +537,7 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNI
 
        /* in error case s is NULL */
 
-       return (java_lang_String *) s;
+       return (jstring) s;
 }
 
 
@@ -621,7 +546,7 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getClassSignature(JNI
  * Method:    isAnonymousClass
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, jclass klass)
 {
        return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
 }
@@ -632,7 +557,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, j
  * Method:    isLocalClass
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, jclass klass)
 {
        return class_is_localclass(LLNI_classinfo_unwrap(klass));
 }
@@ -643,7 +568,7 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclas
  * Method:    isMemberClass
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, jclass klass)
 {
        return class_is_memberclass(LLNI_classinfo_unwrap(klass));
 }
@@ -651,6 +576,59 @@ JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jcla
 } // extern "C"
 
 
+/* native methods implemented by this file ************************************/
+
+static JNINativeMethod methods[] = {
+       { (char*) "isInstance",              (char*) "(Ljava/lang/Class;Ljava/lang/Object;)Z",                        (void*) (uintptr_t) &Java_java_lang_VMClass_isInstance              },
+       { (char*) "isAssignableFrom",        (char*) "(Ljava/lang/Class;Ljava/lang/Class;)Z",                         (void*) (uintptr_t) &Java_java_lang_VMClass_isAssignableFrom        },
+       { (char*) "isInterface",             (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isInterface             },
+       { (char*) "isPrimitive",             (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isPrimitive             },
+       { (char*) "getName",                 (char*) "(Ljava/lang/Class;)Ljava/lang/String;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getName                 },
+       { (char*) "getSuperclass",           (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getSuperclass           },
+       { (char*) "getInterfaces",           (char*) "(Ljava/lang/Class;)[Ljava/lang/Class;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getInterfaces           },
+       { (char*) "getComponentType",        (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getComponentType        },
+       { (char*) "getModifiers",            (char*) "(Ljava/lang/Class;Z)I",                                         (void*) (uintptr_t) &Java_java_lang_VMClass_getModifiers            },
+       { (char*) "getDeclaringClass",       (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaringClass       },
+       { (char*) "getDeclaredClasses",      (char*) "(Ljava/lang/Class;Z)[Ljava/lang/Class;",                        (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredClasses      },
+       { (char*) "getDeclaredFields",       (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",                (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredFields       },
+       { (char*) "getDeclaredMethods",      (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",               (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredMethods      },
+       { (char*) "getDeclaredConstructors", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",          (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredConstructors },
+       { (char*) "getClassLoader",          (char*) "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",                    (void*) (uintptr_t) &Java_java_lang_VMClass_getClassLoader          },
+       { (char*) "forName",                 (char*) "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_forName                 },
+       { (char*) "isArray",                 (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isArray                 },
+       { (char*) "throwException",          (char*) "(Ljava/lang/Throwable;)V",                                      (void*) (uintptr_t) &Java_java_lang_VMClass_throwException          },
+#if defined(ENABLE_ANNOTATIONS)
+       { (char*) "getDeclaredAnnotations",  (char*) "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;",         (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredAnnotations  },
+#endif
+       { (char*) "getEnclosingClass",       (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingClass       },
+       { (char*) "getEnclosingConstructor", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",            (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingConstructor },
+       { (char*) "getEnclosingMethod",      (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Method;",                 (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingMethod      },
+       { (char*) "getClassSignature",       (char*) "(Ljava/lang/Class;)Ljava/lang/String;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getClassSignature       },
+       { (char*) "isAnonymousClass",        (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isAnonymousClass        },
+       { (char*) "isLocalClass",            (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isLocalClass            },
+       { (char*) "isMemberClass",           (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isMemberClass           },
+};
+
+
+/* _Jv_java_lang_VMClass_init **************************************************
+
+   Register native functions.
+
+*******************************************************************************/
+
+// FIXME
+extern "C" {
+void _Jv_java_lang_VMClass_init(void)
+{
+       utf *u;
+
+       u = utf_new_char("java/lang/VMClass");
+
+       native_method_register(u, methods, NATIVE_METHODS_COUNT);
+}
+}
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where