fixed loging crash caused by printf
[cacao.git] / src / native / native.c
index 603ca78f46d55bb971af65b263178f89647be8fc..b4b01001fb8752fa7df5bf648440bf4fa7322178 100644 (file)
    The .hh files created with the header file generator are all
    included here as are the C functions implementing these methods.
 
-   $Id: native.c 692 2003-12-05 18:17:43Z stefan $
+   $Id: native.c 730 2003-12-11 21:23:31Z edwin $
 
 */
 
+
 #include <stdlib.h>
 #include <unistd.h>
 #include <time.h>
@@ -54,6 +55,7 @@
 #include "tables.h"
 #include "loader.h"
 #include "toolbox/loging.h"
+#include "toolbox/memory.h"
 #include "threads/thread.h"
 #include "threads/threadio.h"
 #include "threads/locks.h"
@@ -122,45 +124,49 @@ java_objectheader* exceptionptr = NULL;
 
 void use_class_as_object(classinfo *c) 
 {
-       vftbl *vt, *newtbl;
-
-       /*log_text("use_class_as_object");*/
-        if (!class_java_lang_Class)
-                class_java_lang_Class =
-                        class_new ( utf_new_char ("java/lang/Class") );
-        vt = class_java_lang_Class->vftbl;
-        if (!c->classvftbl) {
-                c->classvftbl = true;
-
-/*                copy_vftbl(&newtbl, vt);
-                newtbl->class = c->header.vftbl->class;
-                newtbl->baseval = c->header.vftbl->baseval;
-                newtbl->diffval = c->header.vftbl->diffval;
-                c->header.vftbl = newtbl;*/
+       vftbl *vt;
+       vftbl *newtbl;
+
+       if (!class_java_lang_Class)
+               class_java_lang_Class = class_new(utf_new_char ("java/lang/Class"));
+
+       vt = class_java_lang_Class->vftbl;
+
+
+       if (!c->classvftbl) {
+               c->classvftbl = true;
+
+               /*                copy_vftbl(&newtbl, vt);
+                                                 newtbl->class = c->header.vftbl->class;
+                                                 newtbl->baseval = c->header.vftbl->baseval;
+                                                 newtbl->diffval = c->header.vftbl->diffval;
+                                                 c->header.vftbl = newtbl;*/
                
-               c->header.vftbl=class_java_lang_Class->vftbl;
+               c->header.vftbl = class_java_lang_Class->vftbl;
         
                if (!class_java_lang_VMClass) {
-                       class_java_lang_VMClass =
-                                       loader_load ( 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) {
+                       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);
+                               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_calljavamethod (method_vmclass_init, vmo, c, NULL, NULL);
-                       c->vmClass=(java_lang_VMClass*)vmo;
+                       asm_calljavamethod(method_vmclass_init, vmo, c, NULL, NULL);
+                       c->vmClass = (java_lang_VMClass *) vmo;
                        /*log_text("VMCLASS has been attached");*/
-               }
-        }
-       
+               }
+       }
 }
 
 
@@ -277,10 +283,10 @@ void native_loadclasses()
        class_java_security_PrivilegedActionException =
                class_new(utf_new_char("java/security/PrivilegedActionException"));
 
-       class_java_net_UnknownHostException = 
-               loader_load(utf_new_char("java/net/UnknownHostException"));
-       class_java_net_SocketException = 
-               loader_load(utf_new_char("java/net/SocketException"));
+       loader_load_sysclass(&class_java_net_UnknownHostException,
+                                                utf_new_char("java/net/UnknownHostException"));
+       loader_load_sysclass(&class_java_net_SocketException,
+                                                utf_new_char("java/net/SocketException"));
 
        class_java_lang_IllegalArgumentException =
                class_new(utf_new_char("java/lang/IllegalArgumentException"));
@@ -382,7 +388,7 @@ void systemclassloader_addlibname(java_objectheader *o)
        methodinfo *m;
        jfieldID id;
 
-       m = class_resolvemethod(loader_load(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")
                                                        );
@@ -414,17 +420,22 @@ void native_setclasspath (char *path)
 
 void throw_classnotfoundexception()
 {
+       dolog("throw_classnotfoundexception");
     if (!class_java_lang_ClassNotFoundException) {
         panic("java.lang.ClassNotFoundException not found. Maybe wrong classpath?");
     }
 
        /* throws a ClassNotFoundException */
        exceptionptr = native_new_and_init(class_java_lang_ClassNotFoundException);
+       dolog("set exceptionptr");
 }
 
 
 void throw_classnotfoundexception2(utf* classname)
 {
+       dolog("throw_classnotfoundexception2");
+       log_plain("Class: "); log_plain_utf(classname); log_nl();
+       
        if (!class_java_lang_ClassNotFoundException) {
                panic("java.lang.ClassNotFoundException not found. Maybe wrong classpath?");
        }
@@ -432,10 +443,14 @@ void throw_classnotfoundexception2(utf* classname)
        /* throws a ClassNotFoundException with message */
        exceptionptr = native_new_and_init_string(class_java_lang_ClassNotFoundException,
                                                                                          javastring_new(classname));
+       dolog("set exceptionptr");
 }
 
 void throw_linkageerror2(utf* classname)
 {
+       dolog("throw_linkageerror2");
+       log_plain("Class: "); log_plain_utf(classname); log_nl();
+       
        if (!class_java_lang_LinkageError) {
                panic("java.lang.LinkageError not found. Maybe wrong classpath?");
        }
@@ -443,6 +458,7 @@ void throw_linkageerror2(utf* classname)
        /* throws a ClassNotFoundException with message */
        exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
                                                                                          javastring_new(classname));
+       dolog("set exceptionptr");
 }
 
 
@@ -717,8 +733,13 @@ s4 class_findfield_index_approx (classinfo *c, utf *name)
 java_objectheader *native_new_and_init(classinfo *c)
 {
        methodinfo *m;
-       java_objectheader *o = builtin_new(c);          /* create object          */
+       java_objectheader *o;
 
+       /* if c==NULL it is probebly because loader_load failed */
+       if (!c) return exceptionptr;
+
+       o = builtin_new(c);          /* create object          */
+       
         /*
        printf("native_new_and_init ");
        utf_display(c->name);
@@ -735,7 +756,7 @@ java_objectheader *native_new_and_init(classinfo *c)
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
                        utf_sprint(logtext + strlen(logtext), c->name);
-                       dolog(logtext);
+                       log_text(logtext);
                }
                return o;
        }
@@ -751,8 +772,13 @@ java_objectheader *native_new_and_init(classinfo *c)
 java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
 {
        methodinfo *m;
-       java_objectheader *o = builtin_new(c);          /* create object          */
+       java_objectheader *o;
 
+       /* if c==NULL it is probebly because loader_load failed */
+       if (!c) return exceptionptr;
+
+       o = builtin_new(c);          /* create object          */
+       
        if (!o) return NULL;
 
        /* find initializer */
@@ -766,7 +792,7 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
                        char logtext[MAXLOGTEXT];
                        sprintf(logtext, "Warning: class has no instance-initializer: ");
                        utf_sprint(logtext + strlen(logtext), c->name);
-                       dolog(logtext);
+                       log_text(logtext);
                }
                return o;
        }