X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FSSJavaLattice.java;h=847cfecbb68e8707130cbb363a28d3d1bb4a8d1d;hb=da0fa968b5637a83e1e8878fc1ab3df8e413344a;hp=89ca9af541c0a4ee5ffbc4fcbe04a86b249c9872;hpb=8252b9bcfa61b6a2692c193483e950739fbe5a05;p=IRC.git diff --git a/Robust/src/Analysis/SSJava/SSJavaLattice.java b/Robust/src/Analysis/SSJava/SSJavaLattice.java index 89ca9af5..847cfecb 100644 --- a/Robust/src/Analysis/SSJava/SSJavaLattice.java +++ b/Robust/src/Analysis/SSJava/SSJavaLattice.java @@ -1,7 +1,9 @@ package Analysis.SSJava; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.Map; import java.util.Set; import Util.Lattice; @@ -16,6 +18,10 @@ public class SSJavaLattice extends Lattice { sharedLocSet = new HashSet(); } + public void setSharedLocSet(Set in) { + sharedLocSet.addAll(in); + } + public Set getSharedLocSet() { return sharedLocSet; } @@ -28,6 +34,21 @@ public class SSJavaLattice extends Lattice { return sharedLocSet.contains(loc); } + public Set getElementSet() { + Set set = new HashSet(); + + Set keySet = getKeySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + T key = (T) iterator.next(); + set.add(key); + set.addAll(getTable().get(key)); + } + + set.remove(getTopItem()); + set.remove(getBottomItem()); + return set; + } + public boolean addRelationHigherToLower(T higher, T lower) { System.out.println("add a relation: " + lower + "<" + higher); @@ -91,14 +112,12 @@ public class SSJavaLattice extends Lattice { getInBetweenElements(cur, end, elementSet); } } - System.out.println(" start=" + start + " end=" + end + " element=" + elementSet); } - public void mergeIntoSharedLocation(Set cycleSet, T newLoc) { + public void mergeIntoNewLocation(Set cycleSet, T newLoc) { - // add a new shared loc + // add a new loc put(newLoc); - addSharedLoc(newLoc); Set keySet = getKeySet(); @@ -226,43 +245,30 @@ public class SSJavaLattice extends Lattice { } public void removeRedundantEdges() { - boolean isUpdated; - do { - isUpdated = recurRemoveRedundant(); - } while (isUpdated); - } - public boolean recurRemoveRedundant() { - - Set keySet = getKeySet(); - Set visited = new HashSet(); + Set keySet = getTable().keySet(); for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { - T key = (T) iterator.next(); - Set connectedSet = getTable().get(key); - if (connectedSet != null) { - Set toberemovedSet = new HashSet(); - for (Iterator iterator2 = connectedSet.iterator(); iterator2.hasNext();) { - T dst = (T) iterator2.next(); - Set otherNeighborSet = new HashSet(); - otherNeighborSet.addAll(connectedSet); - otherNeighborSet.remove(dst); - for (Iterator iterator3 = otherNeighborSet.iterator(); iterator3.hasNext();) { - T neighbor = (T) iterator3.next(); - if (isReachable(neighbor, visited, dst)) { - toberemovedSet.add(dst); - } + T src = (T) iterator.next(); + Set connectedSet = getTable().get(src); + Set toberemovedSet = new HashSet(); + for (Iterator iterator2 = connectedSet.iterator(); iterator2.hasNext();) { + T dst = (T) iterator2.next(); + Set otherNeighborSet = new HashSet(); + otherNeighborSet.addAll(connectedSet); + otherNeighborSet.remove(dst); + for (Iterator iterator3 = otherNeighborSet.iterator(); iterator3.hasNext();) { + T neighbor = (T) iterator3.next(); + if (isReachable(neighbor, new HashSet(), dst)) { + toberemovedSet.add(dst); } } - if (toberemovedSet.size() > 0) { - connectedSet.removeAll(toberemovedSet); - return true; - } + } + if (toberemovedSet.size() > 0) { + connectedSet.removeAll(toberemovedSet); } } - return false; - } private boolean isReachable(T neighbor, Set visited, T dst) { @@ -283,4 +289,55 @@ public class SSJavaLattice extends Lattice { } return false; } + + public Map> getIncomingElementMap() { + Map> map = new HashMap>(); + + Set keySet = getKeySet(); + for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { + T key = (T) iterator.next(); + + Set incomingSet = new HashSet(); + + for (Iterator iterator2 = keySet.iterator(); iterator2.hasNext();) { + T in = (T) iterator2.next(); + if (!in.equals(key) && get(in).contains(key)) { + incomingSet.add(in); + } + } + map.put(key, incomingSet); + } + + return map; + } + + public void insertNewLocationBetween(T higher, T lower, T newLoc) { + Set connectedSet = get(higher); + connectedSet.remove(lower); + connectedSet.add(newLoc); + + put(newLoc, lower); + } + + public void insertNewLocationBetween(T higher, Set lowerSet, T newLoc) { + System.out.println("---insert new location=" + newLoc + " between=" + higher + "<->" + + lowerSet); + Set connectedSet = get(higher); + connectedSet.removeAll(lowerSet); + connectedSet.add(newLoc); + + for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) { + T lower = (T) iterator.next(); + put(newLoc, lower); + } + } + + public SSJavaLattice clone() { + + SSJavaLattice clone = new SSJavaLattice(getTopItem(), getBottomItem()); + clone.setTable(getTable()); + clone.setSharedLocSet(getSharedLocSet()); + return clone; + } + }