This commit introduces C++ support.
[cacao.git] / src / vmcore / loader.c
index f710afaab48fc7498378eb9ed5f832388ec5dae4..c303485d056611d5a8bd2e4d7b3103a0e5f530a2 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vmcore/loader.c - class loader functions
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -45,7 +43,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
-#include "vm/package.h"
+#include "vm/package.hpp"
 #include "vm/primitive.h"
 #include "vm/resolve.h"
 #include "vm/stringlocal.h"
@@ -100,7 +98,11 @@ void loader_preinit(void)
 {
 #if defined(ENABLE_THREADS)
        list_classpath_entry *lce;
+#endif
+
+       TRACESUBSYSTEMINITIALIZATION("loader_preinit");
 
+#if defined(ENABLE_THREADS)
        /* Initialize the monitor pointer for zip/jar file locking. */
 
        for (lce = list_first(list_classpath_entries); lce != NULL;
@@ -139,6 +141,8 @@ void loader_preinit(void)
  
 void loader_init(void)
 {
+       TRACESUBSYSTEMINITIALIZATION("loader_init");
+
        /* Load primitive-type wrapping classes. */
 
        assert(vm_initializing == true);
@@ -169,7 +173,8 @@ void loader_init(void)
                load_class_bootstrap(utf_java_lang_SecurityManager);
 #endif
 
-       class_java_lang_System     = load_class_bootstrap(utf_java_lang_System);
+       class_java_lang_System     =
+               load_class_bootstrap(utf_new_char("java/lang/System"));
 
        class_java_lang_Thread     =
                load_class_bootstrap(utf_new_char("java/lang/Thread"));
@@ -181,7 +186,7 @@ void loader_init(void)
 
        class_java_lang_Throwable  = load_class_bootstrap(utf_java_lang_Throwable);
 
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        class_java_lang_VMSystem   =
                load_class_bootstrap(utf_new_char("java/lang/VMSystem"));
 
@@ -192,27 +197,37 @@ void loader_init(void)
                load_class_bootstrap(utf_new_char("java/lang/VMThrowable"));
 #endif
 
+       /* Important system exceptions. */
+
+       class_java_lang_Exception  = load_class_bootstrap(utf_java_lang_Exception);
+
+       class_java_lang_ClassNotFoundException =
+               load_class_bootstrap(utf_java_lang_ClassNotFoundException);
+
+       class_java_lang_RuntimeException =
+               load_class_bootstrap(utf_java_lang_RuntimeException);
+
        /* Some classes which may be used often. */
 
 #if defined(ENABLE_JAVASE)
-       class_java_lang_StackTraceElement =
-               load_class_bootstrap(utf_java_lang_StackTraceElement);
+       class_java_lang_StackTraceElement      = load_class_bootstrap(utf_java_lang_StackTraceElement);
 
-       class_java_lang_reflect_Constructor =
-               load_class_bootstrap(utf_java_lang_reflect_Constructor);
+       class_java_lang_reflect_Constructor    = load_class_bootstrap(utf_java_lang_reflect_Constructor);
+       class_java_lang_reflect_Field          = load_class_bootstrap(utf_java_lang_reflect_Field);
+       class_java_lang_reflect_Method         = load_class_bootstrap(utf_java_lang_reflect_Method);
 
-       class_java_lang_reflect_Field =
-               load_class_bootstrap(utf_java_lang_reflect_Field);
-
-       class_java_lang_reflect_Method =
-               load_class_bootstrap(utf_java_lang_reflect_Method);
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+       class_java_lang_reflect_VMConstructor  = load_class_bootstrap(utf_java_lang_reflect_VMConstructor);
+       class_java_lang_reflect_VMField        = load_class_bootstrap(utf_java_lang_reflect_VMField);
+       class_java_lang_reflect_VMMethod       = load_class_bootstrap(utf_java_lang_reflect_VMMethod);
+# endif
 
-       class_java_security_PrivilegedAction =
-               load_class_bootstrap(utf_new_char("java/security/PrivilegedAction"));
+       class_java_security_PrivilegedAction   = load_class_bootstrap(utf_new_char("java/security/PrivilegedAction"));
 
-       class_java_util_Vector     = load_class_bootstrap(utf_java_util_Vector);
+       class_java_util_HashMap                = load_class_bootstrap(utf_new_char("java/util/HashMap"));
+       class_java_util_Vector                 = load_class_bootstrap(utf_java_util_Vector);
 
-# if defined(WITH_CLASSPATH_SUN)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
        class_sun_reflect_MagicAccessorImpl =
                load_class_bootstrap(utf_new_char("sun/reflect/MagicAccessorImpl"));
 # endif
@@ -225,7 +240,7 @@ void loader_init(void)
        class_sun_reflect_ConstantPool =
                load_class_bootstrap(utf_new_char("sun/reflect/ConstantPool"));
 
-#  if defined(WITH_CLASSPATH_GNU)
+#  if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        /* needed by GNU Classpaths annotation support */
        class_sun_reflect_annotation_AnnotationParser =
                load_class_bootstrap(utf_new_char("sun/reflect/annotation/AnnotationParser"));
@@ -243,7 +258,7 @@ void loader_init(void)
 
 *******************************************************************************/
 
-classloader *loader_hashtable_classloader_add(java_handle_t *cl)
+classloader_t *loader_hashtable_classloader_add(java_handle_t *cl)
 {
        hashtable_classloader_entry *cle;
        u4   key;
@@ -259,12 +274,7 @@ classloader *loader_hashtable_classloader_add(java_handle_t *cl)
        /* key for entry is the hashcode of the classloader;
           aligned to 16-byte boundaries */
 
-#if defined(ENABLE_GC_CACAO)
-       key  = heap_get_hashcode(LLNI_DIRECT(cl)) >> 4;
-#else
-       key  = ((u4) (ptrint) cl) >> 4;
-#endif
-
+       key  = heap_hashcode(LLNI_DIRECT(cl)) >> 4;
        slot = key & (hashtable_classloader->size - 1);
        cle  = hashtable_classloader->ptr[slot];
 
@@ -331,7 +341,7 @@ classloader *loader_hashtable_classloader_add(java_handle_t *cl)
 
 *******************************************************************************/
 
-classloader *loader_hashtable_classloader_find(java_handle_t *cl)
+classloader_t *loader_hashtable_classloader_find(java_handle_t *cl)
 {
        hashtable_classloader_entry *cle;
        u4   key;
@@ -345,12 +355,7 @@ classloader *loader_hashtable_classloader_find(java_handle_t *cl)
        /* key for entry is the hashcode of the classloader;
           aligned to 16-byte boundaries */
 
-#if defined(ENABLE_GC_CACAO)
-       key  = heap_get_hashcode(LLNI_DIRECT(cl)) >> 4;
-#else
-       key  = ((u4) (ptrint) cl) >> 4;
-#endif
-
+       key  = heap_hashcode(LLNI_DIRECT(cl)) >> 4;
        slot = key & (hashtable_classloader->size - 1);
        cle  = hashtable_classloader->ptr[slot];
 
@@ -540,7 +545,7 @@ static bool load_constantpool(classbuffer *cb, descriptor_pool *descpool)
        u1 *cptags;
        voidptr *cpinfos;
 
-       c = cb->class;
+       c = cb->clazz;
 
        /* number of entries in the constant_pool table plus one */
        if (!suck_check_classbuffer_size(cb, 2))
@@ -932,7 +937,7 @@ bool loader_load_attribute_signature(classbuffer *cb, utf **signature)
 
        /* get classinfo */
 
-       c = cb->class;
+       c = cb->clazz;
 
        /* check remaining bytecode */
 
@@ -982,7 +987,7 @@ classinfo *load_class_from_sysloader(utf *name)
 {
        methodinfo    *m;
        java_handle_t *clo;
-       classloader   *cl;
+       classloader_t *cl;
        classinfo     *c;
 
        assert(class_java_lang_Object);
@@ -1025,7 +1030,7 @@ classinfo *load_class_from_sysloader(utf *name)
 
 *******************************************************************************/
 
-classinfo *load_class_from_classloader(utf *name, classloader *cl)
+classinfo *load_class_from_classloader(utf *name, classloader_t *cl)
 {
        java_handle_t *o;
        classinfo     *c;
@@ -1125,7 +1130,7 @@ classinfo *load_class_from_classloader(utf *name, classloader *cl)
 
                LLNI_class_get(cl, c);
 
-#if defined(WITH_CLASSPATH_SUN)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
                /* OpenJDK uses this internal function because it's
                   synchronized. */
 
@@ -1318,7 +1323,7 @@ classinfo *load_class_bootstrap(utf *name)
                else {
                        /* Add the package name to the boot packages. */
 
-                       package_add(c->packagename);
+                       Package_add(c->packagename);
                }
 
                r = res;
@@ -1397,7 +1402,7 @@ static bool load_class_from_classbuffer_intern(classbuffer *cb)
 
        /* Get the classbuffer's class. */
 
-       c = cb->class;
+       c = cb->clazz;
 
        if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
                return false;
@@ -1645,8 +1650,10 @@ static bool load_class_from_classbuffer_intern(classbuffer *cb)
                /* XXX This should be done better. */
                tc = resolve_classref_or_classinfo_eager(CLASSREF_OR_CLASSINFO(cr), false);
 
-               if (tc == NULL)
+               if (tc == NULL) {
+                       resolve_handle_pending_exception(true);
                        return false;
+               }
 
                /* Interfaces are not allowed as super classes. */
 
@@ -1680,8 +1687,10 @@ static bool load_class_from_classbuffer_intern(classbuffer *cb)
                /* XXX This should be done better. */
                tc = resolve_classref_or_classinfo_eager(CLASSREF_OR_CLASSINFO(cr), false);
 
-               if (tc == NULL)
+               if (tc == NULL) {
+                       resolve_handle_pending_exception(true);
                        return false;
+               }
 
                /* Detect circularity. */
 
@@ -1721,7 +1730,7 @@ static bool load_class_from_classbuffer_intern(classbuffer *cb)
                methodinfo *m = &c->methods[i];
                m->parseddesc =
                        descriptor_pool_parse_method_descriptor(descpool, m->descriptor,
-                                                                                                       m->flags, class_get_self_classref(m->class));
+                                                                                                       m->flags, class_get_self_classref(m->clazz));
                if (!m->parseddesc)
                        return false;
 
@@ -1938,12 +1947,12 @@ static bool load_class_from_classbuffer_intern(classbuffer *cb)
 classinfo *load_class_from_classbuffer(classbuffer *cb)
 {
        classinfo *c;
-       int32_t    dumpsize;
        bool       result;
+       int32_t    dumpmarker;
 
        /* Get the classbuffer's class. */
 
-       c = cb->class;
+       c = cb->clazz;
 
        /* Check if the class is already loaded. */
 
@@ -1962,7 +1971,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
 
        /* Mark start of dump memory area. */
 
-       dumpsize = dump_size();
+       DMARKER;
 
        /* Class is currently loading. */
 
@@ -1974,7 +1983,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
 
        /* Release dump area. */
 
-       dump_release(dumpsize);
+       DRELEASE;
 
        /* An error occurred. */
 
@@ -2024,7 +2033,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
 
 *******************************************************************************/
 
-classinfo *load_newly_created_array(classinfo *c, classloader *loader)
+classinfo *load_newly_created_array(classinfo *c, classloader_t *loader)
 {
        classinfo         *comp = NULL;
        methodinfo        *clone;
@@ -2166,7 +2175,7 @@ classinfo *load_newly_created_array(classinfo *c, classloader *loader)
        clone->name       = utf_clone;
        clone->descriptor = utf_void__java_lang_Object;
        clone->parseddesc = clonedesc;
-       clone->class      = c;
+       clone->clazz      = c;
 
        /* parse the descriptor to get the register allocation */