X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FLocationInference.java;h=e1524c2519200d5e8138e4ebce9fd8c04eb7a890;hb=b1709554ba9722b714ff6e8f83d60943fc1fa1d8;hp=31900f103f5e2216b7f8ccdf62bf4c33258606f6;hpb=d421edc382984588192603ed519923beadeb4d3a;p=IRC.git diff --git a/Robust/src/Analysis/SSJava/LocationInference.java b/Robust/src/Analysis/SSJava/LocationInference.java index 31900f10..e1524c25 100644 --- a/Robust/src/Analysis/SSJava/LocationInference.java +++ b/Robust/src/Analysis/SSJava/LocationInference.java @@ -88,6 +88,9 @@ public class LocationInference { // map a method descriptor to a method summary private Map mapMethodDescToMethodSummary; + // map a descriptor to a simple lattice + private Map> mapDescriptorToSimpleLattice; + // map a method descriptor to the set of method invocation nodes which are // invoked by the method descriptor private Map> mapMethodDescriptorToMethodInvokeNodeSet; @@ -156,6 +159,8 @@ public class LocationInference { this.mapDescriptorToCombineSkeletonHierarchyGraph = new HashMap(); this.mapDescriptorToSimpleHierarchyGraph = new HashMap(); + this.mapDescriptorToSimpleLattice = new HashMap>(); + } public void setupToAnalyze() { @@ -204,13 +209,23 @@ public class LocationInference { constructHierarchyGraph(); + debug_writeHierarchyDotFiles(); + simplifyHierarchyGraph(); + debug_writeSimpleHierarchyDotFiles(); + constructSkeletonHierarchyGraph(); + debug_writeSkeletonHierarchyDotFiles(); + insertCombinationNodes(); - debug_writeHierarchyDotFile(); + debug_writeSkeletonCombinationHierarchyDotFiles(); + + buildLattice(); + + debug_writeLattices(); System.exit(0); @@ -232,6 +247,88 @@ public class LocationInference { } + private void debug_writeLattices() { + + Set keySet = mapDescriptorToSimpleLattice.keySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + Descriptor key = (Descriptor) iterator.next(); + SSJavaLattice simpleLattice = mapDescriptorToSimpleLattice.get(key); + if (key instanceof ClassDescriptor) { + ssjava.writeLatticeDotFile((ClassDescriptor) key, null, simpleLattice, "_SIMPLE"); + } else if (key instanceof MethodDescriptor) { + MethodDescriptor md = (MethodDescriptor) key; + ssjava.writeLatticeDotFile(md.getClassDesc(), md, simpleLattice, "_SIMPLE"); + } + } + + Set cdKeySet = cd2lattice.keySet(); + for (Iterator iterator = cdKeySet.iterator(); iterator.hasNext();) { + ClassDescriptor cd = (ClassDescriptor) iterator.next(); + ssjava.writeLatticeDotFile(cd, null, cd2lattice.get(cd)); + } + + Set mdKeySet = md2lattice.keySet(); + for (Iterator iterator = mdKeySet.iterator(); iterator.hasNext();) { + MethodDescriptor md = (MethodDescriptor) iterator.next(); + ssjava.writeLatticeDotFile(md.getClassDesc(), md, md2lattice.get(md)); + } + + } + + private void buildLattice() { + + BuildLattice buildLattice = new BuildLattice(this); + + Set keySet = mapDescriptorToCombineSkeletonHierarchyGraph.keySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + Descriptor desc = (Descriptor) iterator.next(); + + HierarchyGraph graph = getSkeletonCombinationHierarchyGraph(desc); + SSJavaLattice simpleLattice = buildLattice.buildLattice(graph); + + addMapDescToSimpleLattice(desc, simpleLattice); + + HierarchyGraph simpleHierarchyGraph = getSimpleHierarchyGraph(desc); + System.out.println("## insertIntermediateNodesToStraightLine:" + + simpleHierarchyGraph.getName()); + SSJavaLattice lattice = + buildLattice.insertIntermediateNodesToStraightLine(desc, simpleLattice); + lattice.removeRedundantEdges(); + + if (desc instanceof ClassDescriptor) { + // field lattice + cd2lattice.put((ClassDescriptor) desc, lattice); + // ssjava.writeLatticeDotFile((ClassDescriptor) desc, null, lattice); + } else if (desc instanceof MethodDescriptor) { + // method lattice + md2lattice.put((MethodDescriptor) desc, lattice); + MethodDescriptor md = (MethodDescriptor) desc; + ClassDescriptor cd = md.getClassDesc(); + // ssjava.writeLatticeDotFile(cd, md, lattice); + } + + // System.out.println("\nSSJAVA: Insering Combination Nodes:" + desc); + // HierarchyGraph skeletonGraph = getSkeletonHierarchyGraph(desc); + // HierarchyGraph skeletonGraphWithCombinationNode = skeletonGraph.clone(); + // skeletonGraphWithCombinationNode.setName(desc + "_SC"); + // + // HierarchyGraph simpleHierarchyGraph = getSimpleHierarchyGraph(desc); + // System.out.println("Identifying Combination Nodes:"); + // skeletonGraphWithCombinationNode.insertCombinationNodesToGraph(simpleHierarchyGraph); + // skeletonGraphWithCombinationNode.simplifySkeletonCombinationHierarchyGraph(); + // mapDescriptorToCombineSkeletonHierarchyGraph.put(desc, skeletonGraphWithCombinationNode); + } + + } + + public void addMapDescToSimpleLattice(Descriptor desc, SSJavaLattice lattice) { + mapDescriptorToSimpleLattice.put(desc, lattice); + } + + public SSJavaLattice getSimpleLattice(Descriptor desc) { + return mapDescriptorToSimpleLattice.get(desc); + } + private void simplifyHierarchyGraph() { Set keySet = mapDescriptorToHierarchyGraph.keySet(); for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { @@ -252,8 +349,9 @@ public class LocationInference { HierarchyGraph skeletonGraphWithCombinationNode = skeletonGraph.clone(); skeletonGraphWithCombinationNode.setName(desc + "_SC"); - HierarchyGraph hierarchyGraph = getHierarchyGraph(desc); - skeletonGraphWithCombinationNode.insertCombinationNodesToGraph(hierarchyGraph); + HierarchyGraph simpleHierarchyGraph = getSimpleHierarchyGraph(desc); + System.out.println("Identifying Combination Nodes:"); + skeletonGraphWithCombinationNode.insertCombinationNodesToGraph(simpleHierarchyGraph); skeletonGraphWithCombinationNode.simplifySkeletonCombinationHierarchyGraph(); mapDescriptorToCombineSkeletonHierarchyGraph.put(desc, skeletonGraphWithCombinationNode); } @@ -267,18 +365,47 @@ public class LocationInference { HierarchyGraph skeletonGraph = simpleGraph.generateSkeletonGraph(); skeletonGraph.setMapDescToHNode(simpleGraph.getMapDescToHNode()); skeletonGraph.setMapHNodeToDescSet(simpleGraph.getMapHNodeToDescSet()); + skeletonGraph.removeRedundantEdges(); mapDescriptorToSkeletonHierarchyGraph.put(desc, skeletonGraph); } } - private void debug_writeHierarchyDotFile() { + private void debug_writeHierarchyDotFiles() { + + Set keySet = mapDescriptorToHierarchyGraph.keySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + Descriptor desc = (Descriptor) iterator.next(); + getHierarchyGraph(desc).writeGraph(); + } + + } + + private void debug_writeSimpleHierarchyDotFiles() { Set keySet = mapDescriptorToHierarchyGraph.keySet(); for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { Descriptor desc = (Descriptor) iterator.next(); getHierarchyGraph(desc).writeGraph(); getSimpleHierarchyGraph(desc).writeGraph(); + } + + } + + private void debug_writeSkeletonHierarchyDotFiles() { + + Set keySet = mapDescriptorToHierarchyGraph.keySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + Descriptor desc = (Descriptor) iterator.next(); getSkeletonHierarchyGraph(desc).writeGraph(); + } + + } + + private void debug_writeSkeletonCombinationHierarchyDotFiles() { + + Set keySet = mapDescriptorToHierarchyGraph.keySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + Descriptor desc = (Descriptor) iterator.next(); getSkeletonCombinationHierarchyGraph(desc).writeGraph(); } @@ -295,7 +422,7 @@ public class LocationInference { return mapDescriptorToSkeletonHierarchyGraph.get(d); } - private HierarchyGraph getSkeletonCombinationHierarchyGraph(Descriptor d) { + public HierarchyGraph getSkeletonCombinationHierarchyGraph(Descriptor d) { if (!mapDescriptorToCombineSkeletonHierarchyGraph.containsKey(d)) { mapDescriptorToCombineSkeletonHierarchyGraph.put(d, new HierarchyGraph(d)); }