- exception stuff
authortwisti <none@none>
Mon, 26 Apr 2004 17:12:47 +0000 (17:12 +0000)
committertwisti <none@none>
Mon, 26 Apr 2004 17:12:47 +0000 (17:12 +0000)
- lazy loading/linking (may some stuff is still left!!!)

16 files changed:
nat/Constructor.c
nat/Runtime.c
nat/Thread.c
nat/VMClass.c
nat/VMClassLoader.c
nat/VMObject.c
nat/VMString.c
nat/VMThrowable.c
src/native/vm/Constructor.c
src/native/vm/VMClass.c
src/native/vm/VMClassLoader.c
src/native/vm/VMObject.c
src/native/vm/VMRuntime.c
src/native/vm/VMString.c
src/native/vm/VMThread.c
src/native/vm/VMThrowable.c

index a977db5e60ef12a6065ab5ce2f4ad32a44e04197..bb8f8f6a6a0031b738cd19751373df6ac4aa06a7 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: Constructor.c 951 2004-03-11 17:30:03Z jowenn $
+   $Id: Constructor.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -68,13 +68,13 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Constructor_construct
 
        if (!parameters) {
                if (this->parameterTypes->header.size != 0) {
-                       (*env)->ThrowNew(env, loader_load(utf_new_char("java/lang/IllegalArgumentException")), "wrong number of arguments");
+                       *exceptionptr = new_exception_message(string_java_lang_IllegalArgumentException, "wrong number of arguments");
                        return 0;
                }
 
        } else {
                if (this->parameterTypes->header.size != parameters->header.size) {
-                       (*env)->ThrowNew(env, loader_load(utf_new_char("java/lang/IllegalArgumentException")), "wrong number of arguments");
+                       *exceptionptr = new_exception_message(string_java_lang_IllegalArgumentException, "wrong number of arguments");
                        return 0;
                }
        }
index 7e6de7ff8cc86453cc6370ae782c8f29f9dd35d1..ea8f771c40ac038ef069135dc8195bac36ab00e3 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Joseph Wenninger
             Christian Thalinger
 
-   $Id: Runtime.c 997 2004-03-30 21:49:28Z twisti $
+   $Id: Runtime.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -309,8 +309,10 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
        proplist[6][1] = utsnamebuf.sysname;
        proplist[7][1] = utsnamebuf.release;
 
-       if (!p)
-               panic("Java_java_lang_Runtime_insertSystemProperties called with NULL-Argument");
+       if (!p) {
+               *exceptionptr = new_exception(string_java_lang_NullPointerException);
+               return;
+       }
 
        /* search for method to add properties */
        m = class_resolvemethod(p->header.vftbl->class,
@@ -318,8 +320,11 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
                                                        utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
                                                        );
 
