- lazy loading/linking stuff
authortwisti <none@none>
Mon, 26 Apr 2004 16:18:56 +0000 (16:18 +0000)
committertwisti <none@none>
Mon, 26 Apr 2004 16:18:56 +0000 (16:18 +0000)
- removed: systemclassloader_addclass
           systemclassloader_addlibrary
           systemclassloader_addlibname

native.c
native.h
src/native/native.c
src/native/native.h

index 40a945afc46686546d37c4d2d633fb66ed588a02..1c7c816e47c94bec6fa27a15f9765cee5d470cc0 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 1021 2004-04-21 13:09:20Z stefan $
+   $Id: native.c 1033 2004-04-26 16:18:56Z twisti $
 
 */
 
@@ -47,6 +47,7 @@
 
 #include "config.h"
 #include "global.h"
+#include "main.h"
 #include "jni.h"
 #include "native.h"
 #include "nativetypes.hh"
@@ -85,7 +86,6 @@ char *classpath;
 
 classinfo *class_java_lang_Class;
 classinfo *class_java_lang_VMClass;
-/* static classinfo *class_java_lang_Cloneable=0; */ /* now in global.h */
 classinfo *class_java_lang_System;
 classinfo *class_java_lang_ClassLoader;
 classinfo *class_gnu_java_lang_SystemClassLoader;
@@ -129,6 +129,9 @@ char *string_java_lang_CloneNotSupportedException =
 char *string_java_lang_IllegalArgumentException =
     "java/lang/IllegalArgumentException";
 
+char *string_java_lang_IllegalMonitorStateException =
+    "java/lang/IllegalMonitorStateException";
+
 char *string_java_lang_NegativeArraySizeException =
     "java/lang/NegativeArraySizeException";
 
@@ -144,6 +147,9 @@ char *string_java_lang_NullPointerException =
 
 /* specify some error strings for code generation */
 
+char *string_java_lang_ClassCircularityError =
+    "java/lang/ClassCircularityError";
+
 char *string_java_lang_ClassFormatError =
     "java/lang/ClassFormatError";
 
@@ -175,14 +181,11 @@ java_objectheader* _exceptionptr = NULL;
 
 void use_class_as_object(classinfo *c) 
 {
-       vftbl *vt;
+/*     vftbl *vt; */
 /*     vftbl *newtbl; */
+       java_objectheader *vmo;
 
-       if (!class_java_lang_Class)
-               class_java_lang_Class = class_new(utf_new_char ("java/lang/Class"));
-
-       vt = class_java_lang_Class->vftbl;
-
+/*     vt = class_java_lang_Class->vftbl; */
 
        if (!c->classvftbl) {
                c->classvftbl = true;
@@ -195,29 +198,25 @@ void use_class_as_object(classinfo *c)
                
                c->header.vftbl = class_java_lang_Class->vftbl;
         
-               if (!class_java_lang_VMClass) {
-                       loader_load_sysclass(&class_java_lang_VMClass,
-                                                                utf_new_char("java/lang/VMClass"));
-
-                       method_vmclass_init =
-                               class_findmethod(class_java_lang_VMClass,
-                                                                utf_new_char("<init>"),
-                                                                utf_new_char("(Lgnu/classpath/RawData;)V"));
-
-                       if (method_vmclass_init == 0) {
-                               class_showmethods(class_java_lang_VMClass);
-                               panic("Needed class initializer for VMClass could not be found");
-                       }
-               }
-               {     
-                       java_objectheader *vmo = builtin_new(class_java_lang_VMClass);
-
-                       if (!vmo) panic("Error while creating instance of java/lang/VMClass");
-                       asm_calljavafunction(method_vmclass_init, vmo, c, NULL, NULL);
-                       c->vmClass = (java_lang_VMClass *) vmo;
-                       /*log_text("VMCLASS has been attached");*/
+               method_vmclass_init =
+                       class_findmethod(class_java_lang_VMClass,
+                                                        utf_new_char("<init>"),
+                                                        utf_new_char("(Lgnu/classpath/RawData;)V"));
+
+               if (method_vmclass_init == 0) {
+                       class_showmethods(class_java_lang_VMClass);
+                       panic("Needed class initializer for VMClass could not be found");
                }
        }
+            
+       vmo = builtin_new(class_java_lang_VMClass);
+
+       if (!vmo)
+               panic("Error while creating instance of java/lang/VMClass");
+
+       asm_calljavafunction(method_vmclass_init, vmo, c, NULL, NULL);
+
+       c->vmClass = (java_lang_VMClass *) vmo;
 }
 
 
@@ -280,24 +279,50 @@ static bool nativecompdone = false;
 
 void throw_exception_exit()
 {
-       java_lang_String *message;
+       java_objectheader *xptr;
+       classinfo *c;
+       methodinfo *pss;
 
        if (*exceptionptr) {
+               xptr = *exceptionptr;
+
+               /* clear exception, because we are calling jit code again */
+               *exceptionptr = NULL;
+
                printf("Exception in thread \"main\" ");
-               utf_display_classname((*exceptionptr)->vftbl->class->name);
+               fflush(stdout);
+
+               c = xptr->vftbl->class;
+
+/*             ts = class_resolveclassmethod(c, */
+/*                                                                       utf_new_char("toString"), */
+/*                                                                       utf_new_char("()Ljava/lang/String;"), */
+/*                                                                       class_java_lang_Object, */
+/*                                                                       false); */
+
+/*             if (!ts) { */
+/*                     panic("internal error"); */
+/*             } */
+
+/*             tostring = asm_calljavafunction(ts, xptr, NULL, NULL, NULL); */
+
+/*             utf_display(javastring_toutf(tostring, false)); */
+
+               pss = class_resolveclassmethod(c,
+                                                                          utf_new_char("printStackTrace"),
+                                                                          utf_new_char("()V"),
+                                                                          class_java_lang_Object,
+                                                                          false);
 
-               /* do we have a detail message? */
-               message = ((java_lang_Throwable *) *exceptionptr)->detailMessage;
+               /* print the stacktrace */
+               if (pss) {
+                       asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
 
-               if (message) {
-                       printf(": ");
-                       utf_display(javastring_toutf(message, false));
+               } else {
+                       panic("printStackTrace not found!");
                }
-               printf("\n");
-               fflush(stdout);
 
-               /* clear exception, whatever... */
-               *exceptionptr = NULL;
+               fflush(stdout);
 
                /* good bye! */
                exit(1);
@@ -309,11 +334,6 @@ java_objectheader *new_exception(char *classname)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init(c);
 }
 
@@ -321,23 +341,21 @@ java_objectheader *new_exception_message(char *classname, char *message)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init_string(c, javastring_new_char(message));
 }
 
 
-java_objectheader *new_exception_utfmessage(char *classname, utf *message)
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
+       return native_new_and_init_throwable(c, throwable);
+}
+
+
+java_objectheader *new_exception_utfmessage(char *classname, utf *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
 
        return native_new_and_init_string(c, javastring_new(message));
 }
@@ -347,11 +365,6 @@ java_objectheader *new_exception_javastring(char *classname, java_lang_String *m
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init_string(c, message);
 }
 
@@ -360,11 +373,6 @@ java_objectheader *new_exception_int(char *classname, s4 i)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init_int(c, i);
 }
 
