more type and method references; support for adding static fields to the FakeRootClass for analysis modelling purposes

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@786 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
dolby-oss 2007-02-25 02:15:50 +00:00
parent 24d290beb8
commit 8ad9a91582
5 changed files with 94 additions and 26 deletions

View File

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

View File

@ -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<IField> 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<IField> 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<IField> getAllFields() throws ClassHierarchyException {
Assertions.UNREACHABLE();
return null;
return getDeclaredStaticFields();
}
public boolean isPublic() {
return false;
}
}
}

View File

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

View File

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

View File

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