[Mono-devel-list] Trampolines...

Willibald Krenn Willibald.Krenn at gmx.at
Wed Feb 23 07:26:34 EST 2005


Zoltan Varga schrieb:
> It is possible to call the same virtual method with boxed and
> non-boxed arguments,
> like:
> 
> SomeStruct s = new SomeStruct ();
> s.ToString ();
> object o = s;
> o.ToString ();

I understand. But how about this idea:
For virtual methods of value types, we could 'inline' the unbox 
trampoline in the method like

addq 0x10, %r_this	;unbox start
pushq %rbp		;normal start
movq  %rsp, %rbp
....

Normally the JIT gives the addr of pushq back as starting address. In 
the magic service routine ("get unbox trampoline") we could subtract the 
size of the addq opcode and take that as method starting address. While 
that would make virtual methods of value types still a special case (2 
entry points, so while patching one has to make sure that patching 
starts at the normal start), it would be much easier to handle and we 
would get rid of another jmp indirection...

The arch part of mini will probably need a few new 'functions' (macros):
int mono_arch_get_unbox_size ()
gpointer mono_arch_get_normal_start (gpointer code)

AFAIK the addq would be 4 bytes on AMD64 - instead of ~16 bytes (at 
least 20 bytes allocated) for the unbox tramp. Yes, not every virtual 
method of value types will have an unbox trampoline, but for one 
trampoline we get at least 4 (I assume 6 because of (20+7) & ~7) method 
inlined unbox operations plus we save the jumps.

BTW: Alternatively we could fake-box the this pointer before any call to 
a virtual value type method..

Willi




More information about the Mono-devel-list mailing list