X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FGlobalFlowGraph.java;h=ac901bedfb78ed4bb229fcb0b3f239d012526871;hp=35fbd006bb2fa93f887e0b260dce42cd3afc371a;hb=da0fa968b5637a83e1e8878fc1ab3df8e413344a;hpb=76263fb08dca40e3c50ec9403ff4ddd02c35bfe1 diff --git a/Robust/src/Analysis/SSJava/GlobalFlowGraph.java b/Robust/src/Analysis/SSJava/GlobalFlowGraph.java index 35fbd006..ac901bed 100644 --- a/Robust/src/Analysis/SSJava/GlobalFlowGraph.java +++ b/Robust/src/Analysis/SSJava/GlobalFlowGraph.java @@ -19,6 +19,7 @@ public class GlobalFlowGraph { Map, GlobalFlowNode> mapLocTupleToNode; Map> mapFlowNodeToOutNodeSet; + Map> mapFlowNodeToInNodeSet; Map mapLocationToInferCompositeLocation; @@ -26,6 +27,8 @@ public class GlobalFlowGraph { this.md = md; this.mapLocTupleToNode = new HashMap, GlobalFlowNode>(); this.mapFlowNodeToOutNodeSet = new HashMap>(); + this.mapFlowNodeToInNodeSet = new HashMap>(); + this.mapLocationToInferCompositeLocation = new HashMap(); } @@ -59,7 +62,7 @@ public class GlobalFlowGraph { CompositeLocation oldCompLoc = mapLocationToInferCompositeLocation.get(loc); if (newCompLoc.getSize() == oldCompLoc.getSize()) { - for (int i = 0; i < oldCompLoc.getSize(); i++) { + for (int i = 0; i < oldCompLoc.getSize() - 1; i++) { Location oldLocElement = oldCompLoc.get(i); Location newLocElement = newCompLoc.get(i); @@ -96,10 +99,22 @@ public class GlobalFlowGraph { } mapFlowNodeToOutNodeSet.get(fromNode).add(toNode); + if (!mapFlowNodeToInNodeSet.containsKey(toNode)) { + mapFlowNodeToInNodeSet.put(toNode, new HashSet()); + } + mapFlowNodeToInNodeSet.get(toNode).add(fromNode); + System.out.println("create a global edge from " + fromNode + " to " + toNode); } + public Set getInNodeSet(GlobalFlowNode node) { + if (!mapFlowNodeToInNodeSet.containsKey(node)) { + mapFlowNodeToInNodeSet.put(node, new HashSet()); + } + return mapFlowNodeToInNodeSet.get(node); + } + public Set getNodeSet() { Set nodeSet = new HashSet(); nodeSet.addAll(mapLocTupleToNode.values()); @@ -202,6 +217,80 @@ public class GlobalFlowGraph { } + public Set getIncomingNodeSetByPrefix(Location prefix) { + + Set incomingNodeSet = new HashSet(); + + for (Iterator iterator = getNodeSet().iterator(); iterator.hasNext();) { + GlobalFlowNode curNode = (GlobalFlowNode) iterator.next(); + Set outNodeSet = getOutNodeSet(curNode); + + for (Iterator iterator2 = outNodeSet.iterator(); iterator2.hasNext();) { + GlobalFlowNode outNode = (GlobalFlowNode) iterator2.next(); + + if (outNode.getLocTuple().startsWith(prefix)) { + incomingNodeSet.add(curNode); + recurIncomingNodeSetByPrefix(prefix, curNode, incomingNodeSet); + } + + } + } + + return incomingNodeSet; + + } + + private void recurIncomingNodeSetByPrefix(Location prefix, GlobalFlowNode node, + Set visited) { + + Set inNodeSet = getInNodeSet(node); + + for (Iterator iterator = inNodeSet.iterator(); iterator.hasNext();) { + GlobalFlowNode curNode = (GlobalFlowNode) iterator.next(); + + if (!curNode.getLocTuple().startsWith(prefix) && !visited.contains(curNode)) { + visited.add(curNode); + recurIncomingNodeSetByPrefix(prefix, curNode, visited); + } + } + + } + + public Set getReachableNodeSetByPrefix(Location prefix) { + + Set reachableNodeSet = new HashSet(); + + for (Iterator iterator = getNodeSet().iterator(); iterator.hasNext();) { + GlobalFlowNode curNode = (GlobalFlowNode) iterator.next(); + + if (curNode.getLocTuple().startsWith(prefix)) { + Set outNodeSet = getOutNodeSet(curNode); + for (Iterator iterator2 = outNodeSet.iterator(); iterator2.hasNext();) { + GlobalFlowNode outNode = (GlobalFlowNode) iterator2.next(); + if (!outNode.getLocTuple().startsWith(prefix) && !reachableNodeSet.contains(outNode)) { + reachableNodeSet.add(outNode); + recurReachableNodeSetByPrefix(prefix, outNode, reachableNodeSet); + } + + } + } + } + + return reachableNodeSet; + } + + private void recurReachableNodeSetByPrefix(Location prefix, GlobalFlowNode node, + Set reachableNodeSet) { + Set outNodeSet = getOutNodeSet(node); + for (Iterator iterator = outNodeSet.iterator(); iterator.hasNext();) { + GlobalFlowNode outNode = (GlobalFlowNode) iterator.next(); + if (!outNode.getLocTuple().startsWith(prefix) && !reachableNodeSet.contains(outNode)) { + reachableNodeSet.add(outNode); + recurReachableNodeSetByPrefix(prefix, outNode, reachableNodeSet); + } + } + } + public Set getReachableNodeSetFrom(GlobalFlowNode node) { Set reachableNodeSet = new HashSet();