Anonymous value classes
Remi Forax
forax at univ-mlv.fr
Fri Jun 3 17:39:44 UTC 2022
> From: "Brian Goetz" <brian.goetz at oracle.com>
> To: "daniel smith" <daniel.smith at oracle.com>, "valhalla-spec-experts"
> <valhalla-spec-experts at openjdk.java.net>
> Sent: Friday, June 3, 2022 6:21:26 PM
> Subject: Re: Anonymous value classes
> There is no chance to get any calling-convention optimization here, since the
> concrete class name will not show up in any method descriptor (or preload
> attribute). There is no chance to get any heap flattening here, since the
> concrete class name will not show up in any field descriptor or `newarray`
> operand.
Nope, anonymous classes are anonymous only for Java not in the bytecode, by example
var box = new Object() { };
Supplier<?> supplier = () -> box;
var list = Arrays.asList(box);
is translated to
Code:
0: new #7 // class AnonymousClassNameLeaking$1
3: dup
4: invokespecial #9 // Method AnonymousClassNameLeaking$1."<init>":()V
7: astore_1
8: aload_1
9: invokedynamic #10, 0 // InvokeDynamic #0:get:(LAnonymousClassNameLeaking$1;)Ljava/util/function/Supplier;
14: astore_2
15: iconst_1
16: anewarray #7 // class AnonymousClassNameLeaking$1
19: dup
20: iconst_0
21: aload_1
22: aastore
23: invokestatic #14 // Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
26: astore_3
Here, the anonymous class name appears as parameter of invokedynamic, at runtime the field (box is captured) of the lambda proxy is also typed LAnonymousClassNameLeaking$1; and any varargs will create an array of the anonymous class.
Rémi
> On 6/3/2022 12:15 PM, Dan Smith wrote:
>> Our javac prototype has long included support for a 'value' keyword after 'new'
>> to indicate that an anonymous class is a value class:
>> Runnable r = new value Runnable() {
>> public void run() { x.foo(); }
>> };
>> Is this something we'd like to preserve as a language feature?
>> Arguments for:
>> - Allows the semantics of "I don't need identity" to be conveyed (often true for
>> anonymous classes).
>> - Gives the JVM more information for optimization. If we don't need a heap
>> object, evaluating the expression may be a no-op.
>> Arguments against:
>> - Opens a Pandora's box of syntax: what other keywords can go there? 'identity'?
>> 'primitive'? 'static'? 'record'?
>> - Because there's no named type, there are significantly fewer opportunities for
>> optimization—you're probably going to end up with a heap object anyway.
>> - Value classes are primarily focused on simple data-carrying use cases, but any
>> data being carried by an anonymous class is usually incidental. A new language
>> feature would draw a lot of attention to this out-of-the-mainstream use case.
>> - In the simplest cases, you can use a lambda instead, and there the API
>> implementation has freedom to implement lambdas with value classes if it turns
>> out to be useful.
>> - The workaround—declare a local class instead—is reasonably straightforward for
>> the scenarios where there's a real performance bottleneck that 'value' can help
>> with.
More information about the valhalla-spec-observers
mailing list