diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java index c472528f1..5e2640662 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/AbstractRootMethod.java @@ -26,15 +26,7 @@ import com.ibm.wala.ipa.callgraph.propagation.rta.RTAContextInterpreter; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.summaries.SyntheticIR; import com.ibm.wala.shrikeBT.IInvokeInstruction; -import com.ibm.wala.ssa.ConstantValue; -import com.ibm.wala.ssa.IR; -import com.ibm.wala.ssa.SSAArrayStoreInstruction; -import com.ibm.wala.ssa.SSAGetInstruction; -import com.ibm.wala.ssa.SSAInstruction; -import com.ibm.wala.ssa.SSAInvokeInstruction; -import com.ibm.wala.ssa.SSANewInstruction; -import com.ibm.wala.ssa.SSAOptions; -import com.ibm.wala.ssa.SSAPhiInstruction; +import com.ibm.wala.ssa.*; import com.ibm.wala.types.FieldReference; import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.TypeReference; @@ -235,6 +227,12 @@ public abstract class AbstractRootMethod extends SyntheticMethod { return result; } + public int addCheckcast(TypeReference type, int rv) { + int lv = nextLocal++; + statements.add(SSAInstructionFactory.CheckCastInstruction(lv, rv, type)); + return lv; + } + public RTAContextInterpreter getInterpreter() { return new RTAContextInterpreter() { diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java index 6d6597379..0b9aec294 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/impl/FakeRootClass.java @@ -1,20 +1,18 @@ package com.ibm.wala.ipa.callgraph.impl; -import java.util.Collection; - import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IField; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.SyntheticClass; import com.ibm.wala.ipa.cha.ClassHierarchy; import com.ibm.wala.ipa.cha.ClassHierarchyException; -import com.ibm.wala.types.ClassLoaderReference; -import com.ibm.wala.types.Selector; -import com.ibm.wala.types.TypeName; -import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.*; import com.ibm.wala.util.Atom; import com.ibm.wala.util.debug.Assertions; +import java.util.*; + + /** * * A synthetic class for the fake root method @@ -25,10 +23,64 @@ public class FakeRootClass extends SyntheticClass { public static final TypeReference FAKE_ROOT_CLASS = TypeReference.findOrCreate(ClassLoaderReference.Primordial, TypeName .string2TypeName("Lcom/ibm/wala/FakeRootClass")); + private Map fakeRootStaticFields = null; + FakeRootClass(ClassHierarchy cha) { super(FAKE_ROOT_CLASS, cha); } + public void addStaticField(final Atom name, final TypeReference fieldType) { + if (fakeRootStaticFields == null) { + fakeRootStaticFields = new HashMap(2); + } + + fakeRootStaticFields.put(name, new IField() { + public ClassHierarchy getClassHierarchy() { + return FakeRootClass.this.getClassHierarchy(); + } + + public TypeReference getFieldTypeReference() { + return fieldType; + } + + public IClass getDeclaringClass() { + return FakeRootClass.this; + } + + public Atom getName() { + return name; + } + + public boolean isStatic() { + return true; + } + + public boolean isVolatile() { + return false; + } + + public FieldReference getFieldReference() { + return FieldReference.findOrCreate(FAKE_ROOT_CLASS, name, fieldType); + } + + public boolean isFinal() { + return false; + } + + public boolean isPrivate() { + return true; + } + + public boolean isProtected() { + return false; + } + + public boolean isPublic() { + return false; + } + }); + } + /* * (non-Javadoc) * @@ -99,9 +151,11 @@ public class FakeRootClass extends SyntheticClass { * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.classLoader.Selector) */ public IField getField(Atom name) { - // TODO Auto-generated method stub - Assertions.UNREACHABLE(); - return null; + if (fakeRootStaticFields != null) { + return (IField) fakeRootStaticFields.get(name); + } else { + return null; + } } /* @@ -143,9 +197,11 @@ public class FakeRootClass extends SyntheticClass { * @see com.ibm.wala.classLoader.IClass#getDeclaredStaticFields() */ public Collection getDeclaredStaticFields() { - // TODO Auto-generated method stub - Assertions.UNREACHABLE(); - return null; + if (fakeRootStaticFields != null) { + return fakeRootStaticFields.values(); + } else { + return Collections.EMPTY_SET; + } } /* @@ -185,8 +241,7 @@ public class FakeRootClass extends SyntheticClass { * @see com.ibm.wala.classLoader.IClass#getAllStaticFields() */ public Collection getAllStaticFields() throws ClassHierarchyException { - Assertions.UNREACHABLE(); - return null; + return getDeclaredStaticFields(); } /* @@ -205,11 +260,10 @@ public class FakeRootClass extends SyntheticClass { * @see com.ibm.wala.classLoader.IClass#getAllFields() */ public Collection getAllFields() throws ClassHierarchyException { - Assertions.UNREACHABLE(); - return null; + return getDeclaredStaticFields(); } public boolean isPublic() { return false; } -} \ No newline at end of file +} diff --git a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java index a53a169d4..168a0ec19 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java +++ b/com.ibm.wala.core/src/com/ibm/wala/ipa/callgraph/propagation/SSAPropagationCallGraphBuilder.java @@ -815,6 +815,10 @@ public abstract class SSAPropagationCallGraphBuilder extends PropagationCallGrap } IField f = getClassHierarchy().resolveField(field); + if (f == null && callGraph.getFakeRootNode().getMethod().getDeclaringClass().getReference().equals(field.getType())) { + f = callGraph.getFakeRootNode().getMethod().getDeclaringClass().getField(field.getName()); + } + if (f == null) { getWarnings().add(ResolutionFailure.create(node, field)); return; diff --git a/com.ibm.wala.core/src/com/ibm/wala/types/MethodReference.java b/com.ibm.wala.core/src/com/ibm/wala/types/MethodReference.java index fafd1427d..8d10ba4b8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/types/MethodReference.java +++ b/com.ibm.wala.core/src/com/ibm/wala/types/MethodReference.java @@ -56,6 +56,10 @@ public final class MethodReference extends MemberReference { public final static Descriptor runDesc = Descriptor.findOrCreateUTF8("()Ljava/lang/Object;"); public final static Selector runSelector = new Selector(runAtom, runDesc); + public final static Atom equalsAtom = Atom.findOrCreateUnicodeAtom("equals"); + public final static Descriptor equalsDesc = Descriptor.findOrCreateUTF8("(Ljava/lang/Object;)Z"); + public final static Selector equalsSelector = new Selector(equalsAtom, equalsDesc); + /** * types of parameters to this method. */ diff --git a/com.ibm.wala.core/src/com/ibm/wala/types/TypeReference.java b/com.ibm.wala.core/src/com/ibm/wala/types/TypeReference.java index 6f13b86f2..80ce19766 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/types/TypeReference.java +++ b/com.ibm.wala.core/src/com/ibm/wala/types/TypeReference.java @@ -230,6 +230,14 @@ public final class TypeReference { public final static TypeReference JavaLangCloneable = findOrCreate(ClassLoaderReference.Primordial, JavaLangCloneableName); + private final static TypeName JavaLangSystemName = TypeName.string2TypeName("Ljava/lang/System"); + + public final static TypeReference JavaLangSystem = findOrCreate(ClassLoaderReference.Primordial, JavaLangSystemName); + + private final static TypeName JavaLangIntegerName = TypeName.string2TypeName("Ljava/lang/Integer"); + + public final static TypeReference JavaLangInteger = findOrCreate(ClassLoaderReference.Primordial, JavaLangIntegerName); + private final static TypeName JavaIoSerializableName = TypeName.string2TypeName("Ljava/io/Serializable"); public final static TypeReference JavaIoSerializable = findOrCreate(ClassLoaderReference.Primordial, JavaIoSerializableName);