import IR.Tree.SwitchStatementNode;
import IR.Tree.TertiaryNode;
import IR.Tree.TreeNode;
+import Util.Pair;
public class LocationInference {
public static final Descriptor TOPDESC = new NameDescriptor(TOPLOC);
+ LocationInfo curMethodInfo;
+
boolean debug = true;
public LocationInference(SSJavaAnalysis ssjava, State state) {
new SSJavaLattice<String>(SSJavaAnalysis.TOP, SSJavaAnalysis.BOTTOM);
MethodLocationInfo methodInfo = new MethodLocationInfo(md);
+ curMethodInfo = methodInfo;
System.out.println();
System.out.println("SSJAVA: Inferencing the lattice from " + md);
private void addRelation(SSJavaLattice<String> methodLattice, MethodLocationInfo methodInfo,
CompositeLocation srcInferLoc, CompositeLocation dstInferLoc) throws CyclicFlowException {
+ System.out.println("--- srcInferLoc=" + srcInferLoc + " dstInferLoc=" + dstInferLoc);
String srcLocalLocSymbol = srcInferLoc.get(0).getLocIdentifier();
String dstLocalLocSymbol = dstInferLoc.get(0).getLocIdentifier();
}
}
+ System.out.println();
+
}
- private LocationInfo getLocationInfo(Descriptor d) {
+ public LocationInfo getLocationInfo(Descriptor d) {
if (d instanceof MethodDescriptor) {
return getMethodLocationInfo((MethodDescriptor) d);
} else {
inferLocation.addLocation(fieldLoc);
methodInfo.mapDescriptorToLocation(localVarDesc, inferLocation);
+ addMapLocSymbolToInferredLocation(methodInfo.md, localVarDesc, inferLocation);
methodInfo.removeMaplocalVarToLocSet(localVarDesc);
String newMethodLocationSymbol = curPrefix.get(0).getLocIdentifier();
if (isCompositeLocation(inNodeInferLoc)) {
// need to make sure that newLocSymbol is lower than the infernode
// location in the field lattice
+ System.out.println("--- srcNode=" + localNode + " dstNode=" + flowNode);
addRelation(methodLattice, methodInfo, inNodeInferLoc, inferLocation);
}
if (isCompositeLocation(outNodeInferLoc)) {
// need to make sure that newLocSymbol is higher than the infernode
// location
+ System.out.println("--- srcNode=" + flowNode + " dstNode=" + localOutNode);
addRelation(methodLattice, methodInfo, inferLocation, outNodeInferLoc);
}
+ private void addMapLocSymbolToInferredLocation(MethodDescriptor md, Descriptor localVar,
+ CompositeLocation inferLoc) {
+
+ Location locElement = inferLoc.get((inferLoc.getSize() - 1));
+ Descriptor enclosingDesc = locElement.getDescriptor();
+ LocationInfo locInfo = getLocationInfo(enclosingDesc);
+ locInfo.addMapLocSymbolToRelatedInferLoc(locElement.getLocIdentifier(), md, localVar);
+ }
+
private boolean isCompositeLocation(CompositeLocation cl) {
return cl.getSize() > 1;
}
}
if (cycleElementSet.size() > 0) {
+
String newSharedLoc = "SharedLoc" + (SSJavaLattice.seed++);
lattice.mergeIntoSharedLocation(cycleElementSet, newSharedLoc);
for (Iterator iterator = cycleElementSet.iterator(); iterator.hasNext();) {
String oldLocSymbol = (String) iterator.next();
- locInfo.mergeMapping(oldLocSymbol, newSharedLoc);
+
+ Set<Pair<Descriptor, Descriptor>> inferLocSet = locInfo.getRelatedInferLocSet(oldLocSymbol);
+ for (Iterator iterator2 = inferLocSet.iterator(); iterator2.hasNext();) {
+ Pair<Descriptor, Descriptor> pair = (Pair<Descriptor, Descriptor>) iterator2.next();
+ Descriptor enclosingDesc = pair.getFirst();
+ Descriptor desc = pair.getSecond();
+
+ CompositeLocation inferLoc;
+ if (curMethodInfo.md.equals(enclosingDesc)) {
+ inferLoc = curMethodInfo.getInferLocation(desc);
+ } else {
+ inferLoc = getLocationInfo(enclosingDesc).getInferLocation(desc);
+ }
+
+ Location locElement = inferLoc.get(inferLoc.getSize() - 1);
+
+ locElement.setLocIdentifier(newSharedLoc);
+ locInfo.addMapLocSymbolToRelatedInferLoc(newSharedLoc, enclosingDesc, desc);
+
+ }
+ locInfo.removeRelatedInferLocSet(oldLocSymbol, newSharedLoc);
+
}
lattice.addSharedLoc(newSharedLoc);
import IR.ClassDescriptor;
import IR.Descriptor;
import IR.MethodDescriptor;
+import Util.Pair;
public class LocationInfo {
- // Map<Descriptor, String> mapDescToLocSymbol;
Map<String, Set<Descriptor>> mapLocSymbolToDescSet;
-
+ Map<String, Set<Pair<Descriptor, Descriptor>>> mapLocSymbolToRelatedInferLocSet;
Map<Descriptor, CompositeLocation> mapDescToInferCompositeLocation;
MethodDescriptor md;
ClassDescriptor cd;
public LocationInfo() {
mapDescToInferCompositeLocation = new HashMap<Descriptor, CompositeLocation>();
mapLocSymbolToDescSet = new HashMap<String, Set<Descriptor>>();
+ mapLocSymbolToRelatedInferLocSet = new HashMap<String, Set<Pair<Descriptor, Descriptor>>>();
}
public LocationInfo(ClassDescriptor cd) {
return mapDescToInferCompositeLocation;
}
+ public void addMapLocSymbolToRelatedInferLoc(String locSymbol, Descriptor enclosingDesc,
+ Descriptor desc) {
+ if (!mapLocSymbolToRelatedInferLocSet.containsKey(locSymbol)) {
+ mapLocSymbolToRelatedInferLocSet.put(locSymbol, new HashSet<Pair<Descriptor, Descriptor>>());
+ }
+ mapLocSymbolToRelatedInferLocSet.get(locSymbol).add(
+ new Pair<Descriptor, Descriptor>(enclosingDesc, desc));
+ }
+
+ public Set<Pair<Descriptor, Descriptor>> getRelatedInferLocSet(String locSymbol) {
+ return mapLocSymbolToRelatedInferLocSet.get(locSymbol);
+ }
+
public void mapDescriptorToLocation(Descriptor desc, CompositeLocation inferLoc) {
mapDescToInferCompositeLocation.put(desc, inferLoc);
}
- // public void mapDescSymbolToLocName(String descSymbol, String locName) {
- // mapDescSymbolToLocName.put(descSymbol, locName);
- // }
-
public CompositeLocation getInferLocation(Descriptor desc) {
if (!mapDescToInferCompositeLocation.containsKey(desc)) {
CompositeLocation newInferLoc = new CompositeLocation();
Location loc;
+ Descriptor enclosingDesc;
if (md != null) {
// method lattice
- loc = new Location(md, desc.getSymbol());
+ enclosingDesc = md;
} else {
- loc = new Location(cd, desc.getSymbol());
+ enclosingDesc = cd;
}
+ loc = new Location(enclosingDesc, desc.getSymbol());
+
newInferLoc.addLocation(loc);
mapDescToInferCompositeLocation.put(desc, newInferLoc);
addMapLocSymbolToDescSet(desc.getSymbol(), desc);
+ addMapLocSymbolToRelatedInferLoc(desc.getSymbol(), enclosingDesc, desc);
}
return mapDescToInferCompositeLocation.get(desc);
}
return mapLocSymbolToDescSet.get(locSymbol);
}
- public void mergeMapping(String oldLocSymbol, String newSharedLoc) {
+ public void removeRelatedInferLocSet(String oldLocSymbol, String newSharedLoc) {
Set<Descriptor> descSet = getDescSet(oldLocSymbol);
getDescSet(newSharedLoc).addAll(descSet);
mapLocSymbolToDescSet.remove(oldLocSymbol);
-
- Set<Descriptor> keySet = mapDescToInferCompositeLocation.keySet();
- for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
- Descriptor key = (Descriptor) iterator.next();
- CompositeLocation inferLoc = getInferLocation(key);
-
- CompositeLocation newInferLoc = new CompositeLocation();
- if (inferLoc.getSize() > 1) {
- // local variable has a composite location [refLoc.inferedLoc]
-
- Location oldLoc = inferLoc.get(inferLoc.getSize() - 1);
- // oldLoc corresponds to infered loc.
-
- if (oldLoc.getLocIdentifier().equals(oldLocSymbol)) {
- for (int i = 0; i < inferLoc.getSize() - 1; i++) {
- Location loc = inferLoc.get(i);
- newInferLoc.addLocation(loc);
- }
- Location newLoc = new Location(oldLoc.getDescriptor(), newSharedLoc);
- newInferLoc.addLocation(newLoc);
- mapDescriptorToLocation(key, newInferLoc);
- }
- // else {
- // return;
- // }
- } else {
- // local var has a local location
- Location oldLoc = inferLoc.get(0);
- if (oldLoc.getLocIdentifier().equals(oldLocSymbol)) {
- Location newLoc = new Location(oldLoc.getDescriptor(), newSharedLoc);
- newInferLoc.addLocation(newLoc);
- mapDescriptorToLocation(key, newInferLoc);
- }
- // else {
- // return;
- // }
- }
-
- }
+ mapLocSymbolToRelatedInferLocSet.remove(oldLocSymbol);
}
}