src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java
changeset 5955 f54cccaf6e6c
parent 5872 692432708568
     1.1 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java	Wed May 10 12:38:59 2017 +0200
     1.2 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java	Mon Jul 31 11:07:41 2017 +0200
     1.3 @@ -355,6 +355,8 @@
     1.4          JavaFileObject classfile = c.classfile;
     1.5          if (classfile != null) {
     1.6              JavaFileObject previousClassFile = currentClassFile;
     1.7 +            Symbol prevOwner = c.owner;
     1.8 +            Name prevName = c.fullname;
     1.9              try {
    1.10                  if (reader.filling) {
    1.11                      Assert.error("Filling " + classfile.toUri() + " during " + previousClassFile);
    1.12 @@ -377,6 +379,21 @@
    1.13                                                          + classfile.toUri());
    1.14                      }
    1.15                  }
    1.16 +            } catch (BadClassFile cf) {
    1.17 +                //the symbol may be partially initialized, purge it:
    1.18 +                c.owner = prevOwner;
    1.19 +                c.members_field.getSymbols(sym -> sym.kind == TYP).forEach(sym -> {
    1.20 +                    ClassSymbol csym = (ClassSymbol) sym;
    1.21 +                    csym.owner = sym.packge();
    1.22 +                    csym.owner.members().enter(sym);
    1.23 +                    csym.fullname = sym.flatName();
    1.24 +                    csym.name = Convert.shortName(sym.flatName());
    1.25 +                    csym.reset();
    1.26 +                });
    1.27 +                c.fullname = prevName;
    1.28 +                c.name = Convert.shortName(prevName);
    1.29 +                c.reset();
    1.30 +                throw cf;
    1.31              } finally {
    1.32                  currentClassFile = previousClassFile;
    1.33              }