GNU header update.
[cacao.git] / src / native / vm / VMClass.c
index aeb7bb7987864e8c714d4194d15cb5e2923c04d2..56820cad5a048a742b010988d449e68eb231abcf 100644 (file)
-/* class: java/lang/Class */
+/* native/vm/VMClass.c - java/lang/Class
 
+   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
 
-/* for selecting public members */
-#define MEMBER_PUBLIC  0
-
-
-/******************************************************************************************                                                                                                            
-
-       creates method signature (excluding return type) from array of 
-       class-objects representing the parameters of the method 
-
-*******************************************************************************************/
-
-
-utf *create_methodsig(java_objectarray* types, char *retType)
-{
-    char *buffer;       /* buffer for building the desciptor */
-    char *pos;          /* current position in buffer */
-    utf *result;        /* the method signature */
-    u4 buffer_size = 3; /* minimal size=3: room for parenthesis and returntype */
-    u4 len = 0;                /* current length of the descriptor */
-    u4 i,j,n;
-    if (!types) return NULL;
-
-    /* determine required buffer-size */    
-    for (i=0;i<types->header.size;i++) {
-      classinfo *c = (classinfo *) types->data[i];
-      buffer_size  = buffer_size + c->name->blength+2;
-    }
-
-    if (retType) buffer_size+=strlen(retType);
-
-    /* allocate buffer */
-    buffer = MNEW(u1, buffer_size);
-    pos    = buffer;
-    
-    /* method-desciptor starts with parenthesis */
-    *pos++ = '(';
-
-    for (i=0;i<types->header.size;i++) {
-
-            char ch;      
-            /* current argument */
-           classinfo *c = (classinfo *) types->data[i];
-           /* current position in utf-text */
-           char *utf_ptr = c->name->text; 
-           
-           /* determine type of argument */
-           if ( (ch = utf_nextu2(&utf_ptr)) == '[' ) {
-       
-               /* arrayclass */
-               for ( utf_ptr--; utf_ptr<utf_end(c->name); utf_ptr++)
-                  *pos++ = *utf_ptr; /* copy text */
-
-           } else
-           {           
-               /* check for primitive types */
-               for (j=0; j<PRIMITIVETYPE_COUNT; j++) {
-
-                       char *utf_pos   = utf_ptr-1;
-                       char *primitive = primitivetype_table[j].wrapname;
-
-                       /* compare text */
-                       while (utf_pos<utf_end(c->name))
-                               if (*utf_pos++ != *primitive++) goto nomatch;
-
-                       /* primitive type found */
-                       *pos++ = primitivetype_table[j].typesig;
-                       goto next_type;
-
-               nomatch:
-               }
-
-               /* no primitive type and no arrayclass, so must be object */
-               *pos++ = 'L';
-               /* copy text */
-               for ( utf_ptr--; utf_ptr<utf_end(c->name); utf_ptr++)
-                       *pos++ = *utf_ptr;
-               *pos++ = ';';
-
-               next_type:
-           }  
-    }      
-
-    *pos++ = ')';
-
-    if (retType) {
-       for (i=0;i<strlen(retType);i++) {
-               *pos++=retType[i];
-       }
-    }
-    /* create utf-string */
-    result = utf_new(buffer,(pos-buffer));
-    MFREE(buffer, u1, buffer_size);
-
-    return result;
-}
-
-/******************************************************************************************
-
-       retrieve the next argument or returntype from a descriptor
-       and return the corresponding class 
-
-*******************************************************************************************/
-
+   This file is part of CACAO.
 
