bug fix: The result of the pointer analysis is broken when it tries to do something...
[IRC.git] / Robust / src / Analysis / Disjoint / PointerMethod.java
index bace6eb47693b46b0fda0322e70c0889226ec99f..5ab2314cb961a1aa81e4833f3ff20a281e03793e 100644 (file)
@@ -15,6 +15,8 @@ public class PointerMethod {
   Hashtable<FlatNode, Vector<FlatNode>> prevmap;
 
   public void analyzeMethod(FlatMethod fm) {
+    if (nextmap.containsKey(fm))
+      return;
     Hashtable<FlatNode, HashSet<FlatNode>> map=new Hashtable<FlatNode, HashSet<FlatNode>>();
     HashSet<FlatNode> toprocess=new HashSet<FlatNode>();
     toprocess.add(fm);
@@ -23,41 +25,47 @@ public class PointerMethod {
       toprocess.remove(fn);
       HashSet<FlatNode> myset=new HashSet<FlatNode>();
       if (!analysisCares(fn)) {
-       for(int i=0;i<fn.numPrev();i++) {
-         myset.addAll(map.get(fn.getPrev(i)));
-       }
+        for(int i=0; i<fn.numPrev(); i++) {
+          if (map.containsKey(fn.getPrev(i)))
+            myset.addAll(map.get(fn.getPrev(i)));
+        }
       } else {
-       myset.add(fn);
+        myset.add(fn);
       }
       if (!map.containsKey(fn)||!map.get(fn).equals(myset)) {
-       map.put(fn, myset);
-       for(int i=0;i<fn.numNext();i++) {
-         toprocess.add(fn.getNext(i));
-       }
+        map.put(fn, myset);
+        for(int i=0; i<fn.numNext(); i++) {
+          toprocess.add(fn.getNext(i));
+        }
       }
     }
-    for(Iterator<FlatNode> it=map.keySet().iterator();it.hasNext();) {
+    for(Iterator<FlatNode> it=map.keySet().iterator(); it.hasNext(); ) {
       FlatNode fn=it.next();
       if (analysisCares(fn)) {
-       HashSet<FlatNode> myset=new HashSet<FlatNode>();
-       for(int i=0;i<fn.numPrev();i++) {
-         myset.addAll(map.get(fn.getPrev(i)));
-       }
-       if (!prevmap.containsKey(fn))
-         prevmap.put(fn, new Vector());
-       for(Iterator<FlatNode> it2=myset.iterator();it2.hasNext();) {
-         FlatNode fnprev=it2.next();
-         if (!nextmap.containsKey(fnprev))
-           nextmap.put(fnprev, new Vector());
-         nextmap.get(fnprev).add(fn);
-         prevmap.get(fn).add(fnprev);
-       }
+        HashSet<FlatNode> myset=new HashSet<FlatNode>();
+        for(int i=0; i<fn.numPrev(); i++) {
+          if (map.containsKey(fn.getPrev(i)))
+            myset.addAll(map.get(fn.getPrev(i)));
+        }
+        if (!prevmap.containsKey(fn))
+          prevmap.put(fn, new Vector());
+        for(Iterator<FlatNode> it2=myset.iterator(); it2.hasNext(); ) {
+          FlatNode fnprev=it2.next();
+          if (!nextmap.containsKey(fnprev))
+            nextmap.put(fnprev, new Vector());
+          nextmap.get(fnprev).add(fn);
+          prevmap.get(fn).add(fnprev);
+        }
       }
     }
   }
 
   public int numNext(FlatNode fn) {
-    return nextmap.get(fn).size();
+    Vector<FlatNode> vfn=nextmap.get(fn);
+    if (vfn==null)
+      return 0;
+    else
+      return vfn.size();
   }
 
   public FlatNode getNext(FlatNode fn, int i) {
@@ -72,6 +80,10 @@ public class PointerMethod {
     return prevmap.get(fn).get(i);
   }
 
+  public boolean isBackEdge(FlatNode fn) {
+    return fn.kind() == FKind.FlatBackEdge;
+  }
+
   public boolean analysisCares(FlatNode fn) {
     switch(fn.kind()) {
     case FKind.FlatMethod:
@@ -82,14 +94,23 @@ public class PointerMethod {
     case FKind.FlatNew:
     case FKind.FlatCall:
     case FKind.FlatReturnNode:
+    case FKind.FlatBackEdge:
+    case FKind.FlatSESEEnterNode:
+    case FKind.FlatSESEExitNode:
+    case FKind.FlatGenReachNode:
+    case FKind.FlatGenDefReachNode:
+    case FKind.FlatExit:
       return true;
+
     case FKind.FlatCastNode:
       FlatCastNode fcn=(FlatCastNode)fn;
       TypeDescriptor td=fcn.getType();
       return td.isPtr();
+
     case FKind.FlatOpNode:
       FlatOpNode fon = (FlatOpNode) fn;
       return fon.getOp().getOp()==Operation.ASSIGN&&fon.getLeft().getType().isPtr();
+
     default:
       return false;
     }