Filtering instance keys passed to extracted loop bodies to emulate ToString conversion.

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@4307 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
msridhar1 2012-01-06 21:19:14 +00:00
parent 939f6b3f34
commit 45d15c2bd6
1 changed files with 30 additions and 7 deletions

View File

@ -15,13 +15,17 @@ import java.util.HashMap;
import java.util.Map;
import com.ibm.wala.cast.ir.ssa.AbstractReflectiveGet;
import com.ibm.wala.cast.js.types.JavaScriptTypes;
import com.ibm.wala.classLoader.CallSiteReference;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.Context;
import com.ibm.wala.ipa.callgraph.ContextItem;
import com.ibm.wala.ipa.callgraph.ContextKey;
import com.ibm.wala.ipa.callgraph.ContextSelector;
import com.ibm.wala.ipa.callgraph.propagation.ConcreteTypeKey;
import com.ibm.wala.ipa.callgraph.propagation.ConstantKey;
import com.ibm.wala.ipa.callgraph.propagation.FilteredPointerKey;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.cfa.OneLevelSiteContextSelector;
@ -52,7 +56,7 @@ public class ForInContextSelector implements ContextSelector {
public static boolean DEPENDENT_THRU_READS = true;
public static class SelectiveCPAContext implements Context {
private final Context base;
protected final Context base;
private final Map<ContextKey, InstanceKey> parameterObjs;
@ -117,7 +121,7 @@ public class ForInContextSelector implements ContextSelector {
@Override
public String toString() {
return "for in hack filter for " + get(ContextKey.PARAMETERS[2]);
return "for in hack filter for " + get(ContextKey.PARAMETERS[2]) + " over " + this.base;
}
}
@ -163,20 +167,39 @@ public class ForInContextSelector implements ContextSelector {
this.base = base;
this.oneLevel = new OneLevelSiteContextSelector(base);
}
public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, final InstanceKey[] receiver) {
Context baseContext = base.getCalleeTarget(caller, site, callee, receiver);
if (callee.getDeclaringClass().getName().toString().contains(HACK_METHOD_STR)) {
return new ForInContext(base.getCalleeTarget(caller, site, callee, receiver), receiver[2]);
InstanceKey loopVar = receiver[2];
IClass stringClass = caller.getClassHierarchy().lookupClass(JavaScriptTypes.String);
if(loopVar instanceof ConstantKey) {
// do a manual ToString conversion if necessary
Object value = ((ConstantKey)loopVar).getValue();
if(value instanceof String) {
return new ForInContext(baseContext, loopVar);
} else if(value instanceof Number) {
Integer ival = ((Number)value).intValue();
return new ForInContext(baseContext, new ConstantKey<String>(ival.toString(), stringClass));
} else if(value instanceof Boolean) {
Boolean bval = (Boolean)value;
return new ForInContext(baseContext, new ConstantKey<String>(bval.toString(), stringClass));
} else if(value == null) {
return new ForInContext(baseContext, new ConstantKey<String>("null", stringClass));
}
}
ConcreteTypeKey stringKey = new ConcreteTypeKey(stringClass);
return new ForInContext(baseContext, stringKey);
} else if (USE_CPA_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) {
return new SelectiveCPAContext(base.getCalleeTarget(caller, site, callee, receiver), receiver);
return new SelectiveCPAContext(baseContext, receiver);
} else if (USE_1LEVEL_IN_BODIES && FORIN_MARKER.equals(caller.getContext().get(FORIN_KEY))) {
if (! identifyDependentParameters(caller, site).isEmpty()) {
return oneLevel.getCalleeTarget(caller, site, callee, receiver);
} else {
return base.getCalleeTarget(caller, site, callee, receiver);
return baseContext;
}
} else {
return base.getCalleeTarget(caller, site, callee, receiver);
return baseContext;
}
}