* STATISTICS: Renamed to ENABLE_STATISTICS.
[cacao.git] / src / vm / jit / inline / parseRT.c
index bde1a8bf167fc0ea028d851bfa10cfbda52dc4c4..128ca7fc64070a31620c28e42f7aa7ed0b834961 100644 (file)
@@ -27,7 +27,9 @@
 
    Authors: Carolyn Oates
 
-   $Id: parseRT.c 2107 2005-03-28 22:44:28Z twisti $
+   Changes: Christian Thalinger
+
+   $Id: parseRT.c 4000 2005-12-22 14:05:01Z twisti $
 
 */
 
@@ -59,6 +61,8 @@ Results: (currently) with -stat see # methods marked used
  
 ****************/
 
+
+#include <assert.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -66,12 +70,13 @@ Results: (currently) with -stat see # methods marked used
 #include "cacao/cacao.h"
 #include "mm/memory.h"   
 #include "toolbox/list.h"
+#include "toolbox/logging.h"
 #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"
 #include "vm/jit/jit.h"
 #include "vm/jit/parse.h"
 #include "vm/jit/inline/parseRT.h"
@@ -98,12 +103,12 @@ void addToRtaWorkList(methodinfo *meth, char *info) {
 if (meth->methodUsed == USED) return;
 
 if (!(meth->flags & ACC_ABSTRACT))  {
-#if defined(STATISTICS)
+#if defined(ENABLE_STATISTICS)
     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 +141,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 +205,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++) {
@@ -301,7 +306,7 @@ if (submeth == NULL) {
        utf_display(class->name); printf(".");
        METHINFOx(topmethod);
        printf("parse RT: Method not found in class hierarchy");fflush(stdout);
-       panic("parse RT: Method not found in class hierarchy");
+       assert(0);
        }
 if (submeth->methodUsed == USED) return;
   
@@ -452,8 +457,10 @@ if ((RTA_DEBUGr)||(RTA_DEBUGopcodes)) printf("\n");
                SHOWOPCODE(RTA_DEBUGopcodes)
 
                nextp = p + jcommandsize[opcode];   /* compute next instrtart */
-               if (nextp > m->jcodelength)
-                       panic("Unexpected end of bytecode");
+               if (nextp > m->jcodelength) {
+                       log_text("Unexpected end of bytecode");
+                       assert(0);
+               }
 
                switch (opcode) {
 
@@ -526,11 +533,19 @@ 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 (!fr)
+                                       return 0;
+                               if (!resolve_classref(m,fr->classref,resolveEager,true, true,&frclass)) {
+                                       log_text("Could not resolve class reference");
+                                       assert(0);
+                               }
 
-                               fi = class_resolvefield(fr->class,
+                               LAZYLOADING(frclass);
+
+                               fi = class_resolvefield(frclass,
                                                        fr->name,
                                                        fr->descriptor,
                                                        m->class,
@@ -553,10 +568,18 @@ 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 (!mr)
+                                       return 0;
+                               if (!resolve_classref(m,mr->classref,resolveEager,true, true,&mrclass)) {
+                                       log_text("Could not resolve class reference");
+                                       assert(0);
+                               }
+
+                               LAZYLOADING(mrclass) 
+                               mi = class_resolveclassmethod(  mrclass,
                                                                                                mr->name,
                                                                                                mr->descriptor,
                                                                                                m->class,
@@ -600,7 +623,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);
@@ -656,11 +679,18 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                        {
                                constant_FMIref *mr;
                                 methodinfo *mi;
+                                                               classinfo *mrclass;
 
+                                                               /* XXX why this direct access, this should not be! */
                                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, true,&mrclass)) {
+                                               log_text("Could not resolve class reference");
+                                               assert(0);
+                                       }
+
+                               LAZYLOADING(mrclass) 
+                               mi = class_resolveclassmethod(mrclass,
                                                 mr->name,
                                                 mr->descriptor,
                                                m->class,
@@ -688,7 +718,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 +730,19 @@ 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 (!mr)
+                                                                       return 0;
+                                                               if (!resolve_classref(m,mr->classref,resolveEager,true, true,&mrclass)) {
+                                                                       log_text("Could not resolve class reference");
+                                                                       assert(0);
+                                                               }
 
-                                mi = class_resolveinterfacemethod(mr->class,
+                                LAZYLOADING(mrclass)
+
+                                mi = class_resolveinterfacemethod(mrclass,
                                                           mr->name,
                                                           mr->descriptor,
                                                           m->class,
@@ -716,7 +754,7 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                                           }
                                /* see INVOKESTATIC for explanation about */
                                /*   case when Interface is not resolved  */
-                                /*descriptor2types(mi); 
+                                /*method_descriptor2types(mi); 
                                ?? do need paramcnt? for RTA (or just XTA)*/
                         }
                         break;
@@ -726,8 +764,12 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                 /* class is really instantiated when class.<init> called*/
                         i = code_get_u2(p + 1,m);
                        {
-                       classinfo *ci;
-                        ci = class_getconstant(m->class, i, CONSTANT_Class);
+                               constant_classref *cr;
+                               classinfo *ci;
+                cr = (constant_classref *)class_getconstant(m->class, i, CONSTANT_Class);
+                               if (!cr)
+                                       return 0;
+                               resolve_classref(NULL,cr,resolveEager,true, false,&ci);
                         /*** s_count++; look for s_counts for VTA */
                        /* add marked methods */
                        CLASSNAME(ci,"NEW : do nothing",RTA_DEBUGr);
@@ -740,9 +782,14 @@ utf_display(mr->descriptor); printf("\n");fflush(stdout);
                 /* class used */
                         i = code_get_u2(p + 1,m);
                         {
-                        classinfo *cls =
-                                (classinfo *)
-                            class_getconstant(m->class, i, CONSTANT_Class);
+                                                       constant_classref *cr;
+                               classinfo *cls;
+
+                                                       cr = (constant_classref*) class_getconstant(m->class, i, CONSTANT_Class);
+                                                       if (!cr)
+                                                               return 0;
+                                                       resolve_classref(NULL,cr,resolveEager,true, false,&cls);
+
                         LAZYLOADING(cls)
                                CLASSNAMEop(cls,RTA_DEBUGr);
                         if (cls->classUsed == NOTUSED){
@@ -775,7 +822,7 @@ else
 
 /*-- Get meth ptr for class.meth desc and add to RTA worklist --*/
 #define SYSADD(cls,meth,desc,txt) \
-        c = class_new(utf_new_char(cls)); \
+        c = load_class_bootstrap(utf_new_char(cls)); \
         LAZYLOADING(c) \
         callmeth = class_resolveclassmethod(c, \
               utf_new_char(meth), \
@@ -875,8 +922,10 @@ methodinfo *missedRTAworklist()
            class = strtok(line, " \n");
            meth  = strtok(NULL, " \n");
            desc  = strtok(NULL, " \n");
-           if ((class == NULL) || (meth == NULL) || (desc == NULL))  
-               panic ("Error in rtMissedIn file for: class.meth, desc\n"); 
+           if ((class == NULL) || (meth == NULL) || (desc == NULL)) {
+                       log_text("Error in rtMissedIn file for: class.meth, desc");
+                       assert(0);
+               }
            SYSADD(class,meth,desc,missedtxt)
            }
        fclose(rtMissedIn);
@@ -907,9 +956,10 @@ void parseRTmethod(methodinfo *rt_method) {
            else {
               printf("Abstract method in RTA Work List: ");
               METHINFOx(rt_method);
-              panic("Abstract method in RTA Work List.");
-               }
-            }                  
+              log_text("Abstract method in RTA Work List.");
+                  assert(0);
+               }
+       }               
 }