classinfo: changed type of super and interfaces to classref_or_classinfo
authoredwin <none@none>
Sat, 2 Apr 2005 00:43:25 +0000 (00:43 +0000)
committeredwin <none@none>
Sat, 2 Apr 2005 00:43:25 +0000 (00:43 +0000)
fixed some warnings

18 files changed:
src/native/jni.c
src/native/native.c
src/native/vm/VMClass.c
src/vm/class.c
src/vm/class.h
src/vm/classcache.c
src/vm/descriptor.c
src/vm/jit/inline/parseRT.c
src/vm/jit/inline/parseRTstats.c
src/vm/jit/inline/parseXTA.c
src/vm/jit/verify/typecheck.c
src/vm/jit/verify/typeinfo.c
src/vm/jit/verify/typeinfo.h
src/vm/linker.c
src/vm/loader.c
src/vm/loader.h
src/vm/method.c
src/vm/resolve.c

index fcfd94075fdb1b50597213d54fee63adc6cc519e..5257f8dc65c928354746eddb64dc46b0a4ab477a 100644 (file)
@@ -31,7 +31,7 @@
             Martin Platter
             Christian Thalinger
 
-   $Id: jni.c 2183 2005-04-01 20:57:17Z edwin $
+   $Id: jni.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -557,7 +557,7 @@ static fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
                        return &(c->fields[i]);
                }
 
-       if (c->super) return jclass_findfield(c->super,name,desc);
+       if (c->super.cls) return jclass_findfield(c->super.cls,name,desc);
 
        return NULL;
 }
@@ -658,7 +658,7 @@ jclass GetSuperclass(JNIEnv *env, jclass sub)
 {
        classinfo *c;
 
-       c = ((classinfo *) sub)->super;
+       c = ((classinfo *) sub)->super.cls;
 
        if (!c)
                return NULL;
@@ -994,13 +994,13 @@ jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
 
 jclass GetObjectClass(JNIEnv *env, jobject obj)
 {
+       classinfo *c;
+       
        if (!obj || !obj->vftbl)
                return NULL;
 
-       classinfo *c = obj->vftbl->class;
-
+       c = obj->vftbl->class;
        use_class_as_object(c);
-
        return c;
 }
 
index 016ad9f3d3df0a9e5a0258e6096a4f642181c61a..5eec7e1e66466304b0c39cfb16df8ee0360e2e77 100644 (file)
@@ -30,7 +30,7 @@
 
    Changes: Christian Thalinger
 
-   $Id: native.c 2183 2005-04-01 20:57:17Z edwin $
+   $Id: native.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -588,6 +588,7 @@ java_objectarray* get_parametertypes(methodinfo *m)
                if (!resolve_class_from_typedesc(descr->paramtypes + i,false,
                                        (classinfo **) (result->data + i)))
                        return NULL; /* exception */
+               use_class_as_object((classinfo*) result->data[i]);
        }
 
     return result;
@@ -633,6 +634,8 @@ classinfo *get_returntype(methodinfo *m)
 
        if (!resolve_class_from_typedesc(&(m->parseddesc->returntype),false,&cls))
                return NULL; /* exception */
+
+       use_class_as_object(cls);
        return cls;
 }
 
