String paramsprefix="___params___";
public static boolean GENERATEPRECISEGC=false;
public static String PREFIX="";
+ public static String arraytype="ArrayObject";
Virtual virtualcalls;
TypeUtil typeutil;
outstructs.println("#include \"classdefs.h\"");
outmethodheader.println("#include \"structdefs.h\"");
+ /* Output types for short array and string */
+ outstructs.println("#define STRINGTYPE "+typeutil.getClass(TypeUtil.StringClass).getId());
+ outstructs.println("#define CHARARRAYTYPE "+
+ (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state))+state.numClasses()));
+
// Output the C declarations
// These could mutually reference each other
+ outclassdefs.println("struct "+arraytype+";");
while(it.hasNext()) {
ClassDescriptor cn=(ClassDescriptor)it.next();
outclassdefs.println("struct "+cn.getSafeSymbol()+";");
}
outclassdefs.println("");
-
+ {
+ //Print out definition for array type
+ outclassdefs.println("struct "+arraytype+" {");
+ outclassdefs.println(" int type;");
+ printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs);
+ outclassdefs.println(" int ___length___;");
+ outclassdefs.println("};\n");
+ }
it=state.getClassSymbolTable().getDescriptorsIterator();
while(it.hasNext()) {
ClassDescriptor cn=(ClassDescriptor)it.next();
generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
}
+
+
outstructs.close();
outmethodheader.close();
outmethod.println("#include <runtime.h>");
outclassdefs.println("extern int classsize[];");
+ //Store the sizes of classes & array elements
generateSizeArray(outmethod);
Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
if (virtualcalls.getMethodCount(cd)>maxcount)
maxcount=virtualcalls.getMethodCount(cd);
}
- MethodDescriptor[][] virtualtable=new MethodDescriptor[state.numClasses()][maxcount];
+ MethodDescriptor[][] virtualtable=new MethodDescriptor[state.numClasses()+state.numArrays()][maxcount];
/* Fill in virtual table */
classit=state.getClassSymbolTable().getDescriptorsIterator();
ClassDescriptor cd=(ClassDescriptor)classit.next();
fillinRow(cd, virtualtable, cd.getId());
}
+
+ ClassDescriptor objectcd=typeutil.getClass(TypeUtil.ObjectClass);
+ Iterator arrayit=state.getArrayIterator();
+ while(arrayit.hasNext()) {
+ TypeDescriptor td=(TypeDescriptor)arrayit.next();
+ int id=state.getArrayNumber(td);
+ fillinRow(objectcd, virtualtable, id+state.numClasses());
+ }
+
outvirtual.print("void * virtualtable[]={");
boolean needcomma=false;
- for(int i=0;i<state.numClasses();i++) {
+ for(int i=0;i<state.numClasses()+state.numArrays();i++) {
for(int j=0;j<maxcount;j++) {
if (needcomma)
outvirtual.print(", ");
outclassdefs.print("sizeof(struct "+cdarray[i].getSafeSymbol()+")");
needcomma=true;
}
+
+ TypeDescriptor[] sizetable=new TypeDescriptor[state.numArrays()];
+
+ Iterator arrayit=state.getArrayIterator();
+ while(arrayit.hasNext()) {
+ TypeDescriptor td=(TypeDescriptor)arrayit.next();
+ int id=state.getArrayNumber(td);
+ sizetable[id]=td;
+ }
+
+ for(int i=0;i<state.numArrays();i++) {
+ if (needcomma)
+ outclassdefs.print(", ");
+ TypeDescriptor tdelement=sizetable[i].dereference();
+ if (tdelement.isArray()||tdelement.isClass())
+ outclassdefs.print("sizeof(void *)");
+ else
+ outclassdefs.print("sizeof("+tdelement.getSafeSymbol()+")");
+ needcomma=true;
+ }
+
outclassdefs.println("};");
}
for(int i=0;i<fields.size();i++) {
FieldDescriptor fd=(FieldDescriptor)fields.get(i);
- if (fd.getType().isClass())
+ if (fd.getType().isClass()||fd.getType().isArray())
classdefout.println(" struct "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
else
classdefout.println(" "+fd.getType().getSafeSymbol()+" "+fd.getSafeSymbol()+";");
/* Output method declaration */
if (md.getReturnType()!=null) {
- if (md.getReturnType().isClass())
+ if (md.getReturnType().isClass()||md.getReturnType().isArray())
headersout.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
else
headersout.print(md.getReturnType().getSafeSymbol()+" ");
if (printcomma)
headersout.print(", ");
printcomma=true;
- if (temp.getType().isClass())
+ if (temp.getType().isClass()||temp.getType().isArray())
headersout.print("struct " + temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol());
else
headersout.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());
TypeDescriptor type=td.getType();
if (type.isNull())
output.println(" void * "+td.getSafeSymbol()+";");
- else if (type.isClass())
+ else if (type.isClass()||type.isArray())
output.println(" struct "+type.getSafeSymbol()+" * "+td.getSafeSymbol()+";");
else
output.println(" "+type.getSafeSymbol()+" "+td.getSafeSymbol()+";");
case FKind.FlatFieldNode:
generateFlatFieldNode(fm, (FlatFieldNode) fn,output);
return;
+ case FKind.FlatElementNode:
+ generateFlatElementNode(fm, (FlatElementNode) fn,output);
+ return;
+ case FKind.FlatSetElementNode:
+ generateFlatSetElementNode(fm, (FlatSetElementNode) fn,output);
+ return;
case FKind.FlatSetFieldNode:
generateFlatSetFieldNode(fm, (FlatSetFieldNode) fn,output);
return;
if (fc.getReturnTemp()!=null)
output.print(generateTemp(fm,fc.getReturnTemp())+"=");
-
if (md.isStatic()||md.getReturnType()==null||singleCall(fc.getThis().getType().getClassDesc(),md)) {
output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor());
} else {
output.print("((");
- if (md.getReturnType().isClass())
+ if (md.getReturnType().isClass()||md.getReturnType().isArray())
output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
else
output.print(md.getReturnType().getSafeSymbol()+" ");
if (printcomma)
output.print(", ");
printcomma=true;
- if (temp.getType().isClass())
+ if (temp.getType().isClass()||temp.getType().isArray())
output.print("struct " + temp.getType().getSafeSymbol()+" * ");
else
output.print(temp.getType().getSafeSymbol());
}
private void generateFlatSetFieldNode(FlatMethod fm, FlatSetFieldNode fsfn, PrintWriter output) {
+ if (fsfn.getField().getSymbol().equals("length")&&fsfn.getDst().getType().isArray())
+ throw new Error("Can't set array length");
output.println(generateTemp(fm, fsfn.getDst())+"->"+ fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";");
}
+ private void generateFlatElementNode(FlatMethod fm, FlatElementNode fen, PrintWriter output) {
+ TypeDescriptor elementtype=fen.getSrc().getType().dereference();
+ String type="";
+
+ if (elementtype.isArray()||elementtype.isClass())
+ type="void *";
+ else
+ type=elementtype.getSafeSymbol()+" ";
+
+ if (fen.needsBoundsCheck()) {
+ output.println("if ("+generateTemp(fm, fen.getIndex())+"< 0 || "+generateTemp(fm, fen.getIndex())+" >= "+generateTemp(fm,fen.getSrc()) + "->___length___)");
+ output.println("failedboundschk();");
+ }
+
+ output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];");
+ }
+
+ private void generateFlatSetElementNode(FlatMethod fm, FlatSetElementNode fsen, PrintWriter output) {
+ //TODO: need dynamic check to make sure this assignment is actually legal
+ //Because Object[] could actually be something more specific...ie. Integer[]
+
+ TypeDescriptor elementtype=fsen.getDst().getType().dereference();
+ String type="";
+
+ if (elementtype.isArray()||elementtype.isClass())
+ type="void *";
+ else
+ type=elementtype.getSafeSymbol()+" ";
+
+ if (fsen.needsBoundsCheck()) {
+ output.println("if ("+generateTemp(fm, fsen.getIndex())+"< 0 || "+generateTemp(fm, fsen.getIndex())+" >= "+generateTemp(fm,fsen.getDst()) + "->___length___)");
+ output.println("failedboundschk();");
+ }
+
+ output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst())+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";");
+ }
+
private void generateFlatNew(FlatMethod fm, FlatNew fn, PrintWriter output) {
- output.println(generateTemp(fm,fn.getDst())+"=allocate_new("+fn.getType().getClassDesc().getId()+");");
+ if (fn.getType().isArray()) {
+ int arrayid=state.getArrayNumber(fn.getType())+state.numClasses();
+ output.println(generateTemp(fm,fn.getDst())+"=allocate_newarray("+arrayid+", "+generateTemp(fm, fn.getSize())+");");
+ } else
+ output.println(generateTemp(fm,fn.getDst())+"=allocate_new("+fn.getType().getClassDesc().getId()+");");
}
private void generateFlatOpNode(FlatMethod fm, FlatOpNode fon, PrintWriter output) {
output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+";");
else if (fon.getOp().getOp()==Operation.UNARYMINUS)
output.println(generateTemp(fm, fon.getDest())+" = -"+generateTemp(fm, fon.getLeft())+";");
- else if (fon.getOp().getOp()==Operation.POSTINC)
- output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+"++;");
- else if (fon.getOp().getOp()==Operation.POSTDEC)
- output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+"--;");
- else if (fon.getOp().getOp()==Operation.PREINC)
- output.println(generateTemp(fm, fon.getDest())+" = ++"+generateTemp(fm, fon.getLeft())+";");
- else if (fon.getOp().getOp()==Operation.PREDEC)
- output.println(generateTemp(fm, fon.getDest())+" = --"+generateTemp(fm, fon.getLeft())+";");
+ else if (fon.getOp().getOp()==Operation.LOGIC_NOT)
+ output.println(generateTemp(fm, fon.getDest())+" = !"+generateTemp(fm, fon.getLeft())+";");
else
output.println(generateTemp(fm, fon.getDest())+fon.getOp().toString()+generateTemp(fm, fon.getLeft())+";");
}
private void generateFlatCastNode(FlatMethod fm, FlatCastNode fcn, PrintWriter output) {
- /* TODO: Make call into runtime */
+ /* TODO: Do type check here */
output.println(generateTemp(fm,fcn.getDst())+"=("+fcn.getType().getSafeSymbol()+")"+generateTemp(fm,fcn.getSrc())+";");
}
if (fln.getValue()==null)
output.println(generateTemp(fm, fln.getDst())+"=0;");
else if (fln.getType().getSymbol().equals(TypeUtil.StringClass))
- output.println(generateTemp(fm, fln.getDst())+"=newstring(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\");");
+ output.println(generateTemp(fm, fln.getDst())+"=NewString(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\","+((String)fln.getValue()).length()+");");
else if (fln.getType().isBoolean()) {
if (((Boolean)fln.getValue()).booleanValue())
output.println(generateTemp(fm, fln.getDst())+"=1;");
else
output.println(generateTemp(fm, fln.getDst())+"=0;");
+ } else if (fln.getType().isChar()) {
+ output.println(generateTemp(fm, fln.getDst())+"='"+fln.getValue()+"';");
} else
output.println(generateTemp(fm, fln.getDst())+"="+fln.getValue()+";");
}
ClassDescriptor cn=md.getClassDesc();
if (md.getReturnType()!=null) {
- if (md.getReturnType().isClass())
+ if (md.getReturnType().isClass()||md.getReturnType().isArray())
output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
else
output.print(md.getReturnType().getSafeSymbol()+" ");
if (printcomma)
output.print(", ");
printcomma=true;
- if (temp.getType().isClass())
+ if (temp.getType().isClass()||temp.getType().isArray())
output.print("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol());
else
output.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());