-classinfo *get_type(char **utf_ptr,char *desc_end, bool skip)
-{
-    classinfo *c = class_from_descriptor(*utf_ptr,desc_end,utf_ptr,
-                                         (skip) ? CLASSLOAD_SKIP : CLASSLOAD_LOAD);
-    if (!c)
-       /* unknown type */
-       panic("illegal descriptor");
-
-    if (skip) return NULL;
-
-    use_class_as_object(c);
-    return c;
-}
-
-/******************************************************************************************
-
-       use the descriptor of a method to generate a java/lang/Class array
-       which contains the classes of the parametertypes of the method
-
-*******************************************************************************************/
-
-java_objectarray* get_parametertypes(methodinfo *m) 
-{
-    utf  *descr    =  m->descriptor;    /* method-descriptor */ 
-    char *utf_ptr  =  descr->text;      /* current position in utf-text */
-    char *desc_end =  utf_end(descr);   /* points behind utf string     */
-    java_objectarray* result;
-    int parametercount = 0;
-    int i;
-
-    /* skip '(' */
-    utf_nextu2(&utf_ptr);
-  
-    /* determine number of parameters */
-    while ( *utf_ptr != ')' ) {
-       get_type(&utf_ptr,desc_end,true);
-       parametercount++;
-    }
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
 
-    /* create class-array */
-    result = builtin_anewarray(parametercount, class_java_lang_Class);
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
 
-    utf_ptr  =  descr->text;
-    utf_nextu2(&utf_ptr);
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.
 
-    /* get returntype classes */
-    for (i = 0; i < parametercount; i++)
-           result->data[i] = (java_objectheader *) get_type(&utf_ptr,desc_end, false);
+   Contact: cacao@complang.tuwien.ac.at
 
-    return result;
-}
+   Authors: Roman Obermaiser
 
+   Changes: Joseph Wenninger
 
-/******************************************************************************************
+   $Id: VMClass.c 1735 2004-12-07 14:33:27Z twisti $
 
-       get the returntype class of a method
+*/
 
-*******************************************************************************************/
 
-classinfo *get_returntype(methodinfo *m) 
-{
-       char *utf_ptr;   /* current position in utf-text */
-       char *desc_end;  /* points behind utf string     */
-        utf *desc = m->descriptor; /* method-descriptor  */
+#include <string.h>
 
-       utf_ptr  = desc->text;
-       desc_end = utf_end(desc);
+#include "types.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"
 
-       /* ignore parametertypes */
-        while ((utf_ptr<desc_end) && utf_nextu2(&utf_ptr)!=')')
-               /* skip */ ;
 
-       return get_type(&utf_ptr,desc_end, false);
-}
+/* for selecting public members */
+#define MEMBER_PUBLIC  0
 
 
 /*
@@ -187,64 +65,79 @@ classinfo *get_returntype(methodinfo *m)
  * 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;
-       u4 i;
 
-       if (runverbose)
-       {
-           log_text("Java_java_lang_VMClass_forName0 called");
-           log_text(javastring_tochar((java_objectheader*)s));
+       /* illegal argument */
+       if (!s)
+               return NULL;
+       
+       /* create utf string in which '.' is replaced by '/' */
+       u = javastring_toutf(s, true);
+
+       /* 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;
        }
 
-       /* illegal argument */
-       if (!s) return NULL;
+       /* link, ... */
+       if (!class_link(c))
+               return NULL;
        
-        /* create utf string in which '.' is replaced by '/' */
-        u = javastring_toutf(s, true);
-        
-        if ( !(c = class_get(u)) ) {
-            methodinfo *method;
-            java_lang_Class *class;
-            
-            log_text("forName: would need classloader");
-            /*utf_display(u);*/
-            
-            c = loader_load(u);
-            if (c == NULL)
-            {
-                /* class was not loaded. raise exception */
-                exceptionptr = 
-                    native_new_and_init (class_java_lang_ClassNotFoundException);
-                return NULL;
-            }
-        }
+       /* ...and initialize it */
+       if (!class_init(c))
+               return NULL;
 
-       use_class_as_object (c);
-       return (java_lang_Class*) c;
+       use_class_as_object(c);
+
+       return (java_lang_Class *) c;
 }
 
+
 /*
  * Class:     java_lang_VMClass
  * 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;
     
@@ -255,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;
 }
 
 
@@ -267,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 */
@@ -279,59 +173,51 @@ 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");
-    utf_display(c->name);
-    printf("\n");
-    */
-
+    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"));
+    class_constructor = class_new(utf_new_char("java/lang/reflect/Constructor"));
 
-    if (!class_constructor) 
-       return NULL;
+       if (!class_constructor->loaded)
+               class_load(class_constructor);
+
+       if (!class_constructor->linked)
+               class_link(class_constructor);
 
     array_constructor = builtin_anewarray(public_methods, class_constructor);
 
     if (!array_constructor) 
-       return NULL;
+               return NULL;
 
     for (i = 0; i < c->methodscount; i++) 
