// the current node is not a combination node
// there is only one parent node which should be skeleton node.
- System.out.println(" hierarchyGraph.getSkeleteNodeSetReachTo(" + hNode + ")="
- + hierarchyGraph.getSkeleteNodeSetReachTo(hNode));
- aboveSet.addAll(hierarchyGraph.getSkeleteNodeSetReachTo(hNode));
- System.out.println(" aboveset of " + hNode + "=" + aboveSet);
- // assert aboveSet.size() == 1;
+ // System.out.println(" hierarchyGraph.getSkeleteNodeSetReachTo(" + hNode + ")="
+ // + hierarchyGraph.getSkeleteNodeSetReachTo(hNode));
+
+ Set<HNode> reachToSet = hierarchyGraph.getSkeleteNodeSetReachTo(hNode);
+ for (Iterator iterator2 = reachToSet.iterator(); iterator2.hasNext();) {
+ HNode reachToNode = (HNode) iterator2.next();
+ aboveSet.add(scGraph.getCurrentHNode(reachToNode));
+ }
+
SCNode = aboveSet.iterator().next();
}
trace = hierarchyGraph.computeDistance(hNode, endSet, combineSkeletonNodeSet);
- System.out.println(" COUNT-RESULT::node=" + hNode + " above=" + endSet + " trace="
- + trace + " SCNode=" + SCNode);
+ System.out.println(" COUNT-RESULT::start=" + hNode + " end=" + endSet + " trace="
+ + trace);
}
// 3) convert the node m into a chain of nodes with the last node in the chain having m’s
Set<Set<HNode>> keySet = simpleHierarchyGraph.getCombineNodeSet();
for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
Set<HNode> combineSet = (Set<HNode>) iterator.next();
- System.out.println("--combineSet=" + combineSet);
HNode combinationNode = getCombinationNode(combineSet);
- System.out.println("--combinationNode=" + combinationNode + " combineSet=" + combineSet);
-
- System.out.println("--hierarchynodes="
+ System.out.println("\n@INSERT COMBINATION NODE FOR combineSet=" + combineSet
+ + " --combinationNode=" + combinationNode);
+ System.out.println(" --hierarchynodes="
+ simpleHierarchyGraph.getCombinationNodeSetByCombineNodeSet(combineSet));
Set<HNode> simpleHNodeSet =
if (isFirstNodeOfChain) {
simpleHierarchyGraph.addFirstNodeOfChain(combineSet, simpleHNode);
System.out.println("IT IS THE FIRST NODE OF THE CHAIN:" + simpleHNode);
+ // System.out.println("--->INCOMING NODES=");
+ // Set<HNode> inNodeSet = simpleHierarchyGraph.getIncomingNodeSet(simpleHNode);
+ // for (Iterator iterator3 = inNodeSet.iterator(); iterator3.hasNext();) {
+ // HNode inNode = (HNode) iterator3.next();
+ // System.out.println(" inNode=" + inNode + " combineSet="
+ // + simpleHierarchyGraph.getCombineSetByCombinationNode(inNode) + " SKELETON TO SET="
+ // + simpleHierarchyGraph.getSkeleteNodeSetReachTo(inNode));
+ // }
}
}
srcNode = getHNode(inSkeletonNode.getDescriptor());
}
// System.out.println("--srcNode=" + srcNode);
+ System.out.println(" ADD EDGE SRC=" + srcNode + " -> " + combinationNode);
addEdgeWithNoCycleCheck(srcNode, combinationNode);
}
// because the node is not directly connected to the combination node
// removeRedundantReachToNodes(reachToSet);
- return reachToSet;
+ return removeTransitivelyReachToSet(reachToSet);
+ // return reachToSet;
}
private void recurSkeletonReachTo(HNode node, Set<HNode> reachToSet, Set<HNode> visited) {
if (!node.isSkeleton()) {
Set<HNode> reachToSet = getSkeleteNodeSetReachTo(node);
// Set<HNode> tempSet = removeTransitivelyReachToSet(reachToSet);
+ // System.out.println("ALL REACH SET=" + reachToSet);
// reachToSet = removeTransitivelyReachToSet(reachToSet);
Set<HNode> curReachToSet = new HashSet<HNode>();
curReachToSet.add(getCurrentHNode(reachSkeletonNode));
}
- System.out.println("-curReachToSet=" + curReachToSet + " reachToSet=" + reachToSet);
+ // System.out.println("-curReachToSett=" + curReachToSet + " reachToSet=" + reachToSet);
reachToSet = curReachToSet;
// System.out.println("$node=" + node + " reachToNodeSet=" + reachToSet + " tempSet="
}
public Stack<String> computeDistance(HNode startNode, Set<HNode> endNodeSet, Set<HNode> combineSet) {
- System.out.println("#####computeDistance startNode=" + startNode + " endNode=" + endNodeSet);
+ // System.out.println("#####computeDistanceance startNode=" + startNode + " endNode=" +
+ // endNodeSet);
Stack<String> trace = new Stack<String>();
return recur_computeDistance(startNode, endNodeSet, 0, combineSet, trace);
}
}
}
-
if (endNodeSet.contains(curNode)) {
// it reaches to one of endNodeSet
return trace;
}
}
- System.out.println(" traverse more to" + inNode + " before-trace=" + trace);
+ // System.out.println(" traverse more to" + inNode + " before-trace=" + trace);
Stack<String> newTrace = (Stack<String>) trace.clone();
Stack<String> curTrace =
recur_computeDistance(inNode, endNodeSet, count, combineSet, newTrace);
- System.out.println("curTrace=" + curTrace);
+ // System.out.println("curTracerTrace=" + curTrace);
if (curTrace != null && curTrace.size() > curMaxDistance) {
curMaxTrace = curTrace;
// HNode inNode = inNodeSet.iterator().next();
return -1;
}
+
+ public void removeIsolatedNodes() {
+ Set<HNode> toberemoved = new HashSet<HNode>();
+ for (Iterator iterator = nodeSet.iterator(); iterator.hasNext();) {
+ HNode node = (HNode) iterator.next();
+ if (getIncomingNodeSet(node).isEmpty() && getOutgoingNodeSet(node).isEmpty()) {
+ toberemoved.add(node);
+ }
+ }
+ nodeSet.removeAll(toberemoved);
+ }
}
lattice.removeRedundantEdges();
LocationInference.numLocationsSInfer += lattice.getKeySet().size();
+ System.out.println(desc + " numPaths=" + lattice.countPaths());
if (desc instanceof ClassDescriptor) {
// field lattice
HierarchyGraph simpleHierarchyGraph = getHierarchyGraph(desc).clone();
simpleHierarchyGraph.setName(desc + "_SIMPLE");
simpleHierarchyGraph.removeRedundantEdges();
+ // simpleHierarchyGraph.removeIsolatedNodes();
mapDescriptorToSimpleHierarchyGraph.put(desc, simpleHierarchyGraph);
}
}
// if the srcNode is started with the global descriptor
// need to set as a skeleton node
if (!hasGlobalAccess && srcNode.getDescTuple().startsWith(GLOBALDESC)) {
+ System.out.println("SRCNODE=" + srcNode);
hasGlobalAccess = true;
}
// set hasGloabalAccess true in the method summary.
if (hasGlobalAccess) {
getMethodSummary(md).setHasGlobalAccess();
+ methodGraph.getHNode(GLOBALDESC).setSkeleton(true);
}
- methodGraph.getHNode(GLOBALDESC).setSkeleton(true);
if (ssjava.getMethodContainingSSJavaLoop().equals(md)) {
// if the current method contains the event loop
}
}
-
-
public SSJavaLattice<T> clone() {
SSJavaLattice<T> clone = new SSJavaLattice<T>(getTopItem(), getBottomItem());
return clone;
}
+ public int countPaths() {
+ T bottom = getBottomItem();
+
+ Map<T, Set<T>> map = getIncomingElementMap();
+ Map<T, Integer> countMap = new HashMap<T, Integer>();
+
+ Set<T> visited = new HashSet<T>();
+ visited.add(bottom);
+
+ countMap.put(bottom, new Integer(1));
+ recur_countPaths(bottom, map, countMap, visited);
+ if (countMap.containsKey(getTopItem())) {
+ return countMap.get(getTopItem());
+ }
+ return 0;
+ }
+
+ private void recur_countPaths(T cur, Map<T, Set<T>> map, Map<T, Integer> countMap, Set<T> visited) {
+ int curCount = countMap.get(cur).intValue();
+ Set<T> inSet = map.get(cur);
+
+ for (Iterator iterator = inSet.iterator(); iterator.hasNext();) {
+ T in = (T) iterator.next();
+ int inCount = 0;
+ if (countMap.containsKey(in)) {
+ inCount = countMap.get(in).intValue();
+ }
+ inCount += curCount;
+ countMap.put(in, inCount);
+ if (visited.containsAll(get(in))) {
+ visited.add(in);
+ recur_countPaths(in, map, countMap, visited);
+ }
+ }
+ }
}