OpenJDK / jdk / jdk
changeset 55242:77b54b2822cc
8216261: Javap ignores default modifier on interfaces
Reviewed-by: jjg, darcy
author | vromero |
---|---|
date | Wed, 05 Jun 2019 16:01:50 -0400 |
parents | 7e2238451585 |
children | 647593fdea53 |
files | src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java test/langtools/tools/javap/default_methods/JavapNotPrintingDefaultModifierTest.java |
diffstat | 2 files changed, 101 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java Wed Jun 05 21:14:46 2019 +0200 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java Wed Jun 05 16:01:50 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Set; import com.sun.tools.classfile.AccessFlags; import com.sun.tools.classfile.Attribute; @@ -471,6 +472,9 @@ setPendingNewline(false); } + private static final int DEFAULT_ALLOWED_MAJOR_VERSION = 52; + private static final int DEFAULT_ALLOWED_MINOR_VERSION = 0; + protected void writeMethod(Method m) { if (!options.checkAccess(m.access_flags)) return; @@ -504,11 +508,24 @@ } } - writeModifiers(flags.getMethodModifiers()); + Set<String> modifiers = flags.getMethodModifiers(); + + String name = getName(m); + if (classFile.isInterface() && + (!flags.is(AccessFlags.ACC_ABSTRACT)) && !name.equals("<clinit>")) { + if (classFile.major_version > DEFAULT_ALLOWED_MAJOR_VERSION || + (classFile.major_version == DEFAULT_ALLOWED_MAJOR_VERSION && classFile.minor_version >= DEFAULT_ALLOWED_MINOR_VERSION)) { + if (!flags.is(AccessFlags.ACC_STATIC | AccessFlags.ACC_PRIVATE)) { + modifiers.add("default"); + } + } + } + + writeModifiers(modifiers); if (methodType != null) { print(new JavaTypePrinter(false).printTypeArgs(methodType.typeParamTypes)); } - switch (getName(m)) { + switch (name) { case "<init>": print(getJavaName(classFile)); print(getJavaParameterTypes(d, flags)); @@ -519,7 +536,7 @@ default: print(getJavaReturnType(d)); print(" "); - print(getName(m)); + print(name); print(getJavaParameterTypes(d, flags)); break; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javap/default_methods/JavapNotPrintingDefaultModifierTest.java Wed Jun 05 16:01:50 2019 -0400 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test 8216261 + * @summary Javap ignores default modifier on interfaces + * @library /tools/lib + * @modules jdk.jdeps/com.sun.tools.javap + * @build toolbox.ToolBox toolbox.JavapTask + * @run main JavapNotPrintingDefaultModifierTest + */ + +import java.nio.file.*; +import java.util.*; + +import toolbox.JavapTask; +import toolbox.TestRunner; +import toolbox.ToolBox; +import toolbox.Task; + +public class JavapNotPrintingDefaultModifierTest extends TestRunner { + ToolBox tb = new ToolBox(); + + interface SimpleInterface { + default void defaultMethod() {} + void foo(); + } + + private static final String expectedOutput = + "interface JavapNotPrintingDefaultModifierTest$SimpleInterface {\n" + + " public default void defaultMethod();\n" + + " public abstract void foo();\n" + + "}"; + + JavapNotPrintingDefaultModifierTest() throws Exception { + super(System.err); + } + + public static void main(String... args) throws Exception { + JavapNotPrintingDefaultModifierTest tester = new JavapNotPrintingDefaultModifierTest(); + tester.runTests(); + } + + protected void runTests() throws Exception { + runTests(m -> new Object[] { Paths.get(m.getName()) }); + } + + @Test + public void testMain(Path base) throws Exception { + Path testClassesPath = Paths.get(System.getProperty("test.classes")); + String output = new JavapTask(tb) + .options("-p", testClassesPath.resolve(this.getClass().getSimpleName() + "$SimpleInterface.class").toString()) + .run() + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + if (!output.contains(expectedOutput)) { + throw new AssertionError(String.format("unexpected output:\n %s", output)); + } + } +}