src/share/classes/com/sun/tools/javac/code/Types.java

changeset 1015
6bb526ccf5ff
parent 1007
95fc7fd39be2
child 1071
b86277584776
     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      /**

mercurial