RFR: 8247666: Support Lambda proxy classes in static CDS archive [v5]
Mandy Chung
mchung at openjdk.java.net
Fri Oct 16 21:28:10 UTC 2020
On Wed, 14 Oct 2020 16:24:47 GMT, Calvin Cheung <ccheung at openjdk.org> wrote:
>>> `@lambda-proxy: LambHello run ()Ljava/lang/Runnable; ()V 6 LambHello lambda$main$0 ()V ()V`
>>
>> Can you explain the format?
>
> `@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
-------------
PR: https://git.openjdk.java.net/jdk/pull/364
More information about the core-libs-dev
mailing list