1.1 --- a/src/share/classes/com/sun/tools/javac/code/Types.java Wed Aug 31 16:11:28 2011 +0100 1.2 +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Wed Aug 31 16:15:19 2011 +0100 1.3 @@ -2119,6 +2119,8 @@ 1.4 } 1.5 } 1.6 1.7 + List<TypeSymbol> seenTypes = List.nil(); 1.8 + 1.9 /** members closure visitor methods **/ 1.10 1.11 public CompoundScope visitType(Type t, Boolean skipInterface) { 1.12 @@ -2127,21 +2129,33 @@ 1.13 1.14 @Override 1.15 public CompoundScope visitClassType(ClassType t, Boolean skipInterface) { 1.16 - ClassSymbol csym = (ClassSymbol)t.tsym; 1.17 - Entry e = _map.get(csym); 1.18 - if (e == null || !e.matches(skipInterface)) { 1.19 - CompoundScope membersClosure = new CompoundScope(csym); 1.20 - if (!skipInterface) { 1.21 - for (Type i : interfaces(t)) { 1.22 - membersClosure.addSubScope(visit(i, skipInterface)); 1.23 + if (seenTypes.contains(t.tsym)) { 1.24 + //this is possible when an interface is implemented in multiple 1.25 + //superclasses, or when a classs hierarchy is circular - in such 1.26 + //cases we don't need to recurse (empty scope is returned) 1.27 + return new CompoundScope(t.tsym); 1.28 + } 1.29 + try { 1.30 + seenTypes = seenTypes.prepend(t.tsym); 1.31 + ClassSymbol csym = (ClassSymbol)t.tsym; 1.32 + Entry e = _map.get(csym); 1.33 + if (e == null || !e.matches(skipInterface)) { 1.34 + CompoundScope membersClosure = new CompoundScope(csym); 1.35 + if (!skipInterface) { 1.36 + for (Type i : interfaces(t)) { 1.37 + membersClosure.addSubScope(visit(i, skipInterface)); 1.38 + } 1.39 } 1.40 + membersClosure.addSubScope(visit(supertype(t), skipInterface)); 1.41 + membersClosure.addSubScope(csym.members()); 1.42 + e = new Entry(skipInterface, membersClosure); 1.43 + _map.put(csym, e); 1.44 } 1.45 - membersClosure.addSubScope(visit(supertype(t), skipInterface)); 1.46 - membersClosure.addSubScope(csym.members()); 1.47 - e = new Entry(skipInterface, membersClosure); 1.48 - _map.put(csym, e); 1.49 + return e.compoundScope; 1.50 } 1.51 - return e.compoundScope; 1.52 + finally { 1.53 + seenTypes = seenTypes.tail; 1.54 + } 1.55 } 1.56 1.57 @Override