give nodes unique id's for printing code
[IRC.git] / Robust / src / IR / Flat / FlatNode.java
index bc3063c8a1b60f89a1dba4d15d11d9c7ac6db2b4..3af3893a840c309eced1fa843ca24443ff11c2db 100644 (file)
@@ -1,13 +1,19 @@
 package IR.Flat;
 import java.util.Vector;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.Iterator;
 
 public class FlatNode {
-  protected Vector next;
+  public Vector next;
   protected Vector prev;
+  static int idcounter=0;
+  public final int nodeid;
 
   public FlatNode() {
     next=new Vector();
     prev=new Vector();
+    nodeid=(idcounter++);
   }
 
   public String toString() {
@@ -30,9 +36,14 @@ public class FlatNode {
     next.add(n);
     n.addPrev(this);
   }
+
+  public void removeNext(FlatNode n) {
+    next.remove(n);
+  }
   public void removePrev(FlatNode n) {
     prev.remove(n);
   }
+
   /** This function modifies the graph */
   public void setNext(int i, FlatNode n) {
     FlatNode old=getNext(i);
@@ -81,6 +92,25 @@ public class FlatNode {
     throw new Error();
   }
 
+  public Set<FlatNode> getReachableSet(Set<FlatNode> endset) {
+    HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
+    HashSet<FlatNode> visited=new HashSet<FlatNode>();
+    tovisit.add(this);
+    while(!tovisit.isEmpty()) {
+      FlatNode fn=tovisit.iterator().next();
+      tovisit.remove(fn);
+      visited.add(fn);
+      if (endset!=null&&!endset.contains(fn)) {
+       for(int i=0; i<fn.numNext(); i++) {
+         FlatNode nn=fn.getNext(i);
+         if (!visited.contains(nn))
+           tovisit.add(nn);
+       }
+      }
+    }
+    return visited;
+  }
+
   public void replace(FlatNode fnnew) {
     fnnew.prev.setSize(prev.size());
     fnnew.next.setSize(next.size());
@@ -95,12 +125,14 @@ public class FlatNode {
     }
     for(int i=0;i<next.size();i++) {
       FlatNode nnext=(FlatNode)next.get(i);
-      fnnew.next.set(i,nnext);;
+      fnnew.next.set(i,nnext);
       for(int j=0;j<nnext.numPrev();j++) {
        FlatNode n=nnext.getPrev(j);
        if (n==this)
          nnext.prev.set(j, fnnew);
       }
     }
+    next=null;
+    prev=null;
   }
 }