More code to implement tags
authorbdemsky <bdemsky>
Thu, 12 Apr 2007 12:41:42 +0000 (12:41 +0000)
committerbdemsky <bdemsky>
Thu, 12 Apr 2007 12:41:42 +0000 (12:41 +0000)
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FKind.java
Robust/src/IR/Flat/FlatFlagActionNode.java
Robust/src/IR/Flat/FlatTagDeclaration.java [new file with mode: 0644]
Robust/src/IR/Flat/TempDescriptor.java
Robust/src/IR/Flat/TempTagPair.java
Robust/src/IR/TagDescriptor.java

index a20080a304db1f7b702d9ab8a9abce4d445980ad..f57306350287b724e7ed51070bb090a794574dbd 100644 (file)
@@ -61,10 +61,18 @@ public class BuildFlat {
        for(int i=0;i<flags.size();i++) {
            FlagEffects fes=(FlagEffects)flags.get(i);
            TempDescriptor flagtemp=getTempforVar(fes.getVar());
+           // Process the flags
            for(int j=0;j<fes.numEffects();j++) {
                FlagEffect fe=fes.getEffect(j);
                ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
            }
+           // Process the tags
+           for(int j=0;j<fes.numTagEffects();j++) {
+               TagEffect te=fes.getTagEffect(j);
+               TempDescriptor tagtemp=getTempforVar(te.getTag());
+               
+               ffan.addTagAction(flagtemp, te.getTag().getTag(), tagtemp, te.getStatus());
+           }
        }
     }
 
@@ -150,14 +158,20 @@ public class BuildFlat {
                FlatFlagActionNode ffan=new FlatFlagActionNode(FlatFlagActionNode.NEWOBJECT);
                FlagEffects fes=con.getFlagEffects();
                TempDescriptor flagtemp=out_temp;
-               if (fes!=null)
+               if (fes!=null) {
                    for(int j=0;j<fes.numEffects();j++) {
                        FlagEffect fe=fes.getEffect(j);
                        ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
-                   } else {
-                       ffan.addFlagAction(flagtemp, null, false);
-                   }
+                   } 
+                   for(int j=0;j<fes.numTagEffects();j++) {
+                       TagEffect te=fes.getTagEffect(j);
+                       TempDescriptor tagtemp=getTempforVar(te.getTag());
                
+                       ffan.addTagAction(flagtemp, te.getTag().getTag(), tagtemp, te.getStatus());
+                   }
+               } else {
+                   ffan.addFlagAction(flagtemp, null, false);
+               }
                last.addNext(ffan);
                last=ffan;
            }
@@ -657,23 +671,47 @@ public class BuildFlat {
        }
     }
 
