don't override private methods
[cacao.git] / native.c
index 41bb717152efe83e3b60b499731590498ef38da3..2dc995bab8acc1d5103d638402881f5702d8d701 100644 (file)
--- a/native.c
+++ b/native.c
@@ -31,7 +31,7 @@
    The .hh files created with the header file generator are all
    included here as are the C functions implementing these methods.
 
-   $Id: native.c 771 2003-12-13 23:11:08Z stefan $
+   $Id: native.c 912 2004-02-05 21:20:33Z twisti $
 
 */
 
@@ -54,6 +54,7 @@
 #include "asmpart.h"
 #include "tables.h"
 #include "loader.h"
+#include "jni.h"
 #include "toolbox/loging.h"
 #include "toolbox/memory.h"
 #include "threads/thread.h"
@@ -119,14 +120,14 @@ classinfo *class_java_lang_Integer;
 struct java_lang_ClassLoader *SystemClassLoader = NULL;
 
 /* for raising exceptions from native methods */
-java_objectheader* exceptionptr = NULL;
+THREADSPECIFIC java_objectheader* _exceptionptr = NULL;
 
 /************* use classinfo structure as java.lang.Class object **************/
 
 void use_class_as_object(classinfo *c) 
 {
        vftbl *vt;
-       vftbl *newtbl;
+/*     vftbl *newtbl; */
 
        if (!class_java_lang_Class)
                class_java_lang_Class = class_new(utf_new_char ("java/lang/Class"));
@@ -239,7 +240,7 @@ void throw_noclassdeffounderror_message(utf* classname)
        }
 
        /* throws a NoClassDefFoundError with message */
-       exceptionptr = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
+       *exceptionptr = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
                                                                                          javastring_new(classname));
 }
 
@@ -251,11 +252,23 @@ void throw_linkageerror_message(utf* classname)
        }
 
        /* throws a LinkageError with message */
-       exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
+       *exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
                                                                                          javastring_new(classname));
 }
 
 
+void throw_exception_message(char *classname, char *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
+
+       if (!c->linked)
+               panic("...");
+
+       *exceptionptr = native_new_and_init_string(c,
+                                                                                          javastring_new_char(message));
+}
+
+
 /*********************** function: native_loadclasses **************************
 
        load classes required for native methods        
@@ -327,29 +340,19 @@ void native_loadclasses()
                class_new(utf_new_char("java/lang/NoSuchMethodException"));
 
        /* load classes for wrapping primitive types */
-       class_java_lang_Double =
-               class_new( utf_new_char ("java/lang/Double") );
+       class_java_lang_Double    = class_new(utf_new_char("java/lang/Double"));
        class_init(class_java_lang_Double);
 
-       class_java_lang_Float =
-               class_new(utf_new_char("java/lang/Float"));
-       class_java_lang_Character =
-               class_new(utf_new_char("java/lang/Character"));
-       class_java_lang_Integer =
-               class_new(utf_new_char("java/lang/Integer"));
-       class_java_lang_Long =
-               class_new(utf_new_char("java/lang/Long"));
-       class_java_lang_Byte =
-               class_new(utf_new_char("java/lang/Byte"));
-       class_java_lang_Short =
-               class_new(utf_new_char("java/lang/Short"));
-       class_java_lang_Boolean =
-               class_new(utf_new_char("java/lang/Boolean"));
-       class_java_lang_Void =
-               class_new(utf_new_char("java/lang/Void"));
-
-       classesLoaded=1;
-       log_text("native_loadclasses finished");
+       class_java_lang_Float     = class_new(utf_new_char("java/lang/Float"));
+       class_java_lang_Character =     class_new(utf_new_char("java/lang/Character"));
+       class_java_lang_Integer   = class_new(utf_new_char("java/lang/Integer"));
+       class_java_lang_Long      = class_new(utf_new_char("java/lang/Long"));
+       class_java_lang_Byte      = class_new(utf_new_char("java/lang/Byte"));
+       class_java_lang_Short     = class_new(utf_new_char("java/lang/Short"));
+       class_java_lang_Boolean   = class_new(utf_new_char("java/lang/Boolean"));
+       class_java_lang_Void      = class_new(utf_new_char("java/lang/Void"));
+
+       classesLoaded = 1;
 }
 
 
