[PATCH] 8036827: Incorrect printing of the generic method declaration
B. Blaser
bsrbnd at gmail.com
Fri Aug 25 07:09:05 UTC 2017
Jon,
On 28 January 2017 at 19:26, B. Blaser <bsrbnd at gmail.com> wrote:
> Jonathan,
>
> 2017-01-27 23:05 GMT+01:00 B. Blaser <bsrbnd at gmail.com>:
>> Thanks for your answer.
>> It seems reasonable to print it and compliant with the comments you
>> provided in JDK 7031005.
>>
>> I think there's probably a slight inconsistency similar to JDK
>> 7031005, but for classes.
>> With -verbose, we have:
>>
>> 1) Info from super_class:
>>
>> $ more JDK_8036827.java
>> class JDK_8036827 {}
>>
>> $ javap -v JDK_8036827.class
>> Compiled from "JDK_8036827.java"
>> class JDK_8036827
>>
>> 2) Info from class signature:
>>
>> $ more JDK_8036827.java
>> class JDK_8036827<T> {}
>>
>> $ javap -v JDK_8036827.class
>> Compiled from "JDK_8036827.java"
>> class JDK_8036827<T extends java.lang.Object> extends java.lang.Object
>>
>> What's the correct expectation?
>>
>> Should "extends java.lang.Object" be present in the first example as
>> this information is present in the class file?
>
> If so, I suggest the following fix along with the associate test
> updated to check the -verbose behavior.
Should I create a JBS issue for that?
Bernard
> Bernard
>
> diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
> b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
> --- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
> +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2007, 2017, 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
> @@ -205,7 +205,7 @@
> // use info from class file header
> if (classFile.isClass() && classFile.super_class != 0 ) {
> String sn = getJavaSuperclassName(cf);
> - if (!sn.equals("java.lang.Object")) {
> + if (options.verbose || !sn.equals("java.lang.Object")) {
> print(" extends ");
> print(sn);
> }
> diff --git a/test/tools/javap/TestSuperclass.java
> b/test/tools/javap/TestSuperclass.java
> --- a/test/tools/javap/TestSuperclass.java
> +++ b/test/tools/javap/TestSuperclass.java
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2011, 2017, 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
> @@ -53,12 +53,14 @@
> }
>
> enum GenericKind {
> - NO(""),
> - YES("<T>");
> - GenericKind(String typarams) {
> + NO("", ""),
> + YES("<T>", "<T extends java.lang.Object>");
> + GenericKind(String typarams, String verbose) {
> this.typarams = typarams;
> + this.verbose = verbose;
> }
> final String typarams;
> + final String verbose;
> }
>
> enum SuperKind {
> @@ -73,6 +75,9 @@
> String decl(ClassKind ck) {
> return (name == null) ? "" : ck.keyword + " " + name + " { }";
> }
> + String verbose(ClassKind ck) {
> + return ck == ClassKind.CLASS && name == null ? "extends
> java.lang.Object" : extend();
> + }
> final String name;
> }
>
> @@ -117,28 +122,41 @@
> throw new Error("compilation failed");
>
> File testClass = new File(testDir, "Test.class");
> - String out = javap(testClass);
> +
> + System.err.print("normal: ");
> + String out = javap(testClass.getPath());
>
> // Extract class sig from first line of Java source
> String expect = js.source.replaceAll("(?s)^(.* Test[^{]+?)
> *\\{.*", "$1");
>
> // Extract class sig from line from javap output
> String found = out.replaceAll("(?s).*\n(.* Test[^{]+?) *\\{.*", "$1");
> + System.err.println(found);
>
> checkEqual("class signature", expect, found);
>
> + System.err.print("verbose: ");
> + out = javap("-v", testClass.getPath());
> +
> + String verbose = ck.keyword + " Test" + gk.verbose +
> + (sk.verbose(ck).isEmpty() ? "" : " " + sk.verbose(ck));
> +
> + if (out.contains(verbose))
> + System.err.println(verbose);
> + else
> + checkEqual("class signature", verbose, out);
> +
> + System.err.println();
> +
> return errors;
> }
>
> - String javap(File file) {
> + String javap(String... args) {
> StringWriter sw = new StringWriter();
> PrintWriter pw = new PrintWriter(sw);
> - String[] args = { file.getPath() };
> int rc = com.sun.tools.javap.Main.run(args, pw);
> pw.close();
> String out = sw.toString();
> - if (!out.isEmpty())
> - System.err.println(out);
> if (rc != 0)
> throw new Error("javap failed: rc=" + rc);
> return out;
>
>
>> 2017-01-26 22:24 GMT+01:00 Jonathan Gibbons <jonathan.gibbons at oracle.com>:
>>> Bernard,
>>>
>>> I don't think this should be changed, and I will close out the JBS issue.
>>>
>>> Without the -verbose flag, the "extends java.lang.Object" is not printed.
>>>
>>> $ ./build/linux-x86_64-normal-server-release/images/jdk/bin/javap
>>> play/src/JDK_8036827.class
>>> Compiled from "JDK_8036827.java"
>>> class JDK_8036827 {
>>> JDK_8036827();
>>> public <T> T m1(T);
>>> }
>>>
>>> When the -verbose flag is used, it does not seem unreasonable to print out
>>> information which is explicitly present in the class file.
>>>
>>> -- Jon
More information about the compiler-dev
mailing list