(original) (raw)
On 07/02/13 22:06, Alex Buckley wrote:
On 2/7/2013 12:29 PM, maurizio cimadamore wrote: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.
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 ACC\_SYNTHETIC.
Here you are sir:
\*) 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.
enum Test {
FOO { },
BAR { };
}
javap -p Test
Compiled from "Test.java"
class Test extends java.lang.Enum<Test> {
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<Test> {
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