RFR (S) 8150180: String.value contents should be trusted

Peter Levart peter.levart at gmail.com
Fri Feb 19 14:36:36 UTC 2016



On 02/19/2016 03:07 PM, Aleksey Shipilev wrote:
> Hi Peter,
>
> On 02/19/2016 05:05 PM, Peter Levart wrote:
>> Your comment in String:
>>
>>   140      * @implNote Note this field is not {@link Stable}, because we
>> want
>>   141      * LATIN1 (0) coder to fold too. {@link Stable} would not allow
>> that,
>>   142      * as it reserves the default value as "not initialized" value.
>>   143      * Constant-folding this field is handled internally in VM.
>>   144      */
>>   145     private final byte coder;
>>
>>
>> Couldn't @Stable final instance fields constant-fold the default value
>> too in general? I mean can't it be assumed that the final field has been
>> set before JIT kicks in?
> We've been over this multiple times, actually. @Stable is not designed
> to fold default value -- it is a part of its design to ignore final
> fields with default values. Because @Stable is used largely for lazy
> initialization, and default value is the important marker in field's
> lifecycles.
>
> Cheers,
> -Aleksey
>

Yes, I understand the general principle of @Stable design and the role 
of default value in @Stable fields. But given that:

- instance final fields must be set in the constructor
- the reference to the constructed object can not be assigned to a 
static final field until the constructor is finished

...the compiler could assume that even the default value is the final 
field's stable value, couldn't it?

I understand that these are Java language constraints and not 
necessarily bytecode constraints. Also, while a static final field can 
only be assigned to reference an instance after the instance is fully 
constructed, this does not hold for @Stable fields in general, for example:

class Foo {
     @Stable static Foo foo;

     @Stable final int coder;

     Foo() {
         foo = this;
         // outside code could already access Foo.foo.coder and constant 
fold it to 0
         coder = 1;
     }
}

...given that @Stable is an internal annotation, such usages could be 
advised against. It is generally bad practice to publish an object from 
within its constructor anyway.

But never mind. This is just me thinking loud.

Regards, Peter



More information about the hotspot-compiler-dev mailing list