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

changeset 1072
d0257833498e
parent 1071
b86277584776
child 1093
c0835c8489b0
     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

mercurial