Review request: update javac to properly output mandated parameters in MethodParameters attributes (original) (raw)
Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Feb 7 14:17:16 PST 2013
- Previous message: Review request: update javac to properly output mandated parameters in MethodParameters attributes
- Next message: Review request: update javac to properly output mandated parameters in MethodParameters attributes
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 07/02/13 22:06, Alex Buckley wrote:
On 2/7/2013 12:29 PM, maurizio cimadamore wrote:
It would seem that the spec is not defining (on top of my head - there are probably others):
*) (effectively) final variables passed in to inner classes (javac only does that for reference-types as others are just constants that can be produced on the stack at will) Right. The JLS does not say that those ctor parameters are implicitly declared. javac should mark them with ACCSYNTHETIC. So that we are clear - javac is already marking all this stuff I'm saying as ACC_SYNTHETIC. But Eric's code is implicitly tagging it as ACC_MANDATED too, which is where I think the problem lies. *) I believe javac's generated enum constructor has an additional parameter accepting the ordinal We need to be clear what we're talking abut here. For an enum type, JLS 8.9.2 has always implicitly declared a default ctor with no formal parameters - but that ctor is required to be private, so no other compiler can emit code which uses it. I think you're talking not about the default ctor, but about an explicitly-declared ctor to which javac adds a parameter. In this case, is code from another compiler expected to use the parameter to construct the enum instance correctly? If yes, then the ordinal parameter should be implicitly declared. Please let me know so I can update the JLS. Here you are sir:
enum Test { FOO { }, BAR { }; }
javap -p Test
Compiled from "Test.java" class Test extends java.lang.Enum { public static final Test FOO; public static final Test BAR; public static Test[] values(); public static Test valueOf(java.lang.String); Test(java.lang.String, int, Test$1); static {}; }
And also,
enum Test { Test() { } }
that generates:
Compiled from "Test.java" class Test extends java.lang.Enum { public static final Test Test; public static Test[] values(); public static Test valueOf(java.lang.String); Test(java.lang.String, int, Test$1); static {}; }
Maurizio
In any case, the implementation problem remains: it doesn't distinguish between impl-only parameters and 'implicitly declared' ones. It just takes all parameters that do not have a correspondent in the source code and put them in the same place. I hope Eric is out there somewhere :-) Alex
-------------- next part -------------- An HTML attachment was scrubbed... URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20130207/e4ea5989/attachment.html
- Previous message: Review request: update javac to properly output mandated parameters in MethodParameters attributes
- Next message: Review request: update javac to properly output mandated parameters in MethodParameters attributes
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]