no more unloaded classinfos!
authoredwin <none@none>
Sat, 2 Apr 2005 19:33:43 +0000 (19:33 +0000)
committeredwin <none@none>
Sat, 2 Apr 2005 19:33:43 +0000 (19:33 +0000)
use references for superclass and superinterfaces until linking

24 files changed:
src/cacao/cacao.c
src/cacaoh/cacaoh.c
src/cacaoh/headers.c
src/native/jni.c
src/native/native.c
src/native/vm/VMClass.c
src/native/vm/VMClassLoader.c
src/native/vm/VMThrowable.c
src/threads/native/threads.c
src/vm/builtin.c
src/vm/class.c
src/vm/class.h
src/vm/exceptions.c
src/vm/jit/inline/parseRT.c
src/vm/jit/inline/parseXTA.c
src/vm/jit/inline/parseXTA.h
src/vm/jit/parse.c
src/vm/jit/stacktrace.c
src/vm/jit/verify/typeinfo.c
src/vm/linker.c
src/vm/loader.c
src/vm/loader.h
src/vm/resolve.c
src/vm/string.c

index 706da745a4802d49e0d01595d9a0a7a24027851c..b36508d7f0e84de627835ab68783d7d07568206a 100644 (file)
      - Calling the class loader
      - Running the main method
 
-   $Id: cacao.c 2148 2005-03-30 16:49:40Z twisti $
+   $Id: cacao.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
 
+#include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -870,7 +871,6 @@ int main(int argc, char **argv)
        /* initialize some cacao subsystems */
 
        utf8_init();
-       class_init_foo();
 
        if (!loader_init((u1 *) &dummy))
                throw_main_exception_exit();
@@ -1034,9 +1034,7 @@ int main(int argc, char **argv)
                        c = class_hash.ptr[slot];
 
                        while (c) {
-                               if (!c->loaded)
-                                       if (!load_class_bootstrap(c))
-                                               throw_main_exception_exit();
+                               assert(c->loaded);
 
                                if (!c->linked)
                                        if (!link_class(c))
@@ -1062,9 +1060,7 @@ int main(int argc, char **argv)
                methodinfo *m;
 
                /* create, load and link the main class */
-               mainclass = class_new(utf_new_char(mainstring));
-
-               if (!load_class_bootstrap(mainclass))
+               if (!load_class_bootstrap(utf_new_char(mainstring),&mainclass))
                        throw_main_exception_exit();
 
                if (!link_class(mainclass))
@@ -1117,10 +1113,8 @@ void cacao_exit(s4 status)
 {
        methodinfo *m;
 
-       /* class should already be loaded, but who knows... */
-
-       if (!load_class_bootstrap(class_java_lang_System))
-               throw_main_exception_exit();
+       assert(class_java_lang_System);
+       assert(class_java_lang_System->loaded);
 
        if (!link_class(class_java_lang_System))
                throw_main_exception_exit();
index bb27f06ecf182e8672c49486cb89ab132859046d..d5f6a91d6555fefcf500f90e16a00f5b79778e03 100644 (file)
@@ -30,7 +30,7 @@
             Philipp Tomsich
             Christian Thalinger
 
-   $Id: cacaoh.c 2148 2005-03-30 16:49:40Z twisti $
+   $Id: cacaoh.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -260,7 +260,6 @@ int main(int argc, char **argv)
        /* initialize some cacao subsystems */
 
        utf8_init();
-       class_init_foo();
        loader_init((u1 *) &dummy);
 
 
@@ -282,11 +281,9 @@ int main(int argc, char **argv)
                        }
                }
        
-               c = class_new(utf_new_char(cp));
-
                /* exceptions are catched with new_exception call */
 
-               if (!load_class_bootstrap(c))
+               if (!load_class_bootstrap(utf_new_char(cp),&c))
                        throw_cacao_exception_exit(string_java_lang_NoClassDefFoundError,
                                                                           cp);
 
index c446c7b7ce642c64f548b0639e3df35fa9ebe508..1b52cd65d1b1bfb714ccd26bdd0c584cc5cea72b 100644 (file)
@@ -30,7 +30,7 @@
             Philipp Tomsich
             Christian Thalinger
 
-   $Id: headers.c 2187 2005-04-02 00:46:09Z edwin $
+   $Id: headers.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -154,6 +154,11 @@ void *Java_java_lang_VMObject_clone(void *env, void *clazz, void * this)
        return NULL;
 }
 
+tristate_t
+typeinfo_is_assignable_to_class(typeinfo *value,classref_or_classinfo dest)
+{
+       return true;
+}
 
 /************************ global variables **********************/
 
index 5257f8dc65c928354746eddb64dc46b0a4ab477a..982245d626838573eaf2fe7bd8a4312b6ef75c21 100644 (file)
@@ -31,7 +31,7 @@
             Martin Platter
             Christian Thalinger
 