@@ -377,76 +385,69 @@ java_objectheader *new_exception_int(char *classname, s4 i)
 
 void native_loadclasses()
 {
-       static int classesLoaded=0; /*temporary hack JoWenn*/
-       if (classesLoaded) return;
+       static int classesLoaded = 0; /*temporary hack JoWenn*/
+
+       if (classesLoaded)
+               return;
+
        classesLoaded = 1;
 
-       /*class_java_lang_System =*/
-       (void) class_new(utf_new_char("java/lang/VMClass"));/*JoWenn*/
-       (void) class_new(utf_new_char("java/lang/Class"));/*JoWenn*/
+       class_java_lang_Cloneable =
+               class_new(utf_new_char("java/lang/Cloneable"));
+       class_load(class_java_lang_Cloneable);
+       class_link(class_java_lang_Cloneable);
 
-       /* class_new adds the class to the list of classes to be loaded */
-       if (!class_java_lang_Cloneable)
-               class_java_lang_Cloneable = 
-                       class_new(utf_new_char("java/lang/Cloneable"));
+       class_java_lang_Class =
+               class_new(utf_new_char("java/lang/Class"));
+       class_load(class_java_lang_Class);
+       class_link(class_java_lang_Class);
 
-       if (!class_java_lang_Class)
-               class_java_lang_Class =
-                       class_new(utf_new_char("java/lang/Class"));
+       class_java_lang_VMClass =
+               class_new(utf_new_char("java/lang/VMClass"));
+       class_load(class_java_lang_VMClass);
+       class_link(class_java_lang_VMClass);
 
        class_java_lang_ClassLoader =
-               class_new(utf_new_char("java/lang/ClassLoader"));       
+               class_new(utf_new_char("java/lang/ClassLoader"));
+       class_load(class_java_lang_ClassLoader);
+       class_link(class_java_lang_ClassLoader);
 
        /* load classes for wrapping primitive types */
-       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"));
+       class_java_lang_Double = class_new(utf_new_char("java/lang/Double"));
+       class_load(class_java_lang_Double);
+       class_link(class_java_lang_Double);
 
-       classesLoaded = 1;
-}
+       class_java_lang_Float = class_new(utf_new_char("java/lang/Float"));
+       class_load(class_java_lang_Float);
+       class_link(class_java_lang_Float);
 
+       class_java_lang_Character =     class_new(utf_new_char("java/lang/Character"));
+       class_load(class_java_lang_Character);
+       class_link(class_java_lang_Character);
 
-/*************** adds a class to the vector of loaded classes ****************/
+       class_java_lang_Integer = class_new(utf_new_char("java/lang/Integer"));
+       class_load(class_java_lang_Integer);
+       class_link(class_java_lang_Integer);
 
-void systemclassloader_addclass(classinfo *c)
-{
-       methodinfo *m;
+       class_java_lang_Long = class_new(utf_new_char("java/lang/Long"));
+       class_load(class_java_lang_Long);
+       class_link(class_java_lang_Long);
 
-       /* find method addClass of 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");
-
-       /* 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
-                                                );
-}
+       class_java_lang_Byte = class_new(utf_new_char("java/lang/Byte"));
+       class_load(class_java_lang_Byte);
+       class_link(class_java_lang_Byte);
 
+       class_java_lang_Short = class_new(utf_new_char("java/lang/Short"));
+       class_load(class_java_lang_Short);
+       class_link(class_java_lang_Short);
 
-/*************** adds a library to the vector of loaded libraries *************/
+       class_java_lang_Boolean = class_new(utf_new_char("java/lang/Boolean"));
+       class_load(class_java_lang_Boolean);
+       class_link(class_java_lang_Boolean);
 
-void systemclassloader_addlibrary(java_objectheader *o)
-{
-       log_text("systemclassloader_addlibrary");
+       class_java_lang_Void = class_new(utf_new_char("java/lang/Void"));
+       class_load(class_java_lang_Void);
+       class_link(class_java_lang_Void);
 }
 
 
@@ -473,34 +474,6 @@ void init_systemclassloader()
 }
 
 