@@ -782,13 +785,13 @@ java_objectarray *builtin_asm_createclasscontextarray(classinfo **end, classinfo
                        class_new(utf_new_char("java/lang/SecurityManager"));
 
        if (size > 0) {
-               if (start == class_java_lang_SecurityManager) {
+               if (*start == class_java_lang_SecurityManager) {
                        size--;
                        start--;
                }
        }
 
-       tmpArray =
+       tmpArray = (java_objectarray*)
                builtin_newarray(size, class_array_of(class_java_lang_Class)->vftbl);
 
        for(i = 0, current = start; i < size; i++, current--) {
@@ -824,7 +827,7 @@ java_lang_ClassLoader *builtin_asm_getclassloader(classinfo **end, classinfo **s
                        class_new(utf_new_char("java/lang/SecurityManager"));
 
        if (size > 0) {
-               if (start == class_java_lang_SecurityManager) {
+               if (*start == class_java_lang_SecurityManager) {
                        size--;
                        start--;
                }
index b51412b19e75493a950a35bf81cb38bc317edb21..8b2a4f617a8e4ca0e852763b560abd6c0b96fbdc 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Joseph Wenninger
             Christian Thalinger
 
-   $Id: VMClass.c 2183 2005-04-01 20:57:17Z edwin $
+   $Id: VMClass.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -315,10 +315,8 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIE
 java_lang_reflect_Field* cacao_getField0(JNIEnv *env, java_lang_Class *that, java_lang_String *name, s4 public_only)
 {
     classinfo *c;
-       classinfo *fieldtype;
     fieldinfo *f;               /* the field to be represented */
     java_lang_reflect_Field *o; /* result: field-object */
-    utf *desc;                         /* the fielddescriptor */
     int idx;
 
     /* create Field object */
@@ -418,9 +416,9 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv
                return NULL;
 
        for (i = 0; i < c->interfacescount; i++) {
-               use_class_as_object(c->interfaces[i]);
+               use_class_as_object(c->interfaces[i].cls);
 
-               a->data[i] = (java_objectheader *) c->interfaces[i];
+               a->data[i] = (java_objectheader *) c->interfaces[i].cls;
        }
 
        return a;
@@ -694,7 +692,7 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMClass_getBeautifiedName(JNI
 JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, java_lang_Class *that)
 {
        classinfo *cl = (classinfo *) that;
-       classinfo *c = cl->super;
+       classinfo *c = cl->super.cls;
 
        if (!c)
                return NULL;
@@ -730,7 +728,8 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass
                return 0;
        }
 
-       return builtin_isanysubclass(sup, that);
+       /* XXX this may be wrong for array classes */
+       return builtin_isanysubclass((classinfo*)sup, (classinfo*)that);
 
 }
 
@@ -742,7 +741,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass
  */
 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, java_lang_Class *that, java_lang_Object *obj)
 {
-       return builtin_instanceof(obj, that);
+       return builtin_instanceof((java_objectheader*)obj, (classinfo*)that);
 }
 
 
@@ -820,7 +819,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_loadArrayClass(JNIEnv
 
        /* set the classloader */
 
-       c->classloader = classloader;
+       c->classloader = (java_objectheader*) classloader; /* XXX is this correct? */
 
        use_class_as_object(c);
 
index 23193e2d64b975c136f6186076db285fdedc2f6c..dfaafc8c19b89a2fbaed080c6c9e83711235a9e6 100644 (file)
@@ -30,7 +30,7 @@
             Andreas Krall
             Christian Thalinger
 
-   $Id: class.c 2181 2005-04-01 16:53:33Z edwin $
+   $Id: class.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -302,7 +302,7 @@ classinfo *class_new_intern(utf *classname)
        c->classrefcount = 0;
        c->parseddescs = NULL;
        c->parseddescsize = 0;
-       c->super = NULL;
+       c->super.any = NULL;
        c->sub = NULL;
        c->nextsub = NULL;
        c->interfacescount = 0;
index cdd22692e7995c600551b5602a56ec5e631db160..942b690cf12b5841449ecd30ce28d2b1e1491eb7 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: class.h 2181 2005-04-01 16:53:33Z edwin $
+   $Id: class.h 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -77,12 +77,12 @@ struct classinfo {                /* class structure                          */
        s4          parseddescsize;   /* size of the parsed descriptors block     */
        u1         *parseddescs;      /* parsed descriptors                       */
 
-       classinfo  *super;            /* super class pointer                      */
+       classref_or_classinfo super;  /* super class                              */
        classinfo  *sub;              /* sub class pointer                        */
        classinfo  *nextsub;          /* pointer to next class in sub class list  */
 
        s4          interfacescount;  /* number of interfaces                     */
-       classinfo **interfaces;       /* pointer to interfaces                    */
+       classref_or_classinfo *interfaces; /* superinterfaces                     */
 
        s4          fieldscount;      /* number of fields                         */
        fieldinfo  *fields;           /* field table                              */
index 401ccb74579966b3c10e78cd3e32f4bfc2ccd620..5fb5101869fba462ef7e84638a1dd4d429631d3c 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: classcache.c 2181 2005-04-01 16:53:33Z edwin $
+   $Id: classcache.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -46,6 +46,8 @@
 /* DEBUG HELPERS                                                              */
 /*============================================================================*/
 
+/*#define CLASSCACHE_VERBOSE*/
+
 #ifndef NDEBUG
 #define CLASSCACHE_DEBUG
 #endif
@@ -637,8 +639,8 @@ classcache_add_constraint(classloader *a,classloader *b,utf *classname)
 
        CLASSCACHE_ASSERT(classname);
 
-#ifdef CLASSCACHE_DEBUG
-       fprintf(stderr,"classcache_add_constraint(%p,%p,",a,b);
+#ifdef CLASSCACHE_VERBOSE
+       fprintf(stderr,"classcache_add_constraint(%p,%p,",(void*)a,(void*)b);
        utf_fprint_classname(stderr,classname);
        fprintf(stderr,")\n");
 #endif
index 8510ca236924afe0544d3922ffd841ff12ce5b17..c68d1ac351c010e3d3c84dfa433f25cdd7f92ac8 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: descriptor.c 2182 2005-04-01 20:56:33Z edwin $
+   $Id: descriptor.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -910,7 +910,7 @@ descriptor_pool_debug_dump(descriptor_pool *pool,FILE *file)
        fprintf(file,"classrefcount:  %d\n",pool->classrefhash.entries);
        fprintf(file,"descriptorsize: %d bytes\n",pool->descriptorsize);
        fprintf(file,"classrefsize:   %d bytes\n",
-                       (int)pool->classrefhash.entries * sizeof(constant_classref));
+                       (int)(pool->classrefhash.entries * sizeof(constant_classref)));
 
        fprintf(file,"class references:\n");
        for (slot=0; slot<pool->classrefhash.size; ++slot) {
index d6280abd4325d9338896898744f440cbc5a6fc5a..259008b8abb14ed07b0a8045a9ee7d68b5c4c5fb 100644 (file)
@@ -27,7 +27,7 @@
 
    Authors: Carolyn Oates
 
-   $Id: parseRT.c 2184 2005-04-01 21:19:05Z edwin $
+   $Id: parseRT.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -102,8 +102,8 @@ if (!(meth->flags & ACC_ABSTRACT))  {
     count_methods_marked_used++;
 #endif
     METHINFOt(meth,info,RTA_DEBUGopcodes)
-       if (meth->class->super != NULL) {
-               CLASSNAME(meth->class->super,"\tsuper=",RTA_DEBUGr)
+       if (meth->class->super.cls != NULL) {
+               CLASSNAME(meth->class->super.cls,"\tsuper=",RTA_DEBUGr)
                }
        else {
                if (RTA_DEBUGr) printf("\tsuper=NULL\n");}
@@ -136,7 +136,7 @@ void rtaAddUsedInterfaceMethods(classinfo *ci) {
 
        /* add used interfaces methods to callgraph */
        for (jj=0; jj < ci -> interfacescount; jj++) {
-               classinfo *ici = ci -> interfaces [jj];
+               classinfo *ici = ci -> interfaces [jj].cls;
        
                if (RTA_DEBUGinf) { 
                        printf("BInterface used: ");fflush(stdout); 
@@ -200,7 +200,7 @@ for (ii=0; ii<ci->methodscount; ii++) {
                }
        else    { /*** ??? Should this be an else or ??? */
                for (jj=0; jj < ci -> interfacescount; jj++) {
-                       classinfo *ici = ci -> interfaces [jj];
+                       classinfo *ici = ci -> interfaces [jj].cls;
                        /*  use resolve method....!!!! */
                        if (ici -> classUsed != NOTUSED) {
                                for (mm=0; mm< ici->methodscount; mm++) {
@@ -600,7 +600,7 @@ if ((RTA_DEBUGr)||(RTA_DEBUGopcodes)) printf("\n");
                                                /*--- <init>  ()V  is equivalent to "new" 
                                                indicating a class is used = instaniated ---- */        
                                                if (utf_init==mi->name) {
-                                                       if ((m->class->super == mi->class) 
+                                                       if ((m->class->super.cls == mi->class) 
                                                        &&  (m->descriptor == utf_void__void) ) 
                                                                {
                                                                METHINFOt(mi,"SUPER INIT:",RTA_DEBUGopcodes);
index dc83c880878a4392b0133242bb9bf5928f35f110..c8e4d6efb877756e02e883e6a00b391a6c4721fa 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Carolyn Oates
 
-   $Id: parseRTstats.c 2017 2005-03-09 11:37:33Z twisti $
+   $Id: parseRTstats.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -172,7 +172,7 @@ classinfo  *s;
 
   if (class == NULL) {return;}
   CLASSINFO(class,"CLASS: ");
-  for (s = class->super; s != NULL; s = s->super) {
+  for (s = class->super.cls; s != NULL; s = s->super.cls) {
     CLASSINFO(s,"SUPER:: ");
     }
 
index d199e45b98e1fc81e070ca8f620956a2b5ac09fd..66172f326faeed30f8b364ca3b053d9a1b1c1276 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 2185 2005-04-01 21:24:49Z edwin $
+   $Id: parseXTA.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -884,7 +884,7 @@ for (ii=0; ii<ci->methodscount; ii++) {
 
                else    { /* NOT XTA checked yet */
                        for (jj=0; jj < ci -> interfacescount; jj++) {
-                               classinfo *ici = ci -> interfaces [jj];
+                               classinfo *ici = ci -> interfaces [jj].cls;
                                /*  use resolve method....!!!! */
                                if (ici -> classUsed != NOTUSED) {
                                        for (mm=0; mm< ici->methodscount; mm++) {
@@ -912,7 +912,7 @@ void xtaAddUsedInterfaceMethods(methodinfo *m, classinfo *ci) {
 
        /* add used interfaces methods to callgraph */
        for (jj=0; jj < ci -> interfacescount; jj++) {
-               classinfo *ici = ci -> interfaces [jj];
+               classinfo *ici = ci -> interfaces [jj].cls;
        
                if (XTA_DEBUGinf) { 
                        printf("BInterface used: ");fflush(stdout); 
@@ -1293,7 +1293,7 @@ printf(" GETSTATIC:");fflush(stdout); utf_display(fi->class->name);printf(".");f
                                                /*--- <init>  ()V  is equivalent to "new" 
                                                        indicating a class is used = instaniated ---- */        
                                                if (utf_init==mi->name) {
-                                                       if ((m->class->super == mi->class) 
+                                                       if ((m->class->super.cls == mi->class) 
                                                        &&  (m->descriptor == utf_void__void) ) 
                                                                {
                                                                METHINFOt(mi,"SUPER INIT:",XTA_DEBUGopcodes);
index b2dedc93966e3ec571bb12e260f2be3341c3e6c6..bfcc9979ae1f71ec648b3aef6dd5e6137e1c5762 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Edwin Steiner
 
-   $Id: typecheck.c 2181 2005-04-01 16:53:33Z edwin $
+   $Id: typecheck.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -1759,7 +1759,7 @@ methodinfo *typecheck(methodinfo *m, codegendata *cd, registerdata *rd)
                                   if (!ins) {
                                                                          TYPECHECK_ASSERT(initmethod);
                                                                          /* must be <init> of current class or direct superclass */
-                                                                         if (mi->class != m->class && mi->class != m->class->super)
+                                                                         if (mi->class != m->class && mi->class != m->class->super.cls)
                                                                                  panic("<init> calling <init> of the wrong class");
                                                                          
                                       /* set our marker variable to type int */
index 3f182bb0f18e060fc83249ea9e40e76156b87a90..3910cfe3d099209fa179a5410ff987e9205373c7 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Edwin Steiner
 
-   $Id: typeinfo.c 2182 2005-04-01 20:56:33Z edwin $
+   $Id: typeinfo.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -375,16 +375,17 @@ interface_extends_interface(classinfo *cls,classinfo *interf)
        TYPEINFO_ASSERT(interf);
        TYPEINFO_ASSERT((interf->flags & ACC_INTERFACE) != 0);
        TYPEINFO_ASSERT((cls->flags & ACC_INTERFACE) != 0);
+       TYPEINFO_ASSERT(cls->linked);
 
     /* first check direct superinterfaces */
     for (i=0; i<cls->interfacescount; ++i) {
-        if (cls->interfaces[i] == interf)
+        if (cls->interfaces[i].cls == interf)
             return true;
     }
     
     /* check indirect superinterfaces */
     for (i=0; i<cls->interfacescount; ++i) {
-        if (interface_extends_interface(cls->interfaces[i],interf))
+        if (interface_extends_interface(cls->interfaces[i].cls,interf))
             return true;
     }
     
@@ -912,6 +913,7 @@ static
 bool
 typeinfo_merge_two(typeinfo *dest,classref_or_classinfo clsx,classref_or_classinfo clsy)
 {
+       TYPEINFO_ASSERT(dest);
     TYPEINFO_FREEMERGED_IF_ANY(dest->merged);
     TYPEINFO_ALLOCMERGED(dest->merged,2);
     dest->merged->count = 2;
@@ -1109,26 +1111,6 @@ typeinfo_merge_nonarrays(typeinfo *dest,
        TYPEINFO_ASSERT(x.cls != pseudo_class_New);
        TYPEINFO_ASSERT(y.cls != pseudo_class_New);
 
-#ifdef XXX
-       /* check clsx */
-       if (!clsx->loaded)
-               if (!load_class_bootstrap(clsx))
-                       return false;
-
-       if (!clsx->linked)
-               if (!link_class(clsx))
-                       return false;
-
-       /* check clsy */
-       if (!clsy->loaded)
-               if (!load_class_bootstrap(clsy))
-                       return false;
-
-       if (!clsy->linked)
-               if (!link_class(clsy))
-                       return false;
-#endif
-
        /*--------------------------------------------------*/
        /* common cases                                     */
        /*--------------------------------------------------*/
@@ -1164,10 +1146,19 @@ 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;
                fprintf(stderr,"merge_nonarrays:\n");
+               fprintf(stderr,"    ");if(IS_CLASSREF(x))fprintf(stderr,"<ref>");utf_fprint(stderr,xname);fprintf(stderr,"\n");
+               fprintf(stderr,"    ");if(IS_CLASSREF(y))fprintf(stderr,"<ref>");utf_fprint(stderr,yname);fprintf(stderr,"\n");
+               fflush(stderr);
                TYPEINFO_INIT_CLASSREF_OR_CLASSINFO(dbgx,x);
                dbgx.merged = mergedx;
                TYPEINFO_INIT_CLASSREF_OR_CLASSINFO(dbgy,y);
@@ -1178,6 +1169,9 @@ typeinfo_merge_nonarrays(typeinfo *dest,
        }
 #endif
 
+       TYPEINFO_ASSERT(IS_CLASSREF(x) || x.cls->loaded);
+       TYPEINFO_ASSERT(IS_CLASSREF(y) || y.cls->loaded);
+
     /* If y is unresolved or an interface, swap x and y. */
     if (IS_CLASSREF(y) || (!IS_CLASSREF(x) && y.cls->flags & ACC_INTERFACE))
        {
@@ -1204,6 +1198,10 @@ typeinfo_merge_nonarrays(typeinfo *dest,
        /* {We know: both x and y are resolved} */
     /* {We know: If only one of x,y is an interface it is x.} */
 
+       TYPEINFO_ASSERT(!IS_CLASSREF(x) && !IS_CLASSREF(y));
+       TYPEINFO_ASSERT(x.cls->loaded);
+       TYPEINFO_ASSERT(y.cls->loaded);
+
     /* Handle merging of interfaces: */
     if (x.cls->flags & ACC_INTERFACE) {
         /* {x.cls is an interface and mergedx == NULL.} */
@@ -1224,12 +1222,20 @@ typeinfo_merge_nonarrays(typeinfo *dest,
             x = y;
             goto return_simple_x;
         }
-            
 
         /* If the type y implements x then the result of the merge
          * is x regardless of mergedy.
          */
+
+               /* we may have to link the classes */
+               if (!x.cls->linked)
+                       link_class(x.cls); /* XXX */
+               if (!y.cls->linked)
+                       link_class(y.cls); /* XXX */
         
+               TYPEINFO_ASSERT(x.cls->linked);
+               TYPEINFO_ASSERT(y.cls->linked);
+
         if (CLASSINFO_IMPLEMENTS_INTERFACE(y.cls,x.cls->index)
             || mergedlist_implements_interface(mergedy,x.cls))
         {
@@ -1252,6 +1258,15 @@ typeinfo_merge_nonarrays(typeinfo *dest,
 
     /* {We know: x and y are classes (not interfaces).} */
     
+       /* we may have to link the classes */
+       if (!x.cls->linked)
+               link_class(x.cls); /* XXX */
+       if (!y.cls->linked)
+               link_class(y.cls); /* XXX */
+        
+       TYPEINFO_ASSERT(x.cls->linked);
+       TYPEINFO_ASSERT(y.cls->linked);
+
     /* If *x is deeper in the inheritance hierarchy swap x and y. */
     if (x.cls->index > y.cls->index) {
         t = x; x = y; y = t;
@@ -1264,10 +1279,10 @@ typeinfo_merge_nonarrays(typeinfo *dest,
     common = x.cls;
     tcls = y.cls;
     while (tcls->index > common->index)
-        tcls = tcls->super;
+        tcls = tcls->super.cls;
     while (common != tcls) {
-        common = common->super;
-        tcls = tcls->super;
+        common = common->super.cls;
+        tcls = tcls->super.cls;
     }
 
     /* {common == nearest common anchestor of x and y.} */
index 4601b56db42c29d2d34282f3ea70799a26c04e3b..c00d78dc4681d29b480ebc31f7044843e4e02589 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Edwin Steiner
 
-   $Id: typeinfo.h 2181 2005-04-01 16:53:33Z edwin $
+   $Id: typeinfo.h 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -428,7 +428,7 @@ struct typevector {
              (info).elementtype = 0;} while(0)
 
 #define TYPEINFO_INIT_NULLTYPE(info)                            \
-            TYPEINFO_INIT_CLASSINFO(info,pseudo_class_Null)
+            TYPEINFO_INIT_NON_ARRAY_CLASSINFO(info,pseudo_class_Null)
 
 #define TYPEINFO_INIT_NEWOBJECT(info,instr)             \
          do {(info).typeclass.cls = pseudo_class_New;   \
index ffbf8c947ca5736b7c8d0d82affc28e9a0e78ef7..2ba7652baefbbeb81a3936b1c38146c9de763cd3 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: linker.c 2182 2005-04-01 20:56:33Z edwin $
+   $Id: linker.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -154,11 +154,11 @@ bool linker_init(void)
     /* pseudo class for Arraystubs (extends java.lang.Object) */
     
        pseudo_class_Arraystub->loaded = true;
-    pseudo_class_Arraystub->super = class_java_lang_Object;
+    pseudo_class_Arraystub->super.cls = class_java_lang_Object;
     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;
+    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;
 
     if (!link_class(pseudo_class_Arraystub))
                return false;
@@ -166,7 +166,7 @@ bool linker_init(void)
     /* pseudo class representing the null type */
     
        pseudo_class_Null->loaded = true;
-    pseudo_class_Null->super = class_java_lang_Object;
+    pseudo_class_Null->super.cls = class_java_lang_Object;
 
        if (!link_class(pseudo_class_Null))
                return false;
@@ -174,8 +174,8 @@ bool linker_init(void)
     /* pseudo class representing new uninitialized objects */
     
        pseudo_class_New->loaded = true;
-       pseudo_class_New->linked = true;
-       pseudo_class_New->super = class_java_lang_Object;
+       pseudo_class_New->linked = true; /* XXX is this allright? */
+       pseudo_class_New->super.cls = class_java_lang_Object;
 
 
        /* create classes representing primitive types */
@@ -345,7 +345,7 @@ static classinfo *link_class_intern(classinfo *c)
        /* check interfaces */
 
        for (i = 0; i < c->interfacescount; i++) {
-               tc = c->interfaces[i];
+               tc = c->interfaces[i].cls;
 
                /* detect circularity */
 
@@ -374,7 +374,7 @@ static classinfo *link_class_intern(classinfo *c)
        
        /* check super class */
 
-       super = c->super;
+       super = c->super.cls;
 
        if (super == NULL) {          /* class java.lang.Object */
                c->index = 0;
@@ -462,7 +462,7 @@ static classinfo *link_class_intern(classinfo *c)
                                        }
                                }
 
-                               tc = tc->super;
+                               tc = tc->super.cls;
                        }
 
                notfoundvftblindex:
@@ -485,7 +485,7 @@ static classinfo *link_class_intern(classinfo *c)
                abstractmethodscount = 0;
 
                for (i = 0; i < c->interfacescount; i++) {
-                       ic = c->interfaces[i];
+                       ic = c->interfaces[i].cls;
 
                        for (j = 0; j < ic->methodscount; j++) {
                                im = &(ic->methods[j]);
@@ -503,7 +503,7 @@ static classinfo *link_class_intern(classinfo *c)
                                                        goto noabstractmethod;
                                        }
 
-                                       tc = tc->super;
+                                       tc = tc->super.cls;
                                }
 
                                abstractmethodscount++;
@@ -522,7 +522,7 @@ static classinfo *link_class_intern(classinfo *c)
                                                                  c->methodscount + abstractmethodscount);
 
                        for (i = 0; i < c->interfacescount; i++) {
-                               ic = c->interfaces[i];
+                               ic = c->interfaces[i].cls;
 
                                for (j = 0; j < ic->methodscount; j++) {
                                        im = &(ic->methods[j]);
@@ -540,7 +540,7 @@ static classinfo *link_class_intern(classinfo *c)
                                                                goto noabstractmethod2;
                                                }
 
-                                               tc = tc->super;
+                                               tc = tc->super.cls;
                                        }
 
                                        am = &(c->methods[c->methodscount]);
@@ -571,11 +571,11 @@ static classinfo *link_class_intern(classinfo *c)
        tc = c;
        while (tc) {
                for (i = 0; i < tc->interfacescount; i++) {
-                       s4 h = class_highestinterface(tc->interfaces[i]) + 1;
+                       s4 h = class_highestinterface(tc->interfaces[i].cls) + 1;
                        if (h > interfacetablelength)
                                interfacetablelength = h;
                }
-               tc = tc->super;
+               tc = tc->super.cls;
        }
 
        /* allocate virtual function table */
@@ -659,9 +659,9 @@ static classinfo *link_class_intern(classinfo *c)
        
        /* add interfaces */
        
-       for (tc = c; tc != NULL; tc = tc->super)
+       for (tc = c; tc != NULL; tc = tc->super.cls)
                for (i = 0; i < tc->interfacescount; i++)
-                       linker_addinterface(c, tc->interfaces[i]);
+                       linker_addinterface(c, tc->interfaces[i].cls);
 
        /* add finalizer method (not for java.lang.Object) */
 
@@ -845,9 +845,9 @@ static void linker_compute_subclasses(classinfo *c)
                c->sub = 0;
        }
 
-       if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) {
-               c->nextsub = c->super->sub;
-               c->super->sub = c;
+       if (!(c->flags & ACC_INTERFACE) && (c->super.any != NULL)) {
+               c->nextsub = c->super.cls->sub;
+               c->super.cls->sub = c;
        }
 
        classvalue = 0;
@@ -941,7 +941,7 @@ static void linker_addinterface(classinfo *c, classinfo *ic)
                                                goto foundmethod;
                                        }
                                }
-                               sc = sc->super;
+                               sc = sc->super.cls;
                        }
                foundmethod:
                        ;
@@ -949,7 +949,7 @@ static void linker_addinterface(classinfo *c, classinfo *ic)
        }
 
        for (j = 0; j < ic->interfacescount; j++) 
-               linker_addinterface(c, ic->interfaces[j]);
+               linker_addinterface(c, ic->interfaces[j].cls);
 }
 
 
@@ -971,7 +971,7 @@ static s4 class_highestinterface(classinfo *c)
     h = c->index;
 
        for (i = 0; i < c->interfacescount; i++) {
-               h2 = class_highestinterface(c->interfaces[i]);
+               h2 = class_highestinterface(c->interfaces[i].cls);
 
                if (h2 > h)
                        h = h2;
index cf5466d2042693fdcabc317573599cf96ce11a6a..8c6aa8b72f4678bb5b5fc0025a1dae83b1619416 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 2182 2005-04-01 20:56:33Z edwin $
+   $Id: loader.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -638,17 +638,7 @@ void fprintflags (FILE *fp, u2 f)
 
 void printflags(u2 f)
 {
-   if ( f & ACC_PUBLIC )       printf (" PUBLIC");
-   if ( f & ACC_PRIVATE )      printf (" PRIVATE");
-   if ( f & ACC_PROTECTED )    printf (" PROTECTED");
-   if ( f & ACC_STATIC )       printf (" STATIC");
-   if ( f & ACC_FINAL )        printf (" FINAL");
-   if ( f & ACC_SYNCHRONIZED ) printf (" SYNCHRONIZED");
-   if ( f & ACC_VOLATILE )     printf (" VOLATILE");
-   if ( f & ACC_TRANSIENT )    printf (" TRANSIENT");
-   if ( f & ACC_NATIVE )       printf (" NATIVE");
-   if ( f & ACC_INTERFACE )    printf (" INTERFACE");
-   if ( f & ACC_ABSTRACT )     printf (" ABSTRACT");
+       fprintflags(stdout,f);
 }
 
 
@@ -2092,7 +2082,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
        
        /* retrieve superclass */
        if ((i = suck_u2(cb))) {
-               if (!(c->super = class_getconstant(c, i, CONSTANT_Class)))
+               if (!(c->super.cls = class_getconstant(c, i, CONSTANT_Class)))
                        goto return_exception;
 
                /* java.lang.Object may not have a super class. */
@@ -2106,7 +2096,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
 
                /* Interfaces must have java.lang.Object as super class. */
                if ((c->flags & ACC_INTERFACE) &&
-                       c->super->name != utf_java_lang_Object) {
+                       c->super.cls->name != utf_java_lang_Object) {
                        *exceptionptr =
                                new_exception_message(string_java_lang_ClassFormatError,
                                                                          "Interfaces must have java.lang.Object as superclass");
@@ -2115,7 +2105,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
                }
 
        } else {
-               c->super = NULL;
+               c->super.any = NULL;
 
                /* This is only allowed for java.lang.Object. */
                if (c->name != utf_java_lang_Object) {
@@ -2134,9 +2124,9 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
        if (!check_classbuffer_size(cb, 2 * c->interfacescount))
                goto return_exception;
 
-       c->interfaces = MNEW(classinfo*, c->interfacescount);
+       c->interfaces = MNEW(classref_or_classinfo, c->interfacescount);
        for (i = 0; i < c->interfacescount; i++) {
-               if (!(c->interfaces[i] = class_getconstant(c, suck_u2(cb), CONSTANT_Class)))
+               if (!(c->interfaces[i].cls = class_getconstant(c, suck_u2(cb), CONSTANT_Class)))
                        goto return_exception;
        }
 
@@ -2413,11 +2403,11 @@ void class_new_array(classinfo *c)
        }
 
        /* Setup the array class */
-       c->super = class_java_lang_Object;
+       c->super.cls = class_java_lang_Object;
        c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT;
 
     c->interfacescount = 2;
-    c->interfaces = MNEW(classinfo*, 2);
+    c->interfaces = MNEW(classref_or_classinfo, 2);
 
        if (opt_eager) {
                classinfo *tc;
@@ -2425,16 +2415,16 @@ void class_new_array(classinfo *c)
                tc = class_java_lang_Cloneable;
                load_class_bootstrap(tc);
                list_addfirst(&unlinkedclasses, tc);
-               c->interfaces[0] = tc;
+               c->interfaces[0].cls = tc;
 
                tc = class_java_io_Serializable;
                load_class_bootstrap(tc);
                list_addfirst(&unlinkedclasses, tc);
-               c->interfaces[1] = tc;
+               c->interfaces[1].cls = tc;
 
        } else {
-               c->interfaces[0] = class_java_lang_Cloneable;
-               c->interfaces[1] = class_java_io_Serializable;
+               c->interfaces[0].cls = class_java_lang_Cloneable;
+               c->interfaces[1].cls = class_java_io_Serializable;
        }
 
        c->methodscount = 1;
@@ -2521,15 +2511,15 @@ static fieldinfo *class_resolvefield_int(classinfo *c, utf *name, utf *desc)
        /* try superinterfaces recursively */
 
        for (i = 0; i < c->interfacescount; i++) {
-               fi = class_resolvefield_int(c->interfaces[i], name, desc);
+               fi = class_resolvefield_int(c->interfaces[i].cls, name, desc);
                if (fi)
                        return fi;
        }
 
        /* try superclass */
 
-       if (c->super)
-               return class_resolvefield_int(c->super, name, desc);
+       if (c->super.cls)
+               return class_resolvefield_int(c->super.cls, name, desc);
 
        /* not found */
 
@@ -2677,7 +2667,7 @@ methodinfo *class_resolvemethod_approx(classinfo *c, utf *name, utf *desc)
                /* method found */
                if (m) return m;
                /* search superclass */
-               c = c->super;
+               c = c->super.cls;
        }
 
        return NULL;
@@ -2700,7 +2690,7 @@ methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *desc)
                if (m)
                        return m;
 
-               c = c->super;
+               c = c->super.cls;
        }
 
        return NULL;
@@ -2727,7 +2717,7 @@ static methodinfo *class_resolveinterfacemethod_intern(classinfo *c,
        /* try the superinterfaces */
 
        for (i = 0; i < c->interfacescount; i++) {
-               m = class_resolveinterfacemethod_intern(c->interfaces[i], name, desc);
+               m = class_resolveinterfacemethod_intern(c->interfaces[i].cls, name, desc);
 
                if (m)
                        return m;
@@ -2820,13 +2810,13 @@ methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
                if (mi)
                        goto found;
 
-               cls = cls->super;
+               cls = cls->super.cls;
        }
 
        /* try the superinterfaces */
 
        for (i = 0; i < c->interfacescount; i++) {
-               mi = class_resolveinterfacemethod_intern(c->interfaces[i], name, desc);
+               mi = class_resolveinterfacemethod_intern(c->interfaces[i].cls, name, desc);
 
                if (mi)
                        goto found;
@@ -2876,7 +2866,7 @@ bool class_issubclass(classinfo *sub, classinfo *super)
        for (;;) {
                if (!sub) return false;
                if (sub == super) return true;
-               sub = sub->super;
+               sub = sub->super.cls;
        }
 }
 
@@ -2972,18 +2962,18 @@ static classinfo *class_init_intern(classinfo *c)
 
        /* initialize super class */
 
-       if (c->super) {
-               if (!c->super->initialized) {
+       if (c->super.cls) {
+               if (!c->super.cls->initialized) {
                        if (initverbose) {
                                char logtext[MAXLOGTEXT];
                                sprintf(logtext, "Initialize super class ");
-                               utf_sprint_classname(logtext + strlen(logtext), c->super->name);
+                               utf_sprint_classname(logtext + strlen(logtext), c->super.cls->name);
                                sprintf(logtext + strlen(logtext), " from ");
                                utf_sprint_classname(logtext + strlen(logtext), c->name);
                                log_text(logtext);
                        }
 
-                       if (!class_init(c->super))
+                       if (!class_init(c->super.cls))
                                return NULL;
                }
        }
@@ -2991,17 +2981,17 @@ static classinfo *class_init_intern(classinfo *c)
        /* initialize interface classes */
 
        for (i = 0; i < c->interfacescount; i++) {
-               if (!c->interfaces[i]->initialized) {
+               if (!c->interfaces[i].cls->initialized) {
                        if (initverbose) {
                                char logtext[MAXLOGTEXT];
                                sprintf(logtext, "Initialize interface class ");
-                               utf_sprint_classname(logtext + strlen(logtext), c->interfaces[i]->name);
+                               utf_sprint_classname(logtext + strlen(logtext), c->interfaces[i].cls->name);
                                sprintf(logtext + strlen(logtext), " from ");
                                utf_sprint_classname(logtext + strlen(logtext), c->name);
                                log_text(logtext);
                        }
                        
-                       if (!class_init(c->interfaces[i]))
+                       if (!class_init(c->interfaces[i].cls))
                                return NULL;
                }
        }
@@ -3249,16 +3239,16 @@ void class_showmethods (classinfo *c)
        printf ("Flags: ");     printflags (c->flags);  printf ("\n");
 
        printf ("This: "); utf_display (c->name); printf ("\n");
-       if (c->super) {
-               printf ("Super: "); utf_display (c->super->name); printf ("\n");
+       if (c->super.cls) {
+               printf ("Super: "); utf_display (c->super.cls->name); printf ("\n");
                }
        printf ("Index: %d\n", c->index);
        
        printf ("interfaces:\n");       
        for (i=0; i < c-> interfacescount; i++) {
                printf ("   ");
-               utf_display (c -> interfaces[i] -> name);
-               printf (" (%d)\n", c->interfaces[i] -> index);
+               utf_display (c -> interfaces[i].cls -> name);
+               printf (" (%d)\n", c->interfaces[i].cls -> index);
                }
 
        printf ("fields:\n");           
index 1aadc6764d6fb9ae521ae2e40a81a54d2be29877..fcff0aad7ac06c5c8f7587c84b680adbd0e7308b 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Reinhard Grafl
 
-   $Id: loader.h 2182 2005-04-01 20:56:33Z edwin $
+   $Id: loader.h 2186 2005-04-02 00:43:25Z edwin $
 */
 
 
@@ -209,6 +209,10 @@ classinfo *class_primitive_from_sig(char sig);
 /* (used by class_new, don't use directly) */
 void class_new_array(classinfo *c);
 
+/* debug helpers */
+void fprintflags(FILE *fp, u2 f);
+void printflags(u2 f);
+
 #endif /* _LOADER_H */
 
 
index 09d5220d388630ff20c1104d3e020310934602e0..89c3c843c6e12c453fa55ec14ec8c475bc9ef752 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: method.c 2184 2005-04-01 21:19:05Z edwin $
+   $Id: method.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -41,6 +41,7 @@
 #include "mm/memory.h"
 #include "vm/method.h"
 #include "vm/class.h"
+#include "vm/loader.h"
 #include "vm/jit/codegen.inc.h"
 
 
index a3bd99ee73e7a811a65efee01a2460020464d480..fba2e4bfd6ca65aef5d6bf87d3522c411d069c0c 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: resolve.c 2182 2005-04-01 20:56:33Z edwin $
+   $Id: resolve.c 2186 2005-04-02 00:43:25Z edwin $
 
 */
 
@@ -226,6 +226,12 @@ resolve_class_from_typedesc(typedesc *d,bool link,classinfo **result)
 
        *result = NULL;
 
+#ifdef RESOLVE_VERBOSE
+       fprintf(stderr,"resolve_class_from_typedesc(");
+       descriptor_debug_print_typedesc(stderr,d);
+       fprintf(stderr,",%i)\n",link);
+#endif
+
        if (d->classref) {
                /* a reference type */
                if (!resolve_classref_or_classinfo(NULL,CLASSREF_OR_CLASSINFO(d->classref),
@@ -235,10 +241,18 @@ resolve_class_from_typedesc(typedesc *d,bool link,classinfo **result)
        else {
                /* a primitive type */
                cls = primitivetype_table[d->decltype].class_primitive;
+               RESOLVE_ASSERT(cls->loaded);
                if (!cls->linked)
                        if (!link_class(cls))
                                return false; /* exception */
        }
+       RESOLVE_ASSERT(cls);
+       RESOLVE_ASSERT(cls->loaded);
+       RESOLVE_ASSERT(!link || cls->linked);
+
+#ifdef RESOLVE_VERBOSE
+       fprintf(stderr,"    result = ");utf_fprint(stderr,cls->name);fprintf(stderr,"\n");
+#endif
 
        *result = cls;
        return true;