From 4de8d04803b25025303d27bd0534104c8615dd40 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Mon, 8 Feb 2016 14:21:17 -0800 Subject: [PATCH] Bug 487477 - StackOverflowError in ClassTypeHelper.getVirtualBases Change-Id: If8da2174a9338ee8f4d110a4929f739960350da1 --- .../core/dom/parser/cpp/ClassTypeHelper.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 293ceac6458..a3d7e889360 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -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 result = new HashSet<>(); - result.add(classType); - getVirtualBases(classType, result, point); - result.remove(classType); - return result.toArray(new ICPPClassType[result.size()]); + Set virtualBases = new HashSet<>(); + Set 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 result, IASTNode point) { + + /** + * Helper function for #getVirtualBases(classType, point). + */ + private static void getVirtualBases(ICPPClassType classType, Set virtualBases, + Set 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); } } }