changes on the inference engine.
[IRC.git] / Robust / src / Analysis / SSJava / FlowGraph.java
index 6382ed008123c476091c9c9a5abf0f86ab9db480..4e0a7a66a5bddafeb279274ac01569e3a6fe3dbd 100644 (file)
@@ -23,6 +23,9 @@ public class FlowGraph {
   Set<FlowNode> returnNodeSet;
   FlowNode thisVarNode;
 
+  Map<NTuple<Location>, FlowNode> mapLocTupleToFlowNode;
+  Map<FlowNode, NTuple<Location>> mapFlowNodeToLocTuple;
+
   // maps the composite representation of field/var descriptors to infer nodes
   Map<NTuple<Descriptor>, FlowNode> mapDescTupleToInferNode;
 
@@ -35,6 +38,8 @@ public class FlowGraph {
 
   public FlowGraph(MethodDescriptor md, Map<Descriptor, Integer> mapParamDescToIdx) {
     this.md = md;
+    this.mapFlowNodeToLocTuple = new HashMap<FlowNode, NTuple<Location>>();
+    this.mapLocTupleToFlowNode = new HashMap<NTuple<Location>, FlowNode>();
     this.nodeSet = new HashSet<FlowNode>();
     this.mapDescTupleToInferNode = new HashMap<NTuple<Descriptor>, FlowNode>();
     this.mapNodeToNeighborSet = new HashMap<NTuple<Descriptor>, Set<FlowNode>>();
@@ -42,14 +47,16 @@ public class FlowGraph {
     this.mapParamDescToIdx.putAll(mapParamDescToIdx);
     this.returnNodeSet = new HashSet<FlowNode>();
 
-    // create a node for 'this' varialbe
-    NTuple<Descriptor> thisDescTuple = new NTuple<Descriptor>();
-    thisDescTuple.add(md.getThis());
-    FlowNode thisNode = new FlowNode(thisDescTuple, true);
-    NTuple<Descriptor> thisVarTuple = new NTuple<Descriptor>();
-    thisVarTuple.add(md.getThis());
-    createNewFlowNode(thisVarTuple);
-    thisVarNode = thisNode;
+    if (!md.isStatic()) {
+      // create a node for 'this' varialbe
+      NTuple<Descriptor> thisDescTuple = new NTuple<Descriptor>();
+      thisDescTuple.add(md.getThis());
+      FlowNode thisNode = new FlowNode(thisDescTuple, true);
+      NTuple<Descriptor> thisVarTuple = new NTuple<Descriptor>();
+      thisVarTuple.add(md.getThis());
+      createNewFlowNode(thisVarTuple);
+      thisVarNode = thisNode;
+    }
 
   }
 
@@ -79,7 +86,7 @@ public class FlowGraph {
     }
     set.add(neighbor);
 
-    System.out.println("add a new neighbor " + neighbor + " to " + node);
+//    System.out.println("add a new neighbor " + neighbor + " to " + node);
   }
 
   public boolean hasEdge(NTuple<Descriptor> fromDescTuple, NTuple<Descriptor> toDescTuple) {
@@ -104,10 +111,10 @@ public class FlowGraph {
 
   public void addValueFlowEdge(NTuple<Descriptor> fromDescTuple, NTuple<Descriptor> toDescTuple) {
 
-    FlowNode fromNode = mapDescTupleToInferNode.get(fromDescTuple);
-    FlowNode toNode = mapDescTupleToInferNode.get(toDescTuple);
+    FlowNode fromNode = getFlowNode(fromDescTuple);
+    FlowNode toNode = getFlowNode(toDescTuple);
 
-    System.out.println("create an edge from " + fromNode + " to " + toNode);
+    // System.out.println("create an edge from " + fromNode + " to " + toNode);
 
     int fromTupleSize = fromDescTuple.size();
     NTuple<Descriptor> curTuple = new NTuple<Descriptor>();
@@ -133,7 +140,7 @@ public class FlowGraph {
     FlowEdge edge = new FlowEdge(fromNode, toNode, initTuple, endTuple);
     fromNode.addOutEdge(edge);
 
-    System.out.println("add a new edge=" + edge);
+//    System.out.println("add a new edge=" + edge);
 
   }
 
@@ -158,12 +165,14 @@ public class FlowGraph {
       mapDescTupleToInferNode.put(tuple, node);
       nodeSet.add(node);
 
+      mapLocTupleToFlowNode.put(getLocationTuple(node), node);
+
       if (tuple.size() > 1) {
         NTuple<Descriptor> baseTuple = tuple.subList(0, tuple.size() - 1);
         getFlowNode(baseTuple).addFieldNode(node);
       }
 
-      System.out.println("Creating new node=" + node);
+//      System.out.println("Creating new node=" + node);
       return node;
     } else {
       return mapDescTupleToInferNode.get(tuple);
@@ -231,26 +240,39 @@ public class FlowGraph {
 
   public NTuple<Location> getLocationTuple(FlowNode fn) {
 
-    NTuple<Descriptor> descTuple = fn.getDescTuple();
-
-    NTuple<Location> locTuple = new NTuple<Location>();
-
-    ClassDescriptor cd = null;
-
-    for (int i = 0; i < descTuple.size(); i++) {
-      Descriptor d = descTuple.get(i);
-      Location loc;
-      if (i == 0) {
-        loc = new Location(md, d.getSymbol());
-        cd = ((VarDescriptor) d).getType().getClassDesc();
+    if (!mapFlowNodeToLocTuple.containsKey(fn)) {
+      NTuple<Descriptor> descTuple = fn.getDescTuple();
+      NTuple<Location> locTuple = new NTuple<Location>();
+      ClassDescriptor cd = null;
+
+      Descriptor localDesc = fn.getDescTuple().get(0);
+      if (localDesc.getSymbol().equals(LocationInference.TOPLOC)) {
+        Location topLoc = new Location(md, Location.TOP);
+        locTuple.add(topLoc);
+      } else if (localDesc.getSymbol().equals(LocationInference.GLOBALLOC)) {
+        Location topLoc = new Location(md, LocationInference.GLOBALLOC);
+        locTuple.add(topLoc);
       } else {
-        loc = new Location(cd, d.getSymbol());
-        cd = ((FieldDescriptor) d).getType().getClassDesc();
+        // normal case
+        for (int i = 0; i < descTuple.size(); i++) {
+          Descriptor curDesc = descTuple.get(i);
+          Location loc;
+          if (i == 0) {
+            loc = new Location(md, curDesc.getSymbol());
+            loc.setLocDescriptor(md);
+            cd = ((VarDescriptor) curDesc).getType().getClassDesc();
+          } else {
+            loc = new Location(cd, curDesc.getSymbol());
+            loc.setLocDescriptor(curDesc);
+            cd = ((FieldDescriptor) curDesc).getType().getClassDesc();
+          }
+          locTuple.add(loc);
+        }
       }
-      locTuple.add(loc);
-    }
 
-    return locTuple;
+      mapFlowNodeToLocTuple.put(fn, locTuple);
+    }
+    return mapFlowNodeToLocTuple.get(fn);
   }
 
   public Set<FlowNode> getIncomingFlowNodeSet(FlowNode node) {