-   $Id: jni.c 2186 2005-04-02 00:43:25Z edwin $
+   $Id: jni.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -617,9 +617,7 @@ jclass FindClass(JNIEnv *env, const char *name)
 {
        classinfo *c;  
   
-       c = class_new(utf_new_char_classname((char *) name));
-
-       if (!load_class_bootstrap(c) || !link_class(c)) {
+       if (!load_class_bootstrap(utf_new_char_classname((char *) name),&c) || !link_class(c)) {
                class_remove(c);
 
                return NULL;
index 90139d840d98edc4ad9ec009dc58466f376949db..40820dc329f4824efd0b6983f40ece52c2c37334 100644 (file)
@@ -30,7 +30,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: native.c 2190 2005-04-02 10:07:44Z edwin $
+   $Id: native.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -96,6 +96,7 @@ void use_class_as_object(classinfo *c)
 
                /*if (class_java_lang_Class ==0) panic("java/lang/Class not loaded in use_class_as_object");
                if (class_java_lang_Class->vftbl ==0) panic ("vftbl == 0 in use_class_as_object");*/
+               assert(class_java_lang_Class);
                c->header.vftbl = class_java_lang_Class->vftbl;
                c->classvftbl = true;
        }
@@ -581,6 +582,7 @@ java_objectarray* get_parametertypes(methodinfo *m)
     int i;
 
     /* create class-array */
+       assert(class_java_lang_Class);
     result = builtin_anewarray(parametercount, class_java_lang_Class);
 
     /* get classes */
@@ -611,6 +613,7 @@ java_objectarray* get_exceptiontypes(methodinfo *m)
        excount = m->thrownexceptionscount;
 
     /* create class-array */
+       assert(class_java_lang_Class);
     result = builtin_anewarray(excount, class_java_lang_Class);
 
     for (i = 0; i < excount; i++) {
@@ -780,11 +783,12 @@ java_objectarray *builtin_asm_createclasscontextarray(classinfo **end, classinfo
 
        /*printf("end %p, start %p, size %ld\n",end,start,size);*/
        if (!class_java_lang_Class)
-               class_java_lang_Class = class_new(utf_new_char("java/lang/Class"));
+               if (!load_class_bootstrap(utf_new_char("java/lang/Class"),&class_java_lang_Class))
+                       return NULL;
 
        if (!class_java_lang_SecurityManager)
-               class_java_lang_SecurityManager =
-                       class_new(utf_new_char("java/lang/SecurityManager"));
+               if (!load_class_bootstrap(utf_new_char("java/lang/SecurityManager"),&class_java_lang_SecurityManager))
+                       return NULL;
 
        if (size > 0) {
                if (*start == class_java_lang_SecurityManager) {
@@ -825,8 +829,8 @@ java_lang_ClassLoader *builtin_asm_getclassloader(classinfo **end, classinfo **s
         printf("end %p, start %p, size %ld\n",end,start,size);*/
 
        if (!class_java_lang_SecurityManager)
-               class_java_lang_SecurityManager =
-                       class_new(utf_new_char("java/lang/SecurityManager"));
+               if (!load_class_bootstrap(utf_new_char("java/lang/SecurityManager"),&class_java_lang_SecurityManager))
+                       return NULL;
 
        if (size > 0) {
                if (*start == class_java_lang_SecurityManager) {
@@ -835,7 +839,8 @@ java_lang_ClassLoader *builtin_asm_getclassloader(classinfo **end, classinfo **s
                }
        }
 
-       privilegedAction=class_new(utf_new_char("java/security/PrivilegedAction"));
+       if (!load_class_bootstrap(utf_new_char("java/security/PrivilegedAction"),&privilegedAction))
+               return NULL;
 
        for(i = 0, current = start; i < size; i++, current--) {
                c = *current;
index 4e3d7b495ef014a0cc9e0e42faecfaa5b315e4c4..b8a0d8201108f1fd82b683389c21cf9b294c1276 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Joseph Wenninger
             Christian Thalinger
 
-   $Id: VMClass.c 2190 2005-04-02 10:07:44Z edwin $
+   $Id: VMClass.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -55,6 +55,7 @@
 #include "vm/loader.h"
 #include "vm/stringlocal.h"
 #include "vm/tables.h"
+#include "vm/resolve.h"
 
 
 /* for selecting public members */
@@ -188,13 +189,12 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructo
                        (c->methods[i].name == utf_init))
                        public_methods++;
 
-    class_constructor = class_new(utf_new_char("java/lang/reflect/Constructor"));
-
-       if (!class_constructor->loaded)
-               load_class_bootstrap(class_constructor);
+       if (!load_class_bootstrap(utf_new_char("java/lang/reflect/Constructor"),&class_constructor))
+               return NULL;
 
        if (!class_constructor->linked)
-               link_class(class_constructor);
+               if (!link_class(class_constructor))
+                       return NULL;
 
     array_constructor = builtin_anewarray(public_methods, class_constructor);
 
@@ -263,8 +263,13 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses(JN
        result = builtin_anewarray(declaredclasscount, class_java_lang_Class);          
 
        for (i = 0; i < c->innerclasscount; i++) {
-               classinfo *inner = c->innerclass[i].inner_class.cls;
-               classinfo *outer = c->innerclass[i].outer_class.cls;
+               classinfo *inner;
+               classinfo *outer;
+
+               if (!resolve_classref_or_classinfo(NULL,c->innerclass[i].inner_class,resolveEager,false,&inner))
+                       return NULL;
+               if (!resolve_classref_or_classinfo(NULL,c->innerclass[i].outer_class,resolveEager,false,&inner))
+                       return NULL;
                
                if ((outer == c) && (notPublicOnly || (inner->flags & ACC_PUBLIC))) {
                        /* outer class is this class, store innerclass in array */
index 8cb136d7ad7f55a93657da2bbd56aab69d7c50e6..8316fc1bd3064a1bd4a158af068d85832e0ce4dd 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Joseph Wenninger
             Christian Thalinger
 
-   $Id: VMClassLoader.c 2188 2005-04-02 01:15:33Z edwin $
+   $Id: VMClassLoader.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -178,9 +178,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimitiveClas
 
        /* get primitive class */
 
-       c = class_new(u);
-
-       if (!load_class_bootstrap(c) || !class_init(c))
+       if (!load_class_bootstrap(u,&c) || !class_init(c))
                return NULL;
 
        use_class_as_object(c);
@@ -233,13 +231,9 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
 
        u = javastring_toutf(name, true);
 
-       /* create class */
-
-       c = class_new(u);
-
        /* load class */
 
-       if (!load_class_bootstrap(c))
+       if (!load_class_bootstrap(u,&c))
                goto exception;
 
        /* resolve class -- if requested */
index 3507388d30465305254642f34e675e559db2888c..c2e1596e3046cea564cb222cb8955a16c45dc60f 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: VMThrowable.c 2152 2005-03-30 19:28:40Z twisti $
+   $Id: VMThrowable.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -77,13 +77,11 @@ java_objectarray* generateStackTraceArray(JNIEnv *env,stacktraceelement *el,long
        classinfo *c;
        java_objectarray *oa;
 
-       c = class_new(utf_new_char("java/lang/StackTraceElement"));
-
-       if (!c->loaded)
-               load_class_bootstrap(c);
-
+       if (!load_class_bootstrap(utf_new_char("java/lang/StackTraceElement"),&c))
+               return NULL;
        if (!c->linked)
-               link_class(c);
+               if (!link_class(c))
+                       return NULL;
 
        m = class_findmethod(c,
                                                 utf_init,
index 9be1b5a58563223c2e1f57a4df7d3a2e51f9b0c6..648be3bee458f869e421c321d2063dd72f926b28 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Stefan Ring
 
-   $Id: threads.c 2148 2005-03-30 16:49:40Z twisti $
+   $Id: threads.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -486,12 +486,12 @@ initThreads(u1 *stackbottom)
        threadobject *tempthread = mainthreadobj;
        methodinfo *method;
 
-       threadclass = class_new(utf_new_char("java/lang/VMThread"));
-       load_class_bootstrap(threadclass);
-       link_class(threadclass);
-
+       if (!load_class_bootstrap(utf_new_char("java/lang/VMThread"),&threadclass))
+               throw_exception_exit();
        if (!threadclass)
                throw_exception_exit();
+       if (!link_class(threadclass))
+               throw_exception_exit();
 
        freeLockRecordPools(mainthreadobj->ee.lrpool);
        /* This is kinda tricky, we grow the java.lang.Thread object so we can keep
@@ -517,7 +517,8 @@ initThreads(u1 *stackbottom)
        threadname = javastring_new(utf_new_char("main"));
 
        /* Allocate and init ThreadGroup */
-       threadgroupclass = class_new(utf_new_char("java/lang/ThreadGroup"));
+       if (!load_class_bootstrap(utf_new_char("java/lang/ThreadGroup"),&threadgroupclass))
+               throw_exception_exit();
        threadgroup =
                (java_lang_ThreadGroup *) native_new_and_init(threadgroupclass);
 
@@ -525,7 +526,8 @@ initThreads(u1 *stackbottom)
                throw_exception_exit();
 
        /* Create a Thread */
-       threadclass = class_new(utf_new_char("java/lang/Thread"));
+       if (!load_class_bootstrap(utf_new_char("java/lang/Thread"),&threadclass))
+               throw_exception_exit();
        mainthread = (java_lang_Thread*) builtin_new(threadclass);
        mainthreadobj->o.thread = mainthread;
 
index 14c177cb0bfb1d05a6b07e0cb106e144f42fe713..96e27545f9d3baa18b500d947db4d6135a1d040d 100644 (file)
@@ -36,7 +36,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 2148 2005-03-30 16:49:40Z twisti $
+   $Id: builtin.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -679,9 +679,8 @@ java_objectheader *builtin_new(classinfo *c)
        java_objectheader *o;
 
        /* is the class loaded */
-       if (!c->loaded)
-               if (!load_class_bootstrap(c))
-                       return NULL;
+       /*utf_fprint(stderr,c->name);fprintf(stderr,"\n");*/
+       assert(c->loaded);
 
        /* is the class linked */
        if (!c->linked)
@@ -782,9 +781,7 @@ java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl)
 java_objectarray *builtin_anewarray(s4 size, classinfo *component)
 {
        /* is class loaded */
-       if (!component->loaded)
-               if (!load_class_bootstrap(component))
-                       return NULL;
+       assert(component->loaded);
 
        /* is class linked */
        if (!component->linked)
index dfaafc8c19b89a2fbaed080c6c9e83711235a9e6..d191532ae9fa2553ec030d5f8e6964e9ffdf949f 100644 (file)
@@ -30,7 +30,7 @@
             Andreas Krall
             Christian Thalinger
 
-   $Id: class.c 2186 2005-04-02 00:43:25Z edwin $
+   $Id: class.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -86,93 +86,45 @@ list unlinkedclasses;                   /* this is only used for eager class  */
 
 /* important system classes */
 
-classinfo *class_java_lang_Object;
-classinfo *class_java_lang_Class;
-classinfo *class_java_lang_ClassLoader;
-classinfo *class_java_lang_Cloneable;
-classinfo *class_java_lang_SecurityManager;
-classinfo *class_java_lang_String;
-classinfo *class_java_lang_System;
-classinfo *class_java_io_Serializable;
+classinfo *class_java_lang_Object = NULL;
+classinfo *class_java_lang_Class = NULL;
+classinfo *class_java_lang_ClassLoader = NULL;
+classinfo *class_java_lang_Cloneable = NULL;
+classinfo *class_java_lang_SecurityManager = NULL;
+classinfo *class_java_lang_String = NULL;
+classinfo *class_java_lang_System = NULL;
+classinfo *class_java_io_Serializable = NULL;
 
 
 /* system exception classes required in cacao */
 
-classinfo *class_java_lang_Throwable;
-classinfo *class_java_lang_VMThrowable;
-classinfo *class_java_lang_Exception;
-classinfo *class_java_lang_Error;
-classinfo *class_java_lang_OutOfMemoryError;
-classinfo *class_java_lang_NoClassDefFoundError;
-
-classinfo *class_java_lang_Void;
-classinfo *class_java_lang_Boolean;
-classinfo *class_java_lang_Byte;
-classinfo *class_java_lang_Character;
-classinfo *class_java_lang_Short;
-classinfo *class_java_lang_Integer;
-classinfo *class_java_lang_Long;
-classinfo *class_java_lang_Float;
-classinfo *class_java_lang_Double;
+classinfo *class_java_lang_Throwable = NULL;
+classinfo *class_java_lang_VMThrowable = NULL;
+classinfo *class_java_lang_Exception = NULL;
+classinfo *class_java_lang_Error = NULL;
+classinfo *class_java_lang_OutOfMemoryError = NULL;
+classinfo *class_java_lang_NoClassDefFoundError = NULL;
+
+classinfo *class_java_lang_Void = NULL;
+classinfo *class_java_lang_Boolean = NULL;
+classinfo *class_java_lang_Byte = NULL;
+classinfo *class_java_lang_Character = NULL;
+classinfo *class_java_lang_Short = NULL;
+classinfo *class_java_lang_Integer = NULL;
+classinfo *class_java_lang_Long = NULL;
+classinfo *class_java_lang_Float = NULL;
+classinfo *class_java_lang_Double = NULL;
 
 /* some classes which may be used more often */
 
-classinfo *class_java_util_Vector;
+classinfo *class_java_util_Vector = NULL;
 
 
 /* pseudo classes for the typechecker */
 
-classinfo *pseudo_class_Arraystub;
-classinfo *pseudo_class_Null;
-classinfo *pseudo_class_New;
-
-
-/* class_init ******************************************************************
-
-   Initialize the class subsystem.
-
-*******************************************************************************/
-
-void class_init_foo(void)
-{
-       class_java_lang_Object          = class_new_intern(utf_java_lang_Object);
-
-       class_java_lang_Class           = class_new(utf_java_lang_Class);
-       class_java_lang_ClassLoader     = class_new(utf_java_lang_ClassLoader);
-       class_java_lang_Cloneable       = class_new(utf_java_lang_Cloneable);
-       class_java_lang_SecurityManager = class_new(utf_java_lang_SecurityManager);
-       class_java_lang_String          = class_new(utf_java_lang_String);
-       class_java_lang_System          = class_new(utf_java_lang_System);
-       class_java_io_Serializable      = class_new(utf_java_io_Serializable);
-
-       class_java_lang_Throwable       = class_new(utf_java_lang_Throwable);
-       class_java_lang_VMThrowable     = class_new(utf_java_lang_VMThrowable);
-       class_java_lang_Exception       = class_new(utf_java_lang_Exception);
-       class_java_lang_Error           = class_new(utf_java_lang_Error);
-
-       class_java_lang_OutOfMemoryError =
-               class_new(utf_java_lang_OutOfMemoryError);
-
-       class_java_lang_NoClassDefFoundError =
-               class_new(utf_java_lang_NoClassDefFoundError);
-
-       class_java_lang_Void            = class_new(utf_java_lang_Void);
-       class_java_lang_Boolean         = class_new(utf_java_lang_Boolean);
-       class_java_lang_Byte            = class_new(utf_java_lang_Byte);
-       class_java_lang_Character       = class_new(utf_java_lang_Character);
-       class_java_lang_Short           = class_new(utf_java_lang_Short);
-       class_java_lang_Integer         = class_new(utf_java_lang_Integer);
-       class_java_lang_Long            = class_new(utf_java_lang_Long);
-       class_java_lang_Float           = class_new(utf_java_lang_Float);
-       class_java_lang_Double          = class_new(utf_java_lang_Double);
-
-       class_java_util_Vector          = class_new(utf_java_util_Vector);
-
-    pseudo_class_Arraystub = class_new_intern(utf_new_char("$ARRAYSTUB$"));
-       pseudo_class_Null      = class_new_intern(utf_new_char("$NULL$"));
-       pseudo_class_New       = class_new_intern(utf_new_char("$NEW$"));
-}
-
+classinfo *pseudo_class_Arraystub = NULL;
+classinfo *pseudo_class_Null = NULL;
+classinfo *pseudo_class_New = NULL;
 
 /* class_new *******************************************************************
 
@@ -190,23 +142,18 @@ classinfo *class_new(utf *classname)
     tables_lock();
 #endif
 
-    c = class_new_intern(classname);
-
        /* we support eager class loading and linking on demand */
-
        if (opt_eager) {
                classinfo *tc;
                classinfo *tmp;
 
                list_init(&unlinkedclasses, OFFSET(classinfo, listnode));
 
-               if (!c->loaded) {
-                       if (!load_class_bootstrap(c)) {
+               if (!load_class_bootstrap(classname,&c)) {
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
-                               tables_unlock();
+                       tables_unlock();
 #endif
-                               return c;
-                       }
+                       return NULL;
                }
 
                /* link all referenced classes */
@@ -240,6 +187,10 @@ classinfo *class_new(utf *classname)
                        }
                }
        }
+       else {
+               c = class_new_intern(classname);
+       }
+
 
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
     tables_unlock();
index 37fed6e6ba059e1896721538616503001001084d..13702fb073b484a7bf3dcb5ada501b0c1cd9bbbd 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: class.h 2190 2005-04-02 10:07:44Z edwin $
+   $Id: class.h 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -221,8 +221,6 @@ extern classinfo *pseudo_class_New;
 
 /* function prototypes ********************************************************/
 
-void class_init_foo(void);
-
 /* search for class and create it if not found */
 classinfo *class_new(utf *u);
 
index 912c9f82dde0507e9c568f4aa4dece2ba69e9981..876a3d250005f37cf807680e40522c09079934a0 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: exceptions.c 2147 2005-03-30 16:47:35Z twisti $
+   $Id: exceptions.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -186,28 +186,28 @@ bool exceptions_init(void)
 {
        /* java/lang/Throwable */
 
-       if (!load_class_bootstrap(class_java_lang_Throwable) ||
+       if (!load_class_bootstrap(utf_java_lang_Throwable,&class_java_lang_Throwable) ||
                !link_class(class_java_lang_Throwable))
                return false;
 
 
        /* java/lang/Exception */
 
-       if (!load_class_bootstrap(class_java_lang_Exception) ||
+       if (!load_class_bootstrap(utf_java_lang_Exception,&class_java_lang_Exception) ||
                !link_class(class_java_lang_Exception))
                return false;
 
 
        /* java/lang/Error */
 
-       if (!load_class_bootstrap(class_java_lang_Error) ||
+       if (!load_class_bootstrap(utf_java_lang_Error,&class_java_lang_Error) ||
                !link_class(class_java_lang_Error))
                return false;
 
 
        /* java/lang/OutOfMemoryError */
 
-       if (!load_class_bootstrap(class_java_lang_OutOfMemoryError) ||
+       if (!load_class_bootstrap(utf_java_lang_OutOfMemoryError,&class_java_lang_OutOfMemoryError) ||
                !link_class(class_java_lang_OutOfMemoryError))
                return false;
 
@@ -331,14 +331,21 @@ void throw_cacao_exception_exit(const char *exception, const char *message, ...)
 
 java_objectheader *new_exception(const char *classname)
 {
-       classinfo *c = class_new(utf_new_char(classname));
+       classinfo *c;
+   
+       if (!load_class_bootstrap(utf_new_char(classname),&c))
+               return *exceptionptr;
 
        return native_new_and_init(c);
 }
 
 java_objectheader *new_exception_message(const char *classname, const char *message)
 {
-       classinfo *c = class_new(utf_new_char(classname));
+       classinfo *c;
+   
+       if (!load_class_bootstrap(utf_new_char(classname),&c))
+               return *exceptionptr;
+
 
        return native_new_and_init_string(c, javastring_new_char(message));
 }
@@ -346,7 +353,11 @@ java_objectheader *new_exception_message(const char *classname, const char *mess
 
 java_objectheader *new_exception_throwable(const char *classname, java_lang_Throwable *throwable)
 {
-       classinfo *c = class_new(utf_new_char(classname));
+       classinfo *c;
+   
+       if (!load_class_bootstrap(utf_new_char(classname),&c))
+               return *exceptionptr;
+
 
        return native_new_and_init_throwable(c, throwable);
 }
@@ -354,7 +365,11 @@ java_objectheader *new_exception_throwable(const char *classname, java_lang_Thro
 
 java_objectheader *new_exception_utfmessage(const char *classname, utf *message)
 {
-       classinfo *c = class_new(utf_new_char(classname));
+       classinfo *c;
+   
+       if (!load_class_bootstrap(utf_new_char(classname),&c))
+               return *exceptionptr;
+
 
        return native_new_and_init_string(c, javastring_new(message));
 }
@@ -362,7 +377,11 @@ java_objectheader *new_exception_utfmessage(const char *classname, utf *message)
 
 java_objectheader *new_exception_javastring(const char *classname, java_lang_String *message)
 {
-       classinfo *c = class_new(utf_new_char(classname));
+       classinfo *c;
+   
+       if (!load_class_bootstrap(utf_new_char(classname),&c))
+               return *exceptionptr;
+
 
        return native_new_and_init_string(c, message);
 }
@@ -371,8 +390,9 @@ java_objectheader *new_exception_javastring(const char *classname, java_lang_Str
 java_objectheader *new_exception_int(const char *classname, s4 i)
 {
        classinfo *c;
-
-       c = class_new(utf_new_char(classname));
+   
+       if (!load_class_bootstrap(utf_new_char(classname),&c))
+               return *exceptionptr;
 
        return native_new_and_init_int(c, i);
 }
index a4e68c630a222f7b94965140b0fc0774dc7bd67d..4a34e0dfcffe0a1216a8fc320d82761ad18f1329 100644 (file)
@@ -27,7 +27,7 @@
 
    Authors: Carolyn Oates
 
-   $Id: parseRT.c 2189 2005-04-02 02:05:59Z edwin $
+   $Id: parseRT.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -739,8 +739,10 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                 /* class is really instantiated when class.<init> called*/
                         i = code_get_u2(p + 1,m);
                        {
-                       classinfo *ci;
-                        ci = class_getconstant(m->class, i, CONSTANT_Class);
+                               constant_classref *cr;
+                               classinfo *ci;
+                cr = (constant_classref *)class_getconstant(m->class, i, CONSTANT_Class);
+                               resolve_classref(NULL,cr,resolveEager,false,&ci);
                         /*** s_count++; look for s_counts for VTA */
                        /* add marked methods */
                        CLASSNAME(ci,"NEW : do nothing",RTA_DEBUGr);
@@ -753,9 +755,12 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                 /* class used */
                         i = code_get_u2(p + 1,m);
                         {
-                        classinfo *cls =
-                                (classinfo *)
-                            class_getconstant(m->class, i, CONSTANT_Class);
+                                                       constant_classref *cr;
+                               classinfo *cls;
+
+                                                       cr = (constant_classref*) class_getconstant(m->class, i, CONSTANT_Class);
+                                                       resolve_classref(NULL,cr,resolveEager,false,&cls);
+
                         LAZYLOADING(cls)
                                CLASSNAMEop(cls,RTA_DEBUGr);
                         if (cls->classUsed == NOTUSED){
@@ -788,7 +793,7 @@ else
 
 /*-- Get meth ptr for class.meth desc and add to RTA worklist --*/
 #define SYSADD(cls,meth,desc,txt) \
-        c = class_new(utf_new_char(cls)); \
+        load_class_bootstrap(utf_new_char(cls),&c); \
         LAZYLOADING(c) \
         callmeth = class_resolveclassmethod(c, \
               utf_new_char(meth), \
index ac9a6b9936b9e7ca129d9977d20c784f0b4147b1..f87f121a0311215bd56f85601acd0d8fa260af90 100644 (file)
@@ -39,7 +39,7 @@ Now wondering if there is a memory corruption because XTA seems to finish ok
 
    Authors: Carolyn Oates
 
-   $Id: parseXTA.c 2189 2005-04-02 02:05:59Z edwin $
+   $Id: parseXTA.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -1446,7 +1446,9 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                         i = code_get_u2(p + 1,m);
                        {
                        classinfo *cls;
-                        cls = class_getconstant(m->class, i, CONSTANT_Class);
+                       constant_classref *cr;
+                       cr = (constant_classref *)class_getconstant(m->class, i, CONSTANT_Class);
+                       resolve_classref(NULL,cr,resolveEager,false,&cls);
                         /*** s_count++; look for s_counts for VTA */
                        /* add marked methods */
                        CLASSNAME(cls,"NEW : do nothing",XTA_DEBUGr);
@@ -1460,9 +1462,10 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                 /* class used */
                         i = code_get_u2(p + 1,m);
                         {
-                        classinfo *cls =
-                                (classinfo *)
-                            class_getconstant(m->class, i, CONSTANT_Class);
+                                                       constant_classref *cr;
+                                                       classinfo *cls;
+                                                       cr = (constant_classref*) class_getconstant(m->class, i, CONSTANT_Class);
+                                                       resolve_classref(NULL,cr,resolveEager,false,&cls);
                         LAZYLOADING(cls)
                                CLASSNAMEop(cls,XTA_DEBUGr);
                         if (cls->classUsed == NOTUSED){
@@ -1497,7 +1500,7 @@ else
 
 /*-- Get meth ptr for class.meth desc and add to XTA worklist --*/
 #define SYSADD(cls,meth,desc, is_mono_poly, txt) \
-  c = class_new(utf_new_char(cls)); \
+  load_class_bootstrap(utf_new_char(cls),&c); \
   LAZYLOADING(c) \
   callmeth = class_resolveclassmethod(c, \
     utf_new_char(meth), \
index a13c8362c5c386ad0ed687646db0319be2623d6b..c1b8279527690846e5f3cf8b916e3a14c2226959 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Carolyn Oates
 
-   $Id: parseXTA.h 2181 2005-04-01 16:53:33Z edwin $
+   $Id: parseXTA.h 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -45,9 +45,6 @@ typedef       struct xtafldinfo xtafldinfo;
 
 
 #define LAZYLOADING(class) { \
-        if (!class->loaded) \
-            if (!load_class_bootstrap(class)) \
-                return 0; \
         if (!class->linked) \
             if (!link_class(class)) \
                 return 0; }
@@ -55,9 +52,6 @@ typedef       struct xtafldinfo xtafldinfo;
 
 
 #define LAZYLOADING1(class) { \
-        if (!class->loaded) \
-            if (!load_class_bootstrap(class)) \
-                return; \
         if (!class->linked) \
             if (!link_class(class)) \
                 return; }
index 4a1ae7902c055e713a9e5e24c1f304248bdb96b9..95c55f4131841e884f47b66eb458e074bef70e76 100644 (file)
@@ -30,7 +30,7 @@
             Edwin Steiner
             Joseph Wenninger
 
-   $Id: parse.c 2189 2005-04-02 02:05:59Z edwin $
+   $Id: parse.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -658,24 +658,17 @@ SHOWOPCODE(DEBUG4)
                        OP(ICMD_CHECKASIZE);
                        i = code_get_u2(p + 1,inline_env->method);
                        {
-                               classinfo *component =
-                                       (classinfo *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
+                               classinfo *component;
+                               constant_classref *cr =
+                                       (constant_classref*) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
 
-#if 1
-                               if (!load_class_from_classloader(component, m->class->classloader))
-                                       return NULL;
-
-                               if (!link_class(component))
+                               if (!resolve_classref(inline_env->method,
+                                                       cr,resolveEager,true,&component))
                                        return NULL;
 
                                LOADCONST_A_BUILTIN(class_array_of(component)->vftbl);
                                s_count++;
                                BUILTIN2(BUILTIN_newarray, TYPE_ADR, currentline);
-#else
-                               LOADCONST_A_BUILTIN(component);
-                               s_count++;
-                               BUILTIN2(BUILTIN_anewarray, TYPE_ADR, currentline);
-#endif
                        }
                        OP(ICMD_CHECKEXCEPTION);
                        break;
@@ -693,13 +686,12 @@ SHOWOPCODE(DEBUG4)
 /*                             OP2A(opcode, v, arrayvftbl,currentline); */
 
                                
-                               classinfo *component =
-                                       (classinfo *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
-
-                               if (!load_class_from_classloader(component, m->class->classloader))
-                                       return NULL;
+                               classinfo *component;
+                           constant_classref * cr =
+                                       (constant_classref*) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
 
-                               if (!link_class(component))
+                               if (!resolve_classref_or_classinfo(inline_env->method,
+                                                       CLASSREF_OR_CLASSINFO(cr),resolveEager,true,&component))
                                        return NULL;
 
                                arrayvftbl = component->vftbl;
@@ -1128,23 +1120,30 @@ if (DEBUG4==true) {
                        /* miscellaneous object operations *******/
 
                case JAVA_NEW:
-                       i = code_get_u2(p + 1,inline_env->method);
-                       LOADCONST_A_BUILTIN(class_getconstant(inline_env->method->class, i, CONSTANT_Class));
-                       s_count++;
-                       BUILTIN1(BUILTIN_new, TYPE_ADR, currentline);
-                       OP(ICMD_CHECKEXCEPTION);
+                       {
+                               constant_classref *cr;
+                               classinfo *cls;
+                               
+                               i = code_get_u2(p + 1,inline_env->method);
+                               cr = (constant_classref *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
+                               if (!resolve_classref(inline_env->method,cr,resolveEager,true,&cls))
+                                       return NULL;
+                               LOADCONST_A_BUILTIN(cls);
+                               s_count++;
+                               BUILTIN1(BUILTIN_new, TYPE_ADR, currentline);
+                               OP(ICMD_CHECKEXCEPTION);
+                       }
                        break;
 
                case JAVA_CHECKCAST:
                        i = code_get_u2(p + 1,inline_env->method);
                        {
-                               classinfo *cls =
-                                       (classinfo *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
-
-                               if (!load_class_from_classloader(cls, m->class->classloader))
-                                       return NULL;
-
-                               if (!link_class(cls))
+                               constant_classref *cr;
+                               classinfo *cls;
+                               
+                               cr = (constant_classref *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
+                               if (!resolve_classref(inline_env->method,
+                                                       cr,resolveEager,true,&cls))
                                        return NULL;
 
                                if (cls->vftbl->arraydesc) {
@@ -1167,13 +1166,12 @@ if (DEBUG4==true) {
                case JAVA_INSTANCEOF:
                        i = code_get_u2(p + 1,inline_env->method);
                        {
-                               classinfo *cls =
-                                       (classinfo *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
-
-                               if (!load_class_from_classloader(cls, m->class->classloader))
-                                       return NULL;
-
-                               if (!link_class(cls))
+                               constant_classref *cr;
+                               classinfo *cls;
+                               
+                               cr = (constant_classref *) class_getconstant(inline_env->method->class, i, CONSTANT_Class);
+                               if (!resolve_classref(inline_env->method,
+                                                       cr,resolveEager,true,&cls))
                                        return NULL;
 
                                if (cls->vftbl->arraydesc) {
index 4bbc9b25944c545f8fb0055e28d6a460b389e05b..2e9e1ed9b379c64e16b4e2e4cdce47deba64e352 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Joseph Wenninger
 
-   $Id: stacktrace.c 1929 2005-02-10 10:52:26Z twisti $
+   $Id: stacktrace.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -377,7 +377,9 @@ void classLoaderCollector(void **target, stackTraceBuffer *buffer) {
                start=0;
                size=0;
        }
-        privilegedAction=class_new(utf_new_char("java/security/PrivilegedAction"));
+
+               if (!load_class_bootstrap(utf_new_char("java/security/PrivilegedAction"),&privilegedAction))
+                       /* XXX handle exception */;
 
         for(i=0, current = start; i < size; i++, current++) {
                 m=start->method;
index fae588319d422665ec8e37fb7377ab88b505f70d..4f980395dd63482be3f6941bef9a0aaa129bae60 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Edwin Steiner
 
-   $Id: typeinfo.c 2191 2005-04-02 13:54:54Z edwin $
+   $Id: typeinfo.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -399,10 +399,6 @@ classinfo_implements_interface(classinfo *cls,classinfo *interf)
        TYPEINFO_ASSERT(interf);
        TYPEINFO_ASSERT((interf->flags & ACC_INTERFACE) != 0);
 
-       if (!cls->loaded)
-               if (!load_class_bootstrap(cls)) /* XXX */
-                       return false;
-
        if (!cls->linked)
                if (!link_class(cls)) /* XXX */
                        return false;
@@ -547,11 +543,6 @@ typeinfo_is_assignable_to_class(typeinfo *value,classref_or_classinfo dest)
 
        cls = c.cls;
        
-       if (!cls->loaded)
-               load_class_bootstrap(cls); /* XXX */
-       if (!dest.cls->loaded)
-               load_class_bootstrap(dest.cls); /* XXX */
-
        TYPEINFO_ASSERT(cls->loaded);
        TYPEINFO_ASSERT(dest.cls->loaded);
 
@@ -1149,12 +1140,6 @@ typeinfo_merge_nonarrays(typeinfo *dest,
        /* non-trivial cases                                */
        /*--------------------------------------------------*/
 
-       /* we may have to load the classes */
-       if (!IS_CLASSREF(x) && !x.cls->loaded)
-               load_class_bootstrap(x.cls); /* XXX */
-       if (!IS_CLASSREF(y) && !y.cls->loaded)
-               load_class_bootstrap(y.cls); /* XXX */
-        
 #ifdef TYPEINFO_VERBOSE
        {
                typeinfo dbgx,dbgy;
index f660e9091143f9daf2d131de40f473620ae089ee..3f1d4adb3ba9658fb582e809361ac542faefb5f5 100644 (file)
             Edwin Steiner
             Christian Thalinger
 
-   $Id: linker.c 2190 2005-04-02 10:07:44Z edwin $
+   $Id: linker.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
 
+#include <assert.h>
 #include "mm/memory.h"
 #include "native/native.h"
 #include "vm/builtin.h"
@@ -44,6 +45,7 @@
 #include "vm/exceptions.h"
 #include "vm/loader.h"
 #include "vm/options.h"
+#include "vm/resolve.h"
 #include "vm/statistics.h"
 #include "vm/jit/codegen.inc.h"
 
@@ -153,6 +155,7 @@ bool linker_init(void)
 
     /* pseudo class for Arraystubs (extends java.lang.Object) */
     
+    pseudo_class_Arraystub = class_new_intern(utf_new_char("$ARRAYSTUB$"));
        pseudo_class_Arraystub->loaded = true;
     pseudo_class_Arraystub->super.cls = class_java_lang_Object;
     pseudo_class_Arraystub->interfacescount = 2;
@@ -165,6 +168,7 @@ bool linker_init(void)
 
     /* pseudo class representing the null type */
     
+       pseudo_class_Null = class_new_intern(utf_new_char("$NULL$"));
        pseudo_class_Null->loaded = true;
     pseudo_class_Null->super.cls = class_java_lang_Object;
 
@@ -173,6 +177,7 @@ bool linker_init(void)
 
     /* pseudo class representing new uninitialized objects */
     
+       pseudo_class_New = class_new_intern(utf_new_char("$NEW$"));
        pseudo_class_New->loaded = true;
        pseudo_class_New->linked = true; /* XXX is this allright? */
        pseudo_class_New->super.cls = class_java_lang_Object;
@@ -222,7 +227,8 @@ static bool link_primitivetype_table(void)
                primitivetype_table[i].class_primitive = c;
 
                /* create class for wrapping the primitive type */
-               c = class_new_intern(utf_new_char(primitivetype_table[i].wrapname));
+               if (!load_class_bootstrap(utf_new_char(primitivetype_table[i].wrapname),&c))
+                       return false;
                primitivetype_table[i].class_wrap = c;
                primitivetype_table[i].class_wrap->classUsed = NOTUSED; /* not used initially CO-RT */
                primitivetype_table[i].class_wrap->impldBy = NULL;
@@ -322,7 +328,7 @@ static classinfo *link_class_intern(classinfo *c)
        s4 vftbllength;               /* vftbllength of current class             */
        s4 interfacetablelength;      /* interface table length                   */
        vftbl_t *v;                   /* vftbl of current class                   */
-       s4 i;                         /* interface/method/field counter           */
+       s4 i,j;                       /* interface/method/field counter           */
        arraydescriptor *arraydesc;   /* descriptor for array classes             */
 
        /* maybe the class is already linked */
@@ -345,8 +351,11 @@ static classinfo *link_class_intern(classinfo *c)
        /* check interfaces */
 
        for (i = 0; i < c->interfacescount; i++) {
-               tc = c->interfaces[i].cls;
-
+               /* resolve this super interface */
+               if (!resolve_classref_or_classinfo(NULL,c->interfaces[i],resolveEager,false,&tc))
+                       return NULL;
+               c->interfaces[i].cls = tc;
+               
                /* detect circularity */
 
                if (tc == c) {
@@ -356,9 +365,7 @@ static classinfo *link_class_intern(classinfo *c)
                        return NULL;
                }
 
-               if (!tc->loaded)
-                       if (!load_class_from_classloader(tc, c->classloader))
-                               return NULL;
+               assert(tc->loaded);
 
                if (!(tc->flags & ACC_INTERFACE)) {
                        *exceptionptr =
@@ -374,9 +381,8 @@ static classinfo *link_class_intern(classinfo *c)
        
        /* check super class */
 
-       super = c->super.cls;
-
-       if (super == NULL) {          /* class java.lang.Object */
+       super = NULL;
+       if (c->super.any == NULL) {          /* class java.lang.Object */
                c->index = 0;
         c->classUsed = USED;     /* Object class is always used CO-RT*/
                c->impldBy = NULL;
@@ -387,6 +393,11 @@ static classinfo *link_class_intern(classinfo *c)
                c->finalizer = NULL;
 
        } else {
+               /* resolve super class */
+               if (!resolve_classref_or_classinfo(NULL,c->super,resolveEager,false,&super))
+                       return NULL;
+               c->super.cls = super;
+               
                /* detect circularity */
                if (super == c) {
                        *exceptionptr =
@@ -395,9 +406,7 @@ static classinfo *link_class_intern(classinfo *c)
                        return NULL;
                }
 
-               if (!super->loaded)
-                       if (!load_class_from_classloader(super, c->classloader))
-                               return NULL;
+               assert(super->loaded);
 
                if (super->flags & ACC_INTERFACE) {
                        /* java.lang.IncompatibleClassChangeError: class a has interface java.lang.Cloneable as super class */
@@ -675,6 +684,23 @@ static classinfo *link_class_intern(classinfo *c)
                                c->finalizer = fi;
        }
 
+       /* resolve exception class references */
+
+       for (i = 0; i < c->methodscount; i++) {
+               methodinfo *m = c->methods + i;
+               for (j=0; j<m->exceptiontablelength; ++j) {
+                       if (!m->exceptiontable[j].catchtype.any)
+                               continue;
+                       if (!resolve_classref_or_classinfo(NULL,m->exceptiontable[j].catchtype,
+                                               resolveEager,false,&(m->exceptiontable[j].catchtype.cls)))
+                               return NULL;
+               }
+               for (j=0; j<m->thrownexceptionscount; ++j)
+                       if (!resolve_classref_or_classinfo(NULL,m->thrownexceptions[j],
+                                               resolveEager,false,&(m->thrownexceptions[j].cls)))
+                               return NULL;
+       }
+       
        /* final tasks */
 
        linker_compute_subclasses(c);
@@ -724,9 +750,7 @@ static arraydescriptor *link_array(classinfo *c)
 
        /* If the component type has not been linked, link it now */
        if (comp && !comp->linked) {
-               if (!comp->loaded)
-                       if (!load_class_from_classloader(comp, c->classloader))
-                               return NULL;
+               assert(comp->loaded);
 
                if (!link_class(comp))
                        return NULL;
index 95f1c472b0df8cc9ae45a2698693386a2ce3fbc3..64afdf353313336e012a3dd2e9564351d5319aa0 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 2191 2005-04-02 13:54:54Z edwin $
+   $Id: loader.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
 #include "vm/jit/codegen.inc.h"
 
 
+/******************************************************************************/
+/* DEBUG HELPERS                                                              */
+/******************************************************************************/
+
+/*#define LOADER_VERBOSE*/
+
+#ifndef NDEBUG
+#define LOADER_DEBUG
+#endif
+
+#ifdef LOADER_DEBUG
+#define LOADER_ASSERT(cond)  assert(cond)
+#else
+#define LOADER_ASSERT(cond)
+#endif
+
 #undef JOWENN_DEBUG
 #undef JOWENN_DEBUG1
 #undef JOWENN_DEBUG2
@@ -111,48 +127,82 @@ bool loader_init(u1 *stackbottom)
 
        /* load some important classes */
 
-       if (!load_class_bootstrap(class_java_lang_Object))
+       if (!load_class_bootstrap(utf_java_lang_Object,&class_java_lang_Object))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_String))
+       if (!load_class_bootstrap(utf_java_lang_String,&class_java_lang_String))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Cloneable))
+       if (!load_class_bootstrap(utf_java_lang_Cloneable,&class_java_lang_Cloneable))
                return false;
 
-       if (!load_class_bootstrap(class_java_io_Serializable))
+       if (!load_class_bootstrap(utf_java_io_Serializable,&class_java_io_Serializable))
                return false;
 
 
        /* load classes for wrapping primitive types */
 
-       if (!load_class_bootstrap(class_java_lang_Void))
+       if (!load_class_bootstrap(utf_java_lang_Void,&class_java_lang_Void))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Boolean,&class_java_lang_Boolean))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Byte,&class_java_lang_Byte))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Character,&class_java_lang_Character))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Short,&class_java_lang_Short))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Integer,&class_java_lang_Integer))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Long,&class_java_lang_Long))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Float,&class_java_lang_Float))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_Double,&class_java_lang_Double))
+               return false;
+
+       /* load some other important classes */
+
+       if (!load_class_bootstrap(utf_java_lang_Class,&class_java_lang_Class))
+               return false;
+
+       if (!load_class_bootstrap(utf_java_lang_ClassLoader,&class_java_lang_ClassLoader))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Boolean))
+       if (!load_class_bootstrap(utf_java_lang_SecurityManager,&class_java_lang_SecurityManager))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Byte))
+       if (!load_class_bootstrap(utf_java_lang_System,&class_java_lang_System))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Character))
+       if (!load_class_bootstrap(utf_java_lang_Throwable,&class_java_lang_Throwable))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Short))
+       if (!load_class_bootstrap(utf_java_lang_VMThrowable,&class_java_lang_VMThrowable))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Integer))
+       if (!load_class_bootstrap(utf_java_lang_Exception,&class_java_lang_Exception))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Long))
+       if (!load_class_bootstrap(utf_java_lang_Error,&class_java_lang_Error))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Float))
+       if (!load_class_bootstrap(utf_java_lang_OutOfMemoryError,&class_java_lang_OutOfMemoryError))
                return false;
 
-       if (!load_class_bootstrap(class_java_lang_Double))
+       if (!load_class_bootstrap(utf_java_lang_NoClassDefFoundError,&class_java_lang_NoClassDefFoundError))
                return false;
 
+       if (!load_class_bootstrap(utf_java_util_Vector,&class_java_util_Vector))
+               return false;
 
 #if defined(USE_THREADS)
        if (stackbottom != 0)
@@ -1756,9 +1806,9 @@ static bool load_attributes(classbuffer *cb, u4 num)
                                                                
                                innerclassinfo *info = c->innerclass + j;
 
-                               info->inner_class.cls =
+                               info->inner_class.ref =
                                        innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
-                               info->outer_class.cls =
+                               info->outer_class.ref =
                                        innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
                                info->name =
                                        innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
@@ -1797,24 +1847,46 @@ static bool load_attributes(classbuffer *cb, u4 num)
 
 /* load_class_from_classloader *************************************************
 
-   XXX
-       
+   Load the class with the given name using the given user-defined class loader.
+
+   IN:
+       name.............the classname
+          cl...............user-defined class loader
+          
+
+   OUT:
+       *result..........set to the loaded class
+
+   RETURN VALUE:
+       true.............everything ok
+          false............an exception has been thrown
+
 *******************************************************************************/
 
-classinfo *load_class_from_classloader(classinfo *c, java_objectheader *cl)
+bool load_class_from_classloader(utf *name,java_objectheader *cl,classinfo **result)
 {
        classinfo *r;
 
+       LOADER_ASSERT(name);
+       LOADER_ASSERT(result);
+
+#ifdef LOADER_VERBOSE
+       fprintf(stderr,"load_class_from_classloader(");
+       utf_fprint(stderr,name);fprintf(stderr,",%p)\n",(void*)cl);
+#endif
+
        /* lookup if this class has already been loaded */
-       r = classcache_lookup(cl,c->name);
-       if (r)
-               return r;
+       *result = classcache_lookup(cl,name);
+       if (*result)
+               return true;
 
        /* if other class loader than bootstrap, call it */
 
        if (cl) {
                methodinfo *lc;
 
+               LOADER_ASSERT(class_java_lang_Object);
+
                lc = class_resolveclassmethod(cl->vftbl->class,
                                                                          utf_loadClass,
                                                                          utf_java_lang_String__java_lang_Class,
@@ -1822,64 +1894,90 @@ classinfo *load_class_from_classloader(classinfo *c, java_objectheader *cl)
                                                                          true);
 
                if (!lc)
-                       return NULL;
+                       return false; /* exception */
 
                r = (classinfo *) asm_calljavafunction(lc,
                                                                                           cl,
-                                                                                          javastring_new(c->name),
+                                                                                          javastring_new(name),
                                                                                           NULL, NULL);
 
                /* store this class in the loaded class cache */
                if (r && !classcache_store(cl,r)) {
-                       log_message_class("Could not cache:",c);
                        r->loaded = false;
                        class_remove(r);
                        r = NULL; /* exception */
                }
 
-               return r;
+               *result = r;
+               return (r != NULL);
+       } 
 
-       } else {
-               return load_class_bootstrap(c);
-       }
+       return load_class_bootstrap(name,result);
 }
 
 
 /* load_class_bootstrap ********************************************************
        
-   XXX
+   Load the class with the given name using the bootstrap class loader.
+
+   IN:
+       name.............the classname
+
+   OUT:
+       *result..........set to the loaded class
+
+   RETURN VALUE:
+       true.............everything ok
+          false............an exception has been thrown
 
 *******************************************************************************/
 
-classinfo *load_class_bootstrap(classinfo *c)
+bool load_class_bootstrap(utf *name,classinfo **result)
 {
        classbuffer *cb;
+       classinfo *c;
        classinfo *r;
 
-       /* lookup if this class has already been loaded */
-       r = classcache_lookup(NULL,c->name);
-       if (r)
-               return r;
+       LOADER_ASSERT(name);
+       LOADER_ASSERT(result);
 
-#if defined(USE_THREADS)
-       /* enter a monitor on the class */
+       /* lookup if this class has already been loaded */
+       *result = classcache_lookup(NULL,name);
+       if (*result)
+               return true;
 
-       builtin_monitorenter((java_objectheader *) c);
+#ifdef LOADER_VERBOSE
+       fprintf(stderr,"load_class_bootstrap(");
+       utf_fprint(stderr,name);fprintf(stderr,")\n");
 #endif
 
-       /* maybe the class is already loaded */
+       /* create the classinfo */
+       c = class_new(name);
+
+       if (name == utf_java_lang_Object)
+               class_java_lang_Object = c;
+
+       /* store this class in the loaded class cache */
+       /* XXX we temporarily need this to avoid loading a bootstrap class multiple times */
+       if (!classcache_store(NULL,c)) {
+               c->loaded = false;
+               class_remove(c);
+               return false;
+       }
 
        if (c->loaded) {
+               *result = c;
+               return true;
+       }
+
 #if defined(USE_THREADS)
-               builtin_monitorexit((java_objectheader *) c);
-#endif
+       /* enter a monitor on the class */
 
-               return c;
-       }
+       builtin_monitorenter((java_objectheader *) c);
+#endif
 
 #if defined(STATISTICS)
        /* measure time */
-
        if (getcompilingtime)
                compilingtime_stop();
 
@@ -1891,19 +1989,19 @@ classinfo *load_class_bootstrap(classinfo *c)
 
        if ((cb = suck_start(c)) == NULL) {
                /* this means, the classpath was not set properly */
-               if (c->name == utf_java_lang_Object)
+               if (name == utf_java_lang_Object)
                        throw_cacao_exception_exit(string_java_lang_NoClassDefFoundError,
                                                                           "java/lang/Object");
 
                *exceptionptr =
                        new_exception_utfmessage(string_java_lang_NoClassDefFoundError,
-                                                                        c->name);
+                                                                        name);
 
 #if defined(USE_THREADS)
                builtin_monitorexit((java_objectheader *) c);
 #endif
 
-               return NULL;
+               return false;
        }
        
        /* load the class from the buffer */
@@ -1923,7 +2021,6 @@ classinfo *load_class_bootstrap(classinfo *c)
 
 #if defined(STATISTICS)
        /* measure time */
-
        if (getloadingtime)
                loadingtime_stop();
 
@@ -1931,21 +2028,22 @@ classinfo *load_class_bootstrap(classinfo *c)
                compilingtime_start();
 #endif
 
+#if XXX
        /* store this class in the loaded class cache */
        if (r && !classcache_store(NULL,c)) {
-               log_message_class("Could not cache:",c);
                c->loaded = false;
                class_remove(c);
                r = NULL; /* exception */
        }
+#endif
 
 #if defined(USE_THREADS)
        /* leave the monitor */
-
        builtin_monitorexit((java_objectheader *) c);
 #endif
 
-       return r;
+       *result = r;
+       return (r != NULL);
 }
 
 
@@ -1962,35 +2060,9 @@ classinfo *load_class_bootstrap(classinfo *c)
        
 *******************************************************************************/
 
-static bool
-XXX_TEMPORARY_resolve(classinfo *c,classref_or_classinfo *ref)
-{
-       if (!ref->any)
-               return true;
-
-       if (opt_eager) {
-               classinfo *tc;
-               tc = class_new_intern(ref->ref->name);
-
-               if (!load_class_from_classloader(tc, c->classloader))
-                       return false;
-
-               /* link the class later, because we cannot link the class currently
-                  loading */
-               list_addfirst(&unlinkedclasses, tc);
-
-               ref->cls = tc;
-
-       } else {
-               ref->cls = class_new(ref->ref->name);
-       }
-       return true;
-}
-
 classinfo *load_class_from_classbuffer(classbuffer *cb)
 {
        classinfo *c;
-       classinfo *tc;
        utf *name;
        utf *supername;
        u4 i,j;
@@ -2290,24 +2362,6 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
                }
        }
 
-       /* resolve class references */
-       /* XXX this will be removed later */
-       for (i=0; i<c->cpcount; ++i) {
-               if (c->cptags[i] == CONSTANT_Class) {
-                       XXX_TEMPORARY_resolve(c,(classref_or_classinfo*)(c->cpinfos + i));
-               }
-       }
-       XXX_TEMPORARY_resolve(c,&(c->super));
-       for (i=0; i<c->interfacescount; ++i)
-               XXX_TEMPORARY_resolve(c,c->interfaces + i);
-       for (i = 0; i < c->methodscount; i++) {
-               methodinfo *m = c->methods + i;
-               for (j=0; j<m->exceptiontablelength; ++j)
-                       XXX_TEMPORARY_resolve(c,&(m->exceptiontable[j].catchtype));
-               for (j=0; j<m->thrownexceptionscount; ++j)
-                       XXX_TEMPORARY_resolve(c,m->thrownexceptions + j);
-       }
-
        /* Check if all fields and methods can be uniquely
         * identified by (name,descriptor). */
        if (opt_verify) {
@@ -2478,7 +2532,7 @@ void class_new_array(classinfo *c)
                if (opt_eager) {
                        comp = class_new_intern(utf_new_intern(c->name->text + 1,
                                                                                                   namelen - 1));
-                       load_class_from_classloader(comp, c->classloader);
+                       LOADER_ASSERT(comp->loaded);
                        list_addfirst(&unlinkedclasses, comp);
 
                } else {
@@ -2494,7 +2548,7 @@ void class_new_array(classinfo *c)
                if (opt_eager) {
                        comp = class_new_intern(utf_new_intern(c->name->text + 2,
                                                                                                   namelen - 3));
-                       load_class_from_classloader(comp, c->classloader);
+                       LOADER_ASSERT(comp->loaded);
                        list_addfirst(&unlinkedclasses, comp);
 
                } else {
@@ -2503,6 +2557,10 @@ void class_new_array(classinfo *c)
                break;
        }
 
+       LOADER_ASSERT(class_java_lang_Object);
+       LOADER_ASSERT(class_java_lang_Cloneable);
+       LOADER_ASSERT(class_java_io_Serializable);
+
        /* Setup the array class */
        c->super.cls = class_java_lang_Object;
        c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT;
@@ -2514,12 +2572,12 @@ void class_new_array(classinfo *c)
                classinfo *tc;
 
                tc = class_java_lang_Cloneable;
-               load_class_bootstrap(tc);
+               LOADER_ASSERT(tc->loaded);
                list_addfirst(&unlinkedclasses, tc);
                c->interfaces[0].cls = tc;
 
                tc = class_java_io_Serializable;
-               load_class_bootstrap(tc);
+               LOADER_ASSERT(tc->loaded);
                list_addfirst(&unlinkedclasses, tc);
                c->interfaces[1].cls = tc;
 
@@ -2859,6 +2917,7 @@ methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *desc,
                return mi;
 
        /* try class java.lang.Object */
+       LOADER_ASSERT(class_java_lang_Object);
        mi = class_findmethod(class_java_lang_Object, name, desc);
 
        if (mi)
@@ -3046,10 +3105,8 @@ static classinfo *class_init_intern(classinfo *c)
        int b;
 #endif
 
-       /* maybe the class is not already loaded */
-       if (!c->loaded)
-               if (!load_class_bootstrap(c))
-                       return NULL;
+       LOADER_ASSERT(c);
+       LOADER_ASSERT(c->loaded);
 
        /* maybe the class is not already linked */
        if (!c->linked)
@@ -3137,6 +3194,7 @@ static classinfo *class_init_intern(classinfo *c)
                c->initialized = false;
 
                /* is this an exception, than wrap it */
+               LOADER_ASSERT(class_java_lang_Exception);
                if (builtin_instanceof(*exceptionptr, class_java_lang_Exception)) {
                        java_objectheader *xptr;
                        java_objectheader *cause;
@@ -3181,7 +3239,7 @@ void class_showconstanti(classinfo *c, int ii)
                switch (c->cptags [i]) {
                case CONSTANT_Class:
                        printf("Classreference -> ");
-                       utf_display(((classinfo*)e)->name);
+                       utf_display(((constant_classref*)e)->name);
                        break;
                                
                case CONSTANT_Fieldref:
@@ -3262,7 +3320,7 @@ void class_showconstantpool (classinfo *c)
                        switch (c -> cptags [i]) {
                        case CONSTANT_Class:
                                printf ("Classreference -> ");
-                               utf_display ( ((classinfo*)e) -> name );
+                               utf_display ( ((constant_classref*)e) -> name );
                                break;
                                
                        case CONSTANT_Fieldref:
index fcff0aad7ac06c5c8f7587c84b680adbd0e7308b..cbcc8d8ec7dbf543057d28cbf092540041a5b8fd 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Reinhard Grafl
 
-   $Id: loader.h 2186 2005-04-02 00:43:25Z edwin $
+   $Id: loader.h 2193 2005-04-02 19:33:43Z edwin $
 */
 
 
@@ -168,8 +168,8 @@ inline u4 suck_u4(classbuffer *cb);
 void loader_close(void);
 
 /* class loading functions */
-classinfo *load_class_from_classloader(classinfo *c, java_objectheader *cl);
-classinfo *load_class_bootstrap(classinfo *c);
+bool load_class_from_classloader(utf *name, java_objectheader *cl, classinfo **result);
+bool load_class_bootstrap(utf *name,classinfo **result);
 classinfo *load_class_from_classbuffer(classbuffer *cb);
 
 
index e137ebdeb4d1ef63d141a5c4f200b00f00ca7a25..55b291f439cd7ba8f26cb74db854aa1aa645068d 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: resolve.c 2189 2005-04-02 02:05:59Z edwin $
+   $Id: resolve.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
@@ -136,12 +136,8 @@ resolve_class(classinfo *referer,methodinfo *refmethod,
 
                /* load the class */
                if (!cls) {
-                       classinfo *c = class_new(classname);
-                       cls = load_class_from_classloader(c,referer->classloader);
-                       if (!cls) {
-                               class_free(c);
+                       if (!load_class_from_classloader(classname,referer->classloader,&cls))
                                return false; /* exception */
-                       }
                }
        }
 
@@ -202,9 +198,7 @@ resolve_classref_or_classinfo(methodinfo *refmethod,
        else {
                /* cls has already been resolved */
                c = cls.cls;
-               if (!c->loaded)
-                       if (!load_class_from_classloader(c, cls.ref->referer->classloader))
-                               return false; /* exception */
+               RESOLVE_ASSERT(c->loaded);
        }
        RESOLVE_ASSERT(c || (mode == resolveLazy));
 
index e03bc962d444a68705fa149e6ce1fa6a4dea8749..5135361bb2b2e1c9a18bb1f5f8ad44fc650259b6 100644 (file)
 
    Changes: Christian Thalinger
 
-   $Id: string.c 2148 2005-03-30 16:49:40Z twisti $
+   $Id: string.c 2193 2005-04-02 19:33:43Z edwin $
 
 */
 
 
+#include <assert.h>
 #include "config.h"
 #include "types.h"
 
@@ -293,11 +294,13 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
     stringdata->header.objheader.vftbl = primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
     stringdata->header.size = length;
 
+       if (!class_java_lang_String)
+               load_class_bootstrap(utf_java_lang_String,&class_java_lang_String);
+       assert(class_java_lang_String);
+       assert(class_java_lang_String->loaded);
+
        /* if we use eager loading, we have to check loaded String class */
        if (opt_eager) {
-               if (!load_class_bootstrap(class_java_lang_String))
-                       return NULL;
-
                list_addfirst(&unlinkedclasses, class_java_lang_String);
        }