GNU header update.
[cacao.git] / src / native / vm / VMClass.c
index de8b3238dc08ffbe438aa1b7cacaad3d2c24522c..56820cad5a048a742b010988d449e68eb231abcf 100644 (file)
@@ -1,9 +1,9 @@
-/* nat/VMClass.c -
+/* native/vm/VMClass.c - java/lang/Class
 
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
-   M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
-   P. Tomsich, J. Wenninger
+   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+   Institut f. Computersprachen - TU Wien
 
    This file is part of CACAO.
 
 
    Changes: Joseph Wenninger
 
-   $Id: VMClass.c 827 2004-01-03 15:02:53Z twisti $
+   $Id: VMClass.c 1735 2004-12-07 14:33:27Z twisti $
 
 */
 
 
 #include <string.h>
-#include "jni.h"
+
 #include "types.h"
-#include "global.h"
-#include "builtin.h"
-#include "loader.h"
-#include "native.h"
-#include "tables.h"
-#include "toolbox/loging.h"
-#include "toolbox/memory.h"
-#include "java_lang_Class.h"
-#include "java_lang_reflect_Constructor.h"
-#include "java_lang_reflect_Field.h"
-#include "java_lang_reflect_Method.h"
-#include "java_lang_Throwable.h"    /* needed for java_lang_VMClass.h */
-#include "java_lang_VMClass.h"
+#include "mm/memory.h"
+#include "native/jni.h"
+#include "native/native.h"
+#include "native/include/java_lang_Object.h"
+#include "native/include/java_lang_Class.h"
+#include "native/include/java_lang_ClassLoader.h"
+#include "native/include/java_security_ProtectionDomain.h"
+#include "native/include/java_lang_reflect_Constructor.h"
+#include "native/include/java_lang_reflect_Field.h"
+#include "native/include/java_lang_reflect_Method.h"
+#include "native/include/java_lang_Throwable.h"        /* java_lang_VMClass.h */
+#include "native/include/java_lang_VMClass.h"
+#include "toolbox/logging.h"
+#include "vm/exceptions.h"
+#include "vm/global.h"
+#include "vm/loader.h"
+#include "vm/tables.h"
+#include "vm/builtin.h"
 
 
 /* for selecting public members */
  * Method:    forName
  * Signature: (Ljava/lang/String;)Ljava/lang/Class;
  */
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, struct java_lang_String* s)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, java_lang_String *s)
 {
        classinfo *c;
        utf *u;
 
-       if (runverbose) {
-           log_text("Java_java_lang_VMClass_forName called");
-           log_text(javastring_tochar((java_objectheader*)s));
-       }
-
        /* illegal argument */
-       if (!s) return NULL;
+       if (!s)
+               return NULL;
        
        /* create utf string in which '.' is replaced by '/' */
        u = javastring_toutf(s, true);
-        
-       c = loader_load(u);
-       if (c == NULL) {
-               /* class was not loaded. raise exception */
-               if (runverbose)
-                       log_text("Setting class not found exception");
 
-               /* there is already an exception (NoClassDefFoundError), but forName()
-                  returns a ClassNotFoundException */
-               exceptionptr = 
-                       native_new_and_init_string(class_java_lang_ClassNotFoundException, s);
+       /* create a new class, ... */
+       c = class_new(u);
+
+       /* load, ... */
+       if (!class_load(c)) {
+               classinfo *xclass;
+
+               xclass = (*exceptionptr)->vftbl->class;
+
+               /* if the exception is a NoClassDefFoundError, we replace it with a
+                  ClassNotFoundException, otherwise return the exception */
+
+               if (xclass == class_get(utf_new_char(string_java_lang_NoClassDefFoundError))) {
+                       /* clear exceptionptr, because builtin_new checks for 
+                          ExceptionInInitializerError */
+                       *exceptionptr = NULL;
+
+                       *exceptionptr =
+                               new_exception_javastring(string_java_lang_ClassNotFoundException, s);
+               }
 
            return NULL;
        }
 
-       /*log_text("Returning class");*/
-       use_class_as_object (c);
+       /* link, ... */
+       if (!class_link(c))
+               return NULL;
+       
+       /* ...and initialize it */
+       if (!class_init(c))
+               return NULL;
 
-       return (java_lang_Class*) c;
+       use_class_as_object(c);
+
+       return (java_lang_Class *) c;
 }
 
 
@@ -102,21 +120,24 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv
  * Method:    getClassLoader
  * Signature: ()Ljava/lang/ClassLoader;
  */
-JNIEXPORT struct java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader (JNIEnv *env ,  struct java_lang_VMClass* this )
+JNIEXPORT java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {  
-       init_systemclassloader();
-       return SystemClassLoader;
+       return (java_lang_ClassLoader *) ((classinfo *) that)->classloader;
+
+/*     init_systemclassloader();
+
+       return SystemClassLoader;*/
 }
 
 
 /*
  * Class:     java_lang_VMClass
- * Method:    getModifiers
- * Signature: ()I
+ * Method:    getComponentType
+ * Signature: ()Ljava/lang/Class;
  */
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType (JNIEnv *env ,  struct java_lang_VMClass* this )
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz,java_lang_Class *that)
 {
-    classinfo *thisclass = (classinfo*) (this->vmData);
+    classinfo *thisclass = (classinfo *) that;
     classinfo *c = NULL;
     arraydescriptor *desc;
     
@@ -127,10 +148,10 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentTyp
             c = primitivetype_table[desc->arraytype].class_primitive;
         
         /* set vftbl */
-               use_class_as_object (c);
+               use_class_as_object(c);
     }
     
