model the allocation of string literals in heap analysis
[IRC.git] / Robust / src / Analysis / Disjoint / PointerMethod.java
index 299a677f9a1e3b0d79bbd5f60e57d7d1ca671ee7..5246c9b8deb1923e9a11ac37042f18a517a0e530 100644 (file)
@@ -25,37 +25,37 @@ public class PointerMethod {
       toprocess.remove(fn);
       HashSet<FlatNode> myset=new HashSet<FlatNode>();
       if (!analysisCares(fn)) {
-       for(int i=0;i<fn.numPrev();i++) {
-         if (map.containsKey(fn.getPrev(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++) {
+        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);
-       }
+        }
+        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);
+        }
       }
     }
   }
@@ -64,7 +64,7 @@ public class PointerMethod {
     Vector<FlatNode> vfn=nextmap.get(fn);
     if (vfn==null)
       return 0;
-    else 
+    else
       return vfn.size();
   }
 
@@ -92,6 +92,7 @@ public class PointerMethod {
     case FKind.FlatElementNode:
     case FKind.FlatSetElementNode:
     case FKind.FlatNew:
+    case FKind.FlatLiteralNode:
     case FKind.FlatCall:
     case FKind.FlatReturnNode:
     case FKind.FlatBackEdge:
@@ -100,13 +101,16 @@ public class PointerMethod {
     case FKind.FlatGenReachNode:
     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;
     }