X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvmcore%2Flinker.c;h=37e8daeb7d362077aa0b5ea88a392d0b2dea373e;hb=7659949229c634784f7d27aa8b679fdd4c8351ab;hp=7e7cd867a06b5d809aafe8f2dcf4303da47cddf7;hpb=8766651a7844894218849d88e80758065705c7a6;p=cacao.git diff --git a/src/vmcore/linker.c b/src/vmcore/linker.c index 7e7cd867a..37e8daeb7 100644 --- a/src/vmcore/linker.c +++ b/src/vmcore/linker.c @@ -1,9 +1,7 @@ /* src/vmcore/linker.c - class linker 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. @@ -22,14 +20,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - $Id: linker.c 8343 2007-08-17 21:39:32Z michi $ - */ #include "config.h" #include +#include #include "vm/types.h" @@ -44,7 +41,7 @@ #include "vm/access.h" #include "vm/array.h" #include "vm/exceptions.h" -#include "vm/primitive.h" +#include "vm/primitive.hpp" #include "vm/stringlocal.h" #include "vm/vm.h" @@ -56,6 +53,25 @@ #include "vmcore/options.h" #include "vmcore/rt-timing.h" + +/* debugging macros ***********************************************************/ + +#if !defined(NDEBUG) +# define TRACELINKCLASS(c) \ + do { \ + if (opt_TraceLinkClass) { \ + log_start(); \ + log_print("[Linking "); \ + class_print((c)); \ + log_print("]"); \ + log_finish(); \ + } \ + } while (0) +#else +# define TRACELINKCLASS(c) +#endif + + /* #include "vm/resolve.h" */ /* copied prototype to avoid bootstrapping problem: */ classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess); @@ -65,7 +81,7 @@ classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool c #endif #if !defined(NDEBUG) && defined(ENABLE_INLINING) -#define INLINELOG(code) do { if (opt_inline_debug_log) { code } } while (0) +#define INLINELOG(code) do { if (opt_TraceInlining) { code } } while (0) #else #define INLINELOG(code) #endif @@ -107,34 +123,45 @@ struct dummy_alignment_double_t { /* linker_init ***************************************************************** - Initializes the linker subsystem. + Initializes the linker subsystem and links classes required for the + primitive table. *******************************************************************************/ -bool linker_init(void) +void linker_preinit(void) { + TRACESUBSYSTEMINITIALIZATION("linker_preinit"); + /* Check for if alignment for long and double matches what we assume for the current architecture. */ -#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__)) || (defined(__POWERPC__) && defined(__DARWIN__)) +#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__)) || (defined(__POWERPC__) && defined(__DARWIN__)) || defined(__M68K__) + /* Define a define here which is later checked when we use this + offset. */ + +# define LINKER_ALIGNMENT_LONG_DOUBLE 4 + if (OFFSET(dummy_alignment_long_t, l) != 4) - vm_abort("linker_init: long alignment is different from what assumed: %d != %d", + vm_abort("linker_preinit: long alignment is different from what assumed: %d != %d", OFFSET(dummy_alignment_long_t, l), 4); if (OFFSET(dummy_alignment_double_t, d) != 4) - vm_abort("linker_init: double alignment is different from what assumed: %d != %d", + vm_abort("linker_preinit: double alignment is different from what assumed: %d != %d", OFFSET(dummy_alignment_double_t, d), 4); #else + +# define LINKER_ALIGNMENT_LONG_DOUBLE 8 + if (OFFSET(dummy_alignment_long_t, l) != 8) - vm_abort("linker_init: long alignment is different from what assumed: %d != %d", + vm_abort("linker_preinit: long alignment is different from what assumed: %d != %d", OFFSET(dummy_alignment_long_t, l), 8); if (OFFSET(dummy_alignment_double_t, d) != 8) - vm_abort("linker_init: double alignment is different from what assumed: %d != %d", + vm_abort("linker_preinit: double alignment is different from what assumed: %d != %d", OFFSET(dummy_alignment_double_t, d), 8); #endif - /* reset interface index */ + /* Reset interface index. */ interfaceindex = 0; @@ -146,125 +173,165 @@ bool linker_init(void) LOCK_INIT_OBJECT_LOCK(linker_classrenumber_lock); #endif - /* link java.lang.Class as first class of the system, because we - need it's vftbl for all other classes so we can use a class as - object */ + /* Link the most basic classes. */ - if (!link_class(class_java_lang_Class)) - return false; + if (!link_class(class_java_lang_Object)) + vm_abort("linker_preinit: linking java/lang/Object failed"); - /* now set the header.vftbl of all classes which were created - before java.lang.Class was linked */ +#if defined(ENABLE_JAVASE) + if (!link_class(class_java_lang_Cloneable)) + vm_abort("linker_preinit: linking java/lang/Cloneable failed"); - class_postset_header_vftbl(); + if (!link_class(class_java_io_Serializable)) + vm_abort("linker_preinit: linking java/io/Serializable failed"); +#endif +} - /* link important system classes */ +/* linker_init ***************************************************************** - if (!link_class(class_java_lang_Object)) - return false; + Links all classes required in the VM. - if (!link_class(class_java_lang_String)) - return false; +*******************************************************************************/ -#if defined(ENABLE_JAVASE) - if (!link_class(class_java_lang_Cloneable)) - return false; +void linker_init(void) +{ + TRACESUBSYSTEMINITIALIZATION("linker_init"); - if (!link_class(class_java_io_Serializable)) - return false; -#endif + /* Link java.lang.Class as first class of the system, because we + need it's vftbl for all other classes so we can use a class as + object. */ - /* link classes for wrapping primitive types */ + if (!link_class(class_java_lang_Class)) + vm_abort("linker_init: linking java/lang/Class failed"); + + /* Now set the header.vftbl of all classes which were created + before java.lang.Class was linked. */ + + class_postset_header_vftbl(); + + /* Link primitive-type wrapping classes. */ #if defined(ENABLE_JAVASE) if (!link_class(class_java_lang_Void)) - return false; + vm_abort("linker_init: linking failed"); #endif if (!link_class(class_java_lang_Boolean)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Byte)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Character)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Short)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Integer)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Long)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Float)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Double)) - return false; + vm_abort("linker_init: linking failed"); + /* Link important system classes. */ - /* load some other important classes */ + if (!link_class(class_java_lang_String)) + vm_abort("linker_init: linking java/lang/String failed"); #if defined(ENABLE_JAVASE) if (!link_class(class_java_lang_ClassLoader)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_SecurityManager)) - return false; + vm_abort("linker_init: linking failed"); #endif if (!link_class(class_java_lang_System)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_Thread)) - return false; + vm_abort("linker_init: linking failed"); #if defined(ENABLE_JAVASE) if (!link_class(class_java_lang_ThreadGroup)) - return false; + vm_abort("linker_init: linking failed"); #endif -#if defined(WITH_CLASSPATH_GNU) + if (!link_class(class_java_lang_Throwable)) + vm_abort("linker_init: linking failed"); + +#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) if (!link_class(class_java_lang_VMSystem)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_VMThread)) - return false; + vm_abort("linker_init: linking failed"); + + if (!link_class(class_java_lang_VMThrowable)) + vm_abort("linker_init: linking failed"); #endif + /* Important system exceptions. */ + + if (!link_class(class_java_lang_Exception)) + vm_abort("linker_init: linking failed"); + + if (!link_class(class_java_lang_ClassNotFoundException)) + vm_abort("linker_init: linking failed"); + + if (!link_class(class_java_lang_RuntimeException)) + vm_abort("linker_init: linking failed"); /* some classes which may be used more often */ #if defined(ENABLE_JAVASE) if (!link_class(class_java_lang_StackTraceElement)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_reflect_Constructor)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_reflect_Field)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_lang_reflect_Method)) - return false; + vm_abort("linker_init: linking failed"); + +# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) + if (!link_class(class_java_lang_reflect_VMConstructor)) + vm_abort("linker_init: linking failed"); + + if (!link_class(class_java_lang_reflect_VMField)) + vm_abort("linker_init: linking failed"); + + if (!link_class(class_java_lang_reflect_VMMethod)) + vm_abort("linker_init: linking failed"); +# endif if (!link_class(class_java_security_PrivilegedAction)) - return false; + vm_abort("linker_init: linking failed"); if (!link_class(class_java_util_Vector)) - return false; + vm_abort("linker_init: linking failed"); + + if (!link_class(class_java_util_HashMap)) + vm_abort("linker_init: linking failed"); -# if defined(WITH_CLASSPATH_SUN) +# if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) if (!link_class(class_sun_reflect_MagicAccessorImpl)) - return false; + vm_abort("linker_init: linking failed"); # endif if (!link_class(arrayclass_java_lang_Object)) - return false; + vm_abort("linker_init: linking failed"); #endif @@ -272,47 +339,51 @@ bool linker_init(void) /* pseudo class for Arraystubs (extends java.lang.Object) */ - pseudo_class_Arraystub = + pseudo_class_Arraystub = class_create_classinfo(utf_new_char("$ARRAYSTUB$")); - pseudo_class_Arraystub->state |= CLASS_LOADED; - pseudo_class_Arraystub->super.cls = class_java_lang_Object; + pseudo_class_Arraystub->state |= CLASS_LOADED; + pseudo_class_Arraystub->super = class_java_lang_Object; #if defined(ENABLE_JAVASE) - pseudo_class_Arraystub->interfacescount = 2; - pseudo_class_Arraystub->interfaces = MNEW(classref_or_classinfo, 2); - pseudo_class_Arraystub->interfaces[0].cls = class_java_lang_Cloneable; - pseudo_class_Arraystub->interfaces[1].cls = class_java_io_Serializable; + + pseudo_class_Arraystub->interfacescount = 2; + pseudo_class_Arraystub->interfaces = MNEW(classinfo*, 2); + pseudo_class_Arraystub->interfaces[0] = class_java_lang_Cloneable; + pseudo_class_Arraystub->interfaces[1] = class_java_io_Serializable; + #elif defined(ENABLE_JAVAME_CLDC1_1) - pseudo_class_Arraystub->interfacescount = 0; - pseudo_class_Arraystub->interfaces = NULL; + + pseudo_class_Arraystub->interfacescount = 0; + pseudo_class_Arraystub->interfaces = NULL; + +#else +# error unknown Java configuration #endif - if (!classcache_store_unique(pseudo_class_Arraystub)) { - log_text("could not cache pseudo_class_Arraystub"); - assert(0); - } + if (!classcache_store_unique(pseudo_class_Arraystub)) + vm_abort("linker_init: could not cache pseudo_class_Arraystub"); if (!link_class(pseudo_class_Arraystub)) - return false; + vm_abort("linker_init: linking pseudo_class_Arraystub failed"); /* pseudo class representing the null type */ - pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$")); + pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$")); pseudo_class_Null->state |= CLASS_LOADED; - pseudo_class_Null->super.cls = class_java_lang_Object; + pseudo_class_Null->super = class_java_lang_Object; if (!classcache_store_unique(pseudo_class_Null)) vm_abort("linker_init: could not cache pseudo_class_Null"); if (!link_class(pseudo_class_Null)) - return false; + vm_abort("linker_init: linking failed"); /* pseudo class representing new uninitialized objects */ - pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$")); + pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$")); pseudo_class_New->state |= CLASS_LOADED; pseudo_class_New->state |= CLASS_LINKED; /* XXX is this allright? */ - pseudo_class_New->super.cls = class_java_lang_Object; + pseudo_class_New->super = class_java_lang_Object; if (!classcache_store_unique(pseudo_class_New)) vm_abort("linker_init: could not cache pseudo_class_New"); @@ -321,8 +392,6 @@ bool linker_init(void) java/lang/String). */ stringtable_update(); - - return true; } @@ -349,9 +418,9 @@ classinfo *link_class(classinfo *c) LOCK_MONITOR_ENTER(c); - /* maybe the class is already linked */ + /* Maybe the class is currently linking or is already linked.*/ - if (c->state & CLASS_LINKED) { + if ((c->state & CLASS_LINKING) || (c->state & CLASS_LINKED)) { LOCK_MONITOR_EXIT(c); return c; @@ -371,9 +440,10 @@ classinfo *link_class(classinfo *c) r = link_class_intern(c); - /* if return value is NULL, we had a problem and the class is not linked */ + /* If return value is NULL, we had a problem and the class is not + linked. */ - if (!r) + if (r == NULL) c->state &= ~CLASS_LINKING; #if defined(ENABLE_STATISTICS) @@ -419,8 +489,8 @@ static bool linker_overwrite_method(methodinfo *mg, classinfo *cg; classinfo *cs; - cg = mg->class; - cs = ms->class; + cg = mg->clazz; + cs = ms->clazz; /* overriding a final method is illegal */ @@ -453,6 +523,15 @@ static bool linker_overwrite_method(methodinfo *mg, if ((ms->flags & ACC_METHOD_IMPLEMENTED) && ms->name != utf_init) { do { + +#if defined(ENABLE_TLH) + if (mg->flags & ACC_METHOD_MONOMORPHY_USED) { + printf("%s/%s is evil! the siner is %s/%s\n", mg->clazz->name->text, mg->name->text, + ms->clazz->name->text, ms->name->text); + ms->flags |= ACC_METHOD_PARENT_MONOMORPHY_USED; + } +#endif + if (mg->flags & ACC_METHOD_IMPLEMENTED) { /* this adds another implementation */ @@ -507,21 +586,17 @@ static classinfo *link_class_intern(classinfo *c) RT_TIMING_GET_TIME(time_start); - /* the class is already linked */ - - if (c->state & CLASS_LINKED) - return c; - -#if !defined(NDEBUG) - if (linkverbose) - log_message_class("Linking class: ", c); -#endif + TRACELINKCLASS(c); /* the class must be loaded */ /* XXX should this be a specific exception? */ assert(c->state & CLASS_LOADED); + /* This is check in link_class. */ + + assert(!(c->state & CLASS_LINKED)); + /* cache the self-reference of this class */ /* we do this for cases where the defining loader of the class */ /* has not yet been recorded as an initiating loader for the class */ @@ -539,30 +614,10 @@ static classinfo *link_class_intern(classinfo *c) arraydesc = NULL; worklist = NULL; - /* check interfaces */ + /* Link the super interfaces. */ for (i = 0; i < c->interfacescount; i++) { - /* resolve this super interface */ - - if ((tc = resolve_classref_or_classinfo_eager(c->interfaces[i], true)) == NULL) - return NULL; - - c->interfaces[i].cls = tc; - - /* detect circularity */ - - if (tc == c) { - exceptions_throw_classcircularityerror(c); - return NULL; - } - - assert(tc->state & CLASS_LOADED); - - if (!(tc->flags & ACC_INTERFACE)) { - exceptions_throw_incompatibleclasschangeerror(tc, - "Implementing class"); - return NULL; - } + tc = c->interfaces[i]; if (!(tc->state & CLASS_LINKED)) if (!link_class(tc)) @@ -573,46 +628,22 @@ static classinfo *link_class_intern(classinfo *c) super = NULL; - if (c->super.any == NULL) { /* class java.lang.Object */ + /* Check for java/lang/Object. */ + + if (c->super == NULL) { c->index = 0; c->instancesize = sizeof(java_object_t); vftbllength = supervftbllength = 0; c->finalizer = NULL; + } + else { + /* Get super class. */ - } else { - /* resolve super class */ - - if ((super = resolve_classref_or_classinfo_eager(c->super, true)) == NULL) - return NULL; - - c->super.cls = super; - - /* detect circularity */ - - if (super == c) { - exceptions_throw_classcircularityerror(c); - return NULL; - } - - assert(super->state & CLASS_LOADED); - - if (super->flags & ACC_INTERFACE) { - /* java.lang.IncompatibleClassChangeError: class a has interface java.lang.Cloneable as super class */ - log_text("Interface specified as super class"); - assert(0); - } - - /* Don't allow extending final classes */ - - if (super->flags & ACC_FINAL) { - exceptions_throw_verifyerror(NULL, - "Cannot inherit from final class"); - return NULL; - } + super = c->super; - /* link the superclass if necessary */ + /* Link the super class if necessary. */ if (!(super->state & CLASS_LINKED)) if (!link_class(super)) @@ -676,7 +707,7 @@ static classinfo *link_class_intern(classinfo *c) } } - tc = tc->super.cls; + tc = tc->super; } notfoundvftblindex: @@ -706,7 +737,7 @@ static classinfo *link_class_intern(classinfo *c) /* check all interfaces of the abstract class */ for (i = 0; i < c->interfacescount; i++) { - ic = c->interfaces[i].cls; + ic = c->interfaces[i]; for (j = 0; j < ic->methodscount; j++) { im = &(ic->methods[j]); @@ -716,7 +747,7 @@ static classinfo *link_class_intern(classinfo *c) if ((im->name == utf_clinit) || (im->name == utf_init)) continue; - for (tc = c; tc != NULL; tc = tc->super.cls) { + for (tc = c; tc != NULL; tc = tc->super) { for (k = 0; k < tc->methodscount; k++) { if (method_canoverwrite(im, &(tc->methods[k]))) goto noabstractmethod; @@ -739,7 +770,7 @@ static classinfo *link_class_intern(classinfo *c) c->methodscount + abstractmethodscount); for (i = 0; i < c->interfacescount; i++) { - ic = c->interfaces[i].cls; + ic = c->interfaces[i]; for (j = 0; j < ic->methodscount; j++) { im = &(ic->methods[j]); @@ -749,7 +780,7 @@ static classinfo *link_class_intern(classinfo *c) if ((im->name == utf_clinit) || (im->name == utf_init)) continue; - for (tc = c; tc != NULL; tc = tc->super.cls) { + for (tc = c; tc != NULL; tc = tc->super) { for (k = 0; k < tc->methodscount; k++) { if (method_canoverwrite(im, &(tc->methods[k]))) goto noabstractmethod2; @@ -765,7 +796,7 @@ static classinfo *link_class_intern(classinfo *c) MCOPY(am, im, methodinfo, 1); am->vftblindex = (vftbllength++); - am->class = c; + am->clazz = c; am->flags |= ACC_MIRANDA; noabstractmethod2: @@ -787,9 +818,9 @@ static classinfo *link_class_intern(classinfo *c) interfacetablelength = 0; - for (tc = c; tc != NULL; tc = tc->super.cls) { + for (tc = c; tc != NULL; tc = tc->super) { for (i = 0; i < tc->interfacescount; i++) { - s4 h = class_highestinterface(tc->interfaces[i].cls) + 1; + s4 h = class_highestinterface(tc->interfaces[i]) + 1; if (h > interfacetablelength) interfacetablelength = h; @@ -806,7 +837,7 @@ static classinfo *link_class_intern(classinfo *c) (interfacetablelength - 1) * (interfacetablelength > 1)); c->vftbl = v; - v->class = c; + v->clazz = c; v->vftbllength = vftbllength; v->interfacetablelength = interfacetablelength; v->arraydesc = arraydesc; @@ -883,16 +914,25 @@ static classinfo *link_class_intern(classinfo *c) if (!(f->flags & ACC_STATIC)) { dsize = descriptor_typesize(f->parseddesc); -#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__)) || (defined(__POWERPC__) && defined(__DARWIN__)) - /* On i386 and ARM we align double and s8 fields to - 4-bytes. This matches what GCC does for struct - members. We must do the same as gcc here because the - offsets in native header structs like java_lang_Double - must match the offsets of the Java fields - (eg. java.lang.Double.value). */ +#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__)) || (defined(__POWERPC__) && defined(__DARWIN__)) || defined(__M68K__) + /* On some architectures and configurations we need to + align long (int64_t) and double fields to 4-bytes to + match what GCC does for struct members. We must do the + same as GCC here because the offsets in native header + structs like java_lang_Double must match the offsets of + the Java fields (eg. java.lang.Double.value). */ + +# if LINKER_ALIGNMENT_LONG_DOUBLE != 4 +# error alignment of long and double is not 4 +# endif c->instancesize = MEMORY_ALIGN(c->instancesize, 4); #else + +# if LINKER_ALIGNMENT_LONG_DOUBLE != 8 +# error alignment of long and double is not 8 +# endif + c->instancesize = MEMORY_ALIGN(c->instancesize, dsize); #endif @@ -918,9 +958,9 @@ static classinfo *link_class_intern(classinfo *c) /* add interfaces */ - for (tc = c; tc != NULL; tc = tc->super.cls) + for (tc = c; tc != NULL; tc = tc->super) for (i = 0; i < tc->interfacescount; i++) - if (!linker_addinterface(c, tc->interfaces[i].cls)) + if (!linker_addinterface(c, tc->interfaces[i])) return NULL; RT_TIMING_GET_TIME(time_fill_iftbl); @@ -964,11 +1004,6 @@ static classinfo *link_class_intern(classinfo *c) FREE(wi, method_worklist); } -#if !defined(NDEBUG) - if (linkverbose) - log_message_class("Linking done class: ", c); -#endif - RT_TIMING_TIME_DIFF(time_start ,time_resolving ,RT_TIMING_LINK_RESOLVE); RT_TIMING_TIME_DIFF(time_resolving ,time_compute_vftbl,RT_TIMING_LINK_C_VFTBL); RT_TIMING_TIME_DIFF(time_compute_vftbl,time_abstract ,RT_TIMING_LINK_ABSTRACT); @@ -1150,18 +1185,14 @@ static void linker_compute_subclasses(classinfo *c) { LOCK_MONITOR_ENTER(linker_classrenumber_lock); -#if 0 && defined(ENABLE_THREADS) && !defined(DISABLE_GC) - threads_stopworld(); -#endif - if (!(c->flags & ACC_INTERFACE)) { c->nextsub = NULL; c->sub = NULL; } - if (!(c->flags & ACC_INTERFACE) && (c->super.any != NULL)) { - c->nextsub = c->super.cls->sub; - c->super.cls->sub = c; + if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) { + c->nextsub = c->super->sub; + c->super->sub = c; } classvalue = 0; @@ -1171,10 +1202,6 @@ static void linker_compute_subclasses(classinfo *c) linker_compute_class_values(class_java_lang_Object); LOCK_MONITOR_EXIT(linker_classrenumber_lock); - -#if 0 && defined(ENABLE_THREADS) && !defined(DISABLE_GC) - threads_startworld(); -#endif } @@ -1248,7 +1275,7 @@ static bool linker_addinterface(classinfo *c, classinfo *ic) #endif for (j = 0; j < ic->methodscount; j++) { - for (sc = c; sc != NULL; sc = sc->super.cls) { + for (sc = c; sc != NULL; sc = sc->super) { for (k = 0; k < sc->methodscount; k++) { m = &(sc->methods[k]); @@ -1305,7 +1332,7 @@ static bool linker_addinterface(classinfo *c, classinfo *ic) /* add superinterfaces of this interface */ for (j = 0; j < ic->interfacescount; j++) - if (!linker_addinterface(c, ic->interfaces[j].cls)) + if (!linker_addinterface(c, ic->interfaces[j])) return false; /* everything ok */ @@ -1332,7 +1359,7 @@ static s4 class_highestinterface(classinfo *c) h = c->index; for (i = 0; i < c->interfacescount; i++) { - h2 = class_highestinterface(c->interfaces[i].cls); + h2 = class_highestinterface(c->interfaces[i]); if (h2 > h) h = h2;