+
+
+ /* This function computes all edges that start outside of the callee context and go into the callee context */
+
+ void computeExternalEdges(Graph graph, Delta delta, HashSet<AllocNode> nodeset, HashSet<AllocNode> deltaset, MySet<Edge> externaledgeset) {
+ //Do heap edges first
+ HashSet<AllocNode> externalnodes=new HashSet<AllocNode>();
+ externalnodes.addAll(delta.baseheapedge.keySet());
+ externalnodes.addAll(delta.heapedgeadd.keySet());
+ externalnodes.addAll(delta.heapedgeremove.keySet());
+ //remove allinternal nodes
+ externalnodes.removeAll(nodeset);
+ for(AllocNode extNode:externalnodes) {
+ //Compute set of edges from given node
+ MySet<Edge> edges=new MySet<Edge>(delta.baseheapedge.get(extNode));
+ edges.removeAll(delta.heapedgeremove.get(extNode));
+ edges.addAll(delta.heapedgeadd.get(extNode));
+
+ for(Edge e:edges) {
+ if (nodeset.contains(e.dst))
+ externaledgeset.add(e);
+ }
+ }
+
+ //Do heap edges first
+ HashSet<TempDescriptor> temps=new HashSet<TempDescriptor>();
+ temps.addAll(delta.basevaredge.keySet());
+ temps.addAll(delta.varedgeadd.keySet());
+ temps.addAll(delta.varedgeremove.keySet());
+ //remove allinternal nodes
+ temps.removeAll(nodeset);
+
+ for(TempDescriptor tmp:temps) {
+ //Compute set of edges from given node
+ MySet<Edge> edges=new MySet<Edge>(delta.basevaredge.get(tmp));
+ edges.removeAll(delta.varedgeremove.get(tmp));
+ edges.addAll(delta.varedgeadd.get(tmp));
+
+ for(Edge e:edges) {
+ if (nodeset.contains(e.dst))
+ externaledgeset.add(e);
+ }
+ }
+ }
+
+ void removeEdges(Delta delta, HashSet<AllocNode> nodeset, MySet<Edge> edgeset, MySet<Edge> externaledgeset) {
+ //Want to remove the set of internal edges
+ for(Edge e:edgeset) {
+ if (e.src!=null) {
+ if (delta.heapedgeadd.containsKey(e.src)&&delta.heapedgeadd.get(e.src).contains(e)) {
+ //remove edge if it is in the add set
+ delta.heapedgeadd.get(e.src).remove(e);
+ } else {
+ //add edge to to the remove set
+ if (!delta.heapedgeremove.containsKey(e.src))
+ delta.heapedgeremove.put(e.src, new MySet<Edge>());
+ delta.heapedgeremove.get(e.src).add(e);
+ }
+ }
+ }
+
+ //Want to remove the set of external edges
+ for(Edge e:externaledgeset) {
+ //want to remove the set of internal edges
+ if (e.src!=null) {
+ if (delta.heapedgeadd.containsKey(e.src)&&delta.heapedgeadd.get(e.src).contains(e)) {
+ //remove edge if it is in the add set
+ delta.heapedgeadd.get(e.src).remove(e);
+ } else {
+ //add edge to to the remove set
+ if (!delta.heapedgeremove.containsKey(e.src))
+ delta.heapedgeremove.put(e.src, new MySet<Edge>());
+ delta.heapedgeremove.get(e.src).add(e);
+ }
+ } else {
+ if (delta.varedgeadd.containsKey(e.srcvar)&&delta.varedgeadd.get(e.srcvar).contains(e)) {
+ //remove edge if it is in the add set
+ delta.varedgeadd.get(e.srcvar).remove(e);
+ } else {
+ //add edge to to the remove set
+ if (!delta.varedgeremove.containsKey(e.srcvar))
+ delta.varedgeremove.put(e.srcvar,new MySet<Edge>());
+ delta.varedgeremove.get(e.srcvar).add(e);
+ }
+ }
+ }
+ }