-    private TempDescriptor getTempforParam(VarDescriptor vd) {
-       if (temptovar.containsKey(vd))
-           return (TempDescriptor)temptovar.get(vd);
+    private NodePair flattenTagDeclarationNode(TagDeclarationNode dn) {
+       TagVarDescriptor tvd=dn.getTagVarDescriptor();
+       TagDescriptor tag=tvd.getTag();
+       TempDescriptor tmp=getTempforVar(tvd);
+       FlatTagDeclaration ftd=new FlatTagDeclaration(tag, tmp);
+       return new NodePair(ftd,ftd);
+    }
+
+    private TempDescriptor getTempforParam(Descriptor d) {
+       if (temptovar.containsKey(d))
+           return (TempDescriptor)temptovar.get(d);
        else {
-           TempDescriptor td=TempDescriptor.paramtempFactory(vd.getName(),vd.getType());
-           temptovar.put(vd,td);
-           return td;
+           if (d instanceof VarDescriptor) {
+               VarDescriptor vd=(VarDescriptor)d;
+               TempDescriptor td=TempDescriptor.paramtempFactory(vd.getName(),vd.getType());
+               temptovar.put(vd,td);
+               return td;
+           } else if (d instanceof TagVarDescriptor) {
+               TagVarDescriptor tvd=(TagVarDescriptor)d;
+               TempDescriptor td=TempDescriptor.paramtempFactory(tvd.getName(),tvd.getTag());
+               temptovar.put(tvd,td);
+               return td;
+           } else throw new Error("Unreconized Descriptor");
        }
     }
-
-    private TempDescriptor getTempforVar(VarDescriptor vd) {
-       if (temptovar.containsKey(vd))
-           return (TempDescriptor)temptovar.get(vd);
+    
+    private TempDescriptor getTempforVar(Descriptor d) {
+       if (temptovar.containsKey(d))
+           return (TempDescriptor)temptovar.get(d);
        else {
-           TempDescriptor td=TempDescriptor.tempFactory(vd.getName(),vd.getType());
-           temptovar.put(vd,td);
-           return td;
+           if (d instanceof VarDescriptor) {
+               VarDescriptor vd=(VarDescriptor)d;
+               TempDescriptor td=TempDescriptor.tempFactory(vd.getName(),vd.getType());
+               temptovar.put(vd,td);
+               return td;
+           } else if (d instanceof TagVarDescriptor) {
+               TagVarDescriptor tvd=(TagVarDescriptor)d;
+               TempDescriptor td=TempDescriptor.tempFactory(tvd.getName(),tvd.getTag());
+               temptovar.put(tvd,td);
+               return td;
+           } else throw new Error("Unrecognized Descriptor");
        }
     }
 
@@ -827,6 +865,9 @@ public class BuildFlat {
            
        case Kind.DeclarationNode:
            return flattenDeclarationNode((DeclarationNode)bsn);
+
+       case Kind.TagDeclarationNode:
+           return flattenTagDeclarationNode((TagDeclarationNode)bsn);
            
        case Kind.IfStatementNode:
            return flattenIfStatementNode((IfStatementNode)bsn);
index f89f114528f5ad4c13effce3c2e74da41ea164ca..0de4e0636d9cb30a3d952b716e75baa6c0321435 100644 (file)
@@ -16,5 +16,5 @@ public class FKind {
     public static final int FlatFlagActionNode=13;
     public static final int FlatCheckNode=14;
     public static final int FlatBackEdge=15;    
-    public static final int FlatTagActionNode=16;
+    public static final int FlatTagDeclaration=16;
 }
index da0f761f203209a0d906925ad81a0bc90bef3f71..3379cbb347ff21d6b856f8200b81397792ab6771 100644 (file)
@@ -1,6 +1,6 @@
 package IR.Flat;
 import IR.FlagDescriptor;
-import IR.TagVarDescriptor;
+import IR.TagDescriptor;
 import java.util.Hashtable;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -33,8 +33,8 @@ public class FlatFlagActionNode extends FlatNode {
        tempflagpairs.put(tfp, new Boolean(status));
     }
 
-    public void addTagAction(TempDescriptor td, TagVarDescriptor tvd, boolean status) {
-       TempTagPair ttp=new TempTagPair(td,tvd);
+    public void addTagAction(TempDescriptor td, TagDescriptor tagd, TempDescriptor tagt, boolean status) {
+       TempTagPair ttp=new TempTagPair(td,tagd, tagt);
        if (temptagpairs.containsKey(ttp)) {
            throw new Error("Temp/Tag combination used twice: "+ttp);
        }
diff --git a/Robust/src/IR/Flat/FlatTagDeclaration.java b/Robust/src/IR/Flat/FlatTagDeclaration.java
new file mode 100644 (file)
index 0000000..78ada70
--- /dev/null
@@ -0,0 +1,36 @@
+package IR.Flat;
+import IR.TagDescriptor;
+
+public class FlatTagDeclaration extends FlatNode {
+    TempDescriptor dst;
+    TagDescriptor type;
+    
+    public FlatTagDeclaration(TagDescriptor type, TempDescriptor dst) {
+       this.type=type;
+       this.dst=dst;
+    }
+
+    public String toString() {
+       return dst.toString()+"= new Tag("+type.toString()+")";
+    }
+
+    public int kind() {
+       return FKind.FlatTagDeclaration;
+    }
+
+    public TempDescriptor [] writesTemps() {
+       return new TempDescriptor[] {dst};
+    }
+
+    public TempDescriptor [] readsTemps() {
+       return new TempDescriptor[0];
+    }
+
+    public TempDescriptor getDst() {
+       return dst;
+    }
+
+    public TagDescriptor getType() {
+       return type;
+    }
+}
index 0eacbbeee315e713a3461ccf1d8afbf33470fd42..932d7d58f28749ebe2075e16dd504dff60b47fac 100644 (file)
@@ -6,6 +6,7 @@ public class TempDescriptor extends Descriptor {
     int id;
     //    String safename;
     TypeDescriptor type;
+    TagDescriptor tag;
 
     public TempDescriptor(String name) {
        super(name);
@@ -16,6 +17,11 @@ public class TempDescriptor extends Descriptor {
        this(name);
        type=td;
     }
+
+    public TempDescriptor(String name, TagDescriptor td) {
+       this(name);
+       tag=td;
+    }
     
     public static TempDescriptor tempFactory() {
        return new TempDescriptor("temp_"+currentid);
@@ -29,10 +35,17 @@ public class TempDescriptor extends Descriptor {
        return new TempDescriptor(name+currentid,td);
     }
 
+    public static TempDescriptor tempFactory(String name, TagDescriptor tag) {
+       return new TempDescriptor(name+currentid,tag);
+    }
+
     public static TempDescriptor paramtempFactory(String name, TypeDescriptor td) {
        return new TempDescriptor(name,td);
     }
 
+    public static TempDescriptor paramtempFactory(String name, TagDescriptor tag) {
+       return new TempDescriptor(name,tag);
+    }
 
     public String toString() {
        return safename;
@@ -45,4 +58,8 @@ public class TempDescriptor extends Descriptor {
     public TypeDescriptor getType() {
        return type;
     }
+
+    public TagDescriptor getTag() {
+       return tag;
+    }
 }
index c777a064cc27e4ede68ce83db011b0747e7a3159..a5fb9bc4d86cb2dffc7eab4b5a78dc92f57e02a5 100644 (file)
@@ -1,37 +1,40 @@
 package IR.Flat;
-import IR.TagVarDescriptor;
+import IR.TagDescriptor;
 
 public class TempTagPair {
-    TagVarDescriptor tvd;
+    TagDescriptor tagd;
     TempDescriptor td;
+    TempDescriptor tagt;
 
-    public TempTagPair(TempDescriptor td, TagVarDescriptor tvd) {
-       this.tvd=tvd;
+    public TempTagPair(TempDescriptor td, TagDescriptor tagd, TempDescriptor tagt) {
+       this.tagd=tagd;
+       this.tagt=tagt;
        this.td=td;
     }
     public int hashCode() {
-       if (tvd!=null)
-           return tvd.hashCode()^td.hashCode();
-       else
-           return td.hashCode();
+       return tagd.hashCode()^td.hashCode()^tagt.hashCode();
     }
-
+    
     public TempDescriptor getTemp() {
        return td;
     }
 
-    public TagVarDescriptor getTag() {
-       return tvd;
+    public TagDescriptor getTag() {
+       return tagd;
+    }
+
+    public TempDescriptor getTagTemp() {
+       return tagt;
     }
 
     public boolean equals(Object o) {
        if (!(o instanceof TempTagPair))
            return false;
        TempTagPair ttp=(TempTagPair)o;
-       return ttp.tvd==tvd&&(ttp.td==td);
+       return ttp.tagd.equals(tagd)&&ttp.tagt==tagt&&ttp.td==td;
     }
 
     public String toString() {
-       return "<"+tvd+","+td+">";
+       return "<"+td+","+tagd+","+tagt+">";
     }
 }
index 4faa30f10f9275c8bb06c955d7d9c006006ed6b7..48a2e70a6a727302b04d4813b73490724572c5c9 100644 (file)
@@ -15,7 +15,7 @@ public class TagDescriptor extends Descriptor {
     public boolean equals(Object o) {
        if (o instanceof TagDescriptor) {
            TagDescriptor t=(TagDescriptor) o;
-           return getSymbol()==t.getSymbol();
+           return getSymbol().equals(t.getSymbol());
        } else return false;
     }