From: yeom Date: Thu, 18 Oct 2012 08:15:03 +0000 (+0000) Subject: changes. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=commitdiff_plain;h=3e9dbf9d589dc5b8ed75a35e1f4e6b02761acda6 changes. --- diff --git a/Robust/src/Analysis/SSJava/BuildLattice.java b/Robust/src/Analysis/SSJava/BuildLattice.java index a08e0166..22e514d4 100644 --- a/Robust/src/Analysis/SSJava/BuildLattice.java +++ b/Robust/src/Analysis/SSJava/BuildLattice.java @@ -211,7 +211,6 @@ public class BuildLattice { endCombNodeSet.add(bottomNode); } - recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited, mapIntermediateLoc, 1, locSummary, outNode); } @@ -225,27 +224,31 @@ public class BuildLattice { System.out.println("n=" + node); // an intermediate node 'node' may be located between "TOP" location and a skeleton node - int sizeIncomingNode = simpleGraph.getIncomingNodeSet(node).size(); - - if (sizeIncomingNode == 0) { + if (simpleGraph.getIncomingNodeSet(node).size() == 0) { // this node will be directly connected to the TOP location // start adding the following nodes from this node - Set endNodeSetFromSimpleGraph = - simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(node, null); + // Set endNodeSetFromSimpleGraph = + // simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(node, null); + + Set endNodeSet = simpleGraph.getReachableSCNodeSet(node); - Set endCombNodeSet = new HashSet(); - for (Iterator iterator3 = endNodeSetFromSimpleGraph.iterator(); iterator3.hasNext();) { + Set endCombNormalNodeSet = new HashSet(); + for (Iterator iterator3 = endNodeSet.iterator(); iterator3.hasNext();) { HNode endNode = (HNode) iterator3.next(); - endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode)); + if (endNode.isSkeleton() || endNode.isCombinationNode()) { + endCombNormalNodeSet.add(getCombinationNodeInSCGraph(desc, endNode)); + } else { + endCombNormalNodeSet.addAll(simpleGraph.getSCNodeReachToSet(endNode)); + } } HNode startNode = topNode; visited.add(startNode); - if (endCombNodeSet.size() > 0) { + if (endCombNormalNodeSet.size() > 0) { // follows the straight line up to another skeleton/combination node // endCombNodeSet = removeTransitivelyReachToNode(desc, node, endCombNodeSet); - recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited, + recurDFSNormalNode(desc, lattice, startNode, endCombNormalNodeSet, visited, mapIntermediateLoc, 1, locSummary, node); } @@ -293,7 +296,6 @@ public class BuildLattice { endCombNodeSet = removeTransitivelyReachToNode(desc, combinationNodeInSCGraph, endCombNodeSet); - recurDFS(desc, lattice, combinationNodeInSCGraph, endCombNodeSet, visited, mapIntermediateLoc, 1, locSummary, cnode); } else { @@ -433,9 +435,14 @@ public class BuildLattice { Set belowSet = new HashSet(); for (Iterator iterator = endNodeSet.iterator(); iterator.hasNext();) { HNode endNode = (HNode) iterator.next(); - belowSet.add(endNode.getName()); + String locName; + if (locSummary.getMapHNodeNameToLocationName().containsKey(endNode.getName())) { + locName = locSummary.getLocationName(endNode.getName()); + } else { + locName = endNode.getName(); + } + belowSet.add(locName); } - lattice.insertNewLocationBetween(above, belowSet, newLocName); mapIntermediateLoc.put(item, newLocName); diff --git a/Robust/src/Analysis/SSJava/HierarchyGraph.java b/Robust/src/Analysis/SSJava/HierarchyGraph.java index ef07ac89..d1ee9fb2 100644 --- a/Robust/src/Analysis/SSJava/HierarchyGraph.java +++ b/Robust/src/Analysis/SSJava/HierarchyGraph.java @@ -36,6 +36,8 @@ public class HierarchyGraph { Map, HNode> mapCombineNodeSetToCombinationNode; Map, Set> mapCombineNodeSetToOutgoingNodeSet; + Map> mapNormalNodeToSCNodeReachToSet; + Set nodeSet; // for the lattice generation @@ -63,6 +65,7 @@ public class HierarchyGraph { mapHNodeNameToCurrentHNode = new HashMap(); + mapNormalNodeToSCNodeReachToSet = new HashMap>(); } public Descriptor getDesc() { @@ -568,6 +571,68 @@ public class HierarchyGraph { } + public Set getReachableSCNodeSet(HNode startNode) { + // returns the set of hnodes which is reachable from the startNode and is either SC node or a + // node which is directly connected to the SC nodes + Set reachable = new HashSet(); + Set visited = new HashSet(); + visited.add(startNode); + recurReachableNodeSet(startNode, visited, reachable); + return reachable; + } + + public Set getSCNodeReachToSet(HNode node) { + if (!mapNormalNodeToSCNodeReachToSet.containsKey(node)) { + mapNormalNodeToSCNodeReachToSet.put(node, new HashSet()); + } + return mapNormalNodeToSCNodeReachToSet.get(node); + } + + private void recurReachableNodeSet(HNode node, Set visited, Set reachable) { + + Set outSet = getOutgoingNodeSet(node); + for (Iterator iterator = outSet.iterator(); iterator.hasNext();) { + HNode out = (HNode) iterator.next(); + + if (!visited.contains(out)) { + visited.add(out); + Set reachableFromSCNodeSet = reachableFromSCNode(out); + mapNormalNodeToSCNodeReachToSet.put(out, reachableFromSCNodeSet); + if (out.isSkeleton() || out.isCombinationNode() || reachableFromSCNodeSet.size() > 0) { + reachable.add(out); + } else { + visited.add(out); + recurReachableNodeSet(out, visited, reachable); + } + + } + + } + + } + + private Set reachableFromSCNode(HNode node) { + Set visited = new HashSet(); + visited.add(node); + Set reachable = new HashSet(); + recurReachableFromSCNode(node, reachable, visited); + return reachable; + } + + private void recurReachableFromSCNode(HNode node, Set reachable, Set visited) { + Set inNodeSet = getIncomingNodeSet(node); + for (Iterator iterator = inNodeSet.iterator(); iterator.hasNext();) { + HNode inNode = (HNode) iterator.next(); + if (inNode.isSkeleton() || inNode.isCombinationNode()) { + visited.add(inNode); + reachable.add(inNode); + } else if (!visited.contains(inNode)) { + visited.add(inNode); + recurReachableFromSCNode(inNode, reachable, visited); + } + } + } + public Set getDirectlyReachableSkeletonCombinationNodeFrom(HNode node, Set combinationNodeSet) { Set reachable = new HashSet();