# HG changeset patch # User Dusan Balek # Date 1501492061 -7200 # Node ID f54cccaf6e6cd93bf55fe8fd2c871efcf0c49360 # Parent f453b3a76796c86d04197f73408ee136c0c5ca24 Mergin jlahoda's fix of #8182450: javac aborts when generating ct.sym intermittently - Initialize the module system model even in presence of missing/broken module-infos; BadClassFiles should not immediatelly abort compilation anymore, but should be handled as if the classfile did not exist. diff -r f453b3a76796 -r f54cccaf6e6c src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java Mon Jun 26 10:38:22 2017 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java Mon Jul 31 11:07:41 2017 +0200 @@ -355,6 +355,8 @@ JavaFileObject classfile = c.classfile; if (classfile != null) { JavaFileObject previousClassFile = currentClassFile; + Symbol prevOwner = c.owner; + Name prevName = c.fullname; try { if (reader.filling) { Assert.error("Filling " + classfile.toUri() + " during " + previousClassFile); @@ -377,6 +379,21 @@ + classfile.toUri()); } } + } catch (BadClassFile cf) { + //the symbol may be partially initialized, purge it: + c.owner = prevOwner; + c.members_field.getSymbols(sym -> sym.kind == TYP).forEach(sym -> { + ClassSymbol csym = (ClassSymbol) sym; + csym.owner = sym.packge(); + csym.owner.members().enter(sym); + csym.fullname = sym.flatName(); + csym.name = Convert.shortName(sym.flatName()); + csym.reset(); + }); + c.fullname = prevName; + c.name = Convert.shortName(prevName); + c.reset(); + throw cf; } finally { currentClassFile = previousClassFile; } diff -r f453b3a76796 -r f54cccaf6e6c src/jdk.compiler/share/classes/com/sun/tools/javac/code/ModuleFinder.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ModuleFinder.java Mon Jun 26 10:38:22 2017 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ModuleFinder.java Mon Jul 31 11:07:41 2017 +0200 @@ -31,7 +31,6 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; -import java.util.function.Function; import javax.tools.JavaFileManager; import javax.tools.JavaFileManager.Location; @@ -58,6 +57,7 @@ import com.sun.tools.javac.util.Names; import static com.sun.tools.javac.code.Kinds.Kind.*; +import com.sun.tools.javac.comp.Check; /** * This class provides operations to locate module definitions @@ -82,6 +82,7 @@ private final Names names; private final ClassFinder classFinder; + private final Check chk; /** Access to files */ @@ -109,6 +110,7 @@ fileManager = context.get(JavaFileManager.class); log = Log.instance(context); classFinder = ClassFinder.instance(context); + chk = Check.instance(context); diags = JCDiagnostic.Factory.instance(context); } @@ -203,7 +205,13 @@ if (fo == null) { msym = syms.unnamedModule; } else { - msym = readModule(fo); + try { + msym = readModule(fo); + } catch (CompletionFailure ex) { + chk.completionError(null, ex); + msym = syms.unnamedModule; + } + } if (msym.patchLocation == null) { diff -r f453b3a76796 -r f54cccaf6e6c src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Mon Jun 26 10:38:22 2017 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Mon Jul 31 11:07:41 2017 +0200 @@ -290,8 +290,7 @@ */ public Type completionError(DiagnosticPosition pos, CompletionFailure ex) { log.error(JCDiagnostic.DiagnosticFlag.NON_DEFERRABLE, pos, "cant.access", ex.sym, ex.getDetailValue()); - if (ex instanceof ClassFinder.BadClassFile) throw new Abort(); - else return syms.errType; + return syms.errType; } /** Report an error that wrong type tag was found. diff -r f453b3a76796 -r f54cccaf6e6c src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Mon Jun 26 10:38:22 2017 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Mon Jul 31 11:07:41 2017 +0200 @@ -94,10 +94,8 @@ import com.sun.tools.javac.tree.JCTree.JCUses; import com.sun.tools.javac.tree.JCTree.Tag; import com.sun.tools.javac.tree.TreeInfo; -import com.sun.tools.javac.util.Abort; import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.Context; -import com.sun.tools.javac.util.JCDiagnostic; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; @@ -105,7 +103,6 @@ import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Options; -import com.sun.tools.javac.util.Position; import static com.sun.tools.javac.code.Flags.ABSTRACT; import static com.sun.tools.javac.code.Flags.ENUM; @@ -293,8 +290,7 @@ msym.complete(); } } catch (CompletionFailure ex) { - log.error(JCDiagnostic.DiagnosticFlag.NON_DEFERRABLE, Position.NOPOS, "cant.access", ex.sym, ex.getDetailValue()); - if (ex instanceof ClassFinder.BadClassFile) throw new Abort(); + chk.completionError(null, ex); } finally { depth--; } @@ -1283,10 +1279,6 @@ Predicate observablePred = sym -> (observable == null) ? (moduleFinder.findModule(sym).kind != ERR) : observable.contains(sym); Predicate systemModulePred = sym -> (sym.flags() & Flags.SYSTEM_MODULE) != 0; - Predicate noIncubatorPred = sym -> { - sym.complete(); - return !sym.resolutionFlags.contains(ModuleResolutionFlags.DO_NOT_RESOLVE_BY_DEFAULT); - }; Set enabledRoot = new LinkedHashSet<>(); if (rootModules.contains(syms.unnamedModule)) { @@ -1304,9 +1296,18 @@ jdkModulePred = sym -> true; } + Predicate noIncubatorPred = sym -> { + sym.complete(); + return !sym.resolutionFlags.contains(ModuleResolutionFlags.DO_NOT_RESOLVE_BY_DEFAULT); + }; + for (ModuleSymbol sym : new HashSet<>(syms.getAllModules())) { - if (systemModulePred.test(sym) && observablePred.test(sym) && jdkModulePred.test(sym) && noIncubatorPred.test(sym)) { - enabledRoot.add(sym); + try { + if (systemModulePred.test(sym) && observablePred.test(sym) && jdkModulePred.test(sym) && noIncubatorPred.test(sym)) { + enabledRoot.add(sym); + } + } catch (CompletionFailure ex) { + chk.completionError(null, ex); } } } @@ -1398,32 +1399,36 @@ result.add(syms.java_base); while (primaryTodo.nonEmpty() || secondaryTodo.nonEmpty()) { - ModuleSymbol current; - boolean isPrimaryTodo; - if (primaryTodo.nonEmpty()) { - current = primaryTodo.head; - primaryTodo = primaryTodo.tail; - isPrimaryTodo = true; - } else { - current = secondaryTodo.head; - secondaryTodo = secondaryTodo.tail; - isPrimaryTodo = false; - } - if (observable != null && !observable.contains(current)) - continue; - if (!result.add(current) || current == syms.unnamedModule || ((current.flags_field & Flags.AUTOMATIC_MODULE) != 0)) - continue; - current.complete(); - if (current.kind == ERR && isPrimaryTodo && warnedMissing.add(current)) { - log.error(Errors.ModuleNotFound(current)); - } - for (RequiresDirective rd : current.requires) { - if (rd.module == syms.java_base) continue; - if ((rd.isTransitive() && isPrimaryTodo) || base.contains(current)) { - primaryTodo = primaryTodo.prepend(rd.module); + try { + ModuleSymbol current; + boolean isPrimaryTodo; + if (primaryTodo.nonEmpty()) { + current = primaryTodo.head; + primaryTodo = primaryTodo.tail; + isPrimaryTodo = true; } else { - secondaryTodo = secondaryTodo.prepend(rd.module); + current = secondaryTodo.head; + secondaryTodo = secondaryTodo.tail; + isPrimaryTodo = false; } + if (observable != null && !observable.contains(current)) + continue; + if (!result.add(current) || current == syms.unnamedModule || ((current.flags_field & Flags.AUTOMATIC_MODULE) != 0)) + continue; + current.complete(); + if (current.kind == ERR && isPrimaryTodo && warnedMissing.add(current)) { + log.error(Errors.ModuleNotFound(current)); + } + for (RequiresDirective rd : current.requires) { + if (rd.module == syms.java_base) continue; + if ((rd.isTransitive() && isPrimaryTodo) || base.contains(current)) { + primaryTodo = primaryTodo.prepend(rd.module); + } else { + secondaryTodo = secondaryTodo.prepend(rd.module); + } + } + } catch (CompletionFailure ex) { + chk.completionError(null, ex); } } diff -r f453b3a76796 -r f54cccaf6e6c src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon Jun 26 10:38:22 2017 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon Jul 31 11:07:41 2017 +0200 @@ -1435,7 +1435,7 @@ ClassSymbol c = readClassSymbol(nextChar()); NameAndType nt = readNameAndType(nextChar()); - if (c.members_field == null) + if (c.members_field == null || c.kind != TYP) throw badClassFile("bad.enclosing.class", self, c); MethodSymbol m = findMethod(nt, c.members_field, self.flags()); diff -r f453b3a76796 -r f54cccaf6e6c src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java Mon Jun 26 10:38:22 2017 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java Mon Jul 31 11:07:41 2017 +0200 @@ -408,8 +408,6 @@ } catch (CompletionFailure ex) { // inlined Check.completionError as it is not initialized yet log.error("cant.access", ex.sym, ex.getDetailValue()); - if (ex instanceof ClassFinder.BadClassFile) - throw new Abort(); } source = Source.instance(context); attr = Attr.instance(context); diff -r f453b3a76796 -r f54cccaf6e6c test/tools/javac/modules/EdgeCases.java --- a/test/tools/javac/modules/EdgeCases.java Mon Jun 26 10:38:22 2017 +0200 +++ b/test/tools/javac/modules/EdgeCases.java Mon Jul 31 11:07:41 2017 +0200 @@ -467,7 +467,8 @@ List expected = Arrays.asList( "- compiler.err.cant.access: m1x.module-info, (compiler.misc.bad.class.file.header: module-info.class, (compiler.misc.module.name.mismatch: other, m1x))", - "1 error"); + "module-info.java:1:1: compiler.err.module.not.found: m1x", + "2 errors"); if (!expected.equals(log)) { throw new AssertionError("Unexpected output: " + log);