X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FBuildLattice.java;h=eb38f2709aea6053819aab8cef5e4e4799b1c9bf;hb=9cdbca1a3dcc949bee74ee42ddd8febff6048b9f;hp=bbef531aeb3c5c582fdbfc1c2aa9f50466332021;hpb=75ee5e21119b65f10cf603d29ee261674cd05a9a;p=IRC.git diff --git a/Robust/src/Analysis/SSJava/BuildLattice.java b/Robust/src/Analysis/SSJava/BuildLattice.java index bbef531a..eb38f270 100644 --- a/Robust/src/Analysis/SSJava/BuildLattice.java +++ b/Robust/src/Analysis/SSJava/BuildLattice.java @@ -14,8 +14,13 @@ public class BuildLattice { public static int seed = 0; private LocationInference infer; + private final HNode topNode; + private final HNode bottomNode; + public BuildLattice(LocationInference infer) { this.infer = infer; + topNode = new HNode(infer.ssjava.TOP); + bottomNode = new HNode(infer.ssjava.BOTTOM); } public SSJavaLattice buildLattice(Descriptor desc) { @@ -47,12 +52,17 @@ public class BuildLattice { Set higher = (Set) iterator.next(); String higherName = generateElementName(basisSet, inputGraph, mapFToLocName, higher); - locSummary.addMapHNodeNameToLocationName(higherName, higherName); HNode higherNode = inputGraph.getHNode(higherName); if (higherNode != null && higherNode.isSharedNode()) { lattice.addSharedLoc(higherName); } + Set descSet = inputGraph.getDescSetOfNode(higherNode); + for (Iterator iterator2 = descSet.iterator(); iterator2.hasNext();) { + Descriptor d = (Descriptor) iterator2.next(); + locSummary.addMapHNodeNameToLocationName(d.getSymbol(), higherName); + } + // locSummary.addMapHNodeNameToLocationName(higherName, higherName); Set> lowerSet = mapImSucc.get(higher); for (Iterator iterator2 = lowerSet.iterator(); iterator2.hasNext();) { @@ -121,8 +131,7 @@ public class BuildLattice { for (Iterator iterator = nodeSet.iterator(); iterator.hasNext();) { HNode node = (HNode) iterator.next(); - System.out.println("-node=" + node); - + System.out.println("node=" + node); if (node.isSkeleton() && (!visited.contains(node))) { visited.add(node); @@ -155,7 +164,6 @@ public class BuildLattice { HNode endNode = (HNode) iterator3.next(); endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode)); } - // System.out.println("-endCombNodeSet=" + endCombNodeSet); visited.add(outNode); // follows the straight line up to another skeleton/combination node @@ -164,13 +172,11 @@ public class BuildLattice { removeTransitivelyReachToNode(desc, combinationNodeInSCGraph, endCombNodeSet); recurDFS(desc, lattice, combinationNodeInSCGraph, endCombNodeSet, visited, mapIntermediateLoc, 1, locSummary, outNode); - // recurDFS(desc, lattice, combinationNodeInSCGraph, endCombNodeSet, visited, - // mapIntermediateLoc, 1, locSummary, outNode); } } else { // we have a node that is neither combination or skeleton node - // System.out.println("skeleton node=" + node + " outNode=" + outNode); + System.out.println("%%%skeleton node=" + node + " outNode=" + outNode); HNode startNode = scGraph.getCurrentHNode(node); // if (node.getDescriptor() != null) { @@ -185,21 +191,25 @@ public class BuildLattice { Set endNodeSetFromSimpleGraph = simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(outNode, null); - // System.out.println("endNodeSetFromSimpleGraph=" + endNodeSetFromSimpleGraph - // + " from=" + outNode); + System.out.println("endNodeSetFromSimpleGraph=" + endNodeSetFromSimpleGraph + + " from=" + outNode); Set endCombNodeSet = new HashSet(); for (Iterator iterator3 = endNodeSetFromSimpleGraph.iterator(); iterator3.hasNext();) { HNode endNode = (HNode) iterator3.next(); endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode)); } - + System.out.println("endCombNodeSet=" + endCombNodeSet); visited.add(outNode); if (endCombNodeSet.size() > 0) { // follows the straight line up to another skeleton/combination node endCombNodeSet = removeTransitivelyReachToNode(desc, startNode, endCombNodeSet); - recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited, - mapIntermediateLoc, 1, locSummary, outNode); + } else if (endCombNodeSet.size() == 0) { + // the outNode is (directly/transitively) connected to the bottom node + // therefore, we just add a dummy bottom HNode to the endCombNodeSet. + endCombNodeSet.add(bottomNode); } + recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited, + mapIntermediateLoc, 1, locSummary, outNode); } } @@ -209,56 +219,31 @@ public class BuildLattice { && !visited.contains(node)) { // an intermediate node 'node' may be located between "TOP" location and a skeleton node + int sizeIncomingNode = simpleGraph.getIncomingNodeSet(node).size(); - Set outNodeSet = - simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(node, null); - // Set outNodeSet = simpleGraph.getOutgoingNodeSet(node); - System.out.println("this case? node=" + node + " outNodeSet=" + outNodeSet); + if (sizeIncomingNode == 0) { + // this node will be directly connected to the TOP location + // start adding the following nodes from this node - Set belowSkeletonLocNameSet = new HashSet(); - Set belowSCNodeSet = new HashSet(); + Set endNodeSetFromSimpleGraph = + simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(node, null); - for (Iterator iterator2 = outNodeSet.iterator(); iterator2.hasNext();) { - HNode outNode = (HNode) iterator2.next(); - if (outNode.isSkeleton()) { - belowSCNodeSet.add(scGraph.getCurrentHNode(outNode)); - belowSkeletonLocNameSet.add(scGraph.getCurrentHNode(outNode).getName()); - } - } - System.out.println("-belowSkeletonLocNameSet=" + belowSkeletonLocNameSet); - if (belowSkeletonLocNameSet.size() > 0) { - - int count = simpleGraph.countHopFromTopLocation(node); - System.out.println("---count=" + count); - - TripleItem item = new TripleItem(null, belowSCNodeSet, count); - if (!mapIntermediateLoc.containsKey(item)) { - String newLocName = "ILOC" + (seed++); - mapIntermediateLoc.put(item, newLocName); - lattice.insertNewLocationBetween(lattice.getTopItem(), belowSkeletonLocNameSet, - newLocName); - locSummary.addMapHNodeNameToLocationName(node.getName(), newLocName); - } else { - String locName = mapIntermediateLoc.get(item); - locSummary.addMapHNodeNameToLocationName(node.getName(), locName); + Set endCombNodeSet = new HashSet(); + for (Iterator iterator3 = endNodeSetFromSimpleGraph.iterator(); iterator3.hasNext();) { + HNode endNode = (HNode) iterator3.next(); + endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode)); } - // if (!mapBelowNameSetToILOCName.containsKey(belowSkeletonLocNameSet)) { - // String newLocName = "ILOC" + (seed++); - // mapBelowNameSetToILOCName.put(belowSkeletonLocNameSet, newLocName); - // lattice.insertNewLocationBetween(lattice.getTopItem(), belowSkeletonLocNameSet, - // newLocName); - // locSummary.addMapHNodeNameToLocationName(node.getName(), newLocName); - // } else { - // String ilocName = mapBelowNameSetToILOCName.get(belowSkeletonLocNameSet); - // locSummary.addMapHNodeNameToLocationName(node.getName(), ilocName); - // } + HNode startNode = topNode; + visited.add(startNode); + if (endCombNodeSet.size() > 0) { + // follows the straight line up to another skeleton/combination node + // endCombNodeSet = removeTransitivelyReachToNode(desc, node, endCombNodeSet); + recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited, + mapIntermediateLoc, 1, locSummary, node); + } } - // else { - // System.out.println("---LocName=" + newLocName); - // lattice.put(newLocName); - // } } } @@ -348,9 +333,15 @@ public class BuildLattice { } String locName = mapIntermediateLoc.get(item); - locSummary.addMapHNodeNameToLocationName(curNode.getName(), locName); - HierarchyGraph graph = infer.getSimpleHierarchyGraph(desc); + + Set descSet = graph.getDescSetOfNode(curNode); + for (Iterator iterator = descSet.iterator(); iterator.hasNext();) { + Descriptor d = (Descriptor) iterator.next(); + locSummary.addMapHNodeNameToLocationName(d.getSymbol(), locName); + } + // locSummary.addMapHNodeNameToLocationName(curNode.getName(), locName); + Set outSet = graph.getOutgoingNodeSet(curNode); for (Iterator iterator2 = outSet.iterator(); iterator2.hasNext();) { HNode outNode = (HNode) iterator2.next(); @@ -393,13 +384,17 @@ public class BuildLattice { } + HierarchyGraph graph = infer.getSimpleHierarchyGraph(desc); String locName = mapIntermediateLoc.get(item); - locSummary.addMapHNodeNameToLocationName(curNode.getName(), locName); + Set descSet = graph.getDescSetOfNode(curNode); + for (Iterator iterator = descSet.iterator(); iterator.hasNext();) { + Descriptor d = (Descriptor) iterator.next(); + locSummary.addMapHNodeNameToLocationName(d.getSymbol(), locName); + } // System.out.println("-TripleItem=" + item); // System.out.println("-curNode=" + curNode.getName() + " locName=" + locName); - HierarchyGraph graph = infer.getSimpleHierarchyGraph(desc); Set outSet = graph.getOutgoingNodeSet(curNode); for (Iterator iterator2 = outSet.iterator(); iterator2.hasNext();) { HNode outNode = (HNode) iterator2.next();