-/********************* add loaded library name  *******************************/
-
-void systemclassloader_addlibname(java_objectheader *o)
-{
-       methodinfo *m;
-       jfieldID id;
-
-       m = class_resolvemethod(loader_load_sysclass(NULL, utf_new_char("java/util/Vector")),
-                                                       utf_new_char("addElement"),
-                                                       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;");
-
-       if (!id) panic("can not access ClassLoader");
-
-       asm_calljavafunction(m,
-                                                envTable.GetStaticObjectField(&env, class_java_lang_ClassLoader, id),
-                                                o,
-                                                NULL,  
-                                                NULL);
-}
-
-
 /********************* function: native_setclasspath **************************/
  
 void native_setclasspath(char *path)
@@ -617,7 +590,7 @@ functionptr native_findfunction(utf *cname, utf *mname,
 
        MFREE(buffer, char, buffer_len);
 
-       exit(1);
+/*     exit(1); */
 
        /* keep compiler happy */
        return NULL;
@@ -633,7 +606,6 @@ functionptr native_findfunction(utf *cname, utf *mname,
 
 *******************************************************************************/
 
-/*  java_objectheader *javastring_new(utf *u) */
 java_lang_String *javastring_new(utf *u)
 {
        char *utf_ptr = u->text;        /* current utf character in utf string    */
@@ -642,13 +614,11 @@ java_lang_String *javastring_new(utf *u)
        java_chararray *a;
        s4 i;
        
-/*     log_text("javastring_new");*/
-       
-       s = (java_lang_String*) builtin_new(class_java_lang_String);
+       s = (java_lang_String *) builtin_new(class_java_lang_String);
        a = builtin_newarray_char(utflength);
 
        /* javastring or character-array could not be created */
-       if ((!a) || (!s))
+       if (!a || !s)
                return NULL;
 
        /* decompress utf-string */
@@ -660,7 +630,6 @@ java_lang_String *javastring_new(utf *u)
        s->offset = 0;
        s->count  = utflength;
 
-/*     return (java_objectheader*) s; */
        return s;
 }
 
@@ -681,12 +650,11 @@ java_lang_String *javastring_new_char(char *text)
        java_lang_String *s;   /* result-string */
        java_chararray *a;
        
-       /*log_text("javastring_new_char");*/
        s = (java_lang_String *) builtin_new(class_java_lang_String);
        a = builtin_newarray_char(len);
 
        /* javastring or character-array could not be created */
-       if ((!a) || (!s))
+       if (!a || !s)
                return NULL;
 
        /* copy text */
@@ -698,7 +666,6 @@ java_lang_String *javastring_new_char(char *text)
        s->offset = 0;
        s->count  = len;
 
-/*     return (java_objectheader*) s; */
        return s;
 }
 
@@ -794,29 +761,25 @@ java_objectheader *native_new_and_init(classinfo *c)
        methodinfo *m;
        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          */
+       o = builtin_new(c);                 /* create object                      */
        
-        /*
-       printf("native_new_and_init ");
-       utf_display(c->name);
-       printf("\n");
-        */
-       if (!o) return NULL;
-       /* printf("o!=NULL\n"); */
+       if (!o)
+               return NULL;
+
        /* find initializer */
 
        m = class_findmethod(c,
                                                 utf_new_char("<init>"),
                                                 utf_new_char("()V"));
                                                      
-       if (!m) {                                       /* initializer not found  */
+       if (!m) {                           /* initializer not found              */
                if (verbose) {
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
-                       utf_sprint(logtext + strlen(logtext), c->name);
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
                        log_text(logtext);
                }
                return o;
@@ -835,12 +798,13 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
        methodinfo *m;
        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          */
-       
-       if (!o) return NULL;
+
+       if (!o)
+               return NULL;
 
        /* find initializer */
 
@@ -852,7 +816,7 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
                if (verbose) {
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
-                       utf_sprint(logtext + strlen(logtext), c->name);
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
                        log_text(logtext);
                }
                return o;
@@ -871,8 +835,8 @@ java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
        methodinfo *m;
        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          */
        
@@ -888,7 +852,7 @@ java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
                if (verbose) {
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
-                       utf_sprint(logtext + strlen(logtext), c->name);
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
                        log_text(logtext);
                }
                return o;
@@ -902,6 +866,42 @@ java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
 }
 
 
+java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t)
+{
+       methodinfo *m;
+       java_objectheader *o;
+
+       if (!c)
+               return *exceptionptr;
+
+       o = builtin_new(c);          /* create object          */
+       
+       if (!o) return NULL;
+
+       /* find initializer */
+
+       m = class_findmethod(c,
+                                                utf_new_char("<init>"),
+                                                utf_new_char("(Ljava/lang/Throwable;)V"));
+                                                     
+       if (!m) {                                       /* initializer not found  */
+               if (verbose) {
+                       char logtext[MAXLOGTEXT];
+                       sprintf(logtext, "Warning: class has no instance-initializer: ");
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
+                       log_text(logtext);
+               }
+               return o;
+       }
+
+       /* call initializer */
+
+       asm_calljavafunction(m, o, t, NULL, NULL);
+
+       return o;
+}
+
+
 /******************** function: stringtable_update ****************************
 
        traverses the javastring hashtable and sets the vftbl-entries of
@@ -932,7 +932,7 @@ void stringtable_update ()
 
                                if (!js->header.vftbl) 
                                        /* vftbl of javastring is NULL */ 
-                                       js->header.vftbl = class_java_lang_String -> vftbl;
+                                       js->header.vftbl = class_java_lang_String->vftbl;
 
                                if (!a->header.objheader.vftbl) 
                                        /* vftbl of character-array is NULL */ 
@@ -1144,7 +1144,9 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 
     /* create new javastring */
     js = LNEW(java_lang_String);
-    js->header.vftbl = class_java_lang_String->vftbl;
+       /* TWISTI */
+/*      js->header.vftbl = class_java_lang_String->vftbl; */
+    js->header.vftbl = class_load(class_new(utf_new_char("java/lang/String")))->vftbl;
     js->value  = stringdata;
     js->offset = 0;
     js->count  = length;
@@ -1216,10 +1218,7 @@ java_objectheader *literalstring_new(utf *u)
     u4 utflength  = utf_strlen(u);   /* length of utf-string if uncompressed */
     java_chararray *a;               /* u2-array constructed from utf string */
     u4 i;
-/*    log_text("literalstring_new"); */
-/*    utf_display(u);*/
-    /*if (utflength==0) while (1) sleep(60);*/
-/*    log_text("------------------");    */
+
     /* allocate memory */ 
     a = lit_mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10);
 
@@ -1242,8 +1241,6 @@ void literalstring_free(java_objectheader* 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);
 
@@ -1317,7 +1314,6 @@ utf *create_methodsig(java_objectarray* types, char *retType)
                        }
 
            } else {            
-                       int dummy;
                        /* check for primitive types */
                        for (j = 0; j < PRIMITIVETYPE_COUNT; j++) {
                                char *utf_pos   = utf_ptr - 1;
@@ -1333,8 +1329,7 @@ utf *create_methodsig(java_objectarray* types, char *retType)
                                goto next_type;
 
                        nomatch:
-                               /* GCC 3.4 needs this */
-                               dummy;
+                               ;
                        }
 
                        /* no primitive type and no arrayclass, so must be object */
@@ -1348,8 +1343,7 @@ utf *create_methodsig(java_objectarray* types, char *retType)
                        *pos++ = ';';
 
                next_type:
-                       /* GCC 3.4 needs this */
-                       dummy;
+                       ;
                }  
     }      
 
