removed "class" field in constant_FMIref
authoredwin <none@none>
Sat, 2 Apr 2005 02:05:59 +0000 (02:05 +0000)
committeredwin <none@none>
Sat, 2 Apr 2005 02:05:59 +0000 (02:05 +0000)
src/vm/jit/codegen.inc
src/vm/jit/inline/inline.c
src/vm/jit/inline/parseRT.c
src/vm/jit/inline/parseXTA.c
src/vm/jit/parse.c
src/vm/loader.c
src/vm/references.h
src/vm/resolve.c
src/vm/resolve.h

index 352af7972d2a18c606e9bf1d7be0886d6771e6f8..600c92a43d9319fe800b8d4b75cb9d0f2e05dc5a 100644 (file)
@@ -47,7 +47,7 @@
    memory. All functions writing values into the data area return the offset
    relative the begin of the code area (start of procedure).   
 
-   $Id: codegen.inc 1953 2005-02-17 13:42:23Z christian $
+   $Id: codegen.inc 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -1088,6 +1088,7 @@ static void codegen_resolve_native(methodinfo *m,void **insertionPoint,void *jmp
         /*log_text("resolved");*/
       } else { 
          /* we failed to find the native function within the execution image (app + loaded libraries) -> will cause an exit*/
+                dolog("\nnative function not found: %s",overloadedNative);
          MFREE(overloadedNative,char,overloadedNativeLen);
          log_text("It was not possible to find the native function implementation. Not even in overloading case");
       }
index 79694628e6a44a9a6809e75f41ba0801fa365198..7b344889a002161217783ec9bb2e53dc1feffa44 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Dieter Thuernbeck
 
-   $Id: inline.c 2184 2005-04-01 21:19:05Z edwin $
+   $Id: inline.c 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -66,6 +66,7 @@ Method to be inlined must:
 #include "vm/loader.h"
 #include "vm/tables.h"
 #include "vm/options.h"
+#include "vm/resolve.h"
 #include "vm/statistics.h"
 #include "vm/jit/jit.h"
 #include "vm/jit/parse.h"
