2010-02-15 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Mon, 15 Feb 2010 13:38:11 +0000 (13:38 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 15 Feb 2010 13:38:11 +0000 (13:38 -0000)
* object.c: Instead of using one vtable trampoline, allow the JIT to use one
vtable trampoline per vtable slot index. Not used yet.

svn path=/trunk/mono/; revision=151733

mono/metadata/ChangeLog
mono/metadata/object-internals.h
mono/metadata/object.c

index 33d5f07c932253d1da9b371385435bbb52daabc6..b49e8d6f846dea81e0312929d4f3628d3543e0de 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-15  Zoltan Varga  <vargaz@gmail.com>
+
+       * object.c: Instead of using one vtable trampoline, allow the JIT to use one
+       vtable trampoline per vtable slot index. Not used yet.
+
 2010-02-13 Gonzalo Paniagua Javier <gonzalo@novell.com>
 
        * icall-def.h:
index 5b1116838a29de2425898f81603894b2add9c78e..7169baccaeaee2c59ff6d5352bac7b95df7e83bb 100644 (file)
@@ -516,6 +516,7 @@ typedef struct {
        gpointer (*create_ftnptr) (MonoDomain *domain, gpointer addr);
        gpointer (*get_addr_from_ftnptr) (gpointer descr);
        char*    (*get_runtime_build_info) (void);
+       gpointer (*get_vtable_trampoline) (int slot_index);
 } MonoRuntimeCallbacks;
 
 /* used to free a dynamic method */
@@ -1409,9 +1410,6 @@ mono_install_imt_thunk_builder (MonoImtThunkBuilder func) MONO_INTERNAL;
 void
 mono_install_imt_trampoline (gpointer tramp) MONO_INTERNAL;
 
-void
-mono_install_vtable_trampoline (gpointer tramp) MONO_INTERNAL;
-
 void
 mono_vtable_build_imt_slot (MonoVTable* vtable, int imt_slot) MONO_INTERNAL;
 
index 73404efac6a8374db82cdd6766ca7604d917b7da..398a486850bf0b5c2cbcd75ae52a7e032cacc87b 100644 (file)
@@ -993,14 +993,6 @@ mono_install_imt_trampoline (gpointer tramp_code)
        imt_trampoline = tramp_code;
 }
 
-static gpointer vtable_trampoline = NULL;
-
-void
-mono_install_vtable_trampoline (gpointer tramp_code)
-{
-       vtable_trampoline = tramp_code;
-}
-
 #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
 #define mix(a,b,c) { \
        a -= c;  a ^= rot(c, 4);  c += b; \
@@ -1670,6 +1662,7 @@ mono_method_add_generic_virtual_invocation (MonoDomain *domain, MonoVTable *vtab
 
        if (++gvc->count == THUNK_THRESHOLD) {
                gpointer *old_thunk = *vtable_slot;
+               gpointer vtable_trampoline = callbacks.get_vtable_trampoline ? callbacks.get_vtable_trampoline ((gpointer*)vtable_slot - (gpointer*)vtable) : NULL;
 
                if ((gpointer)vtable_slot < (gpointer)vtable)
                        /* Force the rebuild of the thunk at the next call */
@@ -2001,10 +1994,10 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean
        }
 
        /* Initialize vtable */
-       if (vtable_trampoline) {
+       if (callbacks.get_vtable_trampoline) {
                // This also covers the AOT case
                for (i = 0; i < class->vtable_size; ++i) {
-                       vt->vtable [i] = vtable_trampoline;
+                       vt->vtable [i] = callbacks.get_vtable_trampoline (i);
                }
        } else {
                mono_class_setup_vtable (class);
@@ -2013,7 +2006,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean
                        MonoMethod *cm;
 
                        if ((cm = class->vtable [i]))
-                               vt->vtable [i] = vtable_trampoline? vtable_trampoline: arch_create_jit_trampoline (cm);
+                               vt->vtable [i] = arch_create_jit_trampoline (cm);
                }
        }