index a36a4457266b9dbb3d1e3ab0d278d0c38c99ec7d..5e5735915907d0f433a062e0b426399b3a468344 100644 (file)
--- a/native.h
+++ b/native.h
@@ -26,7 +26,7 @@
 
    Authors: Reinhard Grafl
 
-   $Id: native.h 1001 2004-03-30 22:44:28Z twisti $
+   $Id: native.h 1033 2004-04-26 16:18:56Z twisti $
 
 */
 
@@ -38,6 +38,7 @@
 #include "jni.h"
 #include "nat/java_lang_String.h"
 #include "nat/java_lang_ClassLoader.h"
+#include "nat/java_lang_Throwable.h"
 
 
 /* searchpath for classfiles */
@@ -45,7 +46,6 @@ extern char *classpath;
 
 extern classinfo *class_java_lang_Class;
 extern classinfo *class_java_lang_VMClass;
-/* extern classinfo *class_java_lang_Cloneable=0; */ /* now in global.h */
 extern classinfo *class_java_lang_System;
 extern classinfo *class_java_lang_ClassLoader;
 extern classinfo *class_java_lang_Double;
@@ -69,6 +69,7 @@ extern char *string_java_lang_ClassCastException;
 extern char *string_java_lang_ClassNotFoundException;
 extern char *string_java_lang_CloneNotSupportedException;
 extern char *string_java_lang_IllegalArgumentException;
+extern char *string_java_lang_IllegalMonitorStateException;
 extern char *string_java_lang_NegativeArraySizeException;
 extern char *string_java_lang_NoSuchFieldException;
 extern char *string_java_lang_NoSuchMethodException;
@@ -77,6 +78,7 @@ extern char *string_java_lang_NullPointerException;
 
 /* specify some error strings for code generation */
 
+extern char *string_java_lang_ClassCircularityError;
 extern char *string_java_lang_ClassFormatError;
 extern char *string_java_lang_LinkageError;
 extern char *string_java_lang_NoClassDefFoundError;
@@ -86,7 +88,7 @@ extern char *string_java_lang_OutOfMemoryError;
 
 
 /* the system classloader object */
-extern struct java_lang_ClassLoader *SystemClassLoader;
+extern java_lang_ClassLoader *SystemClassLoader;
 
 /* for raising exceptions from native methods */
 /* extern java_objectheader* exceptionptr; */
@@ -100,6 +102,7 @@ void throw_exception_exit();
 /* initialize new exceptions */
 java_objectheader *new_exception(char *classname);
 java_objectheader *new_exception_message(char *classname, char *message);
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *cause);
 java_objectheader *new_exception_utfmessage(char *classname, utf *message);
 java_objectheader *new_exception_javastring(char *classname, java_lang_String *message);
 java_objectheader *new_exception_int(char *classname, s4 i);
@@ -133,10 +136,15 @@ java_objectheader *native_new_and_init(classinfo *c);
 /* create new object on the heap and call the initializer 
    mainly used for exceptions with a message */
 java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s);
+
 /* create new object on the heap and call the initializer 
    mainly used for exceptions with an index */
 java_objectheader *native_new_and_init_int(classinfo *c, s4 i);
 
+/* create new object on the heap and call the initializer 
+   mainly used for exceptions with cause */
+java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t);
+
 /* add property to system-property vector */
 void attach_property(char *name, char *value);
 
@@ -170,9 +178,6 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 /* dispose a javastring */
 void literalstring_free(java_objectheader*);
 
-void systemclassloader_addlibname(java_objectheader *o);
-void systemclassloader_addlibrary(java_objectheader *o);
-
 void copy_vftbl(vftbl **dest, vftbl *src);
 
 utf *create_methodsig(java_objectarray* types, char *retType);
