1.1 --- a/src/share/classes/com/sun/tools/javac/code/Types.java Fri May 20 16:04:23 2011 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Mon May 23 11:55:55 2011 +0100 1.3 @@ -2061,7 +2061,7 @@ 1.4 _map.put(ms, new SoftReference<Map<TypeSymbol, Entry>>(cache)); 1.5 } 1.6 Entry e = cache.get(origin); 1.7 - CompoundScope members = membersClosure(origin.type); 1.8 + CompoundScope members = membersClosure(origin.type, true); 1.9 if (e == null || 1.10 !e.matches(implFilter, checkResult, members.getMark())) { 1.11 MethodSymbol impl = implementationInternal(ms, origin, checkResult, implFilter); 1.12 @@ -2098,36 +2098,61 @@ 1.13 // </editor-fold> 1.14 1.15 // <editor-fold defaultstate="collapsed" desc="compute transitive closure of all members in given site"> 1.16 - public CompoundScope membersClosure(Type site) { 1.17 - return membersClosure.visit(site); 1.18 - } 1.19 - 1.20 - UnaryVisitor<CompoundScope> membersClosure = new UnaryVisitor<CompoundScope>() { 1.21 - 1.22 - public CompoundScope visitType(Type t, Void s) { 1.23 + class MembersClosureCache extends SimpleVisitor<CompoundScope, Boolean> { 1.24 + 1.25 + private WeakHashMap<TypeSymbol, Entry> _map = 1.26 + new WeakHashMap<TypeSymbol, Entry>(); 1.27 + 1.28 + class Entry { 1.29 + final boolean skipInterfaces; 1.30 + final CompoundScope compoundScope; 1.31 + 1.32 + public Entry(boolean skipInterfaces, CompoundScope compoundScope) { 1.33 + this.skipInterfaces = skipInterfaces; 1.34 + this.compoundScope = compoundScope; 1.35 + } 1.36 + 1.37 + boolean matches(boolean skipInterfaces) { 1.38 + return this.skipInterfaces == skipInterfaces; 1.39 + } 1.40 + } 1.41 + 1.42 + /** members closure visitor methods **/ 1.43 + 1.44 + public CompoundScope visitType(Type t, Boolean skipInterface) { 1.45 return null; 1.46 } 1.47 1.48 @Override 1.49 - public CompoundScope visitClassType(ClassType t, Void s) { 1.50 + public CompoundScope visitClassType(ClassType t, Boolean skipInterface) { 1.51 ClassSymbol csym = (ClassSymbol)t.tsym; 1.52 - if (csym.membersClosure == null) { 1.53 + Entry e = _map.get(csym); 1.54 + if (e == null || !e.matches(skipInterface)) { 1.55 CompoundScope membersClosure = new CompoundScope(csym); 1.56 - for (Type i : interfaces(t)) { 1.57 - membersClosure.addSubScope(visit(i)); 1.58 + if (!skipInterface) { 1.59 + for (Type i : interfaces(t)) { 1.60 + membersClosure.addSubScope(visit(i, skipInterface)); 1.61 + } 1.62 } 1.63 - membersClosure.addSubScope(visit(supertype(t))); 1.64 + membersClosure.addSubScope(visit(supertype(t), skipInterface)); 1.65 membersClosure.addSubScope(csym.members()); 1.66 - csym.membersClosure = membersClosure; 1.67 + e = new Entry(skipInterface, membersClosure); 1.68 + _map.put(csym, e); 1.69 } 1.70 - return csym.membersClosure; 1.71 + return e.compoundScope; 1.72 } 1.73 1.74 @Override 1.75 - public CompoundScope visitTypeVar(TypeVar t, Void s) { 1.76 - return visit(t.getUpperBound()); 1.77 + public CompoundScope visitTypeVar(TypeVar t, Boolean skipInterface) { 1.78 + return visit(t.getUpperBound(), skipInterface); 1.79 } 1.80 - }; 1.81 + } 1.82 + 1.83 + private MembersClosureCache membersCache = new MembersClosureCache(); 1.84 + 1.85 + public CompoundScope membersClosure(Type site, boolean skipInterface) { 1.86 + return membersCache.visit(site, skipInterface); 1.87 + } 1.88 // </editor-fold> 1.89 1.90 /**