-       if ((c->methods[i].flags & ACC_PUBLIC) || (!public_only)){
-       
-           m = &c->methods[i];     
-           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);
-
-/*         class_showconstantpool(class_constructor);*/
-           /* initialize instance fields */
-           ((java_lang_reflect_Constructor*)o)->flag=(m->flags & (ACC_PRIVATE | ACC_PUBLIC | ACC_PROTECTED));
-           setfield_critical(class_constructor,o,"clazz",          "Ljava/lang/Class;",  jobject, (jobject) c /*this*/);
-           setfield_critical(class_constructor,o,"slot",           "I",                     jint,    i); 
-           setfield_critical(class_constructor,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
+               if ((c->methods[i].flags & ACC_PUBLIC) || !public_only){
+                       m = &c->methods[i];         
+                       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);
+
+                       /*          class_showconstantpool(class_constructor);*/
+                       /* initialize instance fields */
+                       /*          ((java_lang_reflect_Constructor*)o)->flag=(m->flags & (ACC_PRIVATE | ACC_PUBLIC | ACC_PROTECTED));*/
+                       setfield_critical(class_constructor,o,"clazz",          "Ljava/lang/Class;",  jobject, (jobject) c /*this*/);
+                       setfield_critical(class_constructor,o,"slot",           "I",                 jint,    i); 
+                       /*          setfield_critical(class_constructor,o,"flag",           "I",                     jint,    (m->flags & (ACC_PRIVATE | 
+                                       ACC_PUBLIC | ACC_PROTECTED))); */
+                       setfield_critical(class_constructor,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
            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;*/
+       return array_constructor;
 }
 
 
@@ -340,123 +226,131 @@ return array_constructor;
  * 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);
-  int pos = 0;                /* current declared class */
-  int declaredclasscount = 0; /* number of declared classes */
-  java_objectarray *result;   /* array of declared classes */
-  int i;
-
-  if (!this)
-    return NULL;
-
-  if (!this->vmData)
-    return NULL;
+#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 (!that)
+               return NULL;
+
+       /*printf("PublicOnly: %d\n",publicOnly);*/
+       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)))
+                               /* outer class is this class */
+                               declaredclasscount++;
+               }
+       }
 
-  if (!Java_java_lang_VMClass_isPrimitive(env, this) && (c->name->text[0]!='[')) {
-    /* determine number of declared classes */
-    for (i = 0; i < c->innerclasscount; i++) {
-      if (c->innerclass[i].outer_class == c) 
-        /* outer class is this class */
-       declaredclasscount++;
-    }
-  }
+       /*class_showmethods(c); */
 
-  result = builtin_anewarray(declaredclasscount, class_java_lang_Class);       
+       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) {
-      /* outer class is this class, store innerclass in array */
-      use_class_as_object (inner);
-      result->data[pos++] = (java_objectheader *) inner;
-    }
-  }
+       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);
+                       result->data[pos++] = (java_objectheader *) inner;
+               }
+       }
 
-  return result;
+       return result;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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]!='[')) {    
-    int i, j;
+       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;
+               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;
+               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;
-      }
-    }
-  }
+                       if (inner == c) {
+                               /* innerclass is this class */
+                               use_class_as_object(outer);
+                               return (java_lang_Class *) outer;
+                       }
+               }
+       }
 
-  /* return NULL for arrayclasses and primitive classes */
-  return NULL;
+       /* return NULL for arrayclasses and primitive classes */
+       return NULL;
 }
 
-/*
- * 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 */
-    char buffer[MAXSTRINGSIZE];
-    
+    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 */
-    f = class_findfield_approx((classinfo*) (this->vmData), javastring_toutf(name, false));
+    idx = class_findfield_index_approx((classinfo *) that, javastring_toutf(name, false));
 
-    if (f) {
-
-       if ( public_only && !(f->flags & ACC_PUBLIC))
-       {
-           /* field is not public */
-           exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+    if (idx < 0) {
+           *exceptionptr = new_exception(string_java_lang_NoSuchFieldException);
            return NULL;
        }
 
-      desc = f->descriptor;
-      fieldtype = class_from_descriptor(desc->text,utf_end(desc),NULL,true);
-      if (!fieldtype) 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;
         
-      /* initialize instance fields */
-      setfield_critical(c,o,"clazz",          "Ljava/lang/Class;",  jobject, (jobject) (this->vmData) /*this*/);
-      setfield_critical(c,o,"modifiers",      "I",                 jint,    f->flags);
-      /* save type in slot-field for faster processing */
-      setfield_critical(c,o,"slot",           "I",                 jint,    (jint) f->descriptor->text[0]);  
-      setfield_critical(c,o,"name",           "Ljava/lang/String;", jstring, (jstring) name);
-      setfield_critical(c,o,"type",           "Ljava/lang/Class;",  jclass,  fieldtype);
-
-      return o;
+               /* initialize instance fields */
+               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); */
+               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);*/
+
+               return o;
     }
 
     return NULL;
