[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