/* 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.
#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"
{
#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;
void loader_init(void)
{
+ TRACESUBSYSTEMINITIALIZATION("loader_init");
+
/* Load primitive-type wrapping classes. */
assert(vm_initializing == true);
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"));
load_class_bootstrap(utf_new_char("java/lang/VMThrowable"));
#endif
- /* Some classes which may be used often. */
+ /* Important system exceptions. */
-#if defined(ENABLE_JAVASE)
- class_java_lang_StackTraceElement =
- load_class_bootstrap(utf_java_lang_StackTraceElement);
+ class_java_lang_Exception = load_class_bootstrap(utf_java_lang_Exception);
- class_java_lang_reflect_Constructor =
- load_class_bootstrap(utf_java_lang_reflect_Constructor);
+ class_java_lang_ClassNotFoundException =
+ load_class_bootstrap(utf_java_lang_ClassNotFoundException);
- class_java_lang_reflect_Field =
- load_class_bootstrap(utf_java_lang_reflect_Field);
+ class_java_lang_RuntimeException =
+ load_class_bootstrap(utf_java_lang_RuntimeException);
- class_java_lang_reflect_Method =
- load_class_bootstrap(utf_java_lang_reflect_Method);
+ /* Some classes which may be used often. */
- class_java_security_PrivilegedAction =
- load_class_bootstrap(utf_new_char("java/security/PrivilegedAction"));
+#if defined(ENABLE_JAVASE)
+ 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_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_util_HashMap =
- load_class_bootstrap(utf_new_char("java/util/HashMap"));
+ 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
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"));
*******************************************************************************/
-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;
*******************************************************************************/
-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;
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))
/* get classinfo */
- c = cb->class;
+ c = cb->clazz;
/* check remaining bytecode */
{
methodinfo *m;
java_handle_t *clo;
- classloader *cl;
+ classloader_t *cl;
classinfo *c;
assert(class_java_lang_Object);
*******************************************************************************/
-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;
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. */
else {
/* Add the package name to the boot packages. */
- package_add(c->packagename);
+ Package_add(c->packagename);
}
r = res;
/* Get the classbuffer's class. */
- c = cb->class;
+ c = cb->clazz;
if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
return false;
/* 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. */
/* 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. */
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;
/* Get the classbuffer's class. */
- c = cb->class;
+ c = cb->clazz;
/* Check if the class is already loaded. */
*******************************************************************************/
-classinfo *load_newly_created_array(classinfo *c, classloader *loader)
+classinfo *load_newly_created_array(classinfo *c, classloader_t *loader)
{
classinfo *comp = NULL;
methodinfo *clone;
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 */