@@ -360,26 +363,27 @@ void systemclassloader_addclass(classinfo *c)
        methodinfo *m;
 
        /* find method addClass of java.lang.ClassLoader */
-       m = class_resolvemethod(
-                                                       class_java_lang_ClassLoader, 
+       m = class_resolvemethod(class_java_lang_ClassLoader,
                                                        utf_new_char("addClass"),
                                                        utf_new_char("(Ljava/lang/Class;)")
                                                        );
        
-       if (!m) panic("warning: cannot initialize classloader");
+       if (!m)
+               panic("warning: cannot initialize classloader");
 
        /* prepare class to be passed as argument */
        use_class_as_object (c);
 
        /* call 'addClass' */
        asm_calljavafunction(m,
-                                          (java_objectheader*) SystemClassLoader, 
-                                          (java_objectheader*) c,
-                                          NULL,  
-                                          NULL
-                                          );
+                                                (java_objectheader*) SystemClassLoader, 
+                                                (java_objectheader*) c,
+                                                NULL,  
+                                                NULL
+                                                );
 }
 
+
 /*************** adds a library to the vector of loaded libraries *************/
 
 void systemclassloader_addlibrary(java_objectheader *o)
@@ -387,6 +391,7 @@ void systemclassloader_addlibrary(java_objectheader *o)
        log_text("systemclassloader_addlibrary");
 }
 
+
 /*****************************************************************************
 
        create systemclassloader object and initialize instance fields  
@@ -395,18 +400,17 @@ void systemclassloader_addlibrary(java_objectheader *o)
 
 void init_systemclassloader() 
 {
-  if (!SystemClassLoader) {
-       native_loadclasses();
-       log_text("Initializing new system class loader");
-       /* create object and call initializer */
-       SystemClassLoader = (java_lang_ClassLoader*) native_new_and_init(class_java_lang_ClassLoader);  
-/*     heap_addreference((void**) &SystemClassLoader); */
-
-       /* systemclassloader has no parent */
-       SystemClassLoader->parent      = NULL;
-       SystemClassLoader->initialized = true;
-  }
-  log_text("leaving system class loader");
+       if (!SystemClassLoader) {
+               native_loadclasses();
+               log_text("Initializing new system class loader");
+               /* create object and call initializer */
+               SystemClassLoader = (java_lang_ClassLoader*) native_new_and_init(class_java_lang_ClassLoader);  
+
+               /* systemclassloader has no parent */
+               SystemClassLoader->parent      = NULL;
+               SystemClassLoader->initialized = true;
+       }
+       log_text("leaving system class loader");
 }
 
 
@@ -417,28 +421,30 @@ void systemclassloader_addlibname(java_objectheader *o)
        methodinfo *m;
        jfieldID id;
 
-       m = class_resolvemethod(loader_load_sysclass(NULL,utf_new_char ("java/util/Vector")),
+       m = class_resolvemethod(loader_load_sysclass(NULL, utf_new_char ("java/util/Vector")),
                                                        utf_new_char("addElement"),
-                                                       utf_new_char("(Ljava/lang/Object;)V")
-                                                       );
+                                                       utf_new_char("(Ljava/lang/Object;)V"));
 
        if (!m) panic("cannot initialize classloader");
 
-       id = envTable.GetStaticFieldID(&env,class_java_lang_ClassLoader,"loadedLibraryNames","Ljava/util/Vector;");
+       id = envTable.GetStaticFieldID(&env,
+                                                                  class_java_lang_ClassLoader,
+                                                                  "loadedLibraryNames",
+                                                                  "Ljava/util/Vector;");
+
        if (!id) panic("can not access ClassLoader");
 
        asm_calljavafunction(m,
-                                          GetStaticObjectField(&env,class_java_lang_ClassLoader,id),
-                                          o,
-                                          NULL,  
-                                          NULL
-                                          );       
+                                                envTable.GetStaticObjectField(&env, class_java_lang_ClassLoader, id),
+                                                o,
+                                                NULL,  
+                                                NULL);
 }
 
 
 /********************* function: native_setclasspath **************************/
  
