- 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>
/* initialize some cacao subsystems */
utf8_init();
- class_init_foo();
if (!loader_init((u1 *) &dummy))
throw_main_exception_exit();
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))
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))
{
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();
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 $
*/
/* initialize some cacao subsystems */
utf8_init();
- class_init_foo();
loader_init((u1 *) &dummy);
}
}
- 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);
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 $
*/
return NULL;
}
+tristate_t
+typeinfo_is_assignable_to_class(typeinfo *value,classref_or_classinfo dest)
+{
+ return true;
+}
/************************ global variables **********************/
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 $
*/
{
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;
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 $
*/
/*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;
}
int i;
/* create class-array */
+ assert(class_java_lang_Class);
result = builtin_anewarray(parametercount, class_java_lang_Class);
/* get classes */
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++) {
/*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) {
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) {
}
}
- 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;
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 $
*/
#include "vm/loader.h"
#include "vm/stringlocal.h"
#include "vm/tables.h"
+#include "vm/resolve.h"
/* for selecting public members */
(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);
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 */
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 $
*/
/* 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);
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 */
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 $
*/
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,
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 $
*/
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
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);
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;
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 $
*/
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)
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)
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 $
*/
/* 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 *******************************************************************
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 */
}
}
}
+ else {
+ c = class_new_intern(classname);
+ }
+
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
tables_unlock();
Changes:
- $Id: class.h 2190 2005-04-02 10:07:44Z edwin $
+ $Id: class.h 2193 2005-04-02 19:33:43Z edwin $
*/
/* function prototypes ********************************************************/
-void class_init_foo(void);
-
/* search for class and create it if not found */
classinfo *class_new(utf *u);
Changes:
- $Id: exceptions.c 2147 2005-03-30 16:47:35Z twisti $
+ $Id: exceptions.c 2193 2005-04-02 19:33:43Z edwin $
*/
{
/* 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;
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));
}
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);
}
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));
}
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);
}
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);
}
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 $
*/
/* 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);
/* 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){
/*-- 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), \
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 $
*/
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);
/* 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){
/*-- 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), \
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 $
*/
#define LAZYLOADING(class) { \
- if (!class->loaded) \
- if (!load_class_bootstrap(class)) \
- return 0; \
if (!class->linked) \
if (!link_class(class)) \
return 0; }
#define LAZYLOADING1(class) { \
- if (!class->loaded) \
- if (!load_class_bootstrap(class)) \
- return; \
if (!class->linked) \
if (!link_class(class)) \
return; }
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 $
*/
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;
/* 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;
/* 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) {
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) {
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 $
*/
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;
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 $
*/
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;
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);
/* 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;
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"
#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"
/* 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;
/* 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;
/* 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;
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;
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 */
/* 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) {
return NULL;
}
- if (!tc->loaded)
- if (!load_class_from_classloader(tc, c->classloader))
- return NULL;
+ assert(tc->loaded);
if (!(tc->flags & ACC_INTERFACE)) {
*exceptionptr =
/* 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;
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 =
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 */
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);
/* 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;
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
/* 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)
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);
/* 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,
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();
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 */
#if defined(STATISTICS)
/* measure time */
-
if (getloadingtime)
loadingtime_stop();
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);
}
*******************************************************************************/
-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;
}
}
- /* 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) {
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 {
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 {
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;
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;
return mi;
/* try class java.lang.Object */
+ LOADER_ASSERT(class_java_lang_Object);
mi = class_findmethod(class_java_lang_Object, name, desc);
if (mi)
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)
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;
switch (c->cptags [i]) {
case CONSTANT_Class:
printf("Classreference -> ");
- utf_display(((classinfo*)e)->name);
+ utf_display(((constant_classref*)e)->name);
break;
case CONSTANT_Fieldref:
switch (c -> cptags [i]) {
case CONSTANT_Class:
printf ("Classreference -> ");
- utf_display ( ((classinfo*)e) -> name );
+ utf_display ( ((constant_classref*)e) -> name );
break;
case CONSTANT_Fieldref:
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 $
*/
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);
Changes:
- $Id: resolve.c 2189 2005-04-02 02:05:59Z edwin $
+ $Id: resolve.c 2193 2005-04-02 19:33:43Z edwin $
*/
/* 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 */
- }
}
}
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));
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"
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);
}