-    return (java_lang_Class*) c;
+    return (java_lang_Class *) c;
 }
 
 
@@ -139,10 +160,11 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentTyp
  * Method:    getDeclaredConstructors
  * Signature: (Z)[Ljava/lang/reflect/Constructor;
  */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors (JNIEnv *env ,  struct java_lang_VMClass* this , s4 public_only)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz,
+       struct java_lang_Class *that, s4 public_only)
 {
   
-    classinfo *c = (classinfo *) (this->vmData);
+    classinfo *c = (classinfo *) that;
     java_objectheader *o;
     classinfo *class_constructor;
     java_objectarray *array_constructor;     /* result: array of Method-objects */
@@ -151,26 +173,21 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
     int public_methods = 0;            /* number of public methods of the class */
     int pos = 0;
     int i;
-    utf *utf_constr=utf_new_char("<init>");
-
-
-    
-       /*log_text("Java_java_lang_VMClass_getDeclaredConstructors");
-         log_plain_utf(c->name);
-         log_plain("\n");*/
-       /*    class_showmethods(c);
-                 class_showmethods(loader_load(utf_new_char("java/lang/Class")));*/
-
+    utf *utf_constr = utf_new_char("<init>");
 
     /* determine number of constructors */
     for (i = 0; i < c->methodscount; i++) 
-               if ((((c->methods[i].flags & ACC_PUBLIC)) || (!public_only)) && 
-                       (c->methods[i].name==utf_constr)) public_methods++;
+               if (((c->methods[i].flags & ACC_PUBLIC) || !public_only) && 
+                       (c->methods[i].name == utf_constr))
+                       public_methods++;
 
-    class_constructor = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Constructor"));
-    if (!class_constructor) 
-               return NULL;
+    class_constructor = class_new(utf_new_char("java/lang/reflect/Constructor"));
 
+       if (!class_constructor->loaded)
+               class_load(class_constructor);
+
+       if (!class_constructor->linked)
+               class_link(class_constructor);
 
     array_constructor = builtin_anewarray(public_methods, class_constructor);
 
@@ -178,15 +195,16 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
                return NULL;
 
     for (i = 0; i < c->methodscount; i++) 
-               if ((c->methods[i].flags & ACC_PUBLIC) || (!public_only)){
-       
+               if ((c->methods[i].flags & ACC_PUBLIC) || !public_only){
                        m = &c->methods[i];         
-                       if (m->name!=utf_constr) continue;
+                       if (m->name!=utf_constr)
+                               continue;
+
                        o = native_new_and_init(class_constructor);     
                        array_constructor->data[pos++] = o;
 
                        /* array of exceptions declared to be thrown, information not available !! */
-                       exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
+                       exceptiontypes = builtin_anewarray(0, class_java_lang_Class);
 
                        /*          class_showconstantpool(class_constructor);*/
                        /* initialize instance fields */
@@ -199,14 +217,7 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
            setfield_critical(class_constructor,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) get_parametertypes(m));
         }           
     
-       /*log_text("leaving Java_java_lang_VMClass_getDeclaredConstructors");*/
        return array_constructor;
-
-
-
-
-       /*  panic("Java_java_lang_Class_getConstructors0 called");
-               return NULL;*/
 }
 
 