-void native_setclasspath (char *path)
+void native_setclasspath(char *path)
 {
        /* set searchpath for classfiles */
        classpath = path;
@@ -486,16 +492,16 @@ functionptr native_findfunction(utf *cname, utf *mname,
 
 #ifdef JOWENN_DEBUG
        buffer_len = 
-         utf_strlen(cname) + utf_strlen(mname) + utf_strlen(desc) + 64;
+               utf_strlen(cname) + utf_strlen(mname) + utf_strlen(desc) + 64;
        
        buffer = MNEW(char, buffer_len);
 
        strcpy(buffer, "searching matching function in native table:");
-        utf_sprint(buffer+strlen(buffer), mname);
+       utf_sprint(buffer+strlen(buffer), mname);
        strcpy(buffer+strlen(buffer), ": ");
-        utf_sprint(buffer+strlen(buffer), desc);
+       utf_sprint(buffer+strlen(buffer), desc);
        strcpy(buffer+strlen(buffer), " for class ");
-        utf_sprint(buffer+strlen(buffer), cname);
+       utf_sprint(buffer+strlen(buffer), cname);
 
        log_text(buffer);       
 
@@ -519,16 +525,15 @@ functionptr native_findfunction(utf *cname, utf *mname,
                                        buffer = MNEW(char, buffer_len);
 
                                        strcpy(buffer, "comparing with:");
-                                       utf_sprint(buffer+strlen(buffer), n->methodname);
+                                       utf_sprint(buffer+strlen(buffer), n->methodname);
                                        strcpy (buffer+strlen(buffer), ": ");
-                                       utf_sprint(buffer+strlen(buffer), n->descriptor);
+                                       utf_sprint(buffer+strlen(buffer), n->descriptor);
                                        strcpy(buffer+strlen(buffer), " for class ");
-                                       utf_sprint(buffer+strlen(buffer), n->classname);
+                                       utf_sprint(buffer+strlen(buffer), n->classname);
 
                                        log_text(buffer);       
 
                                        MFREE(buffer, char, buffer_len);
-                       
                                }
                        } 
 #endif
@@ -553,10 +558,9 @@ functionptr native_findfunction(utf *cname, utf *mname,
 
        MFREE(buffer, char, buffer_len);
 
-
        exit(1);
 
-       
+       /* keep compiler happy */
        return NULL;
 }
 
@@ -653,24 +657,28 @@ java_lang_String *javastring_new_char (char *text)
 
 static char stringbuffer[MAXSTRINGSIZE];
 
-char *javastring_tochar (java_objectheader *so) 
+char *javastring_tochar(java_objectheader *so) 
 {
-       java_lang_String *s = (java_lang_String*) so;
+       java_lang_String *s = (java_lang_String *) so;
        java_chararray *a;
        s4 i;
        
-       log_text("javastring_tochar");
-       
        if (!s)
                return "";
+
        a = s->value;
+
        if (!a)
                return "";
+
        if (s->count > MAXSTRINGSIZE)
                return "";
+
        for (i = 0; i < s->count; i++)
-               stringbuffer[i] = a->data[s->offset+i];
+               stringbuffer[i] = a->data[s->offset + i];
+
        stringbuffer[i] = '\0';
+
        return stringbuffer;
 }
 
@@ -692,7 +700,7 @@ fieldinfo *class_findfield_approx(classinfo *c, utf *name)
        }
 
        /* field was not found, raise exception */      
-       exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+       *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
 
        return NULL;
 }
@@ -707,7 +715,7 @@ s4 class_findfield_index_approx (classinfo *c, utf *name)
                }
 
        /* field was not found, raise exception */      
-       exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+       *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
        return -1;
 }
 
@@ -725,7 +733,7 @@ java_objectheader *native_new_and_init(classinfo *c)
        java_objectheader *o;
 
        /* if c==NULL it is probebly because loader_load failed */
-       if (!c) return exceptionptr;
+       if (!c) return *exceptionptr;
 
        o = builtin_new(c);          /* create object          */
        
@@ -764,7 +772,7 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
        java_objectheader *o;
 
        /* if c==NULL it is probebly because loader_load failed */
-       if (!c) return exceptionptr;
+       if (!c) return *exceptionptr;
 
        o = builtin_new(c);          /* create object          */
        
@@ -816,10 +824,12 @@ void stringtable_update ()
                                                                
                                js = (java_lang_String *) s->string;
                                
