The internal invokers like invokeBasic are intended to link only for erased 
types (that is, Object is the only ref type).

Only invoke[Generic] and invokeExact can have the full range of signatures.

This should be error-checked in SystemDictionary::find_method_handle_invoke or 
a similar place.  I.e., if there is a bytecode generation bug, the JVM should 
throw a link error earlier.

— John

On Apr 2, 2012, at 7:45 AM, Christian Thalinger wrote:

> 
> On Mar 29, 2012, at 7:25 PM, Christian Thalinger wrote:
> 
>> 
>> On Mar 28, 2012, at 7:31 PM, John Rose wrote:
>> 
>>> On Mar 21, 2012, at 8:17 AM, Christian Thalinger wrote:
>>> 
>>>> John, I think there is a bug in MacroAssembler::check_method_handle_type 
>>>> for x86 (with meth-lazy):
>>> 
>>> That's correct.  Thanks for noticing it; I'll push a fix.  — John
>> 
>> The weird thing is that when I implement it correctly on SPARC I get:
>> 
>> MH _invokeBasic mh=0x00000007ab4a4fc0 saved_sp=0xffffffff7dcfb681 
>> args=0xffffffff7dcfbf40
>> MethodHandle:(Ltest/java/lang/invoke/MethodHandlesTest$HasFields;)Z : #( *** 
>> unrecognized MH type }
>> =============== DEBUG MESSAGE: _invokeBasic ================
>> 
>> But it worked with the broken version.
> 
> Today I tried this again and it also fails on x86 (seems I didn't update the 
> VM the last time).  I think the reason for this is that we also have to load 
> the basicType of mtype and compare these two:
> 
>    // fetch mtype.form.basicType                                              
>                                                              
>    load_heap_oop(Address(mtype_reg, 
> delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes,          
> temp3_reg)), temp2_reg);     
>    load_heap_oop(Address(temp2_reg, 
> delayed_value(java_lang_invoke_MethodTypeForm::basicType_offset_in_bytes, 
> temp3_reg)), temp2_reg);     
>    // fetch mh.type.form.basicType                                            
>                                                              
>    load_heap_oop(Address(temp_reg,  
> delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes,          
> temp3_reg)), temp_reg);      
>    load_heap_oop(Address(temp_reg,  
> delayed_value(java_lang_invoke_MethodTypeForm::basicType_offset_in_bytes, 
> temp3_reg)), temp_reg);      
>    cmp_and_brx_short(temp_reg, temp2_reg, Assembler::notEqual, Assembler::pn, 
> wrong_method_type);                                         
> 
> Correct?
> 
> -- Chris
> 
>> 
>> -- Chris
>> 
>>> _______________________________________________
>>> mlvm-dev mailing list
>>> mlvm-dev@openjdk.java.net
>>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>> 
>> _______________________________________________
>> mlvm-dev mailing list
>> mlvm-dev@openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
> 
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to