@@ -215,24 +226,23 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
  * Method:    getDeclaredClasses
  * Signature: (Z)[Ljava/lang/Class;
  */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, struct java_lang_VMClass* this , s4 publicOnly)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, java_lang_Class *that, s4 publicOnly)
 {
+#if defined(__GNUC__)
 #warning fix the public only case
-       classinfo *c = (classinfo *) (this->vmData);
+#endif
+       classinfo *c = (classinfo *) that;
        int pos = 0;                /* current declared class */
        int declaredclasscount = 0; /* number of declared classes */
        java_objectarray *result;   /* array of declared classes */
        int notPublicOnly = !publicOnly;
        int i;
 
-       if (!this)
-               return NULL;
-
-       if (!this->vmData)
+       if (!that)
                return NULL;
 
        /*printf("PublicOnly: %d\n",publicOnly);*/
-       if (!Java_java_lang_VMClass_isPrimitive(env, (java_lang_VMClass *) c) && (c->name->text[0] != '[')) {
+       if (!Java_java_lang_VMClass_isPrimitive(env, clazz, (java_lang_Class *) c) && (c->name->text[0] != '[')) {
                /* determine number of declared classes */
                for (i = 0; i < c->innerclasscount; i++) {
                        if ( (c->innerclass[i].outer_class == c) && (notPublicOnly || (c->innerclass[i].flags & ACC_PUBLIC)))
@@ -246,11 +256,9 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JN
        result = builtin_anewarray(declaredclasscount, class_java_lang_Class);          
 
        for (i = 0; i < c->innerclasscount; i++) {
-    
                classinfo *inner = c->innerclass[i].inner_class;
                classinfo *outer = c->innerclass[i].outer_class;
-
-      
+               
                if ((outer == c) && (notPublicOnly || (inner->flags & ACC_PUBLIC))) {
                        /* outer class is this class, store innerclass in array */
                        use_class_as_object(inner);
@@ -267,27 +275,27 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JN
  * Method:    getDeclaringClass
  * Signature: ()Ljava/lang/Class;
  */
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass ( JNIEnv *env ,  struct java_lang_VMClass* this)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, struct java_lang_Class *that)
 {
+#if defined(__GNUC__)
 #warning fixme
-       classinfo *c = (classinfo *) (this->vmData);
-       log_text("Java_java_lang_VMClass_getDeclaringClass");
+#endif
+       classinfo *c = (classinfo *) that;
 
-       if (this && this->vmData && !Java_java_lang_VMClass_isPrimitive(env, this) && (c->name->text[0]!='[')) {    
+       if (that && !Java_java_lang_VMClass_isPrimitive(env, clazz,that) && (c->name->text[0] != '[')) {
                int i;
 
                if (c->innerclasscount == 0)  /* no innerclasses exist */
                        return NULL;
     
                for (i = 0; i < c->innerclasscount; i++) {
-
                        classinfo *inner =  c->innerclass[i].inner_class;
                        classinfo *outer =  c->innerclass[i].outer_class;
       
                        if (inner == c) {
                                /* innerclass is this class */
-                               use_class_as_object (outer);
-                               return (java_lang_Class*) outer;
+                               use_class_as_object(outer);
+                               return (java_lang_Class *) outer;
                        }
                }
        }
@@ -297,48 +305,47 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringCla
 }
 
 
-/*
- * Class:     java/lang/Class
- * Method:    getField0
- * Signature: (Ljava/lang/String;I)Ljava/lang/reflect/Field;
- */
-JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getField0 ( JNIEnv *env ,  struct java_lang_VMClass* this, struct java_lang_String* name, s4 public_only)
+java_lang_reflect_Field* cacao_getField0(JNIEnv *env, java_lang_Class *that, java_lang_String *name, s4 public_only)
 {
-    classinfo *c, *fieldtype;   
+    classinfo *c;
+       classinfo *fieldtype;
     fieldinfo *f;               /* the field to be represented */
     java_lang_reflect_Field *o; /* result: field-object */
-    utf *desc;                 /* the fielddescriptor */
+    utf *desc;                         /* the fielddescriptor */
     int idx;
 
     /* create Field object */
-    c = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Field"));
-    o = (java_lang_reflect_Field*) native_new_and_init(c);
+/*      c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Field")); */
+    c = class_new(utf_new_char("java/lang/reflect/Field"));
+    o = (java_lang_reflect_Field *) native_new_and_init(c);
 
     /* get fieldinfo entry */
-    idx = class_findfield_index_approx((classinfo*) (this->vmData), javastring_toutf(name, false));
-    if (idx<0) {
-           exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+    idx = class_findfield_index_approx((classinfo *) that, javastring_toutf(name, false));
+
+    if (idx < 0) {
+           *exceptionptr = new_exception(string_java_lang_NoSuchFieldException);
            return NULL;
        }
-    f= &(((struct classinfo*)(this->vmData))->fields[idx]);
-    if (f) {
 
-               if ( public_only && !(f->flags & ACC_PUBLIC))
-                       {
-                               /* field is not public  and public only had been requested*/
-                               exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
-                               return NULL;
-                       }
+    f = &(((classinfo *) that)->fields[idx]);
+    if (f) {
+               if (public_only && !(f->flags & ACC_PUBLIC)) {
+                       /* field is not public  and public only had been requested*/
+                       *exceptionptr = new_exception(string_java_lang_NoSuchFieldException);
+                       return NULL;
+               }
 
                desc = f->descriptor;
-               fieldtype = class_from_descriptor(desc->text,utf_end(desc),NULL,CLASSLOAD_LOAD);
-               if (!fieldtype) return NULL;
+               fieldtype = class_from_descriptor(desc->text, utf_end(desc), NULL, CLASSLOAD_LOAD);
+               if (!fieldtype)
+                       return NULL;
         
                /* initialize instance fields */
-               setfield_critical(c,o,"declaringClass",          "Ljava/lang/Class;",  jobject, (jobject) (this->vmData) /*this*/);
+               setfield_critical(c,o,"declaringClass",          "Ljava/lang/Class;",  jobject, (jobject) that /*this*/);
                /*      ((java_lang_reflect_Field*)(o))->flag=f->flags;*/
                /* save type in slot-field for faster processing */
-               /*      setfield_critical(c,o,"flag",           "I",                jint,    (jint) f->flags);  */
+               /* setfield_critical(c,o,"flag",           "I",             jint,    (jint) f->flags); */
+               o->flag = f->flags;
                setfield_critical(c,o,"slot",           "I",                jint,    (jint) idx);  
                setfield_critical(c,o,"name",           "Ljava/lang/String;", jstring, (jstring) name);
                /*setfield_critical(c,o,"type",           "Ljava/lang/Class;",  jclass,  fieldtype);*/
@@ -355,9 +362,9 @@ JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getFiel
  * Method:    getDeclaredFields
  * Signature: (Z)[Ljava/lang/reflect/Field;
  */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields (JNIEnv *env ,  struct java_lang_VMClass* this , s4 public_only)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, java_lang_Class *that, s4 public_only)
 {
-    classinfo *c = (classinfo *) (this->vmData);
+    classinfo *c = (classinfo *) that;
     classinfo *class_field;
     java_objectarray *array_field; /* result: array of field-objects */
     int public_fields = 0;         /* number of elements in field-array */
@@ -366,9 +373,11 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields (JN
 
     /* determine number of fields */
     for (i = 0; i < c->fieldscount; i++) 
-               if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only)) public_fields++;
+               if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only))
+                       public_fields++;
 
-    class_field = loader_load(utf_new_char("java/lang/reflect/Field"));
+/*      class_field = loader_load(utf_new_char("java/lang/reflect/Field")); */
+    class_field = class_new(utf_new_char("java/lang/reflect/Field"));
 
     if (!class_field) 
                return NULL;
@@ -383,11 +392,9 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields (JN
     /* get the fields and store in the array */    
     for (i = 0; i < c->fieldscount; i++) 
                if ( (c->fields[i].flags & ACC_PUBLIC) || (!public_only))
-                       array_field->data[pos++] = (java_objectheader*) Java_java_lang_VMClass_getField0
-                               (env,
-                                this,
-                                (java_lang_String*) javastring_new(c->fields[i].name), 
-                                public_only);
+                       array_field->data[pos++] = 
+                               (java_objectheader *) cacao_getField0(env,
+                                          that, (java_lang_String *) javastring_new(c->fields[i].name),public_only);
     return array_field;
 }
 
@@ -397,63 +404,76 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields (JN
  * Method:    getInterfaces
  * Signature: ()[Ljava/lang/Class;
  */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces ( JNIEnv *env ,  struct java_lang_VMClass* this)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
-       classinfo *c = (classinfo*) (this->vmData);
+       classinfo *c = (classinfo *) that;
        u4 i;
-       java_objectarray *a = builtin_anewarray (c->interfacescount, class_java_lang_Class);
-       if (!a) return NULL;
-       for (i=0; i<c->interfacescount; i++) {
-               use_class_as_object (c->interfaces[i]);
+       java_objectarray *a;
+
+       a = builtin_anewarray(c->interfacescount, class_java_lang_Class);
+
+       if (!a)
+               return NULL;
 
-               a->data[i] = (java_objectheader*) c->interfaces[i];
+       for (i = 0; i < c->interfacescount; i++) {
+               use_class_as_object(c->interfaces[i]);
+
+               a->data[i] = (java_objectheader *) c->interfaces[i];
        }
+
        return a;
 }
 
 
-/*
- * Class:     java/lang/Class
- * Method:    getMethod0
- * Signature: (Ljava/lang/String;[Ljava/lang/Class;I)Ljava/lang/reflect/Method;
- */
-JNIEXPORT struct java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMethod0 ( JNIEnv *env ,  struct java_lang_Class* 
-                                                                                                                                                                          this, struct java_lang_String* name, java_objectarray* types, s4 which)
+java_lang_reflect_Method* cacao_getMethod0(JNIEnv *env, java_lang_Class *that, java_lang_String *name, java_objectarray *types, s4 which)
 {
     classinfo *c; 
-    classinfo *clazz = (classinfo *) this;
+    classinfo *clazz = (classinfo *) that;
     java_lang_reflect_Method* o;         /* result: Method-object */ 
     java_objectarray *exceptiontypes;    /* the exceptions thrown by the method */
     methodinfo *m;                      /* the method to be represented */
 
-    c = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
-    o = (java_lang_reflect_Method*) native_new_and_init(c);
+/*      c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Method")); */
+    c = class_new(utf_new_char("java/lang/reflect/Method"));
+    o = (java_lang_reflect_Method *) native_new_and_init(c);
 
     /* find the method */
-    m = class_resolvemethod_approx (
-                                                                       clazz, 
-                                                                       javastring_toutf(name, false),
-                                                                       create_methodsig(types,0)
-                                                                       );
-
-    if (!m || (which==MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC)))
-               {
-                       /* no apropriate method was found */
-                       exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
-                       return NULL;
-               }
+    m = class_resolvemethod_approx(clazz, 
+                                                                  javastring_toutf(name, false),
+                                                                  create_methodsig(types,0)
+                                                                  );
+
+    if (!m || (which == MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC))) {
+               /* no apropriate method was found */
+               *exceptionptr = new_exception(string_java_lang_NoSuchMethodException);
+               return NULL;
+       }
    
-    /* array of exceptions declared to be thrown, information not available !! */
-    exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
+    /* array of exceptions declared to be thrown, information not available */
+    exceptiontypes = builtin_anewarray(0, class_java_lang_Class);
 
     /* initialize instance fields */
-    setfield_critical(c,o,"clazz",          "Ljava/lang/Class;",  jobject, (jobject) clazz /*this*/);
-    setfield_critical(c,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) types);
-    setfield_critical(c,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
-    setfield_critical(c,o,"name",           "Ljava/lang/String;", jstring, javastring_new(m->name));
-    setfield_critical(c,o,"modifiers",      "I",                 jint,    m->flags);
-    setfield_critical(c,o,"slot",           "I",                 jint,    0); 
-    setfield_critical(c,o,"returnType",     "Ljava/lang/Class;",  jclass,  get_returntype(m));
+
+    setfield_critical(c, o, "clazz",          "Ljava/lang/Class;",  jobject,
+                                         (jobject) clazz /*this*/);
+
+    setfield_critical(c, o, "parameterTypes", "[Ljava/lang/Class;", jobject,
+                                         (jobject) types);
+
+    setfield_critical(c, o, "exceptionTypes", "[Ljava/lang/Class;", jobject,
+                                         (jobject) exceptiontypes);
+
+    setfield_critical(c, o, "name",           "Ljava/lang/String;", jstring,
+                                         (jobject) javastring_new(m->name));
+
+    setfield_critical(c, o, "modifiers",      "I",                  jint,
+                                         m->flags);
+
+    setfield_critical(c, o, "slot",           "I",                  jint,
+                                         0); 
+
+    setfield_critical(c, o, "returnType",     "Ljava/lang/Class;",  jclass,
+                                         get_returntype(m));
 
     return o;
 }
@@ -464,9 +484,9 @@ JNIEXPORT struct java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMet
  * Method:    getDeclaredMethods
  * Signature: (Z)[Ljava/lang/reflect/Method;
  */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (JNIEnv *env ,  struct java_lang_VMClass* this , s4 public_only)
+JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, java_lang_Class *that, s4 public_only)
 {
-    classinfo *c = (classinfo *) this->vmData;    
+    classinfo *c = (classinfo *) that;    
     java_objectheader *o;
     classinfo *class_method;
     java_objectarray *array_method;     /* result: array of Method-objects */
@@ -478,14 +498,15 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (J
     utf *utf_constr=utf_new_char("<init>");
     utf *utf_clinit=utf_new_char("<clinit>");
 
+/*      class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method")); */
+    class_method = class_new(utf_new_char("java/lang/reflect/Method"));
 
-    class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
     if (!class_method) 
                return NULL;
 
        /* JOWENN: array classes do not declare methods according to mauve test. It should be considered, if 
           we should return to my old clone method overriding instead of declaring it as a member function */
-       if (Java_java_lang_VMClass_isArray(env,this)) {
+       if (Java_java_lang_VMClass_isArray(env, clazz,that)) {
                return builtin_anewarray(0, class_method);
        }
 
@@ -530,7 +551,7 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (J
                                        ACC_SYNCHRONIZED | ACC_NATIVE | ACC_STRICT)
                                        );*/
                        setfield_critical(class_method,o,"declaringClass",          "Ljava/lang/Class;",  jobject, (jobject) c /*this*/);
-                       setfield_critical(class_method,o,"name",           "Ljava/lang/String;", jstring, javastring_new(m->name));
+                       setfield_critical(class_method,o,"name",           "Ljava/lang/String;", jstring, (jobject) javastring_new(m->name));
                        /*          setfield_critical(class_method,o,"flag",      "I",               jint,   (m->flags &
                                        (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_ABSTRACT | ACC_STATIC | ACC_FINAL |
                                        ACC_SYNCHRONIZED | ACC_NATIVE | ACC_STRICT)));*/
@@ -549,9 +570,9 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (J
  * Method:    getModifiers
  * Signature: ()I
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers ( JNIEnv *env ,  struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
-       classinfo *c = (classinfo *) (this->vmData);
+       classinfo *c = (classinfo *) that;
        return c->flags;
 }
 
@@ -561,15 +582,19 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers ( JNIEnv *env ,  struct
  * Method:    getName
  * Signature: ()Ljava/lang/String;
  */
-JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getName ( JNIEnv *env ,  struct java_lang_VMClass* this) {
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, java_lang_Class* that)
+{
        u4 i;
-       classinfo *c = (classinfo*) (this->vmData);
-       java_lang_String *s = (java_lang_String*) javastring_new(c->name);
-       if (!s) return NULL;
+       classinfo *c = (classinfo *) that;
+       java_lang_String *s = (java_lang_String *) javastring_new(c->name);
+
+       if (!s)
+               return NULL;
 
        /* return string where '/' is replaced by '.' */
-       for (i=0; i<s->value->header.size; i++) {
-               if (s->value->data[i] == '/') s->value->data[i] = '.';
+       for (i = 0; i < s->value->header.size; i++) {
+               if (s->value->data[i] == '/')
+                       s->value->data[i] = '.';
        }
 
        return s;
@@ -582,10 +607,10 @@ JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getName ( JNIE
  * Method:    getBeautifiedName
  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
  */
-JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedName(JNIEnv *env, jclass clazz, struct java_lang_Class* par1)
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedName(JNIEnv *env, jclass clazz, java_lang_Class *par1)
 {
     u4 dimCnt;
-    classinfo *c = (classinfo*) (par1);
+    classinfo *c = (classinfo *) (par1);
 
     char *utf__ptr = c->name->text;      /* current position in utf-text */
     char **utf_ptr = &utf__ptr;
@@ -594,17 +619,27 @@ JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedN
     char *str = NULL;
     s4   len;
     s4   i;
-
-    if (runverbose) log_text("Java_java_lang_VMClass_getName");
-
-    dimCnt = 0;
-    while (*utf_ptr != desc_end) {
-               if (utf_nextu2(utf_ptr) == '[') dimCnt++;
+    
+#if 0
+    log_text("Java_java_lang_VMClass_getBeautifiedName");
+    utf_display(c->name);
+    log_text("beautifying");
+#endif
+    dimCnt=0;
+    while ( *utf_ptr != desc_end ) {
+               if (utf_nextu2(utf_ptr)=='[') dimCnt++;
                else break;
     }
     utf__ptr = (*utf_ptr) - 1;
 
     len = 0;
+
+#if 0  
+    log_text("------>");
+    utf_display(c->name);
+    log_text("<------");
+#endif 
+
     if (((*utf_ptr) + 1) == desc_end) {
            for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
                        if (primitivetype_table[i].typesig == (*utf__ptr)) {
@@ -617,9 +652,16 @@ JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedN
     }
 
     if (len == 0) {
-               len = dimCnt + strlen(c->name->text) - 2;
-               str = MNEW(char, len + 1);
-               strncpy(str, ++utf__ptr, len - 2 * dimCnt);        
+               if (dimCnt>0) {
+                       len = dimCnt + strlen(c->name->text) - 2;
+                       str = MNEW(char, len + 1);
+                       strncpy(str, ++utf__ptr, len - 2 * dimCnt);        
+               } else {
+                       len = strlen(c->name->text);
+                       str = MNEW(char, len + 1);
+                       strncpy(str, utf__ptr, len);       
+               }
+               
     }  
 
     dimCnt = len - 2 * dimCnt;
@@ -643,44 +685,23 @@ JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedN
 }
 
 
-/*
- * Class:     java/lang/Class
- * Method:    getProtectionDomain0
- * Signature: ()Ljava/security/ProtectionDomain;
- */
-JNIEXPORT struct java_security_ProtectionDomain* JNICALL Java_java_lang_VMClass_getProtectionDomain0 ( JNIEnv *env ,  struct java_lang_Class* this)
-{
-       log_text("Java_java_lang_VMClass_getProtectionDomain0  called");
-       return NULL;
-}
-
-
-/*
- * Class:     java/lang/Class
- * Method:    getSigners
- * Signature: ()[Ljava/lang/Object;
- */
-JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getSigners ( JNIEnv *env ,  struct java_lang_Class* this)
-{
-       log_text("Java_java_lang_VMClass_getSigners  called");
-       return NULL;
-}
-
 
 /*
  * Class:     java/lang/Class
  * Method:    getSuperclass
  * Signature: ()Ljava/lang/Class;
  */
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass ( JNIEnv *env ,  struct java_lang_VMClass* this)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
-       classinfo *cl= ((classinfo*)this->vmData);
-       classinfo *c=cl -> super;
+       classinfo *cl = (classinfo *) that;
+       classinfo *c = cl->super;
 
-       if (!c) return NULL;
+       if (!c)
+               return NULL;
 
        use_class_as_object (c);
-       return (java_lang_Class*) c;
+
+       return (java_lang_Class *) c;
 }
 
 
@@ -689,9 +710,10 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass (
  * Method:    isArray
  * Signature: ()Z
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray ( JNIEnv *env ,  struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
-    classinfo *c = (classinfo*) (this->vmData);
+    classinfo *c = (classinfo *) that;
+
     return c->vftbl->arraydesc != NULL;
 }
 
@@ -701,16 +723,16 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray ( JNIEnv *env ,  struct java
  * Method:    isAssignableFrom
  * Signature: (Ljava/lang/Class;)Z
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom ( JNIEnv *env ,  struct java_lang_VMClass* this, struct java_lang_Class* sup)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, java_lang_Class *that, java_lang_Class *sup)
 {
        /*      log_text("Java_java_lang_VMClass_isAssignableFrom");*/
-       if (!this) return 0;
+       
        if (!sup) return 0;
-       if (!this->vmData) {
+       if (!that) {
                panic("sup->vmClass is NULL in VMClass.isAssignableFrom");
                return 0;
        }
-       return (*env)->IsAssignableForm(env, (jclass) sup, (jclass) (this->vmData));
+       return (*env)->IsAssignableForm(env, (jclass) sup, (jclass) that);
 }
 
 
@@ -719,10 +741,11 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom ( JNIEnv *env ,  st
  * Method:    isInstance
  * Signature: (Ljava/lang/Object;)Z
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance ( JNIEnv *env ,  struct java_lang_VMClass* this, struct java_lang_Object* obj)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *that, java_lang_Object *obj)
 {
-       classinfo *clazz = (classinfo*) (this->vmData);
-       return (*env)->IsInstanceOf(env,(jobject) obj,clazz);
+/*     classinfo *clazz = (classinfo *) that; */
+
+       return (*env)->IsInstanceOf(env, (jobject) obj, (jclass) that);
 }
 
 
@@ -731,10 +754,13 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance ( JNIEnv *env ,  struct j
  * Method:    isInterface
  * Signature: ()Z
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface ( JNIEnv *env ,  struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
-       classinfo *c = (classinfo*) this->vmData;
-       if (c->flags & ACC_INTERFACE) return true;
+       classinfo *c = (classinfo *) that;
+
+       if (c->flags & ACC_INTERFACE)
+               return true;
+
        return false;
 }
 
@@ -744,61 +770,36 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface ( JNIEnv *env ,  struct
  * Method:    isPrimitive
  * Signature: ()Z
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, struct java_lang_VMClass* this)
+JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
        int i;
-       classinfo *c = (classinfo *) this->vmData;
+       classinfo *c = (classinfo *) that;
 
        /* search table of primitive classes */
        for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
-               if (primitivetype_table[i].class_primitive == c) return true;
+               if (primitivetype_table[i].class_primitive == c)
+                       return true;
 
        return false;
 }
 
 
 /*
- * Class:     java/lang/Class
- * Method:    registerNatives
+ * Class:     java_lang_VMClass
+ * Method:    initialize
  * Signature: ()V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_registerNatives ( JNIEnv *env  )
-{
-    /* empty */
-}
-
-
-/*
- * Class:     java/lang/Class
- * Method:    setProtectionDomain0
- * Signature: (Ljava/security/ProtectionDomain;)V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_setProtectionDomain0 ( JNIEnv *env ,  struct java_lang_Class* this, struct java_security_ProtectionDomain* par1)
-{
-       if (verbose)
-               log_text("Java_java_lang_VMClass_setProtectionDomain0 called");
-}
-
-
-/*
- * Class:     java/lang/Class
- * Method:    setSigners
- * Signature: ([Ljava/lang/Object;)V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_setSigners ( JNIEnv *env ,  struct java_lang_Class* this, java_objectarray* par1)
+JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize(JNIEnv *env, jclass clazz, java_lang_Class *c)
 {
-       if (verbose)
-               log_text("Java_java_lang_VMClass_setSigners called");
-}
+       classinfo *ci;
 
+       ci = (classinfo *) c;
 
-/*
- * Class:     java_lang_VMClass
- * Method:    initialize
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize (JNIEnv *env ,  struct java_lang_VMClass* this ){
-       log_text("Java_java_lang_VMClass_initialize");
+       /* initialize class */
+       if (!ci->initialized)
+               /* No need to check return value, because class_init already sets the */
+               /* exception pointer. */
+               (void) class_init(ci);
 }
 
 
@@ -807,61 +808,22 @@ JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize (JNIEnv *env ,  struct
  * Method:    loadArrayClass
  * Signature: (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;
  */
-JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_loadArrayClass (JNIEnv *env , jclass clazz, struct java_lang_String* par1, struct 
-                                                                                                                                                                java_lang_ClassLoader* par2) {
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_loadArrayClass(JNIEnv *env, jclass clazz, java_lang_String *par1, java_lang_ClassLoader* par2)
+{
        log_text("Java_java_lang_VMClass_loadArrayClass");
+
        return 0;
 }
 
 
 /*
- * Class:     java_lang_VMClass
+ * Class:     java/lang/VMClass
  * Method:    throwException
  * Signature: (Ljava/lang/Throwable;)V
  */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException (JNIEnv *env , jclass clazz, struct java_lang_Throwable* par1) {
-       log_text("Java_java_lang_VMClass_throwException");
-}
-
-
-/*
- * Class:     java_lang_VMClass
- * Method:    step7
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_step7 (JNIEnv *env ,  struct java_lang_VMClass* this ) {
-       log_text("Java_java_lang_VMClass_step7");
-}
-
-
-/*
- * Class:     java_lang_VMClass
- * Method:    step8
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_step8 (JNIEnv *env ,  struct java_lang_VMClass* this ) {
-       log_text("Java_java_lang_VMClass_step8");
-}
-
-
-/*
- * Class:     java_lang_VMClass
- * Method:    isInitialized
- * Signature: ()Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInitialized (JNIEnv *env ,  struct java_lang_VMClass* this ) {
-       log_text("Java_java_lang_VMClass_isInitialized");
-       return 1;
-}
-
-
-/*
- * Class:     java_lang_VMClass
- * Method:    setInitialized
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_lang_VMClass_setInitialized (JNIEnv *env ,  struct java_lang_VMClass* this ) {
-       log_text("Java_java_lang_VMClass_setInitialized");
+JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
+{
+       *exceptionptr = (java_objectheader *) t;
 }