[jdk17] RFR: 8268766: Desugaring of pattern matching enum switch should be improved [v8]

Jan Lahoda jlahoda at openjdk.java.net
Wed Jul 7 12:36:52 UTC 2021


On Wed, 7 Jul 2021 12:10:16 GMT, Jan Lahoda <jlahoda at openjdk.org> wrote:

>> Currently, an enum switch with patterns is desugared in a very non-standard, and potentially slow, way. It would be better to use the standard `typeSwitch` bootstrap to classify the enum constants. The bootstrap needs to accept enum constants as labels in order to allow this. A complication is that if an enum constant is missing, that is not an incompatible change for the switch, and the switch should simply work as if the case for the missing constant didn't exist. So, the proposed solution is to have a new bootstrap `enumSwitch` that accepts `String`s in place of the enum constants, and will internally convert them to the appropriate enum constants, and then it will find the proper case similarly to `typeSwitch`.
>> 
>> How does this look?
>
> Jan Lahoda has updated the pull request incrementally with one additional commit since the last revision:
> 
>   If the pattern type is a supertype of the selector type, use selector type rather than the pattern type when constructing the bootstrap method parameters.

There turned out to be a bug in the patch: considering a switch over enum like:

    E e = ...;
    switch (e) {
        case Object o -> {}
    }


(Or, even worse, `case Object o && <guard> ->`), the patch will generate `Object.class` as a static parameter to the `enumSwitch` bootstrap method. But the method (rightfully) requires the enum class as the static parameter. https://github.com/openjdk/jdk17/pull/81/commits/d970402e969d76a017cdfdcbc6556f6d9a9f3bfa tweaks the code generation to produce `E.class` instead of `Object.class`.

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

PR: https://git.openjdk.java.net/jdk17/pull/81


More information about the core-libs-dev mailing list