On Wed, 14 Oct 2020 01:44:05 GMT, Mandy Chung <mch...@openjdk.org> wrote:

>> Changes requested by iklam (Reviewer).
>
>>  `@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

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

PR: https://git.openjdk.java.net/jdk/pull/364

Reply via email to