X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FFlowGraph.java;h=ce0021cadcfa6c7ea3f79e5b9583cc604b8cedff;hb=031636263ce6e4b6f35f3d9162460eb0ef536c2a;hp=049317d8ee210ca72c975d20e774be05c10d9ef5;hpb=1bf00baead0bc7e05945fe5649f9d92afadae081;p=IRC.git diff --git a/Robust/src/Analysis/SSJava/FlowGraph.java b/Robust/src/Analysis/SSJava/FlowGraph.java index 049317d8..ce0021ca 100644 --- a/Robust/src/Analysis/SSJava/FlowGraph.java +++ b/Robust/src/Analysis/SSJava/FlowGraph.java @@ -23,6 +23,7 @@ public class FlowGraph { MethodDescriptor md; Set nodeSet; + Set returnNodeSet; FlowNode thisVarNode; // maps the composite representation of field/var descriptors to infer nodes @@ -31,25 +32,45 @@ public class FlowGraph { // maps an infer node to the set of neighbors which is pointed by the node Map, Set> mapNodeToNeighborSet; + // maps a paramter descriptor to its index + Map mapParamDescToIdx; boolean debug = true; - public FlowGraph(MethodDescriptor md) { + public FlowGraph(MethodDescriptor md, Map mapParamDescToIdx) { this.md = md; - nodeSet = new HashSet(); - mapDescTupleToInferNode = new HashMap, FlowNode>(); - mapNodeToNeighborSet = new HashMap, Set>(); + this.nodeSet = new HashSet(); + this.mapDescTupleToInferNode = new HashMap, FlowNode>(); + this.mapNodeToNeighborSet = new HashMap, Set>(); + this.mapParamDescToIdx = new HashMap(); + this.mapParamDescToIdx.putAll(mapParamDescToIdx); + this.returnNodeSet = new HashSet(); // create a node for 'this' varialbe NTuple thisDescTuple = new NTuple(); thisDescTuple.add(md.getThis()); - FlowNode thisNode = new FlowNode(thisDescTuple); + FlowNode thisNode = new FlowNode(thisDescTuple, true); NTuple thisVarTuple = new NTuple(); thisVarTuple.add(md.getThis()); - mapDescTupleToInferNode.put(thisVarTuple, thisNode); + createNewFlowNode(thisVarTuple); thisVarNode = thisNode; } + public Set getNodeSet() { + return nodeSet; + } + + public Set getParameterNodeSet() { + Set paramNodeSet = new HashSet(); + for (Iterator iterator = nodeSet.iterator(); iterator.hasNext();) { + FlowNode fn = (FlowNode) iterator.next(); + if (fn.isParameter()) { + paramNodeSet.add(fn); + } + } + return paramNodeSet; + } + public void addNeighbor(FlowNode node, FlowNode neighbor) { Set set = mapNodeToNeighborSet.get(node); if (set == null) { @@ -60,6 +81,26 @@ public class FlowGraph { System.out.println("add a new neighbor " + neighbor + " to " + node); } + public boolean hasEdge(NTuple fromDescTuple, NTuple toDescTuple) { + + FlowNode fromNode = mapDescTupleToInferNode.get(fromDescTuple); + FlowNode toNode = mapDescTupleToInferNode.get(toDescTuple); + + Set fromNodeOutEdgeSet = fromNode.getOutEdgeSet(); + for (Iterator iterator = fromNodeOutEdgeSet.iterator(); iterator.hasNext();) { + FlowEdge flowEdge = (FlowEdge) iterator.next(); + if (flowEdge.getDst().equals(toNode)) { + return true; + } else { + if (hasEdge(flowEdge.getDst().getDescTuple(), toDescTuple)) { + return true; + } + } + } + + return false; + } + public void addValueFlowEdge(NTuple fromDescTuple, NTuple toDescTuple) { FlowNode fromNode = mapDescTupleToInferNode.get(fromDescTuple); @@ -111,7 +152,8 @@ public class FlowGraph { public FlowNode createNewFlowNode(NTuple tuple) { if (!mapDescTupleToInferNode.containsKey(tuple)) { - FlowNode node = new FlowNode(tuple); + + FlowNode node = new FlowNode(tuple, isParamter(tuple)); mapDescTupleToInferNode.put(tuple, node); nodeSet.add(node); @@ -128,6 +170,33 @@ public class FlowGraph { } + public void setReturnFlowNode(NTuple tuple) { + + if (!mapDescTupleToInferNode.containsKey(tuple)) { + createNewFlowNode(tuple); + } + + FlowNode node = mapDescTupleToInferNode.get(tuple); + node.setReturn(true); + + returnNodeSet.add(node); + } + + public Set getReturnNodeSet() { + return returnNodeSet; + } + + public boolean isParamter(NTuple tuple) { + // return true if a descriptor tuple is started with a parameter descriptor + Descriptor firstIdxDesc = tuple.get(0); + return mapParamDescToIdx.containsKey(firstIdxDesc); + } + + public int getParamIdx(NTuple tuple) { + Descriptor firstDesc = tuple.get(0); + return mapParamDescToIdx.get(firstDesc).intValue(); + } + private void drawEdges(FlowNode node, BufferedWriter bw, Set addedNodeSet, Set addedEdgeSet) throws IOException { @@ -169,7 +238,7 @@ public class FlowGraph { public void writeGraph() throws java.io.IOException { - String graphName = md.toString(); + String graphName = "flowgraph_" + md.toString(); graphName = graphName.replaceAll("[\\W]", ""); BufferedWriter bw = new BufferedWriter(new FileWriter(graphName + ".dot"));