@@ -387,7 +388,7 @@ u2 whycannot = 0;
 if ((inline_env->cummethods < INLINING_MAXMETHODS) && 
    /*** (!(imi->flags & ACC_ABSTRACT)) && /** Problem from INVOKE STATIC **/
     (!(imi->flags & ACC_NATIVE)) &&
-    (inlineoutsiders || (m->class == imr->class)) &&
+    (inlineoutsiders || (m->class->name == imr->classref->name)) &&
     (imi->jcodelength < INLINING_MAXCODESIZE) &&
     (imi->jcodelength > 0) &&       /* FIXME: eliminate empty methods? also abstract??*/
     (((!inlinevirtuals)  ||
@@ -433,7 +434,7 @@ if  (imi->flags & ACC_ABSTRACT) return can;
                                                        METHINFOj(imi)
                                                        }
 
-  if  (!(inlineoutsiders) && (m->class != imr->class)) {
+  if  (!(inlineoutsiders) && (m->class->name != imr->classref->name)) {
        /*** if ((!mult) && (whycannot > 0)) mult = true;  *** First time not needed ***/
 #if defined(STATISTICS)
        count_in_outsiders++;
@@ -488,7 +489,7 @@ if  (imi->flags & ACC_ABSTRACT) return can;
                }       
        }       
 
-  if  (inlineoutsiders && (m->class != imr->class)) {
+  if  (inlineoutsiders && (m->class->name != imr->classref->name)) {
        whycannot = whycannot | IN_OUTSIDERS; /* outsider */ 
 #if defined(STATISTICS)
        count_in_outsiders++;
@@ -715,6 +716,7 @@ inlining_methodinfo *inlining_analyse_method(methodinfo *m,
                                {
                                        constant_FMIref *imr;
                                        methodinfo *imi;
+                                       classinfo *imrclass;
 
                                         methodinfo *mout;
                                         bool uniqueVirt= false;
@@ -722,9 +724,11 @@ inlining_methodinfo *inlining_analyse_method(methodinfo *m,
 
                                        if (opcode ==JAVA_INVOKEINTERFACE) {
                                            imr = class_getconstant(m->class, i, CONSTANT_InterfaceMethodref);
-                                           LAZYLOADING(imr->class)
+                                               if (!resolve_classref(m,imr->classref,resolveEager,true,&imrclass))
+                                                       panic("Could not resolve class reference");
+                                           LAZYLOADING(imrclass)
                                             imi = class_resolveinterfacemethod(
-                                               imr->class,
+                                               imrclass,
                                                 imr->name,
                                                 imr->descriptor,
                                                 m->class,
@@ -734,9 +738,11 @@ inlining_methodinfo *inlining_analyse_method(methodinfo *m,
                                           }
                                        else {
                                           imr = class_getconstant(m->class, i, CONSTANT_Methodref);
-                                          LAZYLOADING(imr->class)
+                                               if (!resolve_classref(m,imr->classref,resolveEager,true,&imrclass))
+                                                       panic("Could not resolve class reference");
+                                          LAZYLOADING(imrclass)
                                           imi = class_resolveclassmethod(
-                                               imr->class,
+                                               imrclass,
                                                imr->name,
                                                imr->descriptor,
                                                m->class,
index 259008b8abb14ed07b0a8045a9ee7d68b5c4c5fb..a4e68c630a222f7b94965140b0fc0774dc7bd67d 100644 (file)
@@ -27,7 +27,7 @@
 
    Authors: Carolyn Oates
 
-   $Id: parseRT.c 2186 2005-04-02 00:43:25Z edwin $
+   $Id: parseRT.c 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -69,6 +69,7 @@ Results: (currently) with -stat see # methods marked used
 #include "vm/class.h"
 #include "vm/linker.h"
 #include "vm/loader.h"
+#include "vm/resolve.h"
 #include "vm/options.h"
 #include "vm/statistics.h"
 #include "vm/tables.h"
@@ -526,11 +527,14 @@ if ((RTA_DEBUGr)||(RTA_DEBUGopcodes)) printf("\n");
                        {
                                constant_FMIref *fr;
                                fieldinfo *fi;
+                               classinfo *frclass;
 
                                fr = class_getconstant(m->class, i, CONSTANT_Fieldref);
-                               LAZYLOADING(fr->class)
+                               if (!resolve_classref(m,fr->classref,resolveEager,true,&frclass))
+                                       panic("Could not resolve class reference");
+                               LAZYLOADING(frclass);
 
-                               fi = class_resolvefield(fr->class,
+                               fi = class_resolvefield(frclass,
                                                        fr->name,
                                                        fr->descriptor,
                                                        m->class,
@@ -553,10 +557,13 @@ if ((RTA_DEBUGr)||(RTA_DEBUGopcodes)) printf("\n");
                                {
                                constant_FMIref *mr;
                                methodinfo *mi;
+                               classinfo *mrclass;
 
                                mr = class_getconstant(m->class, i, CONSTANT_Methodref);
-                               LAZYLOADING(mr->class) 
-                               mi = class_resolveclassmethod(  mr->class,
+                               if (!resolve_classref(m,mr->classref,resolveEager,true,&mrclass))
+                                       panic("Could not resolve class reference");
+                               LAZYLOADING(mrclass) 
+                               mi = class_resolveclassmethod(  mrclass,
                                                                                                mr->name,
                                                                                                mr->descriptor,
                                                                                                m->class,
@@ -656,11 +663,14 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                        {
                                constant_FMIref *mr;
                                 methodinfo *mi;
+                                                               classinfo *mrclass;
 
                                mr = m->class->cpinfos[i];
                                 /*mr = class_getconstant(m->class, i, CONSTANT_Methodref)*/
-                               LAZYLOADING(mr->class) 
-                               mi = class_resolveclassmethod(mr->class,
+                                       if (!resolve_classref(m,mr->classref,resolveEager,true,&mrclass))
+                                               panic("Could not resolve class reference");
+                               LAZYLOADING(mrclass) 
+                               mi = class_resolveclassmethod(mrclass,
                                                 mr->name,
                                                 mr->descriptor,
                                                m->class,
@@ -688,7 +698,7 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                                     }
                                   } 
                                else {
-CLASSNAME1(mr->class,"CouldNOT Resolve virt meth:",RTA_DEBUGr);printf(".");fflush(stdout);
+CLASSNAME1(mrclass,"CouldNOT Resolve virt meth:",RTA_DEBUGr);printf(".");fflush(stdout);
 utf_display(mr->name); printf(" "); fflush(stdout);
 utf_display(mr->descriptor); printf("\n");fflush(stdout);
                                   }
@@ -700,11 +710,14 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                         {
                                 constant_FMIref *mr;
                                 methodinfo *mi;
+                                                               classinfo *mrclass;
 
                                 mr = class_getconstant(m->class, i, CONSTANT_InterfaceMethodref);
-                                LAZYLOADING(mr->class)
+                                                               if (!resolve_classref(m,mr->classref,resolveEager,true,&mrclass))
+                                                                       panic("Could not resolve class reference");
+                                LAZYLOADING(mrclass)
 
-                                mi = class_resolveinterfacemethod(mr->class,
+                                mi = class_resolveinterfacemethod(mrclass,
                                                           mr->name,
                                                           mr->descriptor,
                                                           m->class,
index 66172f326faeed30f8b364ca3b053d9a1b1c1276..ac9a6b9936b9e7ca129d9977d20c784f0b4147b1 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 2186 2005-04-02 00:43:25Z edwin $
+   $Id: parseXTA.c 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -125,6 +125,7 @@ Results: (currently) with -stat see # methods marked used
 #include "vm/class.h"
 #include "vm/linker.h"
 #include "vm/loader.h"
+#include "vm/resolve.h"
 #include "vm/options.h"
 #include "vm/statistics.h"
 #include "vm/tables.h"
@@ -1178,11 +1179,14 @@ if ((XTA_DEBUGr)||(XTA_DEBUGopcodes)) printf("\n");
                        {
                                constant_FMIref *fr;
                                fieldinfo *fi;
+                               classinfo *frclass;
 
                                fr = class_getconstant(m->class, i, CONSTANT_Fieldref);
-                               LAZYLOADING(fr->class)
+                               if (!resolve_classref(m,fr->classref,resolveEager,true,&frclass))
+                                       panic("Could not resolve class reference");
+                               LAZYLOADING(frclass)
 
-                               fi = class_resolvefield(fr->class,
+                               fi = class_resolvefield(frclass,
                                                        fr->name,
                                                        fr->descriptor,
                                                        m->class,
@@ -1210,11 +1214,14 @@ printf(" PUTSTATIC:");fflush(stdout); utf_display(fi->class->name);printf(".");f
                        {
                                constant_FMIref *fr;
                                fieldinfo *fi;
+                               classinfo *frclass;
 
                                fr = class_getconstant(m->class, i, CONSTANT_Fieldref);
-                               LAZYLOADING(fr->class)
+                               if (!resolve_classref(m,fr->classref,resolveEager,true,&frclass))
+                                       panic("Could not resolve class reference");
+                               LAZYLOADING(frclass)
 
-                               fi = class_resolvefield(fr->class,
+                               fi = class_resolvefield(frclass,
                                                        fr->name,
                                                        fr->descriptor,
                                                        m->class,
@@ -1245,10 +1252,13 @@ printf(" GETSTATIC:");fflush(stdout); utf_display(fi->class->name);printf(".");f
                                {
                                constant_FMIref *mr;
                                methodinfo *mi;
+                               classinfo *mrclass;
 
                                mr = class_getconstant(m->class, i, CONSTANT_Methodref);
-                               LAZYLOADING(mr->class) 
-                               mi = class_resolveclassmethod(  mr->class,
+                               if (!resolve_classref(m,mr->classref,resolveEager,true,&mrclass))
+                                       panic("Could not resolve class reference");
+                               LAZYLOADING(mrclass) 
+                               mi = class_resolveclassmethod(  mrclass,
                                                                                                mr->name,
                                                                                                mr->descriptor,
                                                                                                m->class,
@@ -1338,7 +1348,7 @@ printf(" GETSTATIC:");fflush(stdout); utf_display(fi->class->name);printf(".");f
       there is a real error in classpath and in normal parse an exception
       will be thrown. Following debug print can verify this
 else  from if (mi) {
-CLASSNAME1(mr->class,"CouldNOT Resolve method:",,XTA_DEBUGr);printf(".");fflush(stdout);
+CLASSNAME1(mrclass,"CouldNOT Resolve method:",,XTA_DEBUGr);printf(".");fflush(stdout);
 utf_display(mr->name); printf(" "); fflush(stdout);
 utf_display(mr->descriptor); printf("\n");fflush(stdout);
 ***/
@@ -1350,11 +1360,14 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                        {
                                constant_FMIref *mr;
                                 methodinfo *mi;
+                                                               classinfo *mrclass;
 
                                mr = m->class->cpinfos[i];
                                 /*mr = class_getconstant(m->class, i, CONSTANT_Methodref)*/
-                               LAZYLOADING(mr->class) 
-                               mi = class_resolveclassmethod(mr->class,
+                                       if (!resolve_classref(m,mr->classref,resolveEager,true,&mrclass))
+                                               panic("Could not resolve class reference");
+                               LAZYLOADING(mrclass) 
+                               mi = class_resolveclassmethod(mrclass,
                                                 mr->name,
                                                 mr->descriptor,
                                                m->class,
@@ -1391,7 +1404,7 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                                       }
                                   } 
                                else {
-CLASSNAME1(mr->class,"CouldNOT Resolve virt meth:",XTA_DEBUGr);printf(".");fflush(stdout);
+CLASSNAME1(mrclass,"CouldNOT Resolve virt meth:",XTA_DEBUGr);printf(".");fflush(stdout);
 utf_display(mr->name); printf(" "); fflush(stdout);
 utf_display(mr->descriptor); printf("\n");fflush(stdout);
                                   }
@@ -1403,11 +1416,14 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                         {
                                 constant_FMIref *mr;
                                 methodinfo *mi;
+                                                               classinfo *mrclass;
 
                                 mr = class_getconstant(m->class, i, CONSTANT_InterfaceMethodref);
-                                LAZYLOADING(mr->class)
+                                                               if (!resolve_classref(m,mr->classref,resolveEager,true,&mrclass))
+                                                                       panic("Could not resolve class reference");
+                                LAZYLOADING(mrclass)
 
-                                mi = class_resolveinterfacemethod(mr->class,
+                                mi = class_resolveinterfacemethod(mrclass,
                                                           mr->name,
                                                           mr->descriptor,
                                                           m->class,
index e49ea122d15841d27ba500488f8a8c05e9543374..4a1ae7902c055e713a9e5e24c1f304248bdb96b9 100644 (file)
@@ -30,7 +30,7 @@
             Edwin Steiner
             Joseph Wenninger
 
-   $Id: parse.c 2185 2005-04-01 21:24:49Z edwin $
+   $Id: parse.c 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -47,6 +47,7 @@
 #include "vm/global.h"
 #include "vm/linker.h"
 #include "vm/loader.h"
+#include "vm/resolve.h"
 #include "vm/options.h"
 #include "vm/statistics.h"
 #include "vm/stringlocal.h"
@@ -961,16 +962,13 @@ SHOWOPCODE(DEBUG4)
                        {
                                constant_FMIref *fr;
                                fieldinfo *fi;
+                               classinfo *frclass;
 
                                fr = class_getconstant(inline_env->method->class, i, CONSTANT_Fieldref);
-
-                               if (!load_class_from_classloader(fr->class, m->class->classloader))
-                                       return NULL;
-
-                               if (!link_class(fr->class))
+                               if (!resolve_classref(inline_env->method,fr->classref,resolveEager,true,&frclass))
                                        return NULL;
 
-                               fi = class_resolvefield(fr->class,
+                               fi = class_resolvefield(frclass,
                                                                                fr->name,
                                                                                fr->descriptor,
                                                                                inline_env->method->class,
@@ -992,16 +990,13 @@ SHOWOPCODE(DEBUG4)
                        {
                                constant_FMIref *fr;
                                fieldinfo *fi;
+                               classinfo *frclass;
 
                                fr = class_getconstant(inline_env->method->class, i, CONSTANT_Fieldref);
-
-                               if (!load_class_from_classloader(fr->class, m->class->classloader))
+                               if (!resolve_classref(inline_env->method,fr->classref,resolveEager,true,&frclass))
                                        return NULL;
 
-                               if (!link_class(fr->class))
-                                       return NULL;
-
-                               fi = class_resolvefield(fr->class,
+                               fi = class_resolvefield(frclass,
                                                                                fr->name,
                                                                                fr->descriptor,
                                                                                inline_env->method->class,
@@ -1022,18 +1017,15 @@ SHOWOPCODE(DEBUG4)
                        {
                                constant_FMIref *mr;
                                methodinfo *mi;
+                               classinfo *mrclass;
                                
                                inline_env->method->isleafmethod = false;
 
                                mr = class_getconstant(inline_env->method->class, i, CONSTANT_Methodref);
-
-                               if (!load_class_from_classloader(mr->class, m->class->classloader))
+                               if (!resolve_classref(inline_env->method,mr->classref,resolveEager,true,&mrclass))
                                        return NULL;
 
-                               if (!link_class(mr->class))
-                                       return NULL;
-
-                               mi = class_resolveclassmethod(mr->class,
+                               mi = class_resolveclassmethod(mrclass,
                                                                                          mr->name,
                                                                                          mr->descriptor,
                                                                                          inline_env->method->class,
@@ -1064,18 +1056,15 @@ if (DEBUG4==true) {
                        {
                                constant_FMIref *mr;
                                methodinfo *mi;
+                               classinfo *mrclass;
 
                                inline_env->method->isleafmethod = false;
 
                                mr = class_getconstant(inline_env->method->class, i, CONSTANT_Methodref);
-
-                               if (!load_class_from_classloader(mr->class, m->class->classloader))
-                                       return NULL;
-
-                               if (!link_class(mr->class))
+                               if (!resolve_classref(inline_env->method,mr->classref,resolveEager,true,&mrclass))
                                        return NULL;
 
-                               mi = class_resolveclassmethod(mr->class,
+                               mi = class_resolveclassmethod(mrclass,
                                                                                          mr->name,
                                                                                          mr->descriptor,
                                                                                          inline_env->method->class,
@@ -1105,18 +1094,15 @@ if (DEBUG4==true) {
                        {
                                constant_FMIref *mr;
                                methodinfo *mi;
+                               classinfo *mrclass;
                                
                                inline_env->method->isleafmethod = false;
 
                                mr = class_getconstant(inline_env->method->class, i, CONSTANT_InterfaceMethodref);
-
-                               if (!load_class_from_classloader(mr->class, m->class->classloader))
-                                       return NULL;
-
-                               if (!link_class(mr->class))
+                               if (!resolve_classref(inline_env->method,mr->classref,resolveEager,true,&mrclass))
                                        return NULL;
 
-                               mi = class_resolveinterfacemethod(mr->class,
+                               mi = class_resolveinterfacemethod(mrclass,
                                                                                                  mr->name,
                                                                                                  mr->descriptor,
                                                                                                  inline_env->method->class,
index 8c6aa8b72f4678bb5b5fc0025a1dae83b1619416..614cf2c9d393a7ac59b5f7abdd72a5f23ceb774f 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 2186 2005-04-02 00:43:25Z edwin $
+   $Id: loader.c 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -870,7 +870,7 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
 
                switch (t) {
                case CONSTANT_Class:
-                       nfc = NEW(forward_class);
+                       nfc = DNEW(forward_class);
 
                        nfc->next = forward_classes;
                        forward_classes = nfc;
@@ -886,7 +886,7 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
                        break;
                        
                case CONSTANT_String:
-                       nfs = NEW(forward_string);
+                       nfs = DNEW(forward_string);
                                
                        nfs->next = forward_strings;
                        forward_strings = nfs;
@@ -903,7 +903,7 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
                        break;
 
                case CONSTANT_NameAndType:
-                       nfn = NEW(forward_nameandtype);
+                       nfn = DNEW(forward_nameandtype);
                                
                        nfn->next = forward_nameandtypes;
                        forward_nameandtypes = nfn;
@@ -926,7 +926,7 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
                case CONSTANT_Fieldref:
                case CONSTANT_Methodref:
                case CONSTANT_InterfaceMethodref:
-                       nff = NEW(forward_fieldmethint);
+                       nff = DNEW(forward_fieldmethint);
                        
                        nff->next = forward_fieldmethints;
                        forward_fieldmethints = nff;
@@ -1087,8 +1087,11 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
                utf *name =
                        class_getconstant(c, forward_classes->name_index, CONSTANT_Utf8);
 
-               if (opt_verify && !is_valid_name_utf(name))
-                       panic("Class reference with invalid name");
+               if (opt_verify && !is_valid_name_utf(name)) {
+                       *exceptionptr = 
+                               new_classformaterror(c, "Class reference with invalid name");
+                       return false;
+               }
 
                cptags[forward_classes->thisindex] = CONSTANT_Class;
                /* retrieve class from class-table */
@@ -1111,7 +1114,6 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
 
                nfc = forward_classes;
                forward_classes = forward_classes->next;
-               FREE(nfc, forward_class);
        }
 
        while (forward_strings) {
@@ -1124,7 +1126,6 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
                
                nfs = forward_strings;
                forward_strings = forward_strings->next;
-               FREE(nfs, forward_string);
        }
 
        while (forward_nameandtypes) {
@@ -1169,7 +1170,6 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
 
                nfn = forward_nameandtypes;
                forward_nameandtypes = forward_nameandtypes->next;
-               FREE(nfn, forward_nameandtype);
        }
 
        while (forward_fieldmethints) {
@@ -1185,9 +1185,7 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
                                                                forward_fieldmethints->nameandtype_index,
                                                                CONSTANT_NameAndType);
 
-               fmi->class = class_getconstant(c,
-                                                                          forward_fieldmethints->class_index,
-                                                                          CONSTANT_Class);
+               fmi->classref = (constant_classref*) (size_t) forward_fieldmethints->class_index;
                fmi->name = nat->name;
                fmi->descriptor = nat->descriptor;
 
@@ -1196,7 +1194,6 @@ static bool load_constantpool(classbuffer *cb,descriptor_pool *descpool)
        
                nff = forward_fieldmethints;
                forward_fieldmethints = forward_fieldmethints->next;
-               FREE(nff, forward_fieldmethint);
        }
 
        /* everything was ok */
@@ -2172,6 +2169,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
        /* parse the loaded descriptors */
        for (i=0; i<c->cpcount; ++i) {
                constant_FMIref *fmi;
+               int index;
                
                switch (c->cptags[i]) {
                        case CONSTANT_Class:
@@ -2183,7 +2181,8 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
                                        descriptor_pool_parse_field_descriptor(descpool,fmi->descriptor);
                                if (!fmi->parseddesc.fd)
                                        goto return_exception;
-                               fmi->classref = descriptor_pool_lookup_classref(descpool,fmi->class->name);
+                               index = (int) (size_t) fmi->classref;
+                               fmi->classref = descriptor_pool_lookup_classref(descpool,((classinfo *)class_getconstant(c,index,CONSTANT_Class))->name);
                                break;
                        case CONSTANT_Methodref:
                        case CONSTANT_InterfaceMethodref:
@@ -2192,7 +2191,8 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
                                        descriptor_pool_parse_method_descriptor(descpool,fmi->descriptor);
                                if (!fmi->parseddesc.md)
                                        goto return_exception;
-                               fmi->classref = descriptor_pool_lookup_classref(descpool,fmi->class->name);
+                               index = (int) (size_t) fmi->classref;
+                               fmi->classref = descriptor_pool_lookup_classref(descpool,((classinfo *)class_getconstant(c,index,CONSTANT_Class))->name);
                                break;
                }
        }
@@ -3092,7 +3092,7 @@ void class_showconstanti(classinfo *c, int ii)
                displayFMIi:
                        {
                                constant_FMIref *fmi = e;
-                               utf_display(fmi->class->name);
+                               utf_display(fmi->classref->name);
                                printf(".");
                                utf_display(fmi->name);
                                printf(" ");
@@ -3173,7 +3173,7 @@ void class_showconstantpool (classinfo *c)
                        displayFMI:
                                {
                                        constant_FMIref *fmi = e;
-                                       utf_display ( fmi->class->name );
+                                       utf_display ( fmi->classref->name );
                                        printf (".");
                                        utf_display ( fmi->name);
                                        printf (" ");
index 0810af4c5c4a8e8dc6817caabe1a2512b7b73b16..6d807047f32f7ff8ae686e1ce2afd405e6668def 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: references.h 2181 2005-04-01 16:53:33Z edwin $
+   $Id: references.h 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -90,7 +90,6 @@ typedef union parseddesc {
 /* constant_FMIref ************************************************************/
 
 typedef struct {            /* Fieldref, Methodref and InterfaceMethodref     */
-       classinfo *class;       /* class containing this field/method/intfmeth.   */ /* XXX remove */
        constant_classref *classref;  /* class containing this field/meth./intfm. */
        utf       *name;        /* field/method/interfacemethod name              */
        utf       *descriptor;  /* field/method/intfmeth. type descriptor string  */
index fba2e4bfd6ca65aef5d6bf87d3522c411d069c0c..e137ebdeb4d1ef63d141a5c4f200b00f00ca7a25 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: resolve.c 2186 2005-04-02 00:43:25Z edwin $
+   $Id: resolve.c 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -168,6 +168,16 @@ resolve_class(classinfo *referer,methodinfo *refmethod,
        return true;
 }
 
+bool
+resolve_classref(methodinfo *refmethod,
+                                constant_classref *ref,
+                                resolve_mode_t mode,
+                            bool link,
+                                classinfo **result)
+{
+       return resolve_classref_or_classinfo(refmethod,CLASSREF_OR_CLASSINFO(ref),mode,link,result);
+}
+
 bool
 resolve_classref_or_classinfo(methodinfo *refmethod,
                                                          classref_or_classinfo cls,
index d127a398983d958e642112037959839477bfa948..190cb84532175100786ea350b4158c0a7d28a4e8 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: resolve.h 2182 2005-04-01 20:56:33Z edwin $
+   $Id: resolve.h 2189 2005-04-02 02:05:59Z edwin $
 
 */
 
@@ -140,6 +140,41 @@ resolve_class(classinfo *referer,methodinfo *refmethod,
                          resolve_mode_t mode,
                          classinfo **result);
 
+/* resolve_classref ************************************************************
+   Resolve a symbolic class reference
+  
+   IN:
+       refmethod........the method from which resolution was triggered
+                        (may be NULL if not applicable)
+       ref..............class reference
+       mode.............mode of resolution:
+                            resolveLazy...only resolve if it does not
+                                          require loading classes
+                            resolveEager..load classes if necessary
+          link.............if true, guarantee that the returned class, if any,
+                           has been linked
+  
+   OUT:
+       *result..........set to result of resolution, or to NULL if
+                        the reference has not been resolved
+                        In the case of an exception, *result is
+                        guaranteed to be set to NULL.
+  
+   RETURN VALUE:
+       true.............everything ok 
+                        (*result may still be NULL for resolveLazy)
+       false............an exception has been thrown
+   
+*******************************************************************************/
+
+bool
+resolve_classref(methodinfo *refmethod,
+                                constant_classref *ref,
+                                resolve_mode_t mode,
+                            bool link,
+                                classinfo **result);
+
 /* resolve_classref_or_classinfo ***********************************************
  
    Resolve a symbolic class reference if necessary