create JSAnalysisOptions, and use to add proper option to disable handling of call / apply

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@4405 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
msridhar1 2012-01-06 21:48:01 +00:00
parent bbbc93d8c6
commit ea7be296c8
8 changed files with 51 additions and 22 deletions

View File

@ -21,6 +21,7 @@ import junit.framework.Assert;
import com.ibm.wala.cast.js.html.MappedSourceModule;
import com.ibm.wala.cast.js.html.WebPageLoaderFactory;
import com.ibm.wala.cast.js.html.WebUtil;
import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions;
import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder;
import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder;
import com.ibm.wala.cast.js.loader.JavaScriptLoader;
@ -28,7 +29,6 @@ import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory;
import com.ibm.wala.classLoader.SourceFileModule;
import com.ibm.wala.classLoader.SourceModule;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.Entrypoint;
@ -116,7 +116,7 @@ public class Util extends com.ibm.wala.cast.js.ipa.callgraph.Util {
IClassHierarchy cha = makeHierarchy(scope, loaders);
com.ibm.wala.cast.test.Util.checkForFrontEndErrors(cha);
Iterable<Entrypoint> roots = makeScriptRoots(cha);
AnalysisOptions options = makeOptions(scope, cha, roots);
JSAnalysisOptions options = makeOptions(scope, cha, roots);
AnalysisCache cache = makeCache();
JSCFABuilder builder = new JSZeroOrOneXCFABuilder(cha, options, cache, null, null, ZeroXInstanceKeys.ALLOCATIONS, useOneCFA);

View File

@ -17,6 +17,7 @@ import java.util.jar.JarFile;
import com.ibm.wala.cast.ipa.callgraph.CAstAnalysisScope;
import com.ibm.wala.cast.ir.ssa.AstIRFactory;
import com.ibm.wala.cast.js.client.impl.ZeroCFABuilderFactory;
import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions;
import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptEntryPoints;
import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory;
@ -98,6 +99,6 @@ public class JavaScriptAnalysisEngine extends AbstractAnalysisEngine {
@Override
protected CallGraphBuilder getCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache) {
return new ZeroCFABuilderFactory().make(options, cache, cha, scope, false);
return new ZeroCFABuilderFactory().make((JSAnalysisOptions) options, cache, cha, scope, false);
}
}

View File

