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:
parent
cc71fc2723
commit
4de8d04803
1 changed files with 15 additions and 12 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue