[Mono-devel-list] Question CEE_CALLVIRT

Paolo Molaro lupus at ximian.com
Wed Dec 15 09:18:05 EST 2004


On 12/15/04 Christoph Stiedl wrote:
> I am currently trying to understand how callvirt  
> works. I figured out that the CEE_CALLVIRT instruction 
> is somehow mapped to OP_*CALL_MEMBASE finally.   
>  
> Could anybody tell me where to find the  
> place in the code where this mapping happens? 
>  
> I "grepped" for CEE_CALLVIRT and didn't find any 
> #define statemtent for it. Where is it coming from? 

CEE_CALLVIRT is the value corresponding to the IL callvirt opcode.
They are generated from the file mono/cil/opcode.def which is
included inside an enum in mini.h.
We create additional call opcodes to differentiate between
different return types, so if the method returns void we use
OP_VOIDCALL*, if it returns a double we use OP_FCALL etc.
We reuse the CEE_CALL values to mean: it returns a register-sized 
int/ptr.
The function mini_emit_virtual_call() in mini/inssel.brg is
used to emit the low-level opcode (virtual and interface calls
load the function pointer to call from a vtable, which is
a base register + offset load, so we use the OP_*CALL_MEMBASE
to represent it).

lupus

-- 
-----------------------------------------------------------------
lupus at debian.org                                     debian/rules
lupus at ximian.com                             Monkeys do it better



More information about the Mono-devel-list mailing list