RFR: 8303374: Implement JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview) [v50]

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Jan 25 10:25:38 UTC 2024


On Wed, 24 Jan 2024 23:50:51 GMT, Aggelos Biboudis <abimpoudis at openjdk.org> wrote:

>> This is the proposed patch for Primitive types in patterns, instanceof, and switch (Preview).
>> 
>> Draft spec here: https://cr.openjdk.org/~abimpoudis/instanceof/latest/
>
> Aggelos Biboudis has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Update year

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

> 402:      */
> 403:     @SuppressWarnings("removal")
> 404:     private static MethodHandle generateInnerClass(MethodHandles.Lookup caller, Class<?> selectorType, Object[] labels) {

I think the name "labels" for the array here is unfortunate, because the code generation also contains "labels" which mean really "jump targets". Maybe `constants` or `labelConstants` or `caseConstants` ?

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

> 515:                                 }
> 516:                             } else {
> 517:                                 Optional<ClassDesc> classLabelConstableOpt = classLabel.describeConstable();

One comment (for future work): we have a bunch of constants that are known by the time we generate this code (at runtime). But we're still serializing them into the constant pool, and then deserialize them at runtime, which is needless work. Hidden classes support injection of already resolved constants into the constant pool - see:

https://download.java.net/java/early_access/jdk22/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#defineHiddenClassWithClassData(byte%5B%5D,java.lang.Object,boolean,java.lang.invoke.MethodHandles.Lookup.ClassOption...)

Basically, the idea is that you can pass the entire `labels` array as a "constant data" which is stored in the constant pool as a pre-resolved constant. You can then load elements from this array using ready-made method handles:

https://download.java.net/java/early_access/jdk22/docs/api/java.base/java/lang/invoke/MethodHandles.html#classDataAt(java.lang.invoke.MethodHandles.Lookup,java.lang.String,java.lang.Class,int)

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

PR Review Comment: https://git.openjdk.org/jdk/pull/15638#discussion_r1466151276
PR Review Comment: https://git.openjdk.org/jdk/pull/15638#discussion_r1466149901


More information about the core-libs-dev mailing list