fix so that new lexical scheme can be enabled with Java frontends

This commit is contained in:
Manu Sridharan 2012-07-12 10:27:24 -07:00
parent d0d1ff1a2b
commit 9a0e105e51
5 changed files with 39 additions and 30 deletions

View File

@ -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) {

View File

@ -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());
}
}

View File

@ -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());

View File

@ -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);
}

View File

@ -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;
/**