bug fix to handle array types correctly

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@1992 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
sjfink 2007-11-08 22:23:35 +00:00
parent 851aec7d00
commit 72b99ed91f
1 changed files with 18 additions and 10 deletions

View File

@ -56,8 +56,9 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis {
/** /**
* @param klasses * @param klasses
* Collection<IClass> * Collection<IClass>
* @throws AssertionError if klasses is null * @throws AssertionError
* if klasses is null
*/ */
private TypeBasedPointerAnalysis(AnalysisOptions options, Collection<IClass> klasses, CallGraph cg) throws AssertionError { private TypeBasedPointerAnalysis(AnalysisOptions options, Collection<IClass> klasses, CallGraph cg) throws AssertionError {
super(cg, makeInstanceKeys(klasses)); super(cg, makeInstanceKeys(klasses));
@ -67,7 +68,7 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis {
/** /**
* @param c * @param c
* Collection<IClass> * Collection<IClass>
*/ */
private static MutableMapping<InstanceKey> makeInstanceKeys(Collection<IClass> c) { private static MutableMapping<InstanceKey> makeInstanceKeys(Collection<IClass> c) {
assert c != null; assert c != null;
@ -104,7 +105,8 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis {
} }
/** /**
* Compute the set of {@link InstanceKey}s which may represent a particular type. * Compute the set of {@link InstanceKey}s which may represent a particular
* type.
*/ */
private OrdinalSet<InstanceKey> computeOrdinalInstanceSet(IClass type) { private OrdinalSet<InstanceKey> computeOrdinalInstanceSet(IClass type) {
Collection<IClass> klasses = null; Collection<IClass> klasses = null;
@ -119,13 +121,19 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis {
} }
} }
} }
klasses = HashSetFactory.make(klasses); Collection<IClass> c = HashSetFactory.make();
klasses.retainAll(this.klasses); for (IClass klass : klasses) {
OrdinalSet<InstanceKey> result = toOrdinalInstanceKeySet(klasses); if (klass.isArrayClass()) {
c.add(klass);
} else if (this.klasses.contains(klass)) {
c.add(klass);
}
}
OrdinalSet<InstanceKey> result = toOrdinalInstanceKeySet(c);
return result; return result;
} }
private OrdinalSet<InstanceKey> toOrdinalInstanceKeySet(Collection c) { private OrdinalSet<InstanceKey> toOrdinalInstanceKeySet(Collection c) {
BimodalMutableIntSet s = new BimodalMutableIntSet(); BimodalMutableIntSet s = new BimodalMutableIntSet();
for (Iterator it = c.iterator(); it.hasNext();) { for (Iterator it = c.iterator(); it.hasNext();) {
@ -143,7 +151,7 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis {
LocalPointerKeyWithFilter lpk = (LocalPointerKeyWithFilter) key; LocalPointerKeyWithFilter lpk = (LocalPointerKeyWithFilter) key;
FilteredPointerKey.TypeFilter filter = lpk.getTypeFilter(); FilteredPointerKey.TypeFilter filter = lpk.getTypeFilter();
Assertions._assert(filter instanceof FilteredPointerKey.SingleClassFilter); Assertions._assert(filter instanceof FilteredPointerKey.SingleClassFilter);
return ((FilteredPointerKey.SingleClassFilter)filter).getConcreteType(); return ((FilteredPointerKey.SingleClassFilter) filter).getConcreteType();
} else if (key instanceof StaticFieldKey) { } else if (key instanceof StaticFieldKey) {
StaticFieldKey s = (StaticFieldKey) key; StaticFieldKey s = (StaticFieldKey) key;
return getCallGraph().getClassHierarchy().lookupClass(s.getField().getFieldTypeReference()); return getCallGraph().getClassHierarchy().lookupClass(s.getField().getFieldTypeReference());
@ -154,7 +162,7 @@ public class TypeBasedPointerAnalysis extends AbstractPointerAnalysis {
ArrayContentsKey i = (ArrayContentsKey) key; ArrayContentsKey i = (ArrayContentsKey) key;
FilteredPointerKey.TypeFilter filter = i.getTypeFilter(); FilteredPointerKey.TypeFilter filter = i.getTypeFilter();
Assertions._assert(filter instanceof FilteredPointerKey.SingleClassFilter); Assertions._assert(filter instanceof FilteredPointerKey.SingleClassFilter);
return ((FilteredPointerKey.SingleClassFilter)filter).getConcreteType(); return ((FilteredPointerKey.SingleClassFilter) filter).getConcreteType();
} else { } else {
Assertions.UNREACHABLE("inferType " + key.getClass()); Assertions.UNREACHABLE("inferType " + key.getClass());
return null; return null;