@ -11,9 +11,9 @@
package com.ibm.wala.cast.js.client.impl;
import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector;
import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions;
import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.propagation.cfa.ZeroXInstanceKeys;
@ -26,7 +26,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
*/
public class OneCFABuilderFactory {
public CallGraphBuilder make(AnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, AnalysisScope scope,
public CallGraphBuilder make(JSAnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, AnalysisScope scope,
boolean keepPointsTo) {
com.ibm.wala.ipa.callgraph.impl.Util.addDefaultSelectors(options, cha);
options.setSelector(new StandardFunctionTargetSelector(cha, options.getMethodTargetSelector()));

View File

@ -11,9 +11,9 @@
package com.ibm.wala.cast.js.client.impl;
import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector;
import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions;
import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.propagation.cfa.ZeroXInstanceKeys;
@ -26,7 +26,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
*/
public class ZeroCFABuilderFactory {
public CallGraphBuilder make(AnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, AnalysisScope scope,
public CallGraphBuilder make(JSAnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, AnalysisScope scope,
boolean keepPointsTo) {
com.ibm.wala.ipa.callgraph.impl.Util.addDefaultSelectors(options, cha);
options.setSelector(new StandardFunctionTargetSelector(cha, options.getMethodTargetSelector()));

View File

@ -0,0 +1,33 @@
package com.ibm.wala.cast.js.ipa.callgraph;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.Entrypoint;
/**
* call graph construction options specific to JavaScript.
*/
public class JSAnalysisOptions extends AnalysisOptions {
/**
* should the analysis model the semantics of Function.prototype.call / apply?
* Defaults to true.
*/
private boolean handleCallApply = true;
public JSAnalysisOptions(AnalysisScope scope, Iterable<? extends Entrypoint> e) {
super(scope, e);
}
/**
* should the analysis model the semantics of Function.prototype.call / apply?
*/
public boolean handleCallApply() {
return handleCallApply;
}
public void setHandleCallApply(boolean handleCallApply) {
this.handleCallApply = handleCallApply;
}
}

View File

@ -13,7 +13,6 @@ package com.ibm.wala.cast.js.ipa.callgraph;
import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts;
import com.ibm.wala.cast.ipa.callgraph.ScopeMappingKeysContextSelector;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.ContextSelector;
import com.ibm.wala.ipa.callgraph.MethodTargetSelector;
@ -30,20 +29,17 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
* "uninteresting" types
*/
public class JSZeroOrOneXCFABuilder extends JSCFABuilder {
private static final boolean SIMPLE = false;
private static final boolean HANDLE_FUNCTION_PROTOTYPE_CALL = !SIMPLE && true;
private static final boolean HANDLE_FUNCTION_PROTOTYPE_APPLY = !SIMPLE && true;
private static final boolean USE_OBJECT_SENSITIVITY = !SIMPLE && true;
private static final boolean USE_OBJECT_SENSITIVITY = false;
private static final boolean USE_LOAD_FILE_TARGET_SELECTOR = false;
public JSZeroOrOneXCFABuilder(IClassHierarchy cha, AnalysisOptions options, AnalysisCache cache,
public JSZeroOrOneXCFABuilder(IClassHierarchy cha, JSAnalysisOptions options, AnalysisCache cache,
ContextSelector appContextSelector, SSAContextInterpreter appContextInterpreter, int instancePolicy, boolean doOneCFA) {
super(cha, options, cache);
SSAContextInterpreter contextInterpreter = makeDefaultContextInterpreters(appContextInterpreter, options, cha);
if (HANDLE_FUNCTION_PROTOTYPE_APPLY) {
if (options.handleCallApply()) {
contextInterpreter = new DelegatingSSAContextInterpreter(new JavaScriptFunctionApplyContextInterpreter(options, cache),
contextInterpreter);
}
@ -51,7 +47,7 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder {
MethodTargetSelector targetSelector = new JavaScriptConstructTargetSelector(cha, options
.getMethodTargetSelector());
if (HANDLE_FUNCTION_PROTOTYPE_CALL) {
if (options.handleCallApply()) {
targetSelector = new JavaScriptFunctionDotCallTargetSelector(targetSelector);
}
if (USE_LOAD_FILE_TARGET_SELECTOR) {
@ -66,7 +62,7 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder {
if (USE_OBJECT_SENSITIVITY) {
contextSelector = new ObjectSensitivityContextSelector(contextSelector);
}
if (HANDLE_FUNCTION_PROTOTYPE_APPLY) {
if (options.handleCallApply()) {
contextSelector = new JavaScriptFunctionApplyContextSelector(contextSelector);
}
contextSelector = new LexicalScopingResolverContexts(this, contextSelector);
@ -95,7 +91,7 @@ public class JSZeroOrOneXCFABuilder extends JSCFABuilder {
* deployment descriptor abstraction
* @return a 0-1-Opt-CFA Call Graph Builder.
*/
public static JSCFABuilder make(AnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, ClassLoader cl,
public static JSCFABuilder make(JSAnalysisOptions options, AnalysisCache cache, IClassHierarchy cha, ClassLoader cl,
AnalysisScope scope, String[] xmlFiles, byte instancePolicy, boolean doOneCFA) {
com.ibm.wala.ipa.callgraph.impl.Util.addDefaultSelectors(options, cha);
for (int i = 0; i < xmlFiles.length; i++) {

View File

@ -38,7 +38,6 @@ import com.ibm.wala.cfg.AbstractCFG;
import com.ibm.wala.classLoader.ClassLoaderFactory;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.SourceURLModule;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
@ -82,8 +81,8 @@ public class Util extends com.ibm.wala.cast.ipa.callgraph.Util {
Util.preprocessor = preprocessor;
}
public static AnalysisOptions makeOptions(AnalysisScope scope, IClassHierarchy cha, Iterable<Entrypoint> roots) {
final AnalysisOptions options = new AnalysisOptions(scope, /*
public static JSAnalysisOptions makeOptions(AnalysisScope scope, IClassHierarchy cha, Iterable<Entrypoint> roots) {
final JSAnalysisOptions options = new JSAnalysisOptions(scope, /*
* AstIRFactory.
* makeDefaultFactory
* (keepIRs),

View File

@ -8,13 +8,13 @@
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
import com.ibm.wala.cast.js.ipa.callgraph.JSAnalysisOptions;
import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder;
import com.ibm.wala.cast.js.ipa.callgraph.JSZeroOrOneXCFABuilder;
import com.ibm.wala.cast.js.ipa.callgraph.Util;
import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.Entrypoint;
@ -29,7 +29,7 @@ class dumpCallGraph {
AnalysisScope scope = Util.makeScope(args, loaders, JavaScriptLoader.JS);
IClassHierarchy cha = Util.makeHierarchy(scope, loaders);
Iterable<Entrypoint> roots = Util.makeScriptRoots(cha);
AnalysisOptions options = Util.makeOptions(scope, cha, roots);
JSAnalysisOptions options = Util.makeOptions(scope, cha, roots);
AnalysisCache cache = Util.makeCache();
JSCFABuilder builder = new JSZeroOrOneXCFABuilder(cha, options, cache, null, null, ZeroXInstanceKeys.ALLOCATIONS, false);