RFR: 8261606: Surprising behavior of step over in String switch

Jan Lahoda jlahoda at openjdk.java.net
Mon Feb 15 08:16:50 UTC 2021


Consider code like:
public class Test {
    public static void main(String... args) {
        new Test().test("a");
    }
    private void test(String s) {
        if (s != null) {
            switch (s) {
                case "a":
                    System.out.println("a"); //breakpoint here, and continue with step-over
                    break;
                default:
                    System.out.println("default"); //the program counter will be shown here eventually
            }
        } else {
            System.out.println("null");
        }
    }
} 

Placing breakpoint at the marked line (with `System.out.println("a");`), running debugger and performing step-over, the execution eventually is shown to stop at the line with `System.out.println("default");`.

The reason for this is (roughly) because the switch-over-string is desugared into a block, but that block does not have an end position set. So the LineNumberTable point for the closing bracket of the block is not generated, and hence the last previous point is used, which is the last line of the last case (branch) of the switch.

The proposal is to set the end position for the synthetic block generated for the switch-over-string.

-------------

Commit messages:
 - 8261606: Surprising behavior of step over in String switch

Changes: https://git.openjdk.java.net/jdk/pull/2569/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2569&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8261606
  Stats: 80 lines in 5 files changed: 79 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2569.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2569/head:pull/2569

PR: https://git.openjdk.java.net/jdk/pull/2569


More information about the compiler-dev mailing list