RFR: 8034066: Incorrect alignment in the "Code" section for "-c -XDdetails" options
Jorn Vernee
jvernee at openjdk.org
Thu Oct 24 19:16:41 UTC 2024
On Thu, 24 Oct 2024 14:57:19 GMT, Jonathan Lampérth <duke at openjdk.org> wrote:
> This PR includes changes to ensure `Code:` block indentation in `javap`for the `-verbose` case and non `-verbose` case is the same, which currently does not hold.
>
> Current behaviour of `javap` differs with and without `-verbose` in the following way:
> **Command**: `javap -c -XDdetails:stackMaps A.class`
>
> Without `-verbose`
>
>
> ...
> public void a();
> Code:
> 0: iconst_0
> 1: istore_1
> StackMap locals: this int
> StackMap stack:
> ...
>
>
> With `-verbose`
>
>
> ...
> public void a();
> descriptor: ()V
> flags: (0x0001) ACC_PUBLIC
> Code:
> stack=2, locals=2, args_size=1
> 0: iconst_0
> 1: istore_1
> StackMap locals: this int
> StackMap stack:
> ...
>
>
> With `-verbose` all contents of the `Code:` section include an extra (2 space) indent, which is missing in the non `-verbose` case. This is because the `CodeWriter` is called via `CoderWriter.write(...)` in the `-verbose` case, which wraps the `Code:` block in `indent(+1);...indent(-1)`.
>
> In the non-verbose case this call is circumvented and a simplified version of `CoderWriter.write(...)` is included directly in `ClassWriter.writeMethod`.
>
> ---
>
> Alternatively to keep the logic within `CodeWriter` with the goal of keeping the logic for `-verbose` and non `-verbose` in the same place one could add `CodeWriter.writeSimple(...)`.
>
>
> void writeSimple(CodeAttribute attr) {
> println("Code:");
> indent(+1);
> writeInstrs(attr);
> writeExceptionTable(attr);
> indent(-1);
> }
>
>
> ---
>
> Note: Test setup is inspired by existing tests: [T6622232.java](https://github.com/openjdk/jdk/blob/master/test/langtools/tools/javap/T6622232.java) and [8244573](https://github.com/openjdk/jdk/blob/master/test/langtools/tools/javap/8244573)
I think I prefer your idea of keeping the code inside `CodeWriter`.
Maybe have a `write` and a `writeVerbose`, and have a private method with a `boolean` param that controls printing of extra info?
test/langtools/tools/javap/8034066/T8034066.java line 37:
> 35: import java.util.regex.Pattern;
> 36:
> 37: public class T8034066 {
Please don't continue the old practice of naming tests after their bug ID. It obfuscates which test class does what (both in the source code and in the test logs). Suggestion for name: `TestStackMapDetailsIndent`
test/langtools/tools/javap/8034066/T8034066.java line 44:
> 42: public void run() throws IOException {
> 43: String output = javap();
> 44:
Could you put a comment here that roughly shows what the expected output looks like? I think it would help readers understand what the following three lines are looking for.
-------------
PR Review: https://git.openjdk.org/jdk/pull/21685#pullrequestreview-2393197370
PR Review Comment: https://git.openjdk.org/jdk/pull/21685#discussion_r1815355517
PR Review Comment: https://git.openjdk.org/jdk/pull/21685#discussion_r1815380775
More information about the compiler-dev
mailing list