Integrated: 8314226: Series of colon-style fallthrough switch cases with guards compiled incorrectly

Aggelos Biboudis abimpoudis at openjdk.org
Wed Sep 13 15:12:57 UTC 2023


On Fri, 1 Sep 2023 10:02:20 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;
> }

This pull request has now been integrated.

Changeset: 3b0a6d2a
Author:    Aggelos Biboudis <abimpoudis at openjdk.org>
Committer: Vicente Romero <vromero at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/3b0a6d2a6842962218b8cebcd9c0672cb4ee6720
Stats:     218 lines in 2 files changed: 217 ins; 0 del; 1 mod

8314226: Series of colon-style fallthrough switch cases with guards compiled incorrectly

Reviewed-by: mcimadamore, vromero

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

PR: https://git.openjdk.org/jdk/pull/15532


More information about the compiler-dev mailing list