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:
parent
851aec7d00
commit
72b99ed91f
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue