[9] RFR (S): 8157181: Compilers accept modification of final fields outside initializer methods

David Holmes david.holmes at oracle.com
Sat Jun 11 00:26:52 UTC 2016


<adding back hotspot-compiler-dev at openjdk.java.net>

Hi Coleen,

If I may ...

On 11/06/2016 5:43 AM, Coleen Phillimore wrote:
>
> Hi,
>
> I'm late to the thread, which is good because it's better that this
> check is done in the rewriter, than in InstanceKlass.
>
> But I'm fuzzy on why this wasn't checked in the verifier, and what the
> purpose of the has_initialized_final_update (which means a non <init>
> method has updated a final field, which is a verify error, right?

Can't comment on the verifier part.

The check is only currently enforced for classfile versions for JDK9+

> Also, have you run the JCK tests?
>
> Why have a global flag if it's an error?

We are enforcing a rule that has not been enforced before. To deal with 
compatibility issues we have provided, as is customary for non-security 
issues, a flag that allows the enforcement to be turned off, if it 
causes a problem. (Though that is more likely needed for JDK 7/8 
compatibility than for 9).

David

> Thanks,
> Coleen
>
>
>
> On 6/10/16 1:40 PM, Zoltán Majó wrote:
>> Hi Vladimir,
>>
>>
>> On 06/10/2016 06:05 PM, Vladimir Ivanov wrote:
>>>
>>>> Please note an additional small change in rewriter.cpp:
>>>>
>>>> +if (!reverse) {
>>>> // Check if any final field of the class given as parameter is modified
>>>> // outside of initializer methods of the class. Fields that are
>>>> modified
>>>>    ...
>>>> +}
>>>>
>>>> It's sufficient to check fields during rewriting (i.e., we're coming
>>>> from Rewriter::rewrite_bytecodes()). We do not need to do the checks if
>>>> the class has already been rewritten but we're reversing changes due to
>>>> some failure that appeared during rewriting (in that case scan_method()
>>>> is called from Rewriter::restore_bytecodes()).
>>>
>>> Ok.
>>>
>>>> Here is the updated webrev:
>>>> http://cr.openjdk.java.net/~zmajo/8157181/webrev.11/
>>>
>>> Looks good.
>>>
>>> src/share/vm/runtime/globals.hpp
>>>
>>> +          "for classfile version >= 51")
>>>
>>> s/51/53/ (no need to send new webrev).
>>
>> OK, I've corrected the code in-situ (in webrev.11). I also have the
>> JPRT results now, all tests pass.
>>
>> Thank you!
>>
>> Best regards,
>>
>>
>> Zoltan
>>
>>
>>
>>>
>>> Best regards,
>>> Vladimir Ivanov
>>
>


More information about the hotspot-dev mailing list