diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/Util.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/Util.java index 583f35e05..d33ee1f65 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/Util.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/Util.java @@ -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 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); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java index 2b323f9a2..72259e869 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/JavaScriptAnalysisEngine.java @@ -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); } } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/OneCFABuilderFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/OneCFABuilderFactory.java index ad6cd1259..7149e9349 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/OneCFABuilderFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/OneCFABuilderFactory.java @@ -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())); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/ZeroCFABuilderFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/ZeroCFABuilderFactory.java index 6a4ce7a5a..43f574a4c 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/ZeroCFABuilderFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/client/impl/ZeroCFABuilderFactory.java @@ -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())); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java new file mode 100644 index 000000000..96e583920 --- /dev/null +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSAnalysisOptions.java @@ -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 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; + } + +} diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java index 9f8ce4bf5..32c8376b9 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSZeroOrOneXCFABuilder.java @@ -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++) { diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/Util.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/Util.java index 3a2b3e8d1..2899257cc 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/Util.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/Util.java @@ -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 roots) { - final AnalysisOptions options = new AnalysisOptions(scope, /* + public static JSAnalysisOptions makeOptions(AnalysisScope scope, IClassHierarchy cha, Iterable roots) { + final JSAnalysisOptions options = new JSAnalysisOptions(scope, /* * AstIRFactory. * makeDefaultFactory * (keepIRs), diff --git a/com.ibm.wala.cast.js/source/dumpCallGraph.java b/com.ibm.wala.cast.js/source/dumpCallGraph.java index 428cc802e..ddaf77cf9 100755 --- a/com.ibm.wala.cast.js/source/dumpCallGraph.java +++ b/com.ibm.wala.cast.js/source/dumpCallGraph.java @@ -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 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);