# HG changeset patch # User vromero # Date 1467055781 25200 # Node ID cd0aca7db174ae3dcb80cd55bf1be05180cfbbe2 # Parent 3aa52182b3ad7c5b3a61cf05a59dd07e4c5884e5 8159439: javac throws NPE with Module attribute and super_class != 0 Reviewed-by: jjg diff -r 3aa52182b3ad -r cd0aca7db174 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Wed Jul 05 21:53:18 2017 +0200 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Mon Jun 27 12:29:41 2016 -0700 @@ -50,6 +50,7 @@ import javax.tools.JavaFileObject.Kind; import javax.tools.StandardLocation; +import com.sun.tools.javac.code.ClassFinder; import com.sun.tools.javac.code.Directive; import com.sun.tools.javac.code.Directive.ExportsDirective; import com.sun.tools.javac.code.Directive.RequiresDirective; @@ -101,6 +102,8 @@ import com.sun.tools.javac.tree.JCTree.JCDirective; import com.sun.tools.javac.tree.JCTree.Tag; +import com.sun.tools.javac.util.Abort; +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; @@ -217,6 +220,9 @@ for (ModuleSymbol msym: roots) { 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(); } finally { depth--; } diff -r 3aa52182b3ad -r cd0aca7db174 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Wed Jul 05 21:53:18 2017 +0200 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon Jun 27 12:29:41 2016 -0700 @@ -2418,6 +2418,9 @@ // reset and read rest of classinfo bp = startbp; int n = nextChar(); + if ((flags & MODULE) != 0 && n > 0) { + throw badClassFile("module.info.invalid.super.class"); + } if (ct.supertype_field == null) ct.supertype_field = (n == 0) ? Type.noType diff -r 3aa52182b3ad -r cd0aca7db174 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Wed Jul 05 21:53:18 2017 +0200 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Mon Jun 27 12:29:41 2016 -0700 @@ -1850,6 +1850,9 @@ compiler.misc.class.file.wrong.class=\ class file contains wrong class: {0} +compiler.misc.module.info.invalid.super.class=\ + module-info with invalid super class + compiler.misc.class.file.not.found=\ class file for {0} not found diff -r 3aa52182b3ad -r cd0aca7db174 langtools/test/ProblemList.txt --- a/langtools/test/ProblemList.txt Wed Jul 05 21:53:18 2017 +0200 +++ b/langtools/test/ProblemList.txt Mon Jun 27 12:29:41 2016 -0700 @@ -76,6 +76,7 @@ tools/javac/annotations/typeAnnotations/referenceinfos/Lambda.java 8057687 generic-all emit correct byte code an attributes for type annotations tools/javac/annotations/typeAnnotations/referenceinfos/NestedTypes.java 8057687 generic-all emit correct byte code an attributes for type annotations tools/javac/warnings/suppress/TypeAnnotations.java 8057683 generic-all improve ordering of errors with type annotations +tools/javac/modules/T8159439/NPEForModuleInfoWithNonZeroSuperClassTest.java 8160396 generic-all current version of jtreg needs a new promotion to include lastes version of ASM ########################################################################### # diff -r 3aa52182b3ad -r cd0aca7db174 langtools/test/tools/javac/diags/examples.not-yet.txt --- a/langtools/test/tools/javac/diags/examples.not-yet.txt Wed Jul 05 21:53:18 2017 +0200 +++ b/langtools/test/tools/javac/diags/examples.not-yet.txt Mon Jun 27 12:29:41 2016 -0700 @@ -120,6 +120,7 @@ compiler.misc.bad.module-info.name # bad class file compiler.err.locn.bad.module-info # bad class file compiler.err.locn.cant.read.file # bad class file +compiler.misc.module.info.invalid.super.class # bad class file compiler.err.locn.cant.read.directory # file system issue compiler.misc.unnamed.module # fragment uninteresting in and of itself compiler.misc.kindname.module # fragment uninteresting in and of itself diff -r 3aa52182b3ad -r cd0aca7db174 langtools/test/tools/javac/modules/T8159439/NPEForModuleInfoWithNonZeroSuperClassTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8159439/NPEForModuleInfoWithNonZeroSuperClassTest.java Mon Jun 27 12:29:41 2016 -0700 @@ -0,0 +1,9 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8159439 + * @summary javac throws NPE with Module attribute and super_class != 0 + * @build module-info + * @compile/fail/ref=NPEForModuleInfoWithNonZeroSuperClassTest.out -XDrawDiagnostics NPEForModuleInfoWithNonZeroSuperClassTest.java + */ + +class NPEForModuleInfoWithNonZeroSuperClassTest {} diff -r 3aa52182b3ad -r cd0aca7db174 langtools/test/tools/javac/modules/T8159439/NPEForModuleInfoWithNonZeroSuperClassTest.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8159439/NPEForModuleInfoWithNonZeroSuperClassTest.out Mon Jun 27 12:29:41 2016 -0700 @@ -0,0 +1,2 @@ +- compiler.err.cant.access: mod.module-info, (compiler.misc.bad.class.file.header: module-info.class, (compiler.misc.module.info.invalid.super.class)) +1 error diff -r 3aa52182b3ad -r cd0aca7db174 langtools/test/tools/javac/modules/T8159439/module-info.jcod --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/T8159439/module-info.jcod Mon Jun 27 12:29:41 2016 -0700 @@ -0,0 +1,55 @@ +module mod { + 0xCAFEBABE; + 0; // minor version + 53; // version + [] { // Constant Pool + ; // first element is empty + Utf8 "mod/module-info"; // #1 + class #1; // #2 + Utf8 "java/lang/Object"; // #3 + class #3; // #4 + Utf8 "java.base"; // #5 + Utf8 "pkg"; // #6 + Utf8 "Module"; // #7 + Utf8 "Version"; // #8 + Utf8 "6.0"; // #9 + } // Constant Pool + + 0x8000; // access + #2;// this_cpx + #4;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + } // fields + + [] { // methods + } // methods + + [] { // Attributes + Attr(#7) { // Module + [] { // requires + #5 0x8020; + } // requires + + [] { // exports + #6 + [] { // to + }; // end to + } // exports + + [] { // uses + } // uses + + [] { // provides + } // provides + + } // end Module + ; + Attr(#8) { // Version + 0x0009; + } // end Version + } // Attributes +} // end module mod