changes
authorbdemsky <bdemsky>
Sat, 8 Apr 2006 06:32:16 +0000 (06:32 +0000)
committerbdemsky <bdemsky>
Sat, 8 Apr 2006 06:32:16 +0000 (06:32 +0000)
Robust/src/IR/ClassDescriptor.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FKind.java
Robust/src/IR/Flat/FlatElementNode.java [new file with mode: 0644]
Robust/src/IR/Flat/FlatNew.java
Robust/src/IR/State.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/TypeDescriptor.java

index e5888b3d616a911fe78a13c178768cdd427a2ede..73b66d7aad7394fe8c3293da18bebff54e857572 100644 (file)
@@ -15,7 +15,17 @@ public class ClassDescriptor extends Descriptor {
        methods=new SymbolTable();
        classid=UIDCount++;
     }
-    private static int UIDCount=0;
+    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 final int classid;
     String classname;
     String superclass;
index cf269d1f22f764d3c6519d1a96e8504b09a1a880..8dfb38d5b64e8e2eefde7ae25c093a30a82aaa99 100644 (file)
@@ -14,6 +14,7 @@ public class BuildCode {
     String paramsprefix="___params___";
     public static boolean GENERATEPRECISEGC=false;
     public static String PREFIX="";
+    public static String arraytype="___array___";
     Virtual virtualcalls;
     TypeUtil typeutil;
 
@@ -58,12 +59,20 @@ public class BuildCode {
 
        // 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();
@@ -120,7 +129,7 @@ public class BuildCode {
            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();
@@ -128,9 +137,18 @@ public class BuildCode {
            ClassDescriptor cd=(ClassDescriptor)classit.next();
            fillinRow(cd, virtualtable, cd.getId());
        }
+
+       ClassDescriptor objectcd=typeutil.getClass(TypeUtil.ObjectClass);
+       Iteratory arrait=state.getArrayIterator();
+       while(arrayit.hasNext()) {
+           TypeDescriptor td=(TypeDescriptor)arrayit.next();
+           int id=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(", ");
@@ -574,7 +592,11 @@ public class BuildCode {
     }
 
     private void generateFlatNew(FlatMethod fm, FlatNew fn, PrintWriter output) {
-       output.println(generateTemp(fm,fn.getDst())+"=allocate_new("+fn.getType().getClassDesc().getId()+");");
+       if (fm.getType().isArray()) {
+           int arrayid=state.getArrayNumber(fm.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) {
index 98921d0394a9c528789f761c6f1ff2629726b319..5b93dc64892209e6965ae593a06ba735d0968345 100644 (file)
@@ -218,6 +218,17 @@ public class BuildFlat {
        return new NodePair(npe.getBegin(),fn);
     }
 
+    private NodePair flattenArrayAccessNode(ArrayAccessNode aan,TempDescriptor out_temp) {
+       TempDescriptor tmp=TempDescriptor.tempFactory("temp",aan.getExpression().getType());
+       TempDescriptor tmpindex=TempDescriptor.tempFactory("temp",aan.getIndex().getType());
+       NodePair npe=flattenExpressionNode(aan.getExpression(),tmp);
+       NodePair npi=flattenExpressionNode(aan.getIndex(),tmpindex);
+       FlatElementNode fn=new FlatElementNode(tmp,tmpindex,out_temp);
+       npe.getEnd().addNext(npi.getBegin());
+       npi.getEnd().addNext(fn);
+       return new NodePair(npe.getBegin(),fn);
+    }
+
     private NodePair flattenAssignmentNode(AssignmentNode an,TempDescriptor out_temp) {
        // Two cases:
        // left side is variable
@@ -247,6 +258,19 @@ public class BuildFlat {
            FlatSetFieldNode fsfn=new FlatSetFieldNode(dst_tmp, fan.getField(), src_tmp);
            np_baseexp.getEnd().addNext(fsfn);
            return new NodePair(np_src.getBegin(), fsfn);
+       } else if (an.getDest().kind()==Kind.ArrayAccessNode) {
+           ArrayAccessNode aan=(ArrayAccessNode)an.getDest();
+           ExpressionNode en=aan.getExpression();
+           ExpressionNode enindex=aan.getIndex();
+           TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst",en.getType());
+           TempDescriptor index_tmp=TempDescriptor.tempFactory("index",enindex.getType());
+           NodePair np_baseexp=flattenExpressionNode(en, dst_tmp);
+           NodePair np_indexexp=flattenExpressionNode(enindex, index_tmp);
+           last.addNext(np_baseexp.getBegin());
+           np_baseexp.getEnd().addNext(np_indexexp.getBegin());
+           FlatSetElementNode fsen=new FlatSetElementNode(dst_tmp, index_tmp, src_tmp);
+           np_indexexp.getEnd().addNext(fsen);
+           return new NodePair(np_src.getBegin(), fsen);
        } else if (an.getDest().kind()==Kind.NameNode) {
            NameNode nn=(NameNode)an.getDest();
            if (nn.getExpression()!=null) {
@@ -367,6 +391,8 @@ public class BuildFlat {
            return flattenCreateObjectNode((CreateObjectNode)en,out_temp);
        case Kind.FieldAccessNode:
            return flattenFieldAccessNode((FieldAccessNode)en,out_temp);
+       case Kind.ArrayAccessNode:
+           return flattenArrayAccessNode((ArrayAccessNode)en,out_temp);
        case Kind.LiteralNode:
            return flattenLiteralNode((LiteralNode)en,out_temp);
        case Kind.MethodInvokeNode:
index f69720f36e6566f48c4ea3a36009abc91403fa3b..4c700d43b0419fb0438c20f779fa7ab2daa1b4dc 100644 (file)
@@ -1,7 +1,6 @@
 package IR.Flat;
 
 public class FKind {
-
     public static final int FlatCall=1;
     public static final int FlatFieldNode=2;
     public static final int FlatSetFieldNode=3;
@@ -13,4 +12,5 @@ public class FKind {
     public static final int FlatCondBranch=9;
     public static final int FlatNop=10;    
     public static final int FlatSetElementNode=11;
+    public static final int FlatElementNode=12;
 }
diff --git a/Robust/src/IR/Flat/FlatElementNode.java b/Robust/src/IR/Flat/FlatElementNode.java
new file mode 100644 (file)
index 0000000..d94affa
--- /dev/null
@@ -0,0 +1,42 @@
+package IR.Flat;
+import IR.FieldDescriptor;
+
+public class FlatElementNode extends FlatNode {
+    TempDescriptor src;
+    TempDescriptor dst;
+    TempDescriptor index;
+    
+    public FlatElementNode(TempDescriptor src, TempDescriptor index, TempDescriptor dst) {
+       this.index=index;
+       this.src=src;
+       this.dst=dst;
+    }
+
+    public TempDescriptor getIndex() {
+       return index;
+    }
+
+    public TempDescriptor getSrc() {
+       return src;
+    }
+
+    public TempDescriptor getDst() {
+       return dst;
+    }
+
+    public String toString() {
+       return dst.toString()+"="+src.toString()+"["+index.toString()+"]";
+    }
+
+    public int kind() {
+       return FKind.FlatElementNode;
+    }
+
+    public TempDescriptor [] writesTemps() {
+       return new TempDescriptor[] {dst};
+    }
+
+    public TempDescriptor [] readsTemps() {
+       return new TempDescriptor[] {src,index};
+    }
+}
index f4ef5ccf2e6c60656011f17eef9de3be75a3e1a4..e4e0d00a5146dea5411d74ccbe43affad9459b20 100644 (file)
@@ -44,6 +44,10 @@ public class FlatNew extends FlatNode {
        return dst;
     }
 
+    public TempDescriptor getSize() {
+       return size;
+    }
+
     public TypeDescriptor getType() {
        return type;
     }
index 93b5af68ceb1c4cbb98bfcf1cfa91fe8d6a80bea..b8b43463c92a8b50a1a78d6ca76451ed5060169d 100644 (file)
@@ -12,6 +12,8 @@ public class State {
        this.treemethodmap=new Hashtable();
        this.flatmethodmap=new Hashtable();
        this.parsetrees=new HashSet();
+       this.arraytypes=new HashSet();
+       this.arraytonumber=new Hashtable();
     }
 
     public void addParseNode(ParseNode parsetree) {
@@ -22,8 +24,27 @@ public class State {
     public Set parsetrees;
     public Hashtable treemethodmap;
     public Hashtable flatmethodmap;
+    private HashSet arraytypes;
+    public Hashtable arraytonumber;
     private int numclasses=0;
+    private int arraycount=0;
 
+    public void addArrayType(TypeDescriptor td) {
+       arraytypes.add(td);
+       arraytonumber.put(td,new Integer(arraycount++));
+    }
+
+    public Iterator getArrayIterator() {
+       return arraytypes.iterator();
+    }
+
+    public int getArrayNumber(TypeDescriptor td) {
+       return ((Integer)arraytonumber.get(td)).intValue();
+    }
+
+    public int numArrays() {
+       return arraytypes.size();
+    }
 
     public static TypeDescriptor getTypeDescriptor(int t) {
        TypeDescriptor td=new TypeDescriptor(t);
index 558e4fe1e8f65dad99c3c39076c74c57da170508..79026676ca5adc2ccf239c16d7877fdfab7d5126 100644 (file)
@@ -106,7 +106,7 @@ public class BuildIR {
            TypeDescriptor td=parseTypeDescriptor(nn.getChild("basetype"));
            Integer numdims=(Integer)nn.getChild("dims").getLiteral();
            for(int i=0;i<numdims.intValue();i++)
-               td=td.makeArray();
+               td=td.makeArray(state);
            return td;
        } else {
            throw new Error();
@@ -137,7 +137,7 @@ public class BuildIR {
            ParseNode tmp=vardecl;
            TypeDescriptor arrayt=t;
            while (tmp.getChild("single")==null) {
-               arrayt=arrayt.makeArray();
+               arrayt=arrayt.makeArray(state);
                tmp=tmp.getChild("array");
            }
            String identifier=tmp.getChild("single").getTerminal();
@@ -199,7 +199,7 @@ public class BuildIR {
            if (pn.getChild("dims_opt").getLiteral()!=null)
                num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
            for(int i=0;i<args.size()+num;i++)
-               td=td.makeArray();
+               td=td.makeArray(state);
            CreateObjectNode con=new CreateObjectNode(td);
            for(int i=0;i<args.size();i++) {
                con.addArgument((ExpressionNode)args.get(i));
@@ -347,7 +347,7 @@ public class BuildIR {
                ParseNode tmp=vardecl;
                TypeDescriptor arrayt=t;
                while (tmp.getChild("single")==null) {
-                   arrayt=arrayt.makeArray();
+                   arrayt=arrayt.makeArray(state);
                    tmp=tmp.getChild("array");
                }
                String identifier=tmp.getChild("single").getTerminal();
@@ -442,7 +442,7 @@ public class BuildIR {
 
             ParseNode tmp=paramn;
             while (tmp.getChild("single")==null) {
-                type=type.makeArray();
+                type=type.makeArray(state);
                 tmp=tmp.getChild("array");
             }
             String paramname=tmp.getChild("single").getTerminal();
index 0f1a4fb9da1a544283e5d50603abbd75da042732..8327609188d02a799377e9f41b702d608a1e3749 100644 (file)
@@ -31,16 +31,26 @@ public class TypeDescriptor extends Descriptor {
                return false;
            if ((type==CLASS)&&(t.class_desc!=class_desc))
                return false;
+           if (t.arraycount!=arraycount)
+               return false;
            return true;
        }
        return false;
     }
 
-    public TypeDescriptor makeArray() {
+    public int hashCode() {
+       int hashcode=type^arraycount;
+       if (type==CLASS)
+           hashcode^=class_desc.hashCode();
+       return hashcode;
+    }
+
+    public TypeDescriptor makeArray(State state) {
        TypeDescriptor td=new TypeDescriptor(getSymbol());
        td.arraycount=arraycount+1;
        td.type=type;
        td.class_desc=class_desc;
+       state.addArrayType(td);
        return td;
     }