2005-02-20 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / tramp-sparc.c
index a68d48296603759a723fa677ec0fe53f61b16e61..a1a00ff5778f56693fcf87717e42faef0d00d0da 100644 (file)
@@ -50,10 +50,10 @@ get_unbox_trampoline (MonoMethod *m, gpointer addr)
        guint8 *code, *start;
        int this_pos = 4, reg;
 
-       if (!m->signature->ret->byref && MONO_TYPE_ISSTRUCT (m->signature->ret))
+       if (!mono_method_signature (m)->ret->byref && MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret))
                this_pos = 8;
            
-       start = code = g_malloc (36);
+       start = code = mono_global_codeman_reserve (36);
 
        /* This executes in the context of the caller, hence o0 */
        sparc_add_imm (code, 0, sparc_o0, sizeof (MonoObject), sparc_o0);
@@ -98,12 +98,12 @@ sparc_magic_trampoline (MonoMethod *m, guint32 *code, guint32 *fp)
         * needed.
         */
        if (mono_sparc_is_virtual_call (code)) {
-               if (m->klass->valuetype)
-                       addr = get_unbox_trampoline (m, addr);
-
                /* Compute address of vtable slot */
                vtable_slot = mono_sparc_get_vcall_slot_addr (code, fp);
-               *vtable_slot = addr;
+               if (m->klass->valuetype && !mono_aot_is_got_entry (code, vtable_slot))
+                       addr = get_unbox_trampoline (m, addr);
+               if (mono_aot_is_got_entry (code, vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))
+                       *vtable_slot = addr;
        }
        else {
                /* Patch calling code */
@@ -113,8 +113,7 @@ sparc_magic_trampoline (MonoMethod *m, guint32 *code, guint32 *fp)
                        MonoJitInfo *target_ji = 
                                mono_jit_info_table_find (mono_domain_get (), addr);
 
-                       /* The first part of the condition means an icall without a wrapper */
-                       if ((!target_ji && m->addr) || mono_method_same_domain (ji, target_ji)) {
+                       if (mono_method_same_domain (ji, target_ji)) {
                                sparc_call_simple (code, (guint8*)addr - (guint8*)code);
                        }
                }
@@ -157,7 +156,7 @@ create_trampoline_code (MonoTrampolineType tramp_type)
                break;
        }
 
-       code = buf = g_malloc (512);
+       code = buf = mono_global_codeman_reserve (512);
 
        sparc_save_imm (code, sparc_sp, -608, sparc_sp);
 
@@ -377,7 +376,7 @@ mono_debugger_create_notification_function (gpointer *notification_address)
 {
        guint8 *ptr, *buf;
 
-       ptr = buf = g_malloc0 (16);
+       ptr = buf = mono_global_codeman_reserve (16);
        if (notification_address)
                *notification_address = buf;