1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 17:35:35 +02:00

Bug 487477 - StackOverflowError in ClassTypeHelper.getVirtualBases

Change-Id: If8da2174a9338ee8f4d110a4929f739960350da1
This commit is contained in:
Sergey Prigogin 2016-02-08 14:21:17 -08:00 committed by Gerrit Code Review @ Eclipse.org
parent cc71fc2723
commit 4de8d04803

View file

@ -310,28 +310,31 @@ public class ClassTypeHelper {
* @param point the point of instantiation for name lookups
*/
public static ICPPClassType[] getVirtualBases(ICPPClassType classType, IASTNode point) {
Set<ICPPClassType> result = new HashSet<>();
result.add(classType);
getVirtualBases(classType, result, point);
result.remove(classType);
return result.toArray(new ICPPClassType[result.size()]);
Set<ICPPClassType> virtualBases = new HashSet<>();
Set<ICPPClassType> nonvirtualBases = new HashSet<>();
nonvirtualBases.add(classType);
getVirtualBases(classType, virtualBases, nonvirtualBases, point);
return virtualBases.toArray(new ICPPClassType[virtualBases.size()]);
}
// Helper function for getVirtualBases(classType, point).
private static void getVirtualBases(ICPPClassType classType, Set<ICPPClassType> result, IASTNode point) {
/**
* Helper function for #getVirtualBases(classType, point).
*/
private static void getVirtualBases(ICPPClassType classType, Set<ICPPClassType> virtualBases,
Set<ICPPClassType> nonvirtualBases, IASTNode point) {
ICPPBase[] bases = getBases(classType, point);
for (ICPPBase base : bases) {
IBinding b = base.getBaseClass();
if (b instanceof ICPPClassType) {
final ICPPClassType baseClass = (ICPPClassType) b;
if (base.isVirtual()) {
if (result.add(baseClass)) {
getVirtualBases(baseClass, result, point);
if (virtualBases.add(baseClass)) {
getVirtualBases(baseClass, virtualBases, nonvirtualBases, point);
}
} else {
// A non-virtual base could have virtual bases in its hierarchy.
if (!result.contains(baseClass)) {
getVirtualBases(baseClass, result, point);
if (nonvirtualBases.add(baseClass)) {
getVirtualBases(baseClass, virtualBases, nonvirtualBases, point);
}
}
}