index 40a945afc46686546d37c4d2d633fb66ed588a02..1c7c816e47c94bec6fa27a15f9765cee5d470cc0 100644 (file)
@@ -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 1021 2004-04-21 13:09:20Z stefan $
+   $Id: native.c 1033 2004-04-26 16:18:56Z twisti $
 
 */
 
@@ -47,6 +47,7 @@
 
 #include "config.h"
 #include "global.h"
+#include "main.h"
 #include "jni.h"
 #include "native.h"
 #include "nativetypes.hh"
@@ -85,7 +86,6 @@ char *classpath;
 
 classinfo *class_java_lang_Class;
 classinfo *class_java_lang_VMClass;
-/* static classinfo *class_java_lang_Cloneable=0; */ /* now in global.h */
 classinfo *class_java_lang_System;
 classinfo *class_java_lang_ClassLoader;
 classinfo *class_gnu_java_lang_SystemClassLoader;
@@ -129,6 +129,9 @@ char *string_java_lang_CloneNotSupportedException =
 char *string_java_lang_IllegalArgumentException =
     "java/lang/IllegalArgumentException";
 
+char *string_java_lang_IllegalMonitorStateException =
+    "java/lang/IllegalMonitorStateException";
+
 char *string_java_lang_NegativeArraySizeException =
     "java/lang/NegativeArraySizeException";
 
@@ -144,6 +147,9 @@ char *string_java_lang_NullPointerException =
 
 /* specify some error strings for code generation */
 
+char *string_java_lang_ClassCircularityError =
+    "java/lang/ClassCircularityError";
+
 char *string_java_lang_ClassFormatError =
     "java/lang/ClassFormatError";
 
@@ -175,14 +181,11 @@ java_objectheader* _exceptionptr = NULL;
 
 void use_class_as_object(classinfo *c) 
 {
-       vftbl *vt;
+/*     vftbl *vt; */
 /*     vftbl *newtbl; */
+       java_objectheader *vmo;
 
-       if (!class_java_lang_Class)
-               class_java_lang_Class = class_new(utf_new_char ("java/lang/Class"));
-
-       vt = class_java_lang_Class->vftbl;
-
+/*     vt = class_java_lang_Class->vftbl; */
 
        if (!c->classvftbl) {
                c->classvftbl = true;
@@ -195,29 +198,25 @@ void use_class_as_object(classinfo *c)
                
                c->header.vftbl = class_java_lang_Class->vftbl;
         
-               if (!class_java_lang_VMClass) {
-                       loader_load_sysclass(&class_java_lang_VMClass,
-                                                                utf_new_char("java/lang/VMClass"));
-
-                       method_vmclass_init =
-                               class_findmethod(class_java_lang_VMClass,
-                                                                utf_new_char("<init>"),
-                                                                utf_new_char("(Lgnu/classpath/RawData;)V"));
-
-                       if (method_vmclass_init == 0) {
-                               class_showmethods(class_java_lang_VMClass);
-                               panic("Needed class initializer for VMClass could not be found");
-                       }
-               }
-               {     
-                       java_objectheader *vmo = builtin_new(class_java_lang_VMClass);
-
-                       if (!vmo) panic("Error while creating instance of java/lang/VMClass");
-                       asm_calljavafunction(method_vmclass_init, vmo, c, NULL, NULL);
-                       c->vmClass = (java_lang_VMClass *) vmo;
-                       /*log_text("VMCLASS has been attached");*/
+               method_vmclass_init =
+                       class_findmethod(class_java_lang_VMClass,
+                                                        utf_new_char("<init>"),
+                                                        utf_new_char("(Lgnu/classpath/RawData;)V"));
+
+               if (method_vmclass_init == 0) {
+                       class_showmethods(class_java_lang_VMClass);
+                       panic("Needed class initializer for VMClass could not be found");
                }
        }
+            
+       vmo = builtin_new(class_java_lang_VMClass);
+
+       if (!vmo)
+               panic("Error while creating instance of java/lang/VMClass");
+
+       asm_calljavafunction(method_vmclass_init, vmo, c, NULL, NULL);
+
+       c->vmClass = (java_lang_VMClass *) vmo;
 }
 
 
@@ -280,24 +279,50 @@ static bool nativecompdone = false;
 
 void throw_exception_exit()
 {
-       java_lang_String *message;
+       java_objectheader *xptr;
+       classinfo *c;
+       methodinfo *pss;
 
        if (*exceptionptr) {
+               xptr = *exceptionptr;
+
+               /* clear exception, because we are calling jit code again */
+               *exceptionptr = NULL;
+
                printf("Exception in thread \"main\" ");
-               utf_display_classname((*exceptionptr)->vftbl->class->name);
+               fflush(stdout);
+
+               c = xptr->vftbl->class;
+
+/*             ts = class_resolveclassmethod(c, */
+/*                                                                       utf_new_char("toString"), */
+/*                                                                       utf_new_char("()Ljava/lang/String;"), */
+/*                                                                       class_java_lang_Object, */
+/*                                                                       false); */
+
+/*             if (!ts) { */
+/*                     panic("internal error"); */
+/*             } */
+
+/*             tostring = asm_calljavafunction(ts, xptr, NULL, NULL, NULL); */
+
+/*             utf_display(javastring_toutf(tostring, false)); */
+
+               pss = class_resolveclassmethod(c,
+                                                                          utf_new_char("printStackTrace"),
+                                                                          utf_new_char("()V"),
+                                                                          class_java_lang_Object,
+                                                                          false);
 
-               /* do we have a detail message? */
-               message = ((java_lang_Throwable *) *exceptionptr)->detailMessage;
+               /* print the stacktrace */
+               if (pss) {
+                       asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
 
-               if (message) {
-                       printf(": ");
-                       utf_display(javastring_toutf(message, false));
+               } else {
+                       panic("printStackTrace not found!");
                }
-               printf("\n");
-               fflush(stdout);
 
-               /* clear exception, whatever... */
-               *exceptionptr = NULL;
+               fflush(stdout);
 
                /* good bye! */
                exit(1);
@@ -309,11 +334,6 @@ java_objectheader *new_exception(char *classname)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init(c);
 }
 
@@ -321,23 +341,21 @@ java_objectheader *new_exception_message(char *classname, char *message)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init_string(c, javastring_new_char(message));
 }
 
 
-java_objectheader *new_exception_utfmessage(char *classname, utf *message)
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
+       return native_new_and_init_throwable(c, throwable);
+}
+
+
+java_objectheader *new_exception_utfmessage(char *classname, utf *message)
+{
+       classinfo *c = class_new(utf_new_char(classname));
 
        return native_new_and_init_string(c, javastring_new(message));
 }
@@ -347,11 +365,6 @@ java_objectheader *new_exception_javastring(char *classname, java_lang_String *m
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init_string(c, message);
 }
 
@@ -360,11 +373,6 @@ java_objectheader *new_exception_int(char *classname, s4 i)
 {
        classinfo *c = class_new(utf_new_char(classname));
 
-       if (!c->linked) {
-               printf("Exception class %s not linked! You probably have not set your CLASSPATH properly.\n", classname);
-               exit(1);
-       }
-
        return native_new_and_init_int(c, i);
 }
 
@@ -377,76 +385,69 @@ java_objectheader *new_exception_int(char *classname, s4 i)
 
 void native_loadclasses()
 {
-       static int classesLoaded=0; /*temporary hack JoWenn*/
-       if (classesLoaded) return;
+       static int classesLoaded = 0; /*temporary hack JoWenn*/
+
+       if (classesLoaded)
+               return;
+
        classesLoaded = 1;
 
-       /*class_java_lang_System =*/
-       (void) class_new(utf_new_char("java/lang/VMClass"));/*JoWenn*/
-       (void) class_new(utf_new_char("java/lang/Class"));/*JoWenn*/
+       class_java_lang_Cloneable =
+               class_new(utf_new_char("java/lang/Cloneable"));
+       class_load(class_java_lang_Cloneable);
+       class_link(class_java_lang_Cloneable);
 
-       /* class_new adds the class to the list of classes to be loaded */
-       if (!class_java_lang_Cloneable)
-               class_java_lang_Cloneable = 
-                       class_new(utf_new_char("java/lang/Cloneable"));
+       class_java_lang_Class =
+               class_new(utf_new_char("java/lang/Class"));
+       class_load(class_java_lang_Class);
+       class_link(class_java_lang_Class);
 
-       if (!class_java_lang_Class)
-               class_java_lang_Class =
-                       class_new(utf_new_char("java/lang/Class"));
+       class_java_lang_VMClass =
+               class_new(utf_new_char("java/lang/VMClass"));
+       class_load(class_java_lang_VMClass);
+       class_link(class_java_lang_VMClass);
 
        class_java_lang_ClassLoader =
-               class_new(utf_new_char("java/lang/ClassLoader"));       
+               class_new(utf_new_char("java/lang/ClassLoader"));
+       class_load(class_java_lang_ClassLoader);
+       class_link(class_java_lang_ClassLoader);
 
        /* load classes for wrapping primitive types */
-       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"));
+       class_java_lang_Double = class_new(utf_new_char("java/lang/Double"));
+       class_load(class_java_lang_Double);
+       class_link(class_java_lang_Double);
 
-       classesLoaded = 1;
-}
+       class_java_lang_Float = class_new(utf_new_char("java/lang/Float"));
+       class_load(class_java_lang_Float);
+       class_link(class_java_lang_Float);
 
+       class_java_lang_Character =     class_new(utf_new_char("java/lang/Character"));
+       class_load(class_java_lang_Character);
+       class_link(class_java_lang_Character);
 
-/*************** adds a class to the vector of loaded classes ****************/
+       class_java_lang_Integer = class_new(utf_new_char("java/lang/Integer"));
+       class_load(class_java_lang_Integer);
+       class_link(class_java_lang_Integer);
 
-void systemclassloader_addclass(classinfo *c)
-{
-       methodinfo *m;
+       class_java_lang_Long = class_new(utf_new_char("java/lang/Long"));
+       class_load(class_java_lang_Long);
+       class_link(class_java_lang_Long);
 
-       /* find method addClass of 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");
-
-       /* 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
-                                                );
-}
+       class_java_lang_Byte = class_new(utf_new_char("java/lang/Byte"));
+       class_load(class_java_lang_Byte);
+       class_link(class_java_lang_Byte);
 
+       class_java_lang_Short = class_new(utf_new_char("java/lang/Short"));
+       class_load(class_java_lang_Short);
+       class_link(class_java_lang_Short);
 
-/*************** adds a library to the vector of loaded libraries *************/
+       class_java_lang_Boolean = class_new(utf_new_char("java/lang/Boolean"));
+       class_load(class_java_lang_Boolean);
+       class_link(class_java_lang_Boolean);
 
-void systemclassloader_addlibrary(java_objectheader *o)
-{
-       log_text("systemclassloader_addlibrary");
+       class_java_lang_Void = class_new(utf_new_char("java/lang/Void"));
+       class_load(class_java_lang_Void);
+       class_link(class_java_lang_Void);
 }
 
 
@@ -473,34 +474,6 @@ void init_systemclassloader()
 }
 
 
-/********************* add loaded library name  *******************************/
-
-void systemclassloader_addlibname(java_objectheader *o)
-{
-       methodinfo *m;
-       jfieldID id;
-
-       m = class_resolvemethod(loader_load_sysclass(NULL, utf_new_char("java/util/Vector")),
-                                                       utf_new_char("addElement"),
-                                                       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;");
-
-       if (!id) panic("can not access ClassLoader");
-
-       asm_calljavafunction(m,
-                                                envTable.GetStaticObjectField(&env, class_java_lang_ClassLoader, id),
-                                                o,
-                                                NULL,  
-                                                NULL);
-}
-
-
 /********************* function: native_setclasspath **************************/
  
 void native_setclasspath(char *path)
@@ -617,7 +590,7 @@ functionptr native_findfunction(utf *cname, utf *mname,
 
        MFREE(buffer, char, buffer_len);
 
-       exit(1);
+/*     exit(1); */
 
        /* keep compiler happy */
        return NULL;
@@ -633,7 +606,6 @@ functionptr native_findfunction(utf *cname, utf *mname,
 
 *******************************************************************************/
 
-/*  java_objectheader *javastring_new(utf *u) */
 java_lang_String *javastring_new(utf *u)
 {
        char *utf_ptr = u->text;        /* current utf character in utf string    */
@@ -642,13 +614,11 @@ java_lang_String *javastring_new(utf *u)
        java_chararray *a;
        s4 i;
        
-/*     log_text("javastring_new");*/
-       
-       s = (java_lang_String*) builtin_new(class_java_lang_String);
+       s = (java_lang_String *) builtin_new(class_java_lang_String);
        a = builtin_newarray_char(utflength);
 
        /* javastring or character-array could not be created */
-       if ((!a) || (!s))
+       if (!a || !s)
                return NULL;
 
        /* decompress utf-string */
@@ -660,7 +630,6 @@ java_lang_String *javastring_new(utf *u)
        s->offset = 0;
        s->count  = utflength;
 
-/*     return (java_objectheader*) s; */
        return s;
 }
 
@@ -681,12 +650,11 @@ java_lang_String *javastring_new_char(char *text)
        java_lang_String *s;   /* result-string */
        java_chararray *a;
        
-       /*log_text("javastring_new_char");*/
        s = (java_lang_String *) builtin_new(class_java_lang_String);
        a = builtin_newarray_char(len);
 
        /* javastring or character-array could not be created */
-       if ((!a) || (!s))
+       if (!a || !s)
                return NULL;
 
        /* copy text */
@@ -698,7 +666,6 @@ java_lang_String *javastring_new_char(char *text)
        s->offset = 0;
        s->count  = len;
 
-/*     return (java_objectheader*) s; */
        return s;
 }
 
@@ -794,29 +761,25 @@ java_objectheader *native_new_and_init(classinfo *c)
        methodinfo *m;
        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          */
+       o = builtin_new(c);                 /* create object                      */
        
-        /*
-       printf("native_new_and_init ");
-       utf_display(c->name);
-       printf("\n");
-        */
-       if (!o) return NULL;
-       /* printf("o!=NULL\n"); */
+       if (!o)
+               return NULL;
+
        /* find initializer */
 
        m = class_findmethod(c,
                                                 utf_new_char("<init>"),
                                                 utf_new_char("()V"));
                                                      
-       if (!m) {                                       /* initializer not found  */
+       if (!m) {                           /* initializer not found              */
                if (verbose) {
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
-                       utf_sprint(logtext + strlen(logtext), c->name);
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
                        log_text(logtext);
                }
                return o;
@@ -835,12 +798,13 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
        methodinfo *m;
        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          */
-       
-       if (!o) return NULL;
+
+       if (!o)
+               return NULL;
 
        /* find initializer */
 
@@ -852,7 +816,7 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
                if (verbose) {
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
-                       utf_sprint(logtext + strlen(logtext), c->name);
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
                        log_text(logtext);
                }
                return o;
@@ -871,8 +835,8 @@ java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
        methodinfo *m;
        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          */
        
@@ -888,7 +852,7 @@ java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
                if (verbose) {
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
-                       utf_sprint(logtext + strlen(logtext), c->name);
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
                        log_text(logtext);
                }
                return o;
@@ -902,6 +866,42 @@ java_objectheader *native_new_and_init_int(classinfo *c, s4 i)
 }
 
 
+java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t)
+{
+       methodinfo *m;
+       java_objectheader *o;
+
+       if (!c)
+               return *exceptionptr;
+
+       o = builtin_new(c);          /* create object          */
+       
+       if (!o) return NULL;
+
+       /* find initializer */
+
+       m = class_findmethod(c,
+                                                utf_new_char("<init>"),
+                                                utf_new_char("(Ljava/lang/Throwable;)V"));
+                                                     
+       if (!m) {                                       /* initializer not found  */
+               if (verbose) {
+                       char logtext[MAXLOGTEXT];
+                       sprintf(logtext, "Warning: class has no instance-initializer: ");
+                       utf_sprint_classname(logtext + strlen(logtext), c->name);
+                       log_text(logtext);
+               }
+               return o;
+       }
+
+       /* call initializer */
+
+       asm_calljavafunction(m, o, t, NULL, NULL);
+
+       return o;
+}
+
+
 /******************** function: stringtable_update ****************************
 
        traverses the javastring hashtable and sets the vftbl-entries of
@@ -932,7 +932,7 @@ void stringtable_update ()
 
                                if (!js->header.vftbl) 
                                        /* vftbl of javastring is NULL */ 
-                                       js->header.vftbl = class_java_lang_String -> vftbl;
+                                       js->header.vftbl = class_java_lang_String->vftbl;
 
                                if (!a->header.objheader.vftbl) 
                                        /* vftbl of character-array is NULL */ 
@@ -1144,7 +1144,9 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 
     /* create new javastring */
     js = LNEW(java_lang_String);
-    js->header.vftbl = class_java_lang_String->vftbl;
+       /* TWISTI */
+/*      js->header.vftbl = class_java_lang_String->vftbl; */
+    js->header.vftbl = class_load(class_new(utf_new_char("java/lang/String")))->vftbl;
     js->value  = stringdata;
     js->offset = 0;
     js->count  = length;
@@ -1216,10 +1218,7 @@ java_objectheader *literalstring_new(utf *u)
     u4 utflength  = utf_strlen(u);   /* length of utf-string if uncompressed */
     java_chararray *a;               /* u2-array constructed from utf string */
     u4 i;
-/*    log_text("literalstring_new"); */
-/*    utf_display(u);*/
-    /*if (utflength==0) while (1) sleep(60);*/
-/*    log_text("------------------");    */
+
     /* allocate memory */ 
     a = lit_mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10);
 
@@ -1242,8 +1241,6 @@ void literalstring_free(java_objectheader* 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);
 
@@ -1317,7 +1314,6 @@ utf *create_methodsig(java_objectarray* types, char *retType)
                        }
 
            } else {            
-                       int dummy;
                        /* check for primitive types */
                        for (j = 0; j < PRIMITIVETYPE_COUNT; j++) {
                                char *utf_pos   = utf_ptr - 1;
@@ -1333,8 +1329,7 @@ utf *create_methodsig(java_objectarray* types, char *retType)
                                goto next_type;
 
                        nomatch:
-                               /* GCC 3.4 needs this */
-                               dummy;
+                               ;
                        }
 
                        /* no primitive type and no arrayclass, so must be object */
@@ -1348,8 +1343,7 @@ utf *create_methodsig(java_objectarray* types, char *retType)
                        *pos++ = ';';
 
                next_type:
-                       /* GCC 3.4 needs this */
-                       dummy;
+                       ;
                }  
     }      
 
