Generated parameter names for -parameters (JEP118)

Alex Buckley alex.buckley at oracle.com
Wed May 29 15:17:46 PDT 2013


I would expect the MethodParameters attribute to have a parameters_count 
of 2, which it does. Regarding the entries in the parameters array:

- The first entry should be ACC_MANDATED, since per JLS 8.8.9 it is 
implicitly declared to represent the immediately enclosing instance.

- The second entry should be ACC_SYNTHETIC, since per JLS 13.1 a second 
parameter is neither explicitly nor implicitly declared for the ctor of 
the anon.class.

(Referring above to http://cr.openjdk.java.net/~abuckley/8misc.pdf)

What JDK8 build are you using? I thought the MethodParameters attribute 
was more prettily printed than what's below.

Alex

On 5/29/2013 2:10 PM, Jesper Steen Møller wrote:
> Hej Compiler-dev
>
> I'm investigating the support for JEP118.
> Is this a bug:
>
> $ cat ParameterNames.java
> import java.util.concurrent.Callable;
>
> public class ParameterNames {
> 	
> 	public Callable<String> makeInner(final String message) {
> 		return new Callable<String>()  {
> 			public String call() throws Exception {
> 				return message;
> 			}
> 		};
> 	}
> }
> $ javac -parameters ParameterNames.java
> $ javap -c -s -p -l -v ParameterNames\$1.class
> Classfile /Users/jesper/Eclipse/JDT-Java8-workspace/Zest/src/ParameterNames$1.class
>    Last modified 29-05-2013; size 869 bytes
>    MD5 checksum 014ebef5db6af83f23b19b1cef7b2b44
>    Compiled from "ParameterNames.java"
> class ParameterNames$1 extends java.lang.Object implements java.util.concurrent.Callable<java.lang.String>
>    Signature: #23                          // Ljava/lang/Object;Ljava/util/concurrent/Callable<Ljava/lang/String;>;
>    SourceFile: "ParameterNames.java"
>    EnclosingMethod: #27.#28                // ParameterNames.makeInner
>    InnerClasses:
>         #5; //class ParameterNames$1
>    minor version: 0
>    major version: 52
>    flags: ACC_SUPER
> Constant pool:
>     #1 = Fieldref           #5.#29         //  ParameterNames$1.this$0:LParameterNames;
>     #2 = Fieldref           #5.#30         //  ParameterNames$1.val$message:Ljava/lang/String;
>     #3 = Methodref          #6.#31         //  java/lang/Object."<init>":()V
>     #4 = Methodref          #5.#32         //  ParameterNames$1.call:()Ljava/lang/String;
>     #5 = Class              #33            //  ParameterNames$1
>     #6 = Class              #35            //  java/lang/Object
>     #7 = Class              #36            //  java/util/concurrent/Callable
>     #8 = Utf8               val$message
>     #9 = Utf8               Ljava/lang/String;
>    #10 = Utf8               this$0
>    #11 = Utf8               LParameterNames;
>    #12 = Utf8               <init>
>    #13 = Utf8               (LParameterNames;Ljava/lang/String;)V
>    #14 = Utf8               Code
>    #15 = Utf8               LineNumberTable
>    #16 = Utf8               MethodParameters
>    #17 = Utf8               call
>    #18 = Utf8               ()Ljava/lang/String;
>    #19 = Utf8               Exceptions
>    #20 = Class              #37            //  java/lang/Exception
>    #21 = Utf8               ()Ljava/lang/Object;
>    #22 = Utf8               Signature
>    #23 = Utf8               Ljava/lang/Object;Ljava/util/concurrent/Callable<Ljava/lang/String;>;
>    #24 = Utf8               SourceFile
>    #25 = Utf8               ParameterNames.java
>    #26 = Utf8               EnclosingMethod
>    #27 = Class              #38            //  ParameterNames
>    #28 = NameAndType        #39:#40        //  makeInner:(Ljava/lang/String;)Ljava/util/concurrent/Callable;
>    #29 = NameAndType        #10:#11        //  this$0:LParameterNames;
>    #30 = NameAndType        #8:#9          //  val$message:Ljava/lang/String;
>    #31 = NameAndType        #12:#41        //  "<init>":()V
>    #32 = NameAndType        #17:#18        //  call:()Ljava/lang/String;
>    #33 = Utf8               ParameterNames$1
>    #34 = Utf8               InnerClasses
>    #35 = Utf8               java/lang/Object
>    #36 = Utf8               java/util/concurrent/Callable
>    #37 = Utf8               java/lang/Exception
>    #38 = Utf8               ParameterNames
>    #39 = Utf8               makeInner
>    #40 = Utf8               (Ljava/lang/String;)Ljava/util/concurrent/Callable;
>    #41 = Utf8               ()V
> {
>    final java.lang.String val$message;
>      descriptor: Ljava/lang/String;
>      flags: ACC_FINAL, ACC_SYNTHETIC
>
>
>    final ParameterNames this$0;
>      descriptor: LParameterNames;
>      flags: ACC_FINAL, ACC_SYNTHETIC
>
>
>    ParameterNames$1(ParameterNames, java.lang.String);
>      descriptor: (LParameterNames;Ljava/lang/String;)V
>      flags:
>      LineNumberTable:
>        line 6: 0
>      Code:
>        stack=2, locals=3, args_size=3
>           0: aload_0
>           1: aload_1
>           2: putfield      #1                  // Field this$0:LParameterNames;
>           5: aload_0
>           6: aload_2
>           7: putfield      #2                  // Field val$message:Ljava/lang/String;
>          10: aload_0
>          11: invokespecial #3                  // Method java/lang/Object."<init>":()V
>          14: return
>        LineNumberTable:
>          line 6: 0
>        MethodParameters: length = 0x5
>         02 00 0A 80 10
>         ^^^^^^^^^^^^^^
>
> Seems like an entry is missing from the table??
>
> Kind regards,
> Jesper
>


More information about the compiler-dev mailing list