+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:
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 */
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;
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; \
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 */
}
/* 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);
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);
}
}