+ throw new Error("Unrecognized node:"+node + " of kind " + node.kind());
+ }
+ }
+
+ Delta processSESEEnterNode(FlatSESEEnterNode sese, Delta delta, Graph graph) {
+ if (!OoOJava)
+ return processFlatNop(sese, delta, graph);
+ if (delta.getInit()) {
+ removeInitTaints(null, delta, graph);
+ for (TempDescriptor tmp : sese.getInVarSet()) {
+ Taint taint=Taint.factory(sese, null, tmp, AllocFactory.dummySite, null, ReachGraph.predsEmpty);
+ MySet<Edge> edges=GraphManip.getEdges(graph, delta, tmp);
+ for(Edge e : edges) {
+ Edge newe=e.addTaint(taint);
+ delta.addVarEdge(newe);
+ }
+ }
+ } else {
+ removeDiffTaints(null, delta);
+ for (TempDescriptor tmp : sese.getInVarSet()) {
+ Taint taint=Taint.factory(sese, null, tmp, AllocFactory.dummySite, null, ReachGraph.predsEmpty);
+ MySet<Edge> edges=GraphManip.getDiffEdges(delta, tmp);
+ for(Edge e : edges) {
+ Edge newe=e.addTaint(taint);
+ delta.addVarEdge(newe);
+ }
+ }
+ }
+
+
+ applyDiffs(graph, delta);
+ return delta;
+ }
+
+ private boolean isRecursive(FlatSESEEnterNode sese) {
+ MethodDescriptor md=sese.getmdEnclosing();
+ boolean isrecursive=callGraph.getCalleeSet(md).contains(md);
+ return isrecursive;
+ }
+
+ Delta processSESEExitNode(FlatSESEExitNode seseexit, Delta delta, Graph graph) {
+ if (!OoOJava)
+ return processFlatNop(seseexit, delta, graph);
+ FlatSESEEnterNode sese=seseexit.getFlatEnter();
+ //Strip Taints from this SESE
+ if (delta.getInit()) {
+ removeInitTaints(isRecursive(sese)?null:sese, delta, graph);
+ } else {
+ removeDiffTaints(isRecursive(sese)?null:sese, delta);
+ }
+ applyDiffs(graph, delta);
+ return delta;
+ }
+
+ void removeDiffTaints(FlatSESEEnterNode sese, Delta delta) {
+ //Start with variable edges
+ {
+ MySet<Edge> edgestoadd=new MySet<Edge>();
+ MySet<Edge> edgestoremove=new MySet<Edge>();
+
+ //Process base diff edges
+ processEdgeMap(sese, delta.basevaredge, null, delta.varedgeremove, edgestoremove, edgestoadd);
+ //Process delta edges
+ processEdgeMap(sese, delta.varedgeadd, null, null, edgestoremove, edgestoadd);
+ for(Edge e : edgestoremove) {
+ delta.removeVarEdge(e);
+ }
+ for(Edge e : edgestoadd) {
+ delta.addVarEdge(e);
+ }
+ }
+
+ //Now do heap edges
+ {
+ MySet<Edge> edgestoadd=new MySet<Edge>();
+ MySet<Edge> edgestoremove=new MySet<Edge>();
+
+ //Process base diff edges
+ processEdgeMap(sese, delta.baseheapedge, null, delta.heapedgeremove, edgestoremove, edgestoadd);
+ //Process delta edges
+ processEdgeMap(sese, delta.heapedgeadd, null, null, edgestoremove, edgestoadd);
+ for(Edge e : edgestoremove) {
+ delta.removeHeapEdge(e);
+ }
+ for(Edge e : edgestoadd) {
+ delta.addHeapEdge(e);
+ }
+ }
+ }
+
+ void removeInitTaints(FlatSESEEnterNode sese, Delta delta, Graph graph) {
+ //Start with variable edges
+ {
+ MySet<Edge> edgestoadd=new MySet<Edge>();
+ MySet<Edge> edgestoremove=new MySet<Edge>();
+
+ //Process parent edges
+ processEdgeMap(sese, graph.parent.varMap, graph.varMap, delta.varedgeremove, edgestoremove, edgestoadd);
+ //Process graph edges
+ processEdgeMap(sese, graph.varMap, null, delta.varedgeremove, edgestoremove, edgestoadd);
+ //Process delta edges
+ processEdgeMap(sese, delta.varedgeadd, null, null, edgestoremove, edgestoadd);
+ for(Edge e : edgestoremove) {
+ delta.removeVarEdge(e);
+ }
+ for(Edge e : edgestoadd) {
+ delta.addVarEdge(e);
+ }
+ }
+
+ //Now do heap edges
+ {
+ MySet<Edge> edgestoadd=new MySet<Edge>();
+ MySet<Edge> edgestoremove=new MySet<Edge>();
+
+ //Process parent edges
+ processEdgeMap(sese, graph.parent.nodeMap, graph.nodeMap, delta.heapedgeremove, edgestoremove, edgestoadd);
+ //Process graph edges
+ processEdgeMap(sese, graph.nodeMap, null, delta.heapedgeremove, edgestoremove, edgestoadd);
+ //Process delta edges
+ processEdgeMap(sese, delta.heapedgeadd, null, null, edgestoremove, edgestoadd);
+ for(Edge e : edgestoremove) {
+ delta.removeHeapEdge(e);
+ }
+ for(Edge e : edgestoadd) {
+ delta.addHeapEdge(e);
+ }
+ }
+ }
+
+ void processEdgeMap(FlatSESEEnterNode sese, HashMap<?, MySet<Edge>> edgemap, HashMap<?, MySet<Edge>> childmap, HashMap<?, MySet<Edge>> removemap, MySet<Edge> edgestoremove, MySet<Edge> edgestoadd) {
+ for(Map.Entry<?, MySet<Edge>> entry:edgemap.entrySet()) {
+ //If the parent map exists and overrides this entry, skip it
+ if (childmap!=null&&childmap.containsKey(entry.getKey()))
+ continue;
+ for(Edge e:entry.getValue()) {
+ //check whether this edge has been removed
+ if (removemap!=null&&removemap.containsKey(entry.getKey())&&
+ removemap.get(entry.getKey()).contains(e))
+ continue;
+ //have real edge
+ TaintSet ts=e.getTaints();
+ TaintSet newts=null;
+ //update non-null taint set
+ if (ts!=null)
+ newts=Canonical.removeInContextTaintsNP(ts, sese);
+ if (newts!=null&&newts!=ts) {
+ edgestoremove.add(e);
+ edgestoadd.add(e.changeTaintSet(newts));
+ }
+ }