-       if (!m)
-               panic("Can not find method 'put' for class Properties");
+       if (!m) {
+               *exceptionptr = new_exception_message(string_java_lang_NoSuchMethodError,
+                                                                                         "java.lang.Properties.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;)");
+               return;
+       }
 
        /* add the properties */
        for (i = 0; i < activeprops; i++) {
index a70ce3fb796e3ad4083fa1b0fd896baa4e1a88bc..ae83f5f5bbbbb0adbc24110703546d05e5fd0783 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: Thread.c 991 2004-03-29 11:22:34Z stefan $
+   $Id: Thread.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -83,7 +83,7 @@ JNIEXPORT java_lang_Thread* JNICALL Java_java_lang_Thread_currentThread(JNIEnv *
                /* ThreadGroup of currentThread is not initialized */
 
                t->group = (java_lang_ThreadGroup *) 
-                       native_new_and_init(loader_load(utf_new_char("java/lang/ThreadGroup")));
+                       native_new_and_init(class_new(utf_new_char("java/lang/ThreadGroup")));
 
                if (t->group == 0) 
                        log_text("unable to create ThreadGroup");
index 28a11aa53995664e71d89729987f17de88bb879b..6bad29b20016f472277f8c6f603d995d1de88696 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMClass.c 1003 2004-03-30 22:56:04Z twisti $
+   $Id: VMClass.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -74,23 +74,35 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, j
        
        /* create utf string in which '.' is replaced by '/' */
        u = javastring_toutf(s, true);
-        
-       c = loader_load(u);
-       if (c == NULL) {
-               /* class was not loaded. raise exception */
-               if (runverbose)
-                       log_text("Setting class not found exception");
 
+       /* create a new class, ... */
+       c = class_new(u);
+
+       /* load, ... */
+       class_load(c);
+
+       /* class was not loaded. raise exception */
+       if (!c->loaded) {
                /* there is already an exception (NoClassDefFoundError), but forName()
                   returns a ClassNotFoundException */
+
+               /* clear exceptionptr, because builtin_new checks for 
+                  ExceptionInInitializerError */
+               *exceptionptr = NULL;
+
                *exceptionptr =
                        new_exception_javastring(string_java_lang_ClassNotFoundException, s);
 
            return NULL;
        }
 
-       /*log_text("Returning class");*/
-       use_class_as_object (c);
+       /* link, ... */
+       class_link(c);
+
+       /* ...and initialize it */
+       class_init(c);
+
+       use_class_as_object(c);
 
        return (java_lang_Class *) c;
 }
@@ -168,10 +180,13 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
                        (c->methods[i].name == utf_constr))
                        public_methods++;
 
-    class_constructor = (classinfo *) loader_load(utf_new_char ("java/lang/reflect/Constructor"));
+    class_constructor = class_new(utf_new_char("java/lang/reflect/Constructor"));
 
-    if (!class_constructor)
-               return NULL;
+       if (!class_constructor->loaded)
+               class_load(class_constructor);
+
+       if (!class_constructor->linked)
+               class_link(class_constructor);
 
     array_constructor = builtin_anewarray(public_methods, class_constructor);
 
@@ -303,7 +318,8 @@ JNIEXPORT java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getField0(JNIE
     int idx;
 
     /* create Field object */
-    c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Field"));
+/*      c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Field")); */
+    c = class_new(utf_new_char("java/lang/reflect/Field"));
     o = (java_lang_reflect_Field *) native_new_and_init(c);
 
     /* get fieldinfo entry */
@@ -362,7 +378,8 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNI
                if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only))
                        public_fields++;
 
-    class_field = loader_load(utf_new_char("java/lang/reflect/Field"));
+/*      class_field = loader_load(utf_new_char("java/lang/reflect/Field")); */
+    class_field = class_new(utf_new_char("java/lang/reflect/Field"));
 
     if (!class_field) 
                return NULL;
