RFR 8035271: Incorrect code attribute indentation

Jonathan Gibbons jonathan.gibbons at oracle.com
Sat Jul 1 20:46:39 UTC 2017


Now would be a good time to make progress on this issue.

-- Jon


On 7/1/17 1:58 AM, B. Blaser wrote:
> Jon,
>
> Is this the right time to consider pushing the following patch to JDK 10?
> Or should I update the JBS issue to "in progress/fix understood" not
> to forget it?
>
> Thanks,
> Bernard
>
> On 6 February 2017 at 15:02, B. Blaser <bsrbnd at gmail.com> wrote:
>> Jonathan,
>>
>> 2017-02-02 18:41 GMT+01:00 Jonathan Gibbons <jonathan.gibbons at oracle.com>:
>>> Bernard,
>>>
>>> In other tests with significant amounts of golden text, we have found it
>>> more
>>> readable to use \n in the golden strings, and use a single .replaceAll
>>> on the string to change the \n to the platform newline character. This
>>> avoids having to use + LS + at the end of each line.
>>>
>>> I will look at your changeset in full context, but comments like
>>> "// Same as CodeWriter.write()" may be meaningful now, but may be less
>>> relevant a year or two down the road, prompting questions like "why does
>>> this need to be stated?".
>>>
>>> Separately, I note that the window of opportunity for fixes like this in JDK
>>> 9
>>> is rapidly closing, and at some point, we will have to push such fixes to
>>> the
>>> JDK 10 repos that were recently opened.
>>>
>>> -- Jon
>> Thanks for your answer, I agree with your comments.
>> Please, find next the updated patch.
>>
>> Bernard
>>
>>> On 02/02/2017 09:05 AM, B. Blaser wrote:
>>>> Hi,
>>>>
>>>> Next is a small fix to preserve the same code attribute indentation
>>>> for all javap options (issue 8035271), along with a test.
>>>>
>>>> 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
>> @@ -571,13 +571,17 @@
>>           } else if (code != null) {
>>               if (options.showDisassembled) {
>>                   println("Code:");
>> +                indent(+1);
>>                   codeWriter.writeInstrs(code);
>>                   codeWriter.writeExceptionTable(code);
>> +                indent(-1);
>>               }
>>
>>               if (options.showLineAndLocalVariableTables) {
>> +                indent(+1);
>>                   attrWriter.write(code,
>> code.attributes.get(Attribute.LineNumberTable), constant_pool);
>>                   attrWriter.write(code,
>> code.attributes.get(Attribute.LocalVariableTable), constant_pool);
>> +                indent(-1);
>>               }
>>           }
>>
>> diff --git a/test/tools/javap/CodeAttributeIndentation.java
>> b/test/tools/javap/CodeAttributeIndentation.java
>> new file mode 100644
>> --- /dev/null
>> +++ b/test/tools/javap/CodeAttributeIndentation.java
>> @@ -0,0 +1,65 @@
>> +/*
>> + * @test
>> + * @bug 8035271
>> + * @summary Same code attribute indentation for all options.
>> + * @library /tools/lib
>> + * @modules jdk.compiler/com.sun.tools.javac.api
>> + *          jdk.compiler/com.sun.tools.javac.main
>> + *          jdk.jdeps/com.sun.tools.javap
>> + * @build toolbox.ToolBox toolbox.JavacTask toolbox.JavapTask
>> + * @run main CodeAttributeIndentation
>> + */
>> +
>> +import toolbox.ToolBox;
>> +import toolbox.JavacTask;
>> +import toolbox.JavapTask;
>> +import toolbox.Task.OutputKind;
>> +
>> +public class CodeAttributeIndentation {
>> +    public static void main(String... args) {
>> +        String LS = System.getProperty("line.separator");
>> +
>> +        String src = (
>> +            "public class A {\n" +
>> +            "    public void a() {}\n" +
>> +            "}"
>> +            ).replaceAll("\n", LS);
>> +
>> +        String expected = (
>> +            "Compiled from \"A.java\"\n" +
>> +            "public class A {\n" +
>> +            "  public A();\n" +
>> +            "    Code:\n" +
>> +            "         0: aload_0\n" +
>> +            "         1: invokespecial #1                  " +
>> +            "// Method java/lang/Object.\"<init>\":()V\n" +
>> +            "         4: return\n" +
>> +            "      LineNumberTable:\n" +
>> +            "        line 1: 0\n" +
>> +            "      LocalVariableTable:\n" +
>> +            "        Start  Length  Slot  Name   Signature\n" +
>> +            "            0       5     0  this   LA;\n" +
>> +            "\n" +
>> +            "  public void a();\n" +
>> +            "    Code:\n" +
>> +            "         0: return\n" +
>> +            "      LineNumberTable:\n" +
>> +            "        line 2: 0\n" +
>> +            "      LocalVariableTable:\n" +
>> +            "        Start  Length  Slot  Name   Signature\n" +
>> +            "            0       1     0  this   LA;\n" +
>> +            "}\n"
>> +            ).replaceAll("\n", LS);
>> +
>> +        ToolBox tb = new ToolBox();
>> +
>> +        new JavacTask(tb).options("-g").sources(src).run();
>> +
>> +        String actual = new JavapTask(tb).options("-c",
>> "-l").classes("A.class")
>> +                .run().getOutput(OutputKind.DIRECT);
>> +
>> +        if (!actual.equals(expected))
>> +            throw new AssertionError("Incorrect code attribute indentation: " +
>> +                    LS + actual);
>> +    }
>> +}



More information about the compiler-dev mailing list