start implementing basic approach
[IRC.git] / Robust / src / Analysis / SSJava / FlowGraph.java
1 package Analysis.SSJava;
2
3 import java.util.HashMap;
4 import java.util.HashSet;
5 import java.util.Map;
6 import java.util.Set;
7
8 import IR.Descriptor;
9 import IR.MethodDescriptor;
10
11 public class FlowGraph {
12
13   MethodDescriptor md;
14
15   Set<FlowNode> nodeSet;
16   FlowNode thisVarNode;
17
18   // maps the composite representation of field/var descriptors to infer nodes
19   Map<NTuple<Descriptor>, FlowNode> mapDescTupleToInferNode;
20
21   // maps an infer node to the set of neighbors which is pointed by the node
22   Map<NTuple<Descriptor>, Set<FlowNode>> mapNodeToNeighborSet;
23
24   boolean debug = true;
25
26   public FlowGraph(MethodDescriptor md) {
27     this.md = md;
28     nodeSet = new HashSet<FlowNode>();
29     mapDescTupleToInferNode = new HashMap<NTuple<Descriptor>, FlowNode>();
30     mapNodeToNeighborSet = new HashMap<NTuple<Descriptor>, Set<FlowNode>>();
31
32     // create a node for 'this' varialbe
33     FlowNode thisNode = new FlowNode(null, md.getThis());
34     NTuple<Descriptor> thisVarTuple = new NTuple<Descriptor>();
35     thisVarTuple.add(md.getThis());
36     mapDescTupleToInferNode.put(thisVarTuple, thisNode);
37     thisVarNode = thisNode;
38
39   }
40
41   public void addNeighbor(FlowNode node, FlowNode neighbor) {
42     Set<FlowNode> set = mapNodeToNeighborSet.get(node);
43     if (set == null) {
44       set = new HashSet<FlowNode>();
45     }
46     set.add(neighbor);
47
48     System.out.println("add a new neighbor " + neighbor + " to " + node);
49   }
50
51   public void addValueFlowEdge(NTuple<Descriptor> fromDescTuple, NTuple<Descriptor> toDescTuple) {
52
53     FlowNode fromNode = mapDescTupleToInferNode.get(fromDescTuple);
54     FlowNode toNode = mapDescTupleToInferNode.get(toDescTuple);
55
56     System.out.println("create an edge from " + fromNode + " to " + toNode);
57
58     int fromTupleSize = fromDescTuple.size();
59     NTuple<Descriptor> curTuple = new NTuple<Descriptor>();
60     for (int i = 0; i < fromTupleSize; i++) {
61       Descriptor desc = fromDescTuple.get(i);
62       curTuple.add(desc);
63       addNeighbor(getInferNode(curTuple), toNode);
64     }
65
66     int toTupleSize = toDescTuple.size();
67     curTuple = new NTuple<Descriptor>();
68     for (int i = 0; i < toTupleSize; i++) {
69       Descriptor desc = toDescTuple.get(i);
70       curTuple.add(desc);
71       addNeighbor(fromNode, getInferNode(curTuple));
72     }
73
74   }
75
76   public FlowNode getInferNode(NTuple<Descriptor> descTuple) {
77     if (mapDescTupleToInferNode.containsKey(descTuple)) {
78       return mapDescTupleToInferNode.get(descTuple);
79     }
80     return null;
81   }
82
83   public FlowNode getThisVarNode() {
84     return thisVarNode;
85   }
86
87   public void createNewFlowNode(NTuple<Descriptor> base) {
88
89     FlowNode node = new FlowNode(base);
90     mapDescTupleToInferNode.put(base, node);
91
92     System.out.println("Creating new node=" + node);
93
94   }
95
96 }