RFR: 8247666: Support Lambda proxy classes in static CDS archive [v5]
Calvin Cheung
ccheung at openjdk.java.net
Fri Oct 16 21:36:16 UTC 2020
On Fri, 16 Oct 2020 21:25:04 GMT, Mandy Chung <mchung at openjdk.org> wrote:
>> `@lambda-proxy LambHello run ()Ljava/lang/Runnable; ()V REF_invokeStatic LambHello lambda$main$0 ()V ()V`
>> means
>> `@lambda-proxy <classname> <intf-method-name> <intf-method-sig> <bsm-arg0> <bsm-arg1a> <bsm-arg1b> <bsm-arg1c>
>> <bsm-arg1d> <bsm-arg2>`
>> It is a symbolic representation of a invoke dynamic constant pool entry.
>> public class LambHello {
>> public static void main(String[] args) {
>> doit(() -> {
>> System.out.println("Hello from Lambda");
>> });
>> }
>> static void doit(Runnable t) {
>> t.run();
>> }
>> }
>>
>> An invoke dynamic constant pool of the above program is:
>> ` - 7 : InvokeDynamic : bootstrap_method_index=43 name_and_type_index=8 arguments={50, 51, 50}`
>> Other constant pool entries related to the above are:
>> - 8 : NameAndType : name_index=9 signature_index=10
>> - 9 : Utf8 : 'run'
>> - 10 : Utf8 : '()Ljava/lang/Runnable;'
>>
>> - 50 : MethodType : signature_index=6
>> - 51 : MethodHandle : ref_kind=6 ref_index=52
>> - 52 : Method : klass_index=12 name_and_type_index=53
>> - 53 : NameAndType : name_index=39 signature_index=6
>>
>> - 6 : Utf8 : '()V'
>> - 12 : Class : 'LambHello' {0x0000000800c10040}
>> - 39 : Utf8 : 'lambda$main$0'
>> The info included in the class list are:
>> <classname> = LambHello
>> <intf-method-name> = run
>> <intf-method-sig> = ()Ljava/lang/Runnable;
>> <bsm-arg0> = ()V
>> <bsm-arg1a> = REF_invokeStatic
>> <bsm-arg1b> = LambHello
>> <bsm-arg1c> = lambda$main$0
>> <bsm-arg1d> = ()V
>> <bsm-arg2> = ()V
>
> Since the class list file is not intended for users to edit/modify but rather a configuration file given
> when -Xshare:dump is used, the format of `@lambda-proxy` entry is internal implementation details and so it's fine.
> BTW: for the method handle reference kind, does the entry have the value (e.g. 6) or the name ("REF_invokeStatic")?
> I see both formats are described in your different replies.
>> @lambda-proxy: LambHello run ()Ljava/lang/Runnable; ()V 6 LambHello lambda$main$0 ()V ()V
> or
>> @lambda-proxy LambHello run ()Ljava/lang/Runnable; ()V REF_invokeStatic LambHello lambda$main$0 ()V ()V
For the reference kind, the first format (with number '6') will be stored in the classlist.
-------------
PR: https://git.openjdk.java.net/jdk/pull/364
More information about the core-libs-dev
mailing list