@@ -468,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 */
@@ -479,105 +373,120 @@ 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;
+               return NULL;
 
     /* create array of fields */
     array_field = builtin_anewarray(public_fields, class_field);
 
     /* creation of array failed */
     if (!array_field) 
-       return NULL;
+               return NULL;
 
     /* 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);
+               if ( (c->fields[i].flags & ACC_PUBLIC) || (!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;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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;
+
+       for (i = 0; i < c->interfacescount; i++) {
+               use_class_as_object(c->interfaces[i]);
+
+               a->data[i] = (java_objectheader *) 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;
 }
 
+
 /*
  * Class:     java_lang_VMClass
  * 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 */
@@ -586,276 +495,347 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (J
     int public_methods = 0;            /* number of public methods of the class */
     int pos = 0;
     int i;
+    utf *utf_constr=utf_new_char("<init>");
+    utf *utf_clinit=utf_new_char("<clinit>");
 
-    /* determine number of methods */
-    for (i = 0; i < c->methodscount; i++) 
-       if (((c->methods[i].flags & ACC_PUBLIC)) || public_only) public_methods++;
-
-    class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
+/*      class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method")); */
+    class_method = class_new(utf_new_char("java/lang/reflect/Method"));
 
     if (!class_method) 
-       return NULL;
+               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, clazz,that)) {
+               return builtin_anewarray(0, class_method);
+       }
+
+
+    /* determine number of methods */
+    for (i = 0; i < c->methodscount; i++) 
+               if ((((c->methods[i].flags & ACC_PUBLIC)) || (!public_only)) && 
+                       (!
+                        ((c->methods[i].name==utf_constr) ||
+                         (c->methods[i].name==utf_clinit) )
+                        )) public_methods++;
+
+       /*      
+               class_showmethods(class_method);
+               panic("JOWENN");
+       */
     
+
     array_method = builtin_anewarray(public_methods, class_method);
 
     if (!array_method) 
-       return NULL;
+               return NULL;
 
     for (i = 0; i < c->methodscount; i++) 
-       if ((c->methods[i].flags & ACC_PUBLIC) || (!public_only)){
-
-           m = &c->methods[i];     
-           o = native_new_and_init(class_method);     
-           array_method->data[pos++] = o;
-
-           /* array of exceptions declared to be thrown, information not available !! */
-           exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
-
-           /* initialize instance fields */
-           setfield_critical(class_method,o,"clazz",          "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,"flag",      "I",               jint,    m->flags);
-           setfield_critical(class_method,o,"slot",           "I",                  jint,    i); 
-           setfield_critical(class_method,o,"returnType",     "Ljava/lang/Class;",  jclass,  get_returntype(m));
-           setfield_critical(class_method,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
-           setfield_critical(class_method,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) get_parametertypes(m));
+               if (((c->methods[i].flags & ACC_PUBLIC) || (!public_only)) && 
+                       (!
+                        ((c->methods[i].name==utf_constr) ||
+                         (c->methods[i].name==utf_clinit) )
+                        )) {
+
+                       m = &c->methods[i];         
+                       o = native_new_and_init(class_method);     
+                       array_method->data[pos++] = o;
+
+                       /* array of exceptions declared to be thrown, information not available !! */
+                       exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
+
+
+                       /* initialize instance fields */
+                       /*          ((java_lang_reflect_Method*)o)->flag=(m->flags & 
+                                       (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_ABSTRACT | ACC_STATIC | ACC_FINAL |
+                                       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, (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)));*/
+                       setfield_critical(class_method,o,"slot",           "I",              jint,    i); 
+                       /*          setfield_critical(class_method,o,"returnType",     "Ljava/lang/Class;",  jclass,  get_returntype(m));
+                                       setfield_critical(class_method,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
+                                       setfield_critical(class_method,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) get_parametertypes(m));*/
         }           
 
     return array_method;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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);
-  return c->flags;
+       classinfo *c = (classinfo *) that;
+       return c->flags;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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);
+       classinfo *c = (classinfo *) that;
+       java_lang_String *s = (java_lang_String *) javastring_new(c->name);
 
