RFR: 8314226: Series of colon-style fallthrough switch cases with guards compiled incorrectly [v2]
Maurizio Cimadamore
mcimadamore at openjdk.org
Fri Sep 1 12:58:41 UTC 2023
On Fri, 1 Sep 2023 12:24:40 GMT, Aggelos Biboudis <abimpoudis at openjdk.org> wrote:
>> 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;
>> }
>
> Aggelos Biboudis has updated the pull request incrementally with one additional commit since the last revision:
>
> Address review
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java line 578:
> 576: }
> 577:
> 578: boolean hasGuard = c.guard != null;
Can this declaration occur before the enclosing `if` ?
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java line 590:
> 588: continueSwitch.target = tree;
> 589:
> 590: if (previousC != null && hasGuard && previousCompletesNormally) {
What happens if there are three of them?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/15532#discussion_r1312992491
PR Review Comment: https://git.openjdk.org/jdk/pull/15532#discussion_r1312992174
More information about the compiler-dev
mailing list