@@ -425,7 +442,8 @@ JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMethod0(JN
     java_objectarray *exceptiontypes;    /* the exceptions thrown by the method */
     methodinfo *m;                      /* the method to be represented */
 
-    c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Method"));
+/*      c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Method")); */
+    c = class_new(utf_new_char("java/lang/reflect/Method"));
     o = (java_lang_reflect_Method *) native_new_and_init(c);
 
     /* find the method */
@@ -475,14 +493,15 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JN
     utf *utf_constr=utf_new_char("<init>");
     utf *utf_clinit=utf_new_char("<clinit>");
 
+/*      class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method")); */
+    class_method = class_new(utf_new_char("java/lang/reflect/Method"));
 
-    class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
     if (!class_method) 
                return NULL;
 
        /* JOWENN: array classes do not declare methods according to mauve test. It should be considered, if 
           we should return to my old clone method overriding instead of declaring it as a member function */
-       if (Java_java_lang_VMClass_isArray(env,this)) {
+       if (Java_java_lang_VMClass_isArray(env, this)) {
                return builtin_anewarray(0, class_method);
        }
 
index 8d61b65d151569be08fdd40ffb94ce51bf195030..208af3bf4a4055e689077926cd4e60aa32d050f5 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMClassLoader.c 1003 2004-03-30 22:56:04Z twisti $
+   $Id: VMClassLoader.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -54,8 +54,13 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE
        log_text("Java_java_lang_VMClassLoader_defineClass called");
 
        /* call JNI-function to load the class */
-       c = (*env)->DefineClass(env, javastring_tochar((java_objectheader*) name), (jobject) this, (const jbyte *) &buf[off], len);
-       use_class_as_object (c);
+       c = (*env)->DefineClass(env,
+                                                       javastring_tochar((java_objectheader*) name),
+                                                       (jobject) this,
+                                                       (const jbyte *) &buf[off],
+                                                       len);
+
+       use_class_as_object(c);
 
        return (java_lang_Class *) c;
 }
@@ -73,7 +78,9 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
 
        if (u) {
                /* get primitive class */
-               c = loader_load_sysclass(NULL, u);
+               c = class_new(u);
+               class_load(c);
+               class_init(c);
                use_class_as_object(c);
 
                return (java_lang_Class *) c;
@@ -93,7 +100,10 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
  */
 JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(JNIEnv *env, jclass clazz, java_lang_Class *par1)
 {
-       /* class already linked, so return */
+       /* linked the class */
+       if (!clazz->linked)
+               class_link(clazz);
+
        return;
 }
 
index 6d5e7aafc7623bd62b74fcfc02652d21504e1492..865318ba6735b5f8dd1dd28f68df202ca7e8aebb 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMObject.c 1003 2004-03-30 22:56:04Z twisti $
+   $Id: VMObject.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -37,6 +37,7 @@
 #include <string.h>
 #include "jni.h"
 #include "builtin.h"
+#include "loader.h"
 #include "native.h"
 #include "mm/boehm.h"
 #include "threads/locks.h"
@@ -53,9 +54,6 @@
  */
 JNIEXPORT java_lang_Object* JNICALL Java_java_lang_VMObject_clone(JNIEnv *env, jclass clazz, java_lang_Cloneable *this)
 {
-/*     log_text("Java_java_lang_VMObject_clone called");
-       log_utf(((java_objectheader*)this)->vftbl->class->name);
-       log_text("starting cloning");     */
        classinfo *c;
        java_lang_Object *new;
        arraydescriptor *desc;
@@ -76,17 +74,17 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_VMObject_clone(JNIEnv *env, j
     
     /* We are cloning a non-array */
     if (!builtin_instanceof((java_objectheader *) this, class_java_lang_Cloneable)) {
-        *exceptionptr = new_exception(string_java_lang_CloneNotSupportedException);
+        *exceptionptr =
+                       new_exception(string_java_lang_CloneNotSupportedException);
         return NULL;
     }
 
     /* XXX should use vftbl */
     c = this->header.vftbl->class;
     new = (java_lang_Object *) builtin_new(c);
-    if (!new) {
-        *exceptionptr = new_exception(string_java_lang_OutOfMemoryError);
+
+    if (!new)
         return NULL;
-    }
 
     memcpy(new, this, c->instancesize);
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
index 4c64a7dc53f35ffcdb9f0e29b4340b1e74eeb01d..832b7bb8e3c40ff259120190abdb0ab1043bf79e 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: VMString.c 913 2004-02-05 21:23:19Z twisti $
+   $Id: VMString.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMString_intern(JNIEnv *env, jclass clazz, java_lang_String *this)
 {
-/*     printf("Java_java_lang_VMString_intern: count=%d offset=%d", this->count, this->offset); */
-/*     utf_display(javastring_toutf(this, 0)); */
-/*     printf("\n"); */
-/*     fflush(stdout); */
-
        if (this) {
                /* search table so identical strings will get identical pointers */
                return (java_lang_String *) literalstring_u2(this->value, this->count, this->offset, true);
index 15693326fe1d90502ba59190807dd9ce049ffd7f..9b6d45c4dd8f6dd184e88e535bfc98756bb5132c 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Joseph Wenninger
 
-   $Id: VMThrowable.c 973 2004-03-25 15:19:16Z twisti $
+   $Id: VMThrowable.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -77,31 +77,36 @@ JNIEXPORT java_lang_VMThrowable* JNICALL Java_java_lang_VMThrowable_fillInStackT
 java_objectarray* generateStackTraceArray(JNIEnv *env,stacktraceelement *source,long size)
 {
        long resultPos;
-       methodinfo *constructor;
-       classinfo *class_stacktraceelement;
-       java_objectarray *array_stacktraceelement;
-       class_stacktraceelement = (classinfo *) loader_load(utf_new_char ("java/lang/StackTraceElement"));
+       methodinfo *m;
+       classinfo *c;
+       java_objectarray *oa;
 
-       if (!class_stacktraceelement)
-               return 0;
+       c = class_new(utf_new_char("java/lang/StackTraceElement"));
+
+       if (!c->loaded)
+               class_load(c);
 
+       if (!c->linked)
+               class_link(c);
 
-       constructor=class_findmethod(class_stacktraceelement,utf_new_char("<init>"),
-               utf_new_char("(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V"));
-       if (!constructor)
+       m = class_findmethod(c,
+                                                utf_new_char("<init>"),
+                                                utf_new_char("(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V"));
+
+       if (!m)
                panic("java.lang.StackTraceElement misses needed constructor"); 
 
-       array_stacktraceelement = builtin_anewarray(size, class_stacktraceelement);
+       oa = builtin_anewarray(size, c);
 
-       if (!array_stacktraceelement)
-                return 0;
+       if (!oa)
+               return 0;
 
 /*     printf("Should return an array with %ld element(s)\n",size);*/
        size--;
        
        
        for(resultPos=0;size>=0;resultPos++,size--) {
-               java_objectheader *element=builtin_new(class_stacktraceelement);
+               java_objectheader *element=builtin_new(c);
                if (!element) {
                        panic("Memory for stack trace element could not be allocated");
                }
@@ -109,32 +114,32 @@ java_objectarray* generateStackTraceArray(JNIEnv *env,stacktraceelement *source,
 #warning call constructor once jni is fixed to allow more than three parameters
 #endif
 #if 0
-               (*env)->CallVoidMethod(env,element,constructor,
+               (*env)->CallVoidMethod(env,element,m,
                        javastring_new(source[size].method->class->sourcefile),
                        source[size].linenumber,
                        javastring_new(source[size].method->class->name),
                        javastring_new(source[size].method->name),
                        source[size].method->flags & ACC_NATIVE);
 #else
-               if (!(source[size].method->flags & ACC_NATIVE))setfield_critical(class_stacktraceelement,element,"fileName",          
+               if (!(source[size].method->flags & ACC_NATIVE))setfield_critical(c,element,"fileName",          
                "Ljava/lang/String;",  jobject, 
                (jobject) javastring_new(source[size].method->class->sourcefile));
-               setfield_critical(class_stacktraceelement,element,"className",          "Ljava/lang/String;",  jobject, 
+               setfield_critical(c,element,"className",          "Ljava/lang/String;",  jobject, 
                (jobject) javastring_new(source[size].method->class->name));
-               setfield_critical(class_stacktraceelement,element,"methodName",          "Ljava/lang/String;",  jobject, 
+               setfield_critical(c,element,"methodName",          "Ljava/lang/String;",  jobject, 
                (jobject) javastring_new(source[size].method->name));
-               setfield_critical(class_stacktraceelement,element,"lineNumber",          "I",  jint, 
+               setfield_critical(c,element,"lineNumber",          "I",  jint, 
                (jint) ((source[size].method->flags & ACC_NATIVE) ? -1:(source[size].linenumber)));
-               setfield_critical(class_stacktraceelement,element,"isNative",          "Z",  jboolean, 
+               setfield_critical(c,element,"isNative",          "Z",  jboolean, 
                (jboolean) ((source[size].method->flags & ACC_NATIVE) ? 1:0));
 
 
 #endif                 
 
-               array_stacktraceelement->data[resultPos]=element;
+               oa->data[resultPos]=element;
        }
 
-       return array_stacktraceelement;
+       return oa;
 
 }
 
@@ -174,7 +179,7 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMThrowable_getStackTrace(JNI
                for (; pos >= 0 && el[pos].method->name == init && el[pos].method->class->name != classname; pos--);
                pos--;
                if (pos < 0) {
-                       panic("Invalid stack trace for Throwable.getStackTrace()");
+                       log_text("Invalid stack trace for Throwable.getStackTrace()");
                }
        }
        
index a977db5e60ef12a6065ab5ce2f4ad32a44e04197..bb8f8f6a6a0031b738cd19751373df6ac4aa06a7 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: Constructor.c 951 2004-03-11 17:30:03Z jowenn $
+   $Id: Constructor.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -68,13 +68,13 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Constructor_construct
 
        if (!parameters) {
                if (this->parameterTypes->header.size != 0) {
-                       (*env)->ThrowNew(env, loader_load(utf_new_char("java/lang/IllegalArgumentException")), "wrong number of arguments");
+                       *exceptionptr = new_exception_message(string_java_lang_IllegalArgumentException, "wrong number of arguments");
                        return 0;
                }
 
        } else {
                if (this->parameterTypes->header.size != parameters->header.size) {
-                       (*env)->ThrowNew(env, loader_load(utf_new_char("java/lang/IllegalArgumentException")), "wrong number of arguments");
+                       *exceptionptr = new_exception_message(string_java_lang_IllegalArgumentException, "wrong number of arguments");
                        return 0;
                }
        }
index 28a11aa53995664e71d89729987f17de88bb879b..6bad29b20016f472277f8c6f603d995d1de88696 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMClass.c 1003 2004-03-30 22:56:04Z twisti $
+   $Id: VMClass.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -74,23 +74,35 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, j
        
        /* create utf string in which '.' is replaced by '/' */
        u = javastring_toutf(s, true);
-        
-       c = loader_load(u);
-       if (c == NULL) {
-               /* class was not loaded. raise exception */
-               if (runverbose)
-                       log_text("Setting class not found exception");
 
+       /* create a new class, ... */
+       c = class_new(u);
+
+       /* load, ... */
+       class_load(c);
+
+       /* class was not loaded. raise exception */
+       if (!c->loaded) {
                /* there is already an exception (NoClassDefFoundError), but forName()
                   returns a ClassNotFoundException */
+
+               /* clear exceptionptr, because builtin_new checks for 
+                  ExceptionInInitializerError */
+               *exceptionptr = NULL;
+
                *exceptionptr =
                        new_exception_javastring(string_java_lang_ClassNotFoundException, s);
 
            return NULL;
        }
 
-       /*log_text("Returning class");*/
-       use_class_as_object (c);
+       /* link, ... */
+       class_link(c);
+
+       /* ...and initialize it */
+       class_init(c);
+
+       use_class_as_object(c);
 
        return (java_lang_Class *) c;
 }
@@ -168,10 +180,13 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
                        (c->methods[i].name == utf_constr))
                        public_methods++;
 
-    class_constructor = (classinfo *) loader_load(utf_new_char ("java/lang/reflect/Constructor"));
+    class_constructor = class_new(utf_new_char("java/lang/reflect/Constructor"));
 
-    if (!class_constructor)
-               return NULL;
+       if (!class_constructor->loaded)
+               class_load(class_constructor);
+
+       if (!class_constructor->linked)
+               class_link(class_constructor);
 
     array_constructor = builtin_anewarray(public_methods, class_constructor);
 
@@ -303,7 +318,8 @@ JNIEXPORT java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getField0(JNIE
     int idx;
 
     /* create Field object */
-    c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Field"));
+/*      c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Field")); */
+    c = class_new(utf_new_char("java/lang/reflect/Field"));
     o = (java_lang_reflect_Field *) native_new_and_init(c);
 
     /* get fieldinfo entry */
@@ -362,7 +378,8 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields(JNI
                if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only))
                        public_fields++;
 
-    class_field = loader_load(utf_new_char("java/lang/reflect/Field"));
+/*      class_field = loader_load(utf_new_char("java/lang/reflect/Field")); */
+    class_field = class_new(utf_new_char("java/lang/reflect/Field"));
 
     if (!class_field) 
                return NULL;
@@ -425,7 +442,8 @@ JNIEXPORT java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMethod0(JN
     java_objectarray *exceptiontypes;    /* the exceptions thrown by the method */
     methodinfo *m;                      /* the method to be represented */
 
-    c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Method"));
+/*      c = (classinfo *) loader_load(utf_new_char("java/lang/reflect/Method")); */
+    c = class_new(utf_new_char("java/lang/reflect/Method"));
     o = (java_lang_reflect_Method *) native_new_and_init(c);
 
     /* find the method */
@@ -475,14 +493,15 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods(JN
     utf *utf_constr=utf_new_char("<init>");
     utf *utf_clinit=utf_new_char("<clinit>");
 
+/*      class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method")); */
+    class_method = class_new(utf_new_char("java/lang/reflect/Method"));
 
-    class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
     if (!class_method) 
                return NULL;
 
        /* JOWENN: array classes do not declare methods according to mauve test. It should be considered, if 
           we should return to my old clone method overriding instead of declaring it as a member function */
-       if (Java_java_lang_VMClass_isArray(env,this)) {
+       if (Java_java_lang_VMClass_isArray(env, this)) {
                return builtin_anewarray(0, class_method);
        }
 
index 8d61b65d151569be08fdd40ffb94ce51bf195030..208af3bf4a4055e689077926cd4e60aa32d050f5 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMClassLoader.c 1003 2004-03-30 22:56:04Z twisti $
+   $Id: VMClassLoader.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -54,8 +54,13 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_defineClass(JNIE
        log_text("Java_java_lang_VMClassLoader_defineClass called");
 
        /* call JNI-function to load the class */
-       c = (*env)->DefineClass(env, javastring_tochar((java_objectheader*) name), (jobject) this, (const jbyte *) &buf[off], len);
-       use_class_as_object (c);
+       c = (*env)->DefineClass(env,
+                                                       javastring_tochar((java_objectheader*) name),
+                                                       (jobject) this,
+                                                       (const jbyte *) &buf[off],
+                                                       len);
+
+       use_class_as_object(c);
 
        return (java_lang_Class *) c;
 }
@@ -73,7 +78,9 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
 
        if (u) {
                /* get primitive class */
-               c = loader_load_sysclass(NULL, u);
+               c = class_new(u);
+               class_load(c);
+               class_init(c);
                use_class_as_object(c);
 
                return (java_lang_Class *) c;
@@ -93,7 +100,10 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
  */
 JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass(JNIEnv *env, jclass clazz, java_lang_Class *par1)
 {
-       /* class already linked, so return */
+       /* linked the class */
+       if (!clazz->linked)
+               class_link(clazz);
+
        return;
 }
 
index 6d5e7aafc7623bd62b74fcfc02652d21504e1492..865318ba6735b5f8dd1dd28f68df202ca7e8aebb 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMObject.c 1003 2004-03-30 22:56:04Z twisti $
+   $Id: VMObject.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -37,6 +37,7 @@
 #include <string.h>
 #include "jni.h"
 #include "builtin.h"
+#include "loader.h"
 #include "native.h"
 #include "mm/boehm.h"
 #include "threads/locks.h"
@@ -53,9 +54,6 @@
  */
 JNIEXPORT java_lang_Object* JNICALL Java_java_lang_VMObject_clone(JNIEnv *env, jclass clazz, java_lang_Cloneable *this)
 {
-/*     log_text("Java_java_lang_VMObject_clone called");
-       log_utf(((java_objectheader*)this)->vftbl->class->name);
-       log_text("starting cloning");     */
        classinfo *c;
        java_lang_Object *new;
        arraydescriptor *desc;
@@ -76,17 +74,17 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_VMObject_clone(JNIEnv *env, j
     
     /* We are cloning a non-array */
     if (!builtin_instanceof((java_objectheader *) this, class_java_lang_Cloneable)) {
-        *exceptionptr = new_exception(string_java_lang_CloneNotSupportedException);
+        *exceptionptr =
+                       new_exception(string_java_lang_CloneNotSupportedException);
         return NULL;
     }
 
     /* XXX should use vftbl */
     c = this->header.vftbl->class;
     new = (java_lang_Object *) builtin_new(c);
-    if (!new) {
-        *exceptionptr = new_exception(string_java_lang_OutOfMemoryError);
+
+    if (!new)
         return NULL;
-    }
 
     memcpy(new, this, c->instancesize);
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
index 664bdd6bacbd91e89d3acd5bc76bd20d773ab090..6243b846cec7e4926fa369c6da3c20db59aa997d 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Joseph Wenninger
             Christian Thalinger
 
-   $Id: VMRuntime.c 997 2004-03-30 21:49:28Z twisti $
+   $Id: VMRuntime.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -309,8 +309,10 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
        proplist[6][1] = utsnamebuf.sysname;
        proplist[7][1] = utsnamebuf.release;
 
-       if (!p)
-               panic("Java_java_lang_Runtime_insertSystemProperties called with NULL-Argument");
+       if (!p) {
+               *exceptionptr = new_exception(string_java_lang_NullPointerException);
+               return;
+       }
 
        /* search for method to add properties */
        m = class_resolvemethod(p->header.vftbl->class,
@@ -318,8 +320,11 @@ JNIEXPORT void JNICALL Java_java_lang_Runtime_insertSystemProperties(JNIEnv *env
                                                        utf_new_char("(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
                                                        );
 
-       if (!m)
-               panic("Can not find method 'put' for class Properties");
+       if (!m) {
+               *exceptionptr = new_exception_message(string_java_lang_NoSuchMethodError,
+                                                                                         "java.lang.Properties.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;)");
+               return;
+       }
 
        /* add the properties */
        for (i = 0; i < activeprops; i++) {
index 4c64a7dc53f35ffcdb9f0e29b4340b1e74eeb01d..832b7bb8e3c40ff259120190abdb0ab1043bf79e 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: VMString.c 913 2004-02-05 21:23:19Z twisti $
+   $Id: VMString.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMString_intern(JNIEnv *env, jclass clazz, java_lang_String *this)
 {
-/*     printf("Java_java_lang_VMString_intern: count=%d offset=%d", this->count, this->offset); */
-/*     utf_display(javastring_toutf(this, 0)); */
-/*     printf("\n"); */
-/*     fflush(stdout); */
-
        if (this) {
                /* search table so identical strings will get identical pointers */
                return (java_lang_String *) literalstring_u2(this->value, this->count, this->offset, true);
index 610b429d312127cb1f9a66866e345257f27d8d22..a35f046b8d816f149dc6eb19adb476aaa44a23fb 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMThread.c 991 2004-03-29 11:22:34Z stefan $
+   $Id: VMThread.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -83,7 +83,7 @@ JNIEXPORT java_lang_Thread* JNICALL Java_java_lang_Thread_currentThread(JNIEnv *
                /* ThreadGroup of currentThread is not initialized */
 
                t->group = (java_lang_ThreadGroup *) 
-                       native_new_and_init(loader_load(utf_new_char("java/lang/ThreadGroup")));
+                       native_new_and_init(class_new(utf_new_char("java/lang/ThreadGroup")));
 
                if (t->group == 0) 
                        log_text("unable to create ThreadGroup");
index 15693326fe1d90502ba59190807dd9ce049ffd7f..9b6d45c4dd8f6dd184e88e535bfc98756bb5132c 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Joseph Wenninger
 
-   $Id: VMThrowable.c 973 2004-03-25 15:19:16Z twisti $
+   $Id: VMThrowable.c 1042 2004-04-26 17:12:47Z twisti $
 
 */
 
@@ -77,31 +77,36 @@ JNIEXPORT java_lang_VMThrowable* JNICALL Java_java_lang_VMThrowable_fillInStackT
 java_objectarray* generateStackTraceArray(JNIEnv *env,stacktraceelement *source,long size)
 {
        long resultPos;
-       methodinfo *constructor;
-       classinfo *class_stacktraceelement;
-       java_objectarray *array_stacktraceelement;
-       class_stacktraceelement = (classinfo *) loader_load(utf_new_char ("java/lang/StackTraceElement"));
+       methodinfo *m;
+       classinfo *c;
+       java_objectarray *oa;
 
-       if (!class_stacktraceelement)
-               return 0;
+       c = class_new(utf_new_char("java/lang/StackTraceElement"));
+
+       if (!c->loaded)
+               class_load(c);
 
+       if (!c->linked)
+               class_link(c);
 
-       constructor=class_findmethod(class_stacktraceelement,utf_new_char("<init>"),
-               utf_new_char("(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V"));
-       if (!constructor)
+       m = class_findmethod(c,
+                                                utf_new_char("<init>"),
+                                                utf_new_char("(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V"));
+
+       if (!m)
                panic("java.lang.StackTraceElement misses needed constructor"); 
 
-       array_stacktraceelement = builtin_anewarray(size, class_stacktraceelement);
+       oa = builtin_anewarray(size, c);
 
-       if (!array_stacktraceelement)
-                return 0;
+       if (!oa)
+               return 0;
 
 /*     printf("Should return an array with %ld element(s)\n",size);*/
        size--;
        
        
        for(resultPos=0;size>=0;resultPos++,size--) {
-               java_objectheader *element=builtin_new(class_stacktraceelement);
+               java_objectheader *element=builtin_new(c);
                if (!element) {
                        panic("Memory for stack trace element could not be allocated");
                }
@@ -109,32 +114,32 @@ java_objectarray* generateStackTraceArray(JNIEnv *env,stacktraceelement *source,
 #warning call constructor once jni is fixed to allow more than three parameters
 #endif
 #if 0
-               (*env)->CallVoidMethod(env,element,constructor,
+               (*env)->CallVoidMethod(env,element,m,
                        javastring_new(source[size].method->class->sourcefile),
                        source[size].linenumber,
                        javastring_new(source[size].method->class->name),
                        javastring_new(source[size].method->name),
                        source[size].method->flags & ACC_NATIVE);
 #else
-               if (!(source[size].method->flags & ACC_NATIVE))setfield_critical(class_stacktraceelement,element,"fileName",          
+               if (!(source[size].method->flags & ACC_NATIVE))setfield_critical(c,element,"fileName",          
                "Ljava/lang/String;",  jobject, 
                (jobject) javastring_new(source[size].method->class->sourcefile));
-               setfield_critical(class_stacktraceelement,element,"className",          "Ljava/lang/String;",  jobject, 
+               setfield_critical(c,element,"className",          "Ljava/lang/String;",  jobject, 
                (jobject) javastring_new(source[size].method->class->name));
-               setfield_critical(class_stacktraceelement,element,"methodName",          "Ljava/lang/String;",  jobject, 
+               setfield_critical(c,element,"methodName",          "Ljava/lang/String;",  jobject, 
                (jobject) javastring_new(source[size].method->name));
-               setfield_critical(class_stacktraceelement,element,"lineNumber",          "I",  jint, 
+               setfield_critical(c,element,"lineNumber",          "I",  jint, 
                (jint) ((source[size].method->flags & ACC_NATIVE) ? -1:(source[size].linenumber)));
-               setfield_critical(class_stacktraceelement,element,"isNative",          "Z",  jboolean, 
+               setfield_critical(c,element,"isNative",          "Z",  jboolean, 
                (jboolean) ((source[size].method->flags & ACC_NATIVE) ? 1:0));
 
 
 #endif                 
 
-               array_stacktraceelement->data[resultPos]=element;
+               oa->data[resultPos]=element;
        }
 
-       return array_stacktraceelement;
+       return oa;
 
 }
 
@@ -174,7 +179,7 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMThrowable_getStackTrace(JNI
                for (; pos >= 0 && el[pos].method->name == init && el[pos].method->class->name != classname; pos--);
                pos--;
                if (pos < 0) {
-                       panic("Invalid stack trace for Throwable.getStackTrace()");
+                       log_text("Invalid stack trace for Throwable.getStackTrace()");
                }
        }