On Sep 26, 2013, at 11:50 AM, Christian Thalinger 
<christian.thalin...@oracle.com> wrote:

> 
> On Sep 26, 2013, at 1:22 AM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
>> On 09/26/2013 01:27 AM, Christian Thalinger wrote:
>>> http://cr.openjdk.java.net/~twisti/8019192/webrev/
>>> 
>>> 8019192: StringIndexOutOfBoundsException: in Class.getSimpleName()
>>> Reviewed-by:
>>> 
>>> This is a race in MemberName's name and type getters.
>>> 
>>> MemberName's type field is of type Object so it can hold different objects 
>>> when it gets filled in from the VM.  These types include String and 
>>> Object[].  On the first invocation the current type if it's not MethodType 
>>> gets converted to a MethodType.
>>> 
>>> There is a tiny window where some instanceof check have already been done 
>>> on one thread and then another thread stores a MethodType.  The following 
>>> checkcast then fails.
>>> 
>>> The fix is to make name and type volatile and do the conversion in a 
>>> synchronized block.  This is okay because it's only done once.
>>> 
>>> src/share/classes/java/lang/invoke/MemberName.java
>>> 
>> 
>> Hi Christian,
>> 
>> Wouldn't it be cleaner that instead of just casting and catching 
>> ClassCastException, the volatile field 'type' was 1st copied to a local 
>> variable and then an instanceof check + casting and returning performed on 
>> the local variable. This would avoid throwing ClassCastException even if it 
>> is performed only once per MemberName…
> 
> Not sure it would be cleaner; depends on the definition of "cleaner".  I had 
> similar code as you describe before but I changed it to catch the exception.  
> If people have a strong opinion here I can change it back.

Here are the two different versions:

http://cr.openjdk.java.net/~twisti/8019192/webrev.00/
http://cr.openjdk.java.net/~twisti/8019192/webrev.01/

> 
>> 
>> Regards, Peter
>> 
> 

Reply via email to