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

Rémi Forax forax at openjdk.java.net
Thu Jun 17 21:59:31 UTC 2021


On Thu, 17 Jun 2021 18:33:56 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 `enumConstant` that converts the enum constant name to the enum constant, returning `null`, if the constant does not exist. It delegates to `ConstantBootstraps.enumConstant` to do the actual conversion. And `typeSwitch` accepts `null`s as padding.
>> 
>> How does this look?
>
> Jan Lahoda has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Creating a new bootstrap method for (pattern matching) enum switches, as suggested.

src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java line 222:

> 220:                                       String invocationName,
> 221:                                       MethodType invocationType,
> 222:                                       Object... labels) throws Throwable {

Is it not better to take a Class and a String... as separated parameters instead of taking Object... and doing the conversion to a Class and an array of String later in Java

src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java line 238:

> 236:         MethodHandle target =
> 237:                 MethodHandles.insertArguments(DO_ENUM_SWITCH, 2, (Object) labels);
> 238:         target = MethodHandles.explicitCastArguments(target, invocationType);

why explicitCast is used here instead of the classical cast asType() ?

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

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


More information about the core-libs-dev mailing list