index a36a4457266b9dbb3d1e3ab0d278d0c38c99ec7d..5e5735915907d0f433a062e0b426399b3a468344 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Reinhard Grafl
 
-   $Id: native.h 1001 2004-03-30 22:44:28Z twisti $
+   $Id: native.h 1033 2004-04-26 16:18:56Z twisti $
 
 */
 
@@ -38,6 +38,7 @@
 #include "jni.h"
 #include "nat/java_lang_String.h"
 #include "nat/java_lang_ClassLoader.h"
+#include "nat/java_lang_Throwable.h"
 
 
 /* searchpath for classfiles */
@@ -45,7 +46,6 @@ extern char *classpath;
 
 extern classinfo *class_java_lang_Class;
 extern classinfo *class_java_lang_VMClass;
-/* extern classinfo *class_java_lang_Cloneable=0; */ /* now in global.h */
 extern classinfo *class_java_lang_System;
 extern classinfo *class_java_lang_ClassLoader;
 extern classinfo *class_java_lang_Double;
@@ -69,6 +69,7 @@ extern char *string_java_lang_ClassCastException;
 extern char *string_java_lang_ClassNotFoundException;
 extern char *string_java_lang_CloneNotSupportedException;
 extern char *string_java_lang_IllegalArgumentException;
+extern char *string_java_lang_IllegalMonitorStateException;
 extern char *string_java_lang_NegativeArraySizeException;
 extern char *string_java_lang_NoSuchFieldException;
 extern char *string_java_lang_NoSuchMethodException;
