From: bdemsky Date: Sun, 9 Apr 2006 08:23:32 +0000 (+0000) Subject: Array support X-Git-Tag: preEdgeChange~931 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=76ce6dc60427aafd95e53c2188223072fac5f9a3;p=IRC.git Array support --- diff --git a/Robust/src/IR/ClassDescriptor.java b/Robust/src/IR/ClassDescriptor.java index 73b66d7a..aae2e558 100644 --- a/Robust/src/IR/ClassDescriptor.java +++ b/Robust/src/IR/ClassDescriptor.java @@ -15,17 +15,7 @@ public class ClassDescriptor extends Descriptor { methods=new SymbolTable(); classid=UIDCount++; } - private static int UIDCount=10; /* 0 is for Arrays */ - /* For element types we use as defined in TypeDescriptor - public static final int BYTE=1; - public static final int SHORT=2; - public static final int INT=3; - public static final int LONG=4; - public static final int CHAR=5; - public static final int BOOLEAN=6; - public static final int FLOAT=7; - public static final int DOUBLE=8;*/ - + private static int UIDCount=0; private final int classid; String classname; String superclass; diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 8dfb38d5..84d8eb4e 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -14,7 +14,7 @@ public class BuildCode { String paramsprefix="___params___"; public static boolean GENERATEPRECISEGC=false; public static String PREFIX=""; - public static String arraytype="___array___"; + public static String arraytype="ArrayObject"; Virtual virtualcalls; TypeUtil typeutil; @@ -88,6 +88,7 @@ public class BuildCode { outmethod.println("#include "); outclassdefs.println("extern int classsize[];"); + //Store the sizes of classes & array elements generateSizeArray(outmethod); Iterator classit=state.getClassSymbolTable().getDescriptorsIterator(); @@ -139,10 +140,10 @@ public class BuildCode { } ClassDescriptor objectcd=typeutil.getClass(TypeUtil.ObjectClass); - Iteratory arrait=state.getArrayIterator(); + Iterator arrayit=state.getArrayIterator(); while(arrayit.hasNext()) { TypeDescriptor td=(TypeDescriptor)arrayit.next(); - int id=getArrayNumber(td); + int id=state.getArrayNumber(td); fillinRow(objectcd, virtualtable, id+state.numClasses()); } @@ -195,6 +196,27 @@ public class BuildCode { 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"+ 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()+" "; + 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()+" "; + + 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) { - if (fm.getType().isArray()) { - int arrayid=state.getArrayNumber(fm.getType())+state.numClasses(); + 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()+");"); @@ -657,7 +710,7 @@ public class BuildCode { 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()+" "); @@ -678,7 +731,7 @@ public class BuildCode { 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()); diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index 5b93dc64..9eaebf8d 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -123,9 +123,12 @@ public class BuildFlat { } FlatNew fn=new FlatNew(td, out_temp, temps[0]); last.addNext(fn); - NodePair np=generateNewArrayLoop(temps, td.dereference(), out_temp, 0); - fn.addNext(np.getBegin()); - return new NodePair(first,np.getEnd()); + if (temps.length>1) { + NodePair np=generateNewArrayLoop(temps, td.dereference(), out_temp, 0); + fn.addNext(np.getBegin()); + return new NodePair(first,np.getEnd()); + } else + return new NodePair(first, fn); } } @@ -157,7 +160,7 @@ public class BuildFlat { fcb.addFalseNext(fnop); fn.addNext(fsen); //Recursive call here - if ((i+1)0; + return (arraycount>0); + } + + public int getArrayCount() { + return arraycount; } public TypeDescriptor dereference() { @@ -69,7 +73,9 @@ public class TypeDescriptor extends Descriptor { } public String getSafeSymbol() { - if (isClass()) + if (isArray()) + return IR.Flat.BuildCode.arraytype; + else if (isClass()) return class_desc.getSafeSymbol(); else if (isByte()) return "char"; diff --git a/Robust/src/IR/TypeUtil.java b/Robust/src/IR/TypeUtil.java index fcf7a63e..5e12999a 100644 --- a/Robust/src/IR/TypeUtil.java +++ b/Robust/src/IR/TypeUtil.java @@ -59,6 +59,30 @@ public class TypeUtil { } public boolean isSuperorType(TypeDescriptor possiblesuper, TypeDescriptor cd2) { + //Matching type are always okay + if (possiblesuper.equals(cd2)) + return true; + + //Handle arrays + if (cd2.isArray()||possiblesuper.isArray()) { + // Object is super class of all arrays + if (possiblesuper.getSymbol().equals(ObjectClass)&&!possiblesuper.isArray()) + return true; + + // If we have the same dimensionality of arrays & both are classes, we can default to the normal test + if (cd2.isClass()&&possiblesuper.isClass() + &&(possiblesuper.getArrayCount()==cd2.getArrayCount())&& + isSuperorType(possiblesuper.getClassDesc(), cd2.getClassDesc())) + return true; + + // Object is superclass of all array classes + if (possiblesuper.getSymbol().equals(ObjectClass)&&cd2.isClass() + &&(possiblesuper.getArrayCount()