changes
[IRC.git] / Robust / src / Analysis / Pointer / GraphManip.java
1 package Analysis.Pointer;
2 import IR.Flat.*;
3 import IR.*;
4 import Analysis.Pointer.AllocFactory.AllocNode;
5 import java.util.*;
6
7 public class GraphManip {
8   static MySet<Edge> genEdges(TempDescriptor tmp, HashSet<AllocNode> dstSet) {
9     MySet<Edge> edgeset=new MySet<Edge>();
10     for(AllocNode node:dstSet) {
11       edgeset.add(new Edge(tmp, node));
12     }
13     return edgeset;
14   }
15
16   static MySet<Edge> genEdges(HashSet<AllocNode> srcSet, FieldDescriptor fd, HashSet<AllocNode> dstSet) {
17     MySet<Edge> edgeset=new MySet<Edge>();
18     for(AllocNode srcnode:srcSet) {
19       for(AllocNode dstnode:dstSet) {
20         edgeset.add(new Edge(srcnode, fd, dstnode, Edge.NEW));
21       }
22     }
23     return edgeset;
24   }
25
26   static MySet<Edge> getDiffEdges(Delta delta, TempDescriptor tmp) {
27     MySet<Edge> edges=new MySet<Edge>();
28     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
29
30     for(Edge e:delta.basevaredge.get(tmp)) {
31       if (removeedges==null||!removeedges.contains(e))
32         edges.add(e);
33     }
34     if (delta.varedgeadd.containsKey(tmp))
35       for(Edge e:delta.varedgeadd.get(tmp)) {
36         edges.add(e);
37       }
38     return edges;
39   }
40
41   static MySet<Edge> getEdges(Graph graph, Delta delta, TempDescriptor tmp) {
42     MySet<Edge> edges=new MySet<Edge>();
43     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
44
45     for(Edge e:graph.getEdges(tmp)) {
46       if (removeedges==null||!removeedges.contains(e))
47         edges.add(e);
48     }
49     if (delta.varedgeadd.containsKey(tmp))
50       for(Edge e:delta.varedgeadd.get(tmp)) {
51         edges.add(e);
52       }
53     return edges;
54   }
55
56   static MySet<Edge> getEdges(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
57     MySet<Edge> nodes=new MySet<Edge>();
58     for(AllocNode node:srcNodes) {
59       MySet<Edge> removeedges=delta.heapedgeremove.get(node);
60       for(Edge e:graph.getEdges(node)) {
61         if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
62           nodes.add(e);
63       }
64       if (delta.heapedgeadd.containsKey(node))
65         for(Edge e:delta.heapedgeadd.get(node)) {
66           if (e.fd==fd)
67             nodes.add(e);
68         }
69     }
70     return nodes;
71   }
72
73   static MySet<Edge> getEdges(Graph graph, Delta delta, AllocNode node) {
74     MySet<Edge> nodes=new MySet<Edge>();
75     MySet<Edge> removeedges=delta.heapedgeremove.get(node);
76     for(Edge e:graph.getEdges(node)) {
77       if ((removeedges==null||!removeedges.contains(e)))
78         nodes.add(e);
79     }
80     if (delta.heapedgeadd.containsKey(node))
81       for(Edge e:delta.heapedgeadd.get(node)) {
82         nodes.add(e);
83       }
84     
85     return nodes;
86   }
87
88   static HashSet<AllocNode> getDiffNodes(Delta delta, TempDescriptor tmp) {
89     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
90     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
91
92     for(Edge e:delta.basevaredge.get(tmp)) {
93       if (removeedges==null||!removeedges.contains(e))
94         nodes.add(e.dst);
95     }
96     if (delta.varedgeadd.containsKey(tmp))
97       for(Edge e:delta.varedgeadd.get(tmp)) {
98         nodes.add(e.dst);
99       }
100     return nodes;
101   }
102
103   static HashSet<AllocNode> getNodes(Graph graph, Delta delta, TempDescriptor tmp) {
104     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
105     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
106
107     for(Edge e:graph.getEdges(tmp)) {
108       if (removeedges==null||!removeedges.contains(e))
109         nodes.add(e.dst);
110     }
111     if (delta.varedgeadd.containsKey(tmp))
112       for(Edge e:delta.varedgeadd.get(tmp)) {
113         nodes.add(e.dst);
114       }
115     return nodes;
116   }
117
118   static HashSet<AllocNode> getDiffNodes(Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
119     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
120     for(AllocNode node:srcNodes) {
121       MySet<Edge> removeedges=delta.heapedgeremove.get(node);
122       for(Edge e:delta.baseheapedge.get(node)) {
123         if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
124           nodes.add(e.dst);
125       }
126       if (delta.heapedgeadd.containsKey(node))
127         for(Edge e:delta.heapedgeadd.get(node)) {
128           if (e.fd==fd)
129             nodes.add(e.dst);
130         }
131     }
132     return nodes;
133   }
134
135   static MySet<Edge> getDiffEdges(Delta delta, HashSet<AllocNode> srcNodes) {
136     MySet<Edge> newedges=new MySet<Edge>();
137     for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.baseheapedge.entrySet()) {
138       AllocNode node=entry.getKey();
139       if (srcNodes.contains(node)) {
140         MySet<Edge> edges=entry.getValue();
141         MySet<Edge> removeedges=delta.heapedgeremove.get(node);
142         for(Edge e:edges) {
143           if (!removeedges.contains(e)) {
144             newedges.add(e);
145           }
146         }
147       }
148     }
149     for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.heapedgeadd.entrySet()) {
150       AllocNode node=entry.getKey();
151       if (srcNodes.contains(node)) {
152         MySet<Edge> edges=entry.getValue();
153         newedges.addAll(edges);
154       }
155     }
156     return newedges;
157   }
158
159   static MySet<Edge> makeOld(MySet<Edge> edgesin) {
160     MySet<Edge> edgeset=new MySet<Edge>();
161     for(Edge e:edgesin) {
162       edgeset.add(e.makeOld());
163     }
164     return edgeset;
165   }
166
167   static HashSet<AllocNode> getNodes(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
168     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
169     for(AllocNode node:srcNodes) {
170       MySet<Edge> removeedges=delta.heapedgeremove.get(node);
171       for(Edge e:graph.getEdges(node)) {
172         if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
173           nodes.add(e.dst);
174       }
175       if (delta.heapedgeadd.containsKey(node))
176         for(Edge e:delta.heapedgeadd.get(node)) {
177           if (e.fd==fd)
178             nodes.add(e.dst);
179         }
180     }
181     return nodes;
182   }
183 }