Review request: update javac to properly output mandated parameters in MethodParameters attributes

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Feb 7 14:50:54 PST 2013


On 07/02/13 22:48, Maurizio Cimadamore wrote:
> On 07/02/13 22:45, Eric McCorkle wrote:
>> Okay this will indeed necessitate some modifications.
>>
>> VarSymbols only seem to get created for the formal (explicitly declared)
>> parameters.  I had assumed (incorrectly, it seems) that SYNTHESIZED
>> parameters also got VarSymbols, and the extra parameters in externalType
>> represent MANDATED parameters.
>>
>> It seems the thing to do is to mark all the extra parameters
>> SYNTHESIZED, *unless* they match certain cases, in which case they get
>> marked MANDATED.
>>
>> If there is a better way to do this in javac, then please let me know.
> I can't think of another way other than chasing down the cases called 
> out in the spec and marking them appropriately. After all, the 
> distinction between ACC_SYNTHETIC and ACC_MANDATED is brand new, so it 
> has been normal for the compiler to mark all extra stuff (not in the 
> spec) as SYNTHETIC.
Also, SYNTHETIC parameters also have VarSymbols - only that symbol is 
not referred to from the method symbol. But you can access to those 
symbol from the method tree.

Maurizio
>
> Maurizio
>>
>> On 02/07/13 17: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 ACC_SYNTHETIC.
>>>
>>>> *) 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.
>>>
>>>> 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
>




More information about the compiler-dev mailing list