@@ -77,6 +78,7 @@ extern char *string_java_lang_NullPointerException;
 
 /* specify some error strings for code generation */
 
+extern char *string_java_lang_ClassCircularityError;
 extern char *string_java_lang_ClassFormatError;
 extern char *string_java_lang_LinkageError;
 extern char *string_java_lang_NoClassDefFoundError;
@@ -86,7 +88,7 @@ extern char *string_java_lang_OutOfMemoryError;
 
 
 /* the system classloader object */
-extern struct java_lang_ClassLoader *SystemClassLoader;
+extern java_lang_ClassLoader *SystemClassLoader;
 
 /* for raising exceptions from native methods */
 /* extern java_objectheader* exceptionptr; */
@@ -100,6 +102,7 @@ void throw_exception_exit();
 /* initialize new exceptions */
 java_objectheader *new_exception(char *classname);
 java_objectheader *new_exception_message(char *classname, char *message);
+java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *cause);
 java_objectheader *new_exception_utfmessage(char *classname, utf *message);
 java_objectheader *new_exception_javastring(char *classname, java_lang_String *message);
 java_objectheader *new_exception_int(char *classname, s4 i);
@@ -133,10 +136,15 @@ java_objectheader *native_new_and_init(classinfo *c);
 /* create new object on the heap and call the initializer 
    mainly used for exceptions with a message */
 java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s);
+
 /* create new object on the heap and call the initializer 
    mainly used for exceptions with an index */
 java_objectheader *native_new_and_init_int(classinfo *c, s4 i);
 
+/* create new object on the heap and call the initializer 
+   mainly used for exceptions with cause */
+java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t);
+
 /* add property to system-property vector */
 void attach_property(char *name, char *value);
 
@@ -170,9 +178,6 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
 /* dispose a javastring */
 void literalstring_free(java_objectheader*);
 
-void systemclassloader_addlibname(java_objectheader *o);
-void systemclassloader_addlibrary(java_objectheader *o);
-
 void copy_vftbl(vftbl **dest, vftbl *src);
 
 utf *create_methodsig(java_objectarray* types, char *retType);