changes.
[IRC.git] / Robust / src / Analysis / SSJava / GlobalFlowGraph.java
index 1cf59b77354ea137c29705d2aafcbe7a9d09162f..5a2595a4e9527a29f5fa8b34a6c408e40a315e72 100644 (file)
@@ -40,6 +40,10 @@ public class GlobalFlowGraph {
     return mapLocationToInferCompositeLocation;
   }
 
+  public boolean contains(NTuple<Location> locTuple) {
+    return mapLocTupleToNode.containsKey(locTuple);
+  }
+
   public GlobalFlowNode getFlowNode(NTuple<Location> locTuple) {
     if (!mapLocTupleToNode.containsKey(locTuple)) {
       GlobalFlowNode node = createNewGlobalFlowNode(locTuple);
@@ -49,10 +53,17 @@ public class GlobalFlowGraph {
   }
 
   private GlobalFlowNode createNewGlobalFlowNode(NTuple<Location> locTuple) {
+    if (locTuple.size() == 0) {
+      throw new Error();
+    }
     GlobalFlowNode node = new GlobalFlowNode(locTuple);
     return node;
   }
 
+  public boolean contrainsInferCompositeLocationMapKey(Location loc) {
+    return mapLocationToInferCompositeLocation.containsKey(loc);
+  }
+
   public void addMapLocationToInferCompositeLocation(Location loc, CompositeLocation newCompLoc) {
     if (mapLocationToInferCompositeLocation.containsKey(loc)) {
       // need to do a sanity check
@@ -89,8 +100,37 @@ public class GlobalFlowGraph {
     return mapLocationToInferCompositeLocation.get(loc);
   }
 
+  public boolean hasValueFlowEdge(NTuple<Location> fromLocTuple, NTuple<Location> toLocTuple) {
+
+    // return true if the graph already has a flow edge
+
+    if (!mapLocTupleToNode.containsKey(fromLocTuple) || !mapLocTupleToNode.containsKey(toLocTuple)) {
+      return false;
+    }
+
+    GlobalFlowNode fromNode = getFlowNode(fromLocTuple);
+    GlobalFlowNode toNode = getFlowNode(toLocTuple);
+
+    if (!mapFlowNodeToOutNodeSet.containsKey(fromNode)
+        || !mapFlowNodeToInNodeSet.containsKey(toNode)) {
+      return false;
+    }
+
+    if (mapFlowNodeToOutNodeSet.get(fromNode).contains(toNode)
+        && mapFlowNodeToInNodeSet.get(toNode).contains(fromNode)) {
+      return true;
+    }
+
+    return false;
+  }
+
   public void addValueFlowEdge(NTuple<Location> fromLocTuple, NTuple<Location> toLocTuple) {
 
+    Location lastElementfromLocTuple = fromLocTuple.get(fromLocTuple.size() - 1);
+    if (lastElementfromLocTuple.getLocDescriptor().equals(LocationInference.LITERALDESC)) {
+      return;
+    }
+
     GlobalFlowNode fromNode = getFlowNode(fromLocTuple);
     GlobalFlowNode toNode = getFlowNode(toLocTuple);
 
@@ -227,7 +267,6 @@ public class GlobalFlowGraph {
 
       for (Iterator iterator2 = outNodeSet.iterator(); iterator2.hasNext();) {
         GlobalFlowNode outNode = (GlobalFlowNode) iterator2.next();
-
         if (outNode.getLocTuple().startsWith(prefix)) {
           incomingNodeSet.add(curNode);
           recurIncomingNodeSetByPrefix(prefix, curNode, incomingNodeSet);