ClassDescriptor cn=(ClassDescriptor)it.next();
generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
}
+
outstructs.close();
outmethodheader.close();
outmethod.println("#include \"methodheaders.h\"");
outmethod.println("#include \"virtualtable.h\"");
outmethod.println("#include <runtime.h>");
+
+ outclassdefs.println("extern int classsize[];");
+ generateSizeArray(outmethod);
+
Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
while(classit.hasNext()) {
ClassDescriptor cn=(ClassDescriptor)classit.next();
private int maxcount=0;
private void buildVirtualTables(PrintWriter outvirtual) {
- int numclasses=0;
Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
while(classit.hasNext()) {
ClassDescriptor cd=(ClassDescriptor)classit.next();
if (virtualcalls.getMethodCount(cd)>maxcount)
maxcount=virtualcalls.getMethodCount(cd);
- numclasses++;
}
- MethodDescriptor[][] virtualtable=new MethodDescriptor[numclasses][maxcount];
+ MethodDescriptor[][] virtualtable=new MethodDescriptor[state.numClasses()][maxcount];
/* Fill in virtual table */
classit=state.getClassSymbolTable().getDescriptorsIterator();
}
outvirtual.print("void * virtualtable[]={");
boolean needcomma=false;
- for(int i=0;i<numclasses;i++) {
+ for(int i=0;i<state.numClasses();i++) {
for(int j=0;j<maxcount;j++) {
if (needcomma)
outvirtual.print(", ");
}
}
+ private void generateSizeArray(PrintWriter outclassdefs) {
+ outclassdefs.print("int classsize[]={");
+ Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
+ ClassDescriptor[] cdarray=new ClassDescriptor[state.numClasses()];
+ while(it.hasNext()) {
+ ClassDescriptor cd=(ClassDescriptor)it.next();
+ cdarray[cd.getId()]=cd;
+ }
+ boolean needcomma=false;
+ for(int i=0;i<state.numClasses();i++) {
+ if (needcomma)
+ outclassdefs.print(", ");
+ outclassdefs.print("sizeof(struct "+cdarray[i].getSafeSymbol()+")");
+ needcomma=true;
+ }
+ outclassdefs.println("};");
+ }
+
private void generateTempStructs(FlatMethod fm) {
MethodDescriptor md=fm.getMethod();
ParamsObject objectparams=new ParamsObject(md,tag++);
public Set parsetrees;
public Hashtable treemethodmap;
public Hashtable flatmethodmap;
+ private int numclasses=0;
+
public static TypeDescriptor getTypeDescriptor(int t) {
TypeDescriptor td=new TypeDescriptor(t);
if (classes.contains(tdn.getSymbol()))
throw new Error("Class "+tdn.getSymbol()+" defined twice");
classes.add(tdn);
+ numclasses++;
+ }
+
+ public int numClasses() {
+ return numclasses;
}
public BlockNode getMethodBody(MethodDescriptor md) {