RFR: 8314226: Series of colon-style fallthrough switch cases with guards compiled incorrectly
Aggelos Biboudis
abimpoudis at openjdk.org
Fri Sep 1 10:32:00 UTC 2023
The `switch` structure is translated in `handleSwitch` where we rewrite pattern matching switches. In some occasions a switch has multiple cases with multiple patterns where the n-th case does not complete normally and falls through to the n+1-st case:
switch (obj) {
case Integer _ when ((Integer) obj) > 0:
case String _ when !((String) obj).isEmpty():
return 1;
default:
return -1;
}
This PR addresses that by translating the second case correctly and also replicates the body of the latter to the former (which we can do because no bindings are introduced in either statement blocks by the definition of unnamed variables.).
Previously the code was translated into:
switch (java.lang.runtime.SwitchBootstraps.typeSwitch(selector0$temp, index$1)) {
case 0:
Integer _;
if (!(true && ((Integer)obj) > 0)) {
index$1 = 1;
continue;
}
case 1 when !((String)obj).isEmpty():
return 1;
default:
return -1;
}
This PR adjusts the translation into:
switch (java.lang.runtime.SwitchBootstraps.typeSwitch(selector0$temp, index$1)) {
case 0:
Integer _;
if (!(true && ((Integer)obj) > 0)) {
index$1 = 1;
continue;
}
return 1;
case 1:
String _;
if (!((selector0$temp instanceof String || false) && (true && !((String)obj).isEmpty()))) {
index$1 = 2;
continue;
}
return 1;
}
-------------
Commit messages:
- 8314226: Series of colon-style fallthrough switch cases with guards compiled incorrectly
Changes: https://git.openjdk.org/jdk/pull/15532/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=15532&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8314226
Stats: 105 lines in 2 files changed: 96 ins; 0 del; 9 mod
Patch: https://git.openjdk.org/jdk/pull/15532.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/15532/head:pull/15532
PR: https://git.openjdk.org/jdk/pull/15532
More information about the compiler-dev
mailing list