-                               if (!js || !(a = js->value)
+                               if (!js || !js->value
                                        /* error in hashtable found */
                                        panic("invalid literalstring in hashtable");
 
+                               a = js->value;
+
                                if (!js->header.vftbl) 
                                        /* vftbl of javastring is NULL */ 
                                        js->header.vftbl = class_java_lang_String -> vftbl;
@@ -949,8 +959,10 @@ utf *utf_new_u2(u2 *unicode_pos, u4 unicode_length, bool isclassname)
 utf *javastring_toutf(java_lang_String *string, bool isclassname)
 {
        java_lang_String *str = (java_lang_String *) string;
-/*     printf("javastring_toutf offset: %d, len %d\n",str->offset, str->count);
-       fflush(stdout);*/
+
+/*     printf("javastring_toutf offset: %d, len %d\n",str->offset, str->count); */
+/*     fflush(stdout); */
+
        return utf_new_u2(str->value->data + str->offset, str->count, isclassname);
 }
 
@@ -965,7 +977,8 @@ utf *javastring_toutf(java_lang_String *string, bool isclassname)
 
 *******************************************************************************/
 
-java_objectheader *literalstring_u2 (java_chararray *a, u4 length, bool copymode )
+java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
+                                                                       bool copymode)
 {
     literalstring *s;                /* hashtable element */
     java_lang_String *js;            /* u2-array wrapped in javastring */
@@ -974,63 +987,70 @@ java_objectheader *literalstring_u2 (java_chararray *a, u4 length, bool copymode
     u4 slot;  
     u2 i;
 
-#if JOWENN_DEBUG1
-    printf("literalstring_u2: length: %d\n",length);    
-    log_text("literalstring_u2");
+//#define DEBUG_LITERALSTRING_U2
+#ifdef DEBUG_LITERALSTRING_U2
+    printf("literalstring_u2: length=%d, offset=%d\n", length, offset);
+       fflush(stdout);
 #endif
     
     /* find location in hashtable */
-    key  = unicode_hashkey (a->data, length);
-    slot = key & (string_hash.size-1);
+    key  = unicode_hashkey(a->data + offset, length);
+    slot = key & (string_hash.size - 1);
     s    = string_hash.ptr[slot];
 
     while (s) {
-       
-      js = (java_lang_String *) s->string;
-       
-      if (js->count == length) {
-       /* compare text */
-       for (i=0; i<length; i++) 
-         if (js->value->data[i] != a->data[i]) goto nomatch;
-                                       
-       /* string already in hashtable, free memory */
-       if (!copymode)
-               lit_mem_free(a, sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10);
-
-#ifdef JOWENN_DEBUG1
-       log_text("literalstring_u2: foundentry");
-       utf_display(javastring_toutf(js,0));
+               js = (java_lang_String *) s->string;
+
+               if (length == js->count) {
+                       /* compare text */
+                       for (i = 0; i < length; i++) {
+                               if (a->data[offset + i] != js->value->data[i])
+                                       goto nomatch;
+                       }
+
+                       /* string already in hashtable, free memory */
+                       if (!copymode)
+                               lit_mem_free(a, sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10);
+
+#ifdef DEBUG_LITERALSTRING_U2
+                       printf("literalstring_u2: foundentry at %p\n", js);
+                       utf_display(javastring_toutf(js, 0));
+                       printf("\n\n");
+                       fflush(stdout);
 #endif
-       return (java_objectheader *) js;
-      }
+                       return (java_objectheader *) js;
+               }
 
-      nomatch:
-      /* follow link in external hash chain */
-      s = s->hashlink;
+       nomatch:
+               /* follow link in external hash chain */
+               s = s->hashlink;
     }
 
     if (copymode) {
-      /* create copy of u2-array for new javastring */
-      u4 arraysize = sizeof(java_chararray) + sizeof(u2)*(length-1)+10;
-      stringdata = lit_mem_alloc ( arraysize );        
-      memcpy(stringdata, a, arraysize );       
-    }  
-    else
-      stringdata = a;
+               /* create copy of u2-array for new javastring */
+               u4 arraysize = sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10;
+               stringdata = lit_mem_alloc(arraysize);
+/*             memcpy(stringdata, a, arraysize); */
+               memcpy(&(stringdata->header), &(a->header), sizeof(java_arrayheader));
+               memcpy(&(stringdata->data), &(a->data) + offset, sizeof(u2) * (length - 1) + 10);
+
+    } else {
+               stringdata = a;
+       }
 
     /* location in hashtable found, complete arrayheader */
-    stringdata -> header.objheader.vftbl = primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
-    stringdata -> header.size = length;        
+    stringdata->header.objheader.vftbl = primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
+    stringdata->header.size = length;
 
     /* create new javastring */
-    js = LNEW (java_lang_String);
-    js -> header.vftbl = class_java_lang_String -> vftbl;
-    js -> value  = stringdata;
-    js -> offset = 0;
-    js -> count  = length;
+    js = LNEW(java_lang_String);
+    js->header.vftbl = class_java_lang_String->vftbl;
+    js->value  = stringdata;
+    js->offset = 0;
+    js->count  = length;
 
     /* create new literalstring */
-    s = NEW (literalstring);
+    s = NEW(literalstring);
     s->hashlink = string_hash.ptr[slot];
     s->string   = (java_objectheader *) js;
     string_hash.ptr[slot] = s;
@@ -1039,47 +1059,50 @@ java_objectheader *literalstring_u2 (java_chararray *a, u4 length, bool copymode
     string_hash.entries++;
 
     /* reorganization of hashtable */       
-    if ( string_hash.entries > (string_hash.size*2)) {
-
-      /* reorganization of hashtable, average length of 
+    if (string_hash.entries > (string_hash.size * 2)) {
+               /* reorganization of hashtable, average length of 
          the external chains is approx. 2                */  
 
-      u4 i;
-      literalstring *s;     
-      hashtable newhash; /* the new hashtable */
+               u4 i;
+               literalstring *s;     
+               hashtable newhash; /* the new hashtable */
       
-      /* create new hashtable, double the size */
-      init_hashtable(&newhash, string_hash.size*2);
-      newhash.entries=string_hash.entries;
+               /* create new hashtable, double the size */
+               init_hashtable(&newhash, string_hash.size * 2);
+               newhash.entries = string_hash.entries;
       
-      /* transfer elements to new hashtable */
-      for (i=0; i<string_hash.size; i++) {
-       s = string_hash.ptr[i];
-       while (s) {
-         literalstring *nexts = s -> hashlink;  
-         js   = (java_lang_String*) s->string;
-         slot = (unicode_hashkey(js->value->data,js->count)) & (newhash.size-1);
+               /* transfer elements to new hashtable */
+               for (i = 0; i < string_hash.size; i++) {
+                       s = string_hash.ptr[i];
+                       while (s) {
+                               literalstring *nexts = s->hashlink;
+                               js   = (java_lang_String *) s->string;
+                               slot = unicode_hashkey(js->value->data, js->count) & (newhash.size - 1);
          
-         s->hashlink = newhash.ptr[slot];
-         newhash.ptr[slot] = s;
+                               s->hashlink = newhash.ptr[slot];
+                               newhash.ptr[slot] = s;
        
-         /* follow link in external hash chain */  
-         s = nexts;
-       }
-      }
+                               /* follow link in external hash chain */  
+                               s = nexts;
+                       }
+               }
        
-      /* dispose old table */  
-      MFREE (string_hash.ptr, void*, string_hash.size);
-      string_hash = newhash;
+               /* dispose old table */ 
+               MFREE(string_hash.ptr, void*, string_hash.size);
+               string_hash = newhash;
     }
-#ifdef JOWENN_DEBUG1
-       log_text("literalstring_u2: newly created");
-/*     utf_display(javastring_toutf(js,0));*/
+
+#ifdef DEBUG_LITERALSTRING_U2
+       printf("literalstring_u2: newly created at %p\n", js);
+       utf_display(javastring_toutf(js, 0));
+       printf("\n\n");
+       fflush(stdout);
 #endif
                        
     return (java_objectheader *) js;
 }
 
+
 /******************** Function: literalstring_new *****************************
 
     creates a new javastring with the text of the utf-symbol
@@ -1087,7 +1110,7 @@ java_objectheader *literalstring_u2 (java_chararray *a, u4 length, bool copymode
 
 *******************************************************************************/
 
-java_objectheader *literalstring_new (utf *u)
+java_objectheader *literalstring_new(utf *u)
 {
     char *utf_ptr = u->text;         /* pointer to current unicode character in utf string */
     u4 utflength  = utf_strlen(u);   /* length of utf-string if uncompressed */
@@ -1098,11 +1121,13 @@ java_objectheader *literalstring_new (utf *u)
     /*if (utflength==0) while (1) sleep(60);*/
 /*    log_text("------------------");    */
     /* allocate memory */ 
-    a = lit_mem_alloc (sizeof(java_chararray) + sizeof(u2)*(utflength-1)+10 ); 
+    a = lit_mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10);
+
     /* convert utf-string to u2-array */
-    for (i=0; i<utflength; i++) a->data[i] = utf_nextu2(&utf_ptr);     
+    for (i = 0; i < utflength; i++)
+               a->data[i] = utf_nextu2(&utf_ptr);
 
-    return literalstring_u2(a, utflength, false);
+    return literalstring_u2(a, utflength, 0, false);
 }
 
 
@@ -1112,22 +1137,21 @@ java_objectheader *literalstring_new (utf *u)
 
 ******************************************************************************/
 
-void literalstring_free (java_objectheader* sobj)
+void literalstring_free(java_objectheader* sobj)
 {
-       java_lang_String *s = (java_lang_String*) sobj;
+       java_lang_String *s = (java_lang_String *) sobj;
        java_chararray *a = s->value;
 
        log_text("literalstring_free called");
        
        /* dispose memory of java.lang.String object */
-       LFREE (s, java_lang_String);
+       LFREE(s, java_lang_String);
+
        /* dispose memory of java-characterarray */
-       LFREE (a, sizeof(java_chararray) + sizeof(u2)*(a->header.size-1)); /* +10 ?? */
+       LFREE(a, sizeof(java_chararray) + sizeof(u2) * (a->header.size - 1)); /* +10 ?? */
 }
 
 
-
-
 void copy_vftbl(vftbl **dest, vftbl *src)
 {
     *dest = src;
@@ -1162,12 +1186,12 @@ utf *create_methodsig(java_objectarray* types, char *retType)
     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;
+    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);
+    if (retType) buffer_size += strlen(retType);
 
     /* allocate buffer */
     buffer = MNEW(u1, buffer_size);
@@ -1176,60 +1200,64 @@ utf *create_methodsig(java_objectarray* types, char *retType)
     /* method-desciptor starts with parenthesis */
     *pos++ = '(';
 
-    for (i=0;i<types->header.size;i++) {
+    for (i = 0; i < types->header.size; i++) {
+               char ch;           
 
-            char ch;      
-            /* current argument */
+               /* 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)) == '[' ) {
-       
+           if ((ch = utf_nextu2(&utf_ptr)) == '[') {
                /* arrayclass */
-               for ( utf_ptr--; utf_ptr<utf_end(c->name); utf_ptr++)
-                  *pos++ = *utf_ptr; /* copy text */
+               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++) {
+           } else {            
+                       /* check for primitive types */
+                       for (j = 0; j < PRIMITIVETYPE_COUNT; j++) {
+                               char *utf_pos   = utf_ptr - 1;
+                               char *primitive = primitivetype_table[j].wrapname;
 
-                       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;
+                               }
 
-                       /* 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;
 
-                       /* primitive type found */
-                       *pos++ = primitivetype_table[j].typesig;
-                       goto next_type;
+                       nomatch:
+                       }
 
-               nomatch:
-               }
+                       /* no primitive type and no arrayclass, so must be object */
+                       *pos++ = 'L';
 
-               /* 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++ = ';';
+                       /* 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];
-       }
+               for (i = 0; i < strlen(retType); i++) {
+                       *pos++ = retType[i];
+               }
     }
+
     /* create utf-string */
-    result = utf_new(buffer,(pos-buffer));
+    result = utf_new(buffer, (pos - buffer));
     MFREE(buffer, u1, buffer_size);
 
     return result;
@@ -1297,6 +1325,23 @@ java_objectarray* get_parametertypes(methodinfo *m)
 }
 
 
+
+
+
+/******************************************************************************************
+
+       get the exceptions which can be thrown by a method      
+
+*******************************************************************************************/
+
+java_objectarray* get_exceptiontypes(methodinfo *m) 
+{
+}
+
+
+
+
+
 /******************************************************************************************
 
        get the returntype class of a method