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 $
*/
****************/
+
+#include <assert.h>
#include <stdio.h>
#include <string.h>
#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"
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");}
/* 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);
}
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++) {
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;
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) {
{
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,
{
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,
/*--- <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);
{
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,
}
}
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);
}
{
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,
}
/* 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;
/* 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);
/* 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){
/*-- 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), \
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);
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);
+ }
+ }
}