fix so that new lexical scheme can be enabled with Java frontends
This commit is contained in:
parent
d0d1ff1a2b
commit
9a0e105e51
|
@ -27,7 +27,6 @@ import java.util.jar.JarFile;
|
|||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.ibm.wala.cast.ir.translator.AstTranslator;
|
||||
import com.ibm.wala.cast.java.client.JavaSourceAnalysisEngine;
|
||||
import com.ibm.wala.cast.java.ipa.callgraph.JavaSourceAnalysisScope;
|
||||
import com.ibm.wala.classLoader.IClass;
|
||||
|
@ -283,9 +282,6 @@ public abstract class IRTests {
|
|||
public Pair runTest(Collection<String> sources, List<String> libs, String[] mainClassDescriptors, List<? extends IRAssertion> ca,
|
||||
boolean assertReachable) {
|
||||
try {
|
||||
boolean currentState = AstTranslator.NEW_LEXICAL;
|
||||
AstTranslator.NEW_LEXICAL = false;
|
||||
|
||||
JavaSourceAnalysisEngine engine = getAnalysisEngine(mainClassDescriptors);
|
||||
|
||||
populateScope(engine, sources, libs);
|
||||
|
@ -301,8 +297,6 @@ public abstract class IRTests {
|
|||
IRAssertion.check(callGraph);
|
||||
}
|
||||
|
||||
AstTranslator.NEW_LEXICAL = currentState;
|
||||
|
||||
return Pair.make(callGraph, engine.getPointerAnalysis());
|
||||
|
||||
} catch (Exception e) {
|
||||
|
|
|
@ -10,21 +10,26 @@
|
|||
*****************************************************************************/
|
||||
package com.ibm.wala.cast.java.ipa.callgraph;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys;
|
||||
import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys.ScopeMappingInstanceKey;
|
||||
import com.ibm.wala.cast.ir.translator.AstTranslator;
|
||||
import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl.JavaClass;
|
||||
import com.ibm.wala.cast.loader.AstMethod;
|
||||
import com.ibm.wala.cast.loader.AstMethod.LexicalParent;
|
||||
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.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
|
||||
public class JavaScopeMappingInstanceKeys extends ScopeMappingInstanceKeys {
|
||||
|
||||
|
@ -75,4 +80,11 @@ public class JavaScopeMappingInstanceKeys extends ScopeMappingInstanceKeys {
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Collection<CGNode> getConstructorCallers(ScopeMappingInstanceKey smik, Pair<String, String> name) {
|
||||
// for Java, the creator node is exactly what we want
|
||||
return Collections.singleton(smik.getCreator());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
package com.ibm.wala.cast.js.ipa.callgraph;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
import com.ibm.wala.cast.ipa.callgraph.ScopeMappingInstanceKeys;
|
||||
import com.ibm.wala.cast.js.loader.JavaScriptLoader;
|
||||
|
@ -21,9 +22,13 @@ import com.ibm.wala.cast.types.AstMethodReference;
|
|||
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.ContextKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.cfa.CallString;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.cfa.CallStringContextSelector;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.MethodReference;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
|
@ -60,7 +65,22 @@ public class JavaScriptScopeMappingInstanceKeys extends ScopeMappingInstanceKeys
|
|||
|
||||
@Override
|
||||
protected Collection<CGNode> getConstructorCallers(ScopeMappingInstanceKey smik, Pair<String, String> name) {
|
||||
final Collection<CGNode> result = super.getConstructorCallers(smik, name);
|
||||
// in JavaScript, the 'new' instruction is wrapped in a synthetic constructor method. we want the
|
||||
// caller of that constructor method, which we obtain from the context for the constructor method
|
||||
final Context creatorContext = smik.getCreator().getContext();
|
||||
CGNode callerOfConstructor = (CGNode) creatorContext.get(ContextKey.CALLER);
|
||||
Collection<CGNode> result = null;
|
||||
if (callerOfConstructor != null) {
|
||||
return Collections.singleton(callerOfConstructor);
|
||||
} else {
|
||||
CallString cs = (CallString) creatorContext.get(CallStringContextSelector.CALL_STRING);
|
||||
if (cs != null) {
|
||||
IMethod[] methods = cs.getMethods();
|
||||
assert methods.length == 1;
|
||||
IMethod m = methods[0];
|
||||
result = builder.getCallGraph().getNodes(m.getReference());
|
||||
}
|
||||
}
|
||||
if (result == null) {
|
||||
IClassHierarchy cha = smik.getCreator().getClassHierarchy();
|
||||
MethodReference ref = MethodReference.findOrCreate(JavaScriptLoader.JS, TypeReference.findOrCreate(cha.getLoaders()[0].getReference(), name.snd), AstMethodReference.fnAtomStr, AstMethodReference.fnDesc.toString());
|
||||
|
|
|
@ -11,25 +11,19 @@
|
|||
package com.ibm.wala.cast.ipa.callgraph;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.ibm.wala.cast.ipa.callgraph.LexicalScopingResolverContexts.LexicalScopingResolver;
|
||||
import com.ibm.wala.cast.ir.translator.AstTranslator;
|
||||
import com.ibm.wala.classLoader.IClass;
|
||||
import com.ibm.wala.classLoader.IMethod;
|
||||
import com.ibm.wala.classLoader.NewSiteReference;
|
||||
import com.ibm.wala.classLoader.ProgramCounter;
|
||||
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.propagation.InstanceKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.InstanceKeyFactory;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.cfa.CallString;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.cfa.CallStringContextSelector;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
import com.ibm.wala.util.collections.CompoundIterator;
|
||||
import com.ibm.wala.util.collections.EmptyIterator;
|
||||
|
@ -192,22 +186,11 @@ abstract public class ScopeMappingInstanceKeys implements InstanceKeyFactory {
|
|||
}
|
||||
}
|
||||
|
||||
protected Collection<CGNode> getConstructorCallers(ScopeMappingInstanceKey smik, Pair<String, String> name) {
|
||||
final Context creatorContext = smik.getCreator().getContext();
|
||||
CGNode callerOfConstructor = (CGNode) creatorContext.get(ContextKey.CALLER);
|
||||
if (callerOfConstructor != null) {
|
||||
return Collections.singleton(callerOfConstructor);
|
||||
} else {
|
||||
CallString cs = (CallString) creatorContext.get(CallStringContextSelector.CALL_STRING);
|
||||
if (cs != null) {
|
||||
IMethod[] methods = cs.getMethods();
|
||||
assert methods.length == 1;
|
||||
IMethod m = methods[0];
|
||||
return builder.getCallGraph().getNodes(m.getReference());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* get the CGNodes corresponding to the method that invoked the constructor for smik
|
||||
*/
|
||||
protected abstract Collection<CGNode> getConstructorCallers(ScopeMappingInstanceKey smik, Pair<String, String> name);
|
||||
|
||||
public InstanceKey getInstanceKeyForMultiNewArray(CGNode node, NewSiteReference allocation, int dim) {
|
||||
return basic.getInstanceKeyForMultiNewArray(node, allocation, dim);
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
|||
/**
|
||||
* set to true to use new handling of lexical scoping
|
||||
*/
|
||||
public static boolean NEW_LEXICAL = true;
|
||||
public static final boolean NEW_LEXICAL = true;
|
||||
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue