1 package Analysis.Pointer;
4 import Analysis.Pointer.AllocFactory.AllocNode;
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));
16 static MySet<Edge> genEdges(TempDescriptor tmp, MySet<Edge> dstSet) {
17 MySet<Edge> edgeset=new MySet<Edge>();
19 edgeset.add(e.changeSrcVar(tmp));
24 static MySet<Edge> genEdges(HashSet<AllocNode> srcSet, FieldDescriptor fd, HashSet<AllocNode> dstSet) {
25 MySet<Edge> edgeset=new MySet<Edge>();
26 for(AllocNode srcnode:srcSet) {
27 for(AllocNode dstnode:dstSet) {
28 edgeset.add(new Edge(srcnode, fd, dstnode, Edge.NEW));
34 static MySet<Edge> getDiffEdges(Delta delta, TempDescriptor tmp) {
35 MySet<Edge> edges=new MySet<Edge>();
36 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
38 MySet<Edge> baseedges=delta.basevaredge.get(tmp);
39 if (baseedges!=null) {
40 for(Edge e:baseedges) {
41 if (removeedges==null||!removeedges.contains(e))
45 if (delta.varedgeadd.containsKey(tmp))
46 for(Edge e:delta.varedgeadd.get(tmp)) {
52 static MySet<Edge> getEdges(Graph graph, Delta delta, TempDescriptor tmp) {
53 MySet<Edge> edges=new MySet<Edge>();
54 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
56 for(Edge e:graph.getEdges(tmp)) {
57 if (removeedges==null||!removeedges.contains(e))
60 if (delta.varedgeadd.containsKey(tmp))
61 for(Edge e:delta.varedgeadd.get(tmp)) {
67 static MySet<Edge> getEdges(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
68 MySet<Edge> nodes=new MySet<Edge>();
69 for(AllocNode node:srcNodes) {
70 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
71 for(Edge e:graph.getEdges(node)) {
72 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
75 if (delta.heapedgeadd.containsKey(node))
76 for(Edge e:delta.heapedgeadd.get(node)) {
84 static MySet<Edge> getEdges(Graph graph, Delta delta, AllocNode node) {
85 MySet<Edge> nodes=new MySet<Edge>();
86 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
87 for(Edge e:graph.getEdges(node)) {
88 if ((removeedges==null||!removeedges.contains(e)))
91 if (delta.heapedgeadd.containsKey(node))
92 for(Edge e:delta.heapedgeadd.get(node)) {
99 static HashSet<AllocNode> getDiffNodes(Delta delta, TempDescriptor tmp) {
100 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
101 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
103 MySet<Edge> baseEdges=delta.basevaredge.get(tmp);
106 for(Edge e:baseEdges) {
107 if (removeedges==null||!removeedges.contains(e))
110 if (delta.varedgeadd.containsKey(tmp))
111 for(Edge e:delta.varedgeadd.get(tmp)) {
117 static HashSet<AllocNode> getNodes(Graph graph, Delta delta, TempDescriptor tmp) {
118 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
119 MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
121 for(Edge e:graph.getEdges(tmp)) {
122 if (removeedges==null||!removeedges.contains(e))
125 if (delta.varedgeadd.containsKey(tmp))
126 for(Edge e:delta.varedgeadd.get(tmp)) {
132 static HashSet<AllocNode> getDiffNodes(Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
133 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
134 for(AllocNode node:srcNodes) {
135 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
136 MySet<Edge> baseEdges=delta.baseheapedge.get(node);
138 for(Edge e:baseEdges) {
139 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
142 if (delta.heapedgeadd.containsKey(node))
143 for(Edge e:delta.heapedgeadd.get(node)) {
151 static MySet<Edge> getDiffEdges(Delta delta, HashSet<AllocNode> srcNodes) {
152 MySet<Edge> newedges=new MySet<Edge>();
153 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.baseheapedge.entrySet()) {
154 AllocNode node=entry.getKey();
155 if (srcNodes.contains(node)) {
156 MySet<Edge> edges=entry.getValue();
157 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
159 if (removeedges==null||!removeedges.contains(e)) {
165 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.heapedgeadd.entrySet()) {
166 AllocNode node=entry.getKey();
167 if (srcNodes.contains(node)) {
168 MySet<Edge> edges=entry.getValue();
169 newedges.addAll(edges);
176 static MySet<Edge> getDiffEdges(Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
177 MySet<Edge> newedges=new MySet<Edge>();
178 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.baseheapedge.entrySet()) {
179 AllocNode node=entry.getKey();
180 if (srcNodes.contains(node)) {
181 MySet<Edge> edges=entry.getValue();
182 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
184 if ((removeedges==null||!removeedges.contains(e))&&(e.fd==fd)) {
190 for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.heapedgeadd.entrySet()) {
191 AllocNode node=entry.getKey();
192 if (srcNodes.contains(node)) {
193 MySet<Edge> edges=entry.getValue();
203 static MySet<Edge> makeOld(MySet<Edge> edgesin) {
204 MySet<Edge> edgeset=new MySet<Edge>();
205 for(Edge e:edgesin) {
206 edgeset.add(e.makeOld());
211 static MySet<Edge> dereference(Graph graph, Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd) {
212 MySet<Edge> edgeset=new MySet<Edge>();
213 for(Edge edge:srcEdges) {
214 MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
215 for(Edge e:graph.getEdges(edge.dst)) {
216 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
217 e=e.changeSrcVar(dst);
218 if (!edgeset.contains(e))
221 Edge preve=edgeset.get(e);
227 if (delta.heapedgeadd.containsKey(edge.dst))
228 for(Edge e:delta.heapedgeadd.get(edge.dst)) {
230 e=e.changeSrcVar(dst);
231 if (!edgeset.contains(e))
234 Edge preve=edgeset.get(e);
244 static MySet<Edge> diffDereference(Delta delta, TempDescriptor dst, MySet<Edge> srcEdges, FieldDescriptor fd) {
245 MySet<Edge> edgeset=new MySet<Edge>();
246 for(Edge edge:srcEdges) {
247 MySet<Edge> removeedges=delta.heapedgeremove.get(edge.dst);
248 if (delta.baseheapedge.containsKey(edge.dst)) {
249 for(Edge e:delta.baseheapedge.get(edge.dst)) {
250 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e))) {
251 e=e.changeSrcVar(dst);
252 if (!edgeset.contains(e))
255 Edge preve=edgeset.get(e);
262 if (delta.heapedgeadd.containsKey(edge.dst))
263 for(Edge e:delta.heapedgeadd.get(edge.dst)) {
265 e=e.changeSrcVar(dst);
266 if (!edgeset.contains(e))
269 Edge preve=edgeset.get(e);
279 static HashSet<AllocNode> getNodes(Graph graph, Delta delta, HashSet<AllocNode> srcNodes, FieldDescriptor fd) {
280 HashSet<AllocNode> nodes=new HashSet<AllocNode>();
281 for(AllocNode node:srcNodes) {
282 MySet<Edge> removeedges=delta.heapedgeremove.get(node);
283 for(Edge e:graph.getEdges(node)) {
284 if (e.fd==fd&&(removeedges==null||!removeedges.contains(e)))
287 if (delta.heapedgeadd.containsKey(node))
288 for(Edge e:delta.heapedgeadd.get(node)) {