experiences with prototype

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Feb 3 21:34:19 UTC 2015


On 03/02/15 21:05, Peter Levart wrote:
> Hi Maurizio,
>
> I see. I thought this could be a nice idiom for boxing, since the 
> following:
>
> (Object) 42
>
> ...is legal and results in an Integer object at runtime.
I'm not saying this will never work - actually the compiler is currently 
accepting this kind of idioms, but the specializer does nothing with it, 
so you'll get runtime errors.
>
> But I don't know if a checkcast is actually inserted for (Object). 
> Could javac redundantly do it in case casting to Object is from 
> expression of <any> type and also equip checkcast with BMA indicating 
> the type of expression so that specialization could replace it with 
> boxing code?
That will be the way forward, yes

Maurizio
>
> Regards, Peter
>
>
> On 02/03/2015 08:09 PM, Maurizio Cimadamore wrote:
>>
>> On 03/02/15 18:46, Maurizio Cimadamore wrote:
>>> I will also investigate on the crash you are getting... 
>> Hi Peter,
>> the crash is coming from this code in AbstractCollection (see code in 
>> bold):
>>
>>     public boolean contains(Object o) {
>>         __WhereVal(E) {
>>             Iterator<E> it = iterator();
>>             if (o == null) {
>>                 return false;
>>             } else {
>>                 while (it.hasNext())
>> *if (o.equals((Object) it.next()))*
>>                         return true;
>>             }
>>             return false;
>>         }
>>         __WhereRef(E) {
>>             Iterator<E> it = iterator();
>>             if (o == null) {
>>                 while (it.hasNext())
>>                     if (it.next() == null)
>>                         return true;
>>             } else {
>>                 while (it.hasNext())
>>                     if (o.equals(it.next()))
>>                         return true;
>>             }
>>             return false;
>>         }
>>     }
>>
>> I believe that, apart from the obvious javac bug, the code has an 
>> issue, as it.next() is supposed to return a value there, but you are 
>> casting to Object?
>>
>> For the records - a simpler test case for the bug is this:
>>
>> class Foo<any E> {
>>     E e;
>>     E get() { return e; }
>>
>>     void test() {
>>         __WhereVal(E) {
>>             Object o = (Object)get();
>>         }
>>     }
>> }
>>
>> Maurizio
>




More information about the valhalla-dev mailing list