-       if (!s) return NULL;
+       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;
+       
 }
 
 
-
 /*
- * Class:     java/lang/Class
- * Method:    getProtectionDomain0
- * Signature: ()Ljava/security/ProtectionDomain;
+ * Class:     java/lang/VMClass
+ * Method:    getBeautifiedName
+ * Signature: (Ljava/lang/Class;)Ljava/lang/String;
  */
-JNIEXPORT struct java_security_ProtectionDomain* JNICALL Java_java_lang_VMClass_getProtectionDomain0 ( JNIEnv *env ,  struct java_lang_Class* this)
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedName(JNIEnv *env, jclass clazz, java_lang_Class *par1)
 {
-  log_text("Java_java_lang_VMClass_getProtectionDomain0  called");
-  return NULL;
-}
+    u4 dimCnt;
+    classinfo *c = (classinfo *) (par1);
+
+    char *utf__ptr = c->name->text;      /* current position in utf-text */
+    char **utf_ptr = &utf__ptr;
+    char *desc_end = utf_end(c->name);   /* points behind utf string     */
+    java_lang_String *s;
+    char *str = NULL;
+    s4   len;
+    s4   i;
+    
+#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;
 
-/*
- * 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;
+    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)) {
+                               len = dimCnt * 2 + strlen(primitivetype_table[i].name);
+                               str = MNEW(char, len + 1);
+                               strcpy(str, primitivetype_table[i].name);
+                               break;
+                       }
+           }
+    }
+
+    if (len == 0) {
+               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;
+    str[len] = 0;
+    for (i = len - 1; i >= dimCnt; i = i - 2) {
+               str[i] = ']';
+               str[i - 1] = '[';
+    }
+
+    s = javastring_new(utf_new_char(str));
+    MFREE(str, char, len + 1);
+
+    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] = '.';
+       }
+       
+       return s;
 }
 
+
+
 /*
  * 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 *c = ((classinfo*) this->vmData) -> super;
-       if (!c) return NULL;
+       classinfo *cl = (classinfo *) that;
+       classinfo *c = cl->super;
+
+       if (!c)
+               return NULL;
 
        use_class_as_object (c);
-       return (java_lang_Class*) c;
+
+       return (java_lang_Class *) c;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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)
 {
-#warning fixme
-       log_text("Java_java_lang_VMClass_isAssignableFrom");
-       return (*env)->IsAssignableForm(env, (jclass) this, (jclass) sup->vmClass);
+       /*      log_text("Java_java_lang_VMClass_isAssignableFrom");*/
+       
+       if (!sup) return 0;
+       if (!that) {
+               panic("sup->vmClass is NULL in VMClass.isAssignableFrom");
+               return 0;
+       }
+       return (*env)->IsAssignableForm(env, (jclass) sup, (jclass) that);
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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;
-       return (*env)->IsInstanceOf(env,(jobject) obj,clazz);
+/*     classinfo *clazz = (classinfo *) that; */
+
+       return (*env)->IsInstanceOf(env, (jobject) obj, (jclass) that);
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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;
 }
 
+
 /*
  * Class:     java/lang/Class
  * 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;
+       int i;
+       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;
+       /* search table of primitive classes */
+       for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
+               if (primitivetype_table[i].class_primitive == c)
+                       return true;
 
-  return false;
+       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  )
+JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize(JNIEnv *env, jclass clazz, java_lang_Class *c)
 {
-    /* empty */
-}
+       classinfo *ci;
 
-/*
- * 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");
-}
+       ci = (classinfo *) c;
 
-/*
- * 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)
-{
-  if (verbose)
-    log_text("Java_java_lang_VMClass_setSigners called");
+       /* initialize class */
+       if (!ci->initialized)
+               /* No need to check return value, because class_init already sets the */
+               /* exception pointer. */
+               (void) class_init(ci);
 }
 
 
-
-
-
-
-/*
- * 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");
-}
 /*
  * Class:     java_lang_VMClass
  * 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) {
-               log_text("Java_java_lang_VMClass_loadArrayClass");
-               return 0;
+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");
+JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
+{
+       *exceptionptr = (java_objectheader *) t;
 }
 
 
-
 /*
- * Class:     java_lang_VMClass
- * Method:    isInitialized
- * Signature: ()Z
+ * 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
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
  */
-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");
-}