diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/modref/JavaScriptModRef.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/modref/JavaScriptModRef.java index d0111c697..efd21d650 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/modref/JavaScriptModRef.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/modref/JavaScriptModRef.java @@ -31,9 +31,9 @@ import com.ibm.wala.ipa.modref.ExtendedHeapModel; public class JavaScriptModRef extends AstModRef { - protected static class JavaScriptRefVisitor extends AstRefVisitor implements JSInstructionVisitor { + public static class JavaScriptRefVisitor extends AstRefVisitor implements JSInstructionVisitor { - protected JavaScriptRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { + public JavaScriptRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { super(n, result, pa, (AstHeapModel)h); } @@ -80,9 +80,9 @@ public class JavaScriptModRef extends AstModRef { return new JavaScriptRefVisitor<>(n, result, pa, h); } - protected static class JavaScriptModVisitor extends AstModVisitor implements JSInstructionVisitor { + public static class JavaScriptModVisitor extends AstModVisitor implements JSInstructionVisitor { - protected JavaScriptModVisitor(CGNode n, Collection result, ExtendedHeapModel h, PointerAnalysis pa) { + public JavaScriptModVisitor(CGNode n, Collection result, ExtendedHeapModel h, PointerAnalysis pa) { super(n, result, (AstHeapModel)h, pa); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java index 78be30fc2..2305e4576 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java @@ -36,6 +36,8 @@ import com.ibm.wala.cast.ir.translator.TranslatorToCAst; import com.ibm.wala.cast.ir.translator.TranslatorToIR; import com.ibm.wala.cast.js.analysis.typeInference.JSPrimitiveType; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph.JSFakeRoot; +import com.ibm.wala.cast.js.ipa.modref.JavaScriptModRef; +import com.ibm.wala.cast.js.ipa.modref.JavaScriptModRef.JavaScriptRefVisitor; import com.ibm.wala.cast.js.ssa.JSInstructionFactory; import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference; import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf; @@ -67,9 +69,16 @@ import com.ibm.wala.classLoader.LanguageImpl; import com.ibm.wala.classLoader.ModuleEntry; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.IAnalysisCacheView; import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ipa.modref.ExtendedHeapModel; +import com.ibm.wala.ipa.modref.ModRef.ModVisitor; +import com.ibm.wala.ipa.modref.ModRef.RefVisitor; import com.ibm.wala.shrikeBT.IBinaryOpInstruction.IOperator; import com.ibm.wala.shrikeBT.IComparisonInstruction.Operator; import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod; @@ -669,6 +678,18 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { return new JSFakeRoot(cha, options, cache); } + @Override + public RefVisitor makeRefVisitor(CGNode n, + Collection result, PointerAnalysis pa, ExtendedHeapModel h) { + return new JavaScriptRefVisitor<>(n, result, pa, h); + } + + @Override + public ModVisitor makeModVisitor(CGNode n, Collection result, + PointerAnalysis pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) { + return new JavaScriptModRef.JavaScriptModVisitor<>(n, result, h, pa); + } + }; private final JavaScriptTranslatorFactory translatorFactory; diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java index 73a075a94..a82e90191 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JavaLanguage.java @@ -21,11 +21,18 @@ import java.util.Collections; import com.ibm.wala.analysis.typeInference.JavaPrimitiveType; import com.ibm.wala.analysis.typeInference.PrimitiveType; import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.IAnalysisCacheView; import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; import com.ibm.wala.ipa.callgraph.impl.FakeRootClass; import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ipa.modref.ExtendedHeapModel; +import com.ibm.wala.ipa.modref.ModRef.ModVisitor; +import com.ibm.wala.ipa.modref.ModRef.RefVisitor; import com.ibm.wala.shrikeBT.ConstantInstruction; import com.ibm.wala.shrikeBT.ConstantInstruction.ClassToken; import com.ibm.wala.shrikeBT.Constants; @@ -776,4 +783,16 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons return new FakeRootMethod(new FakeRootClass(ClassLoaderReference.Primordial, cha), options, cache); } + @Override + public RefVisitor makeRefVisitor(CGNode n, Collection result, + PointerAnalysis pa, ExtendedHeapModel h) { + return new RefVisitor<>(n, result, pa, h); + } + + @Override + public ModVisitor makeModVisitor(CGNode n, Collection result, + PointerAnalysis pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) { + return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs); + } + } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java index 1ceb63be4..9562489e2 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/Language.java @@ -17,10 +17,17 @@ import com.ibm.wala.analysis.typeInference.PrimitiveType; import com.ibm.wala.analysis.typeInference.TypeInference; import com.ibm.wala.cfg.InducedCFG; import com.ibm.wala.ipa.callgraph.AnalysisOptions; +import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.IAnalysisCacheView; import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; +import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; +import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; +import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ipa.modref.ExtendedHeapModel; +import com.ibm.wala.ipa.modref.ModRef; +import com.ibm.wala.ipa.modref.ModRef.RefVisitor; import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.ssa.SSAInstructionFactory; @@ -157,4 +164,10 @@ public interface Language { boolean modelConstant(Object o); + RefVisitor makeRefVisitor(CGNode n, Collection result, + PointerAnalysis pa, ExtendedHeapModel h); + + ModRef.ModVisitor makeModVisitor(CGNode n, + Collection result, PointerAnalysis pa, ExtendedHeapModel h, + boolean ignoreAllocHeapDefs); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java index 3fd2c6f52..223e9c6b9 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/modref/ModRef.java @@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IField; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure; +import com.ibm.wala.ipa.callgraph.propagation.HeapModel; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.callgraph.propagation.PointerKey; @@ -116,8 +117,14 @@ public class ModRef { } public ExtendedHeapModel makeHeapModel(PointerAnalysis pa) { - return new DelegatingExtendedHeapModel(pa.getHeapModel()); + HeapModel heapModel = pa.getHeapModel(); + if (heapModel instanceof ExtendedHeapModel) { + return (ExtendedHeapModel) heapModel; + } else { + return new DelegatingExtendedHeapModel(heapModel); + } } + /** * For a call graph node, what heap locations (as determined by a heap model) may it write, NOT including it's callees * transitively @@ -162,7 +169,7 @@ public class ModRef { return result; } - protected static class RefVisitor extends SSAInstruction.Visitor { + public static class RefVisitor extends SSAInstruction.Visitor { protected final CGNode n; protected final Collection result; @@ -171,7 +178,7 @@ public class ModRef { protected final H h; - protected RefVisitor(CGNode n, Collection result, PointerAnalysis pa2, H h) { + public RefVisitor(CGNode n, Collection result, PointerAnalysis pa2, H h) { this.n = n; this.result = result; this.pa = pa2; @@ -213,7 +220,7 @@ public class ModRef { } } - protected static class ModVisitor extends SSAInstruction.Visitor { + public static class ModVisitor extends SSAInstruction.Visitor { protected final CGNode n; protected final Collection result; @@ -224,7 +231,7 @@ public class ModRef { private final boolean ignoreAllocHeapDefs; - protected ModVisitor(CGNode n, Collection result, H h, PointerAnalysis pa, + public ModVisitor(CGNode n, Collection result, H h, PointerAnalysis pa, boolean ignoreAllocHeapDefs) { this.n = n; this.result = result; @@ -330,7 +337,8 @@ public class ModRef { protected ModVisitor makeModVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) { - return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs); + return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeModVisitor(n, result, pa, h, ignoreAllocHeapDefs); + //return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs); } /** @@ -355,7 +363,7 @@ public class ModRef { } protected RefVisitor makeRefVisitor(CGNode n, Collection result, PointerAnalysis pa, ExtendedHeapModel h) { - return new RefVisitor<>(n, result, pa, h); + return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeRefVisitor(n, result, pa, h); } /**