Removing custom context selector for Function.prototype.call; it doesn't

seem worth having.

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@4367 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
msridhar1 2012-01-06 21:34:40 +00:00
parent df0525d55c
commit 3388b8dc7b
2 changed files with 0 additions and 78 deletions

View File

@ -51,7 +51,6 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder {
ContextSelector contextSelector = appContextSelector == null ? def : new DelegatingContextSelector(appContextSelector, def);
contextSelector = new ScopeMappingKeysContextSelector(contextSelector);
contextSelector = new JavaScriptConstructorContextSelector(contextSelector);
contextSelector = new JavaScriptFunctionDotCallContextSelector(contextSelector);
if (HANDLE_FUNCTION_APPLY) {
contextSelector = new JavaScriptFunctionApplyContextSelector(contextSelector);
}

View File

@ -1,77 +0,0 @@
package com.ibm.wala.cast.js.ipa.callgraph;
import com.ibm.wala.classLoader.CallSiteReference;
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.FilteredPointerKey;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.util.intset.IntSet;
import com.ibm.wala.util.intset.IntSetUtil;
/**
* Special-purpose context selector which adds object sensitivity on uses of <code>Function.prototype.call</code>.
*
* @see <a
* href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call">MDN
* Function.prototype.call() docs</a>
*
* @author mschaefer
*/
public class JavaScriptFunctionDotCallContextSelector implements ContextSelector {
private final ContextSelector base;
public JavaScriptFunctionDotCallContextSelector(ContextSelector base) {
this.base = base;
}
// parameter 0 is the call function itself, parameter 1 is the function to call, parameter 2 its receiver
private final static int PARAMETER_INDEX = 2;
public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) {
if (caller.getIR().getCalls(site)[0].getNumberOfUses() > PARAMETER_INDEX) {
return IntSetUtil.make(new int[] { PARAMETER_INDEX }).union(base.getRelevantParameters(caller, site));
} else {
return base.getRelevantParameters(caller, site);
}
}
public Context getCalleeTarget(CGNode caller, CallSiteReference site, IMethod callee, InstanceKey[] receiver) {
String calleeName = callee.getName().toString();
Context baseContext = base.getCalleeTarget(caller, site, callee, receiver);
// TODO: use a better test here
if (calleeName.contains(JavaScriptFunctionDotCallTargetSelector.SYNTHETIC_CALL_METHOD_PREFIX)) {
if (receiver.length > PARAMETER_INDEX && receiver[PARAMETER_INDEX] != null) {
return new ParameterInstanceContext(baseContext, PARAMETER_INDEX, receiver[PARAMETER_INDEX]);
}
}
return baseContext;
}
public class ParameterInstanceContext implements Context {
private final Context baseContext;
private final int index;
private final InstanceKey key;
public ParameterInstanceContext(Context baseContext, int index, InstanceKey key) {
if(key == null)
throw new IllegalArgumentException("Null key provided for parameter.");
if(index <= 0 || index > ContextKey.PARAMETERS.length)
throw new IllegalArgumentException("Parameter index out of range.");
this.baseContext = baseContext;
this.index = index;
this.key = key;
}
public ContextItem get(ContextKey name) {
if(name == ContextKey.PARAMETERS[index])
return new FilteredPointerKey.SingleInstanceFilter(key);
else
return baseContext.get(name);
}
}
}