2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / arch / x86 / tramp.c
index dab0d78ac890f4ead5ff273cb8752f91736cdbe6..fab5a55325fa8ff4d140b51a8959f44f1ab714ad 100644 (file)
@@ -32,7 +32,7 @@
 #define ARG_SIZE       sizeof (stackval)
 
 MonoPIFunc
-mono_create_trampoline (MonoMethodSignature *sig, gboolean string_ctor)
+mono_arch_create_trampoline (MonoMethodSignature *sig, gboolean string_ctor)
 {
        unsigned char *p, *code_buffer;
        guint32 stack_size = 0, code_size = 50;
@@ -201,6 +201,8 @@ enum_marshal:
                                        x86_mov_reg_imm (p, X86_EAX, memcpy);
                                        x86_call_reg (p, X86_EAX);
                                        x86_alu_reg_imm (p, X86_ADD, X86_ESP, 12);
+                                       /* memcpy might clobber EDX so restore it */
+                                       x86_mov_reg_membase (p, X86_EDX, X86_EBP, ARGP_POS, 4);
                                }
                        } else {
                                /* it's an enum value */
@@ -337,7 +339,7 @@ enum_marshal:
  * across the managed/unmanaged boundary.
  */
 void *
-mono_create_method_pointer (MonoMethod *method)
+mono_arch_create_method_pointer (MonoMethod *method)
 {
        MonoMethodSignature *sig;
        MonoJitInfo *ji;
@@ -347,20 +349,6 @@ mono_create_method_pointer (MonoMethod *method)
        int i, size, align, cpos;
        int *vtbuf;
 
-       /*
-        * If it is a static P/Invoke method, we can just return the pointer
-        * to the method implementation.
-        */
-       if (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL && method->addr) {
-               ji = g_new0 (MonoJitInfo, 1);
-               ji->method = method;
-               ji->code_size = 1;
-               ji->code_start = method->addr;
-
-               mono_jit_info_table_add (mono_root_domain, ji);
-               return method->addr;
-       }
-
        sig = method->signature;
 
        code_buffer = p = alloca (512); /* FIXME: check for overflows... */
@@ -407,7 +395,6 @@ mono_create_method_pointer (MonoMethod *method)
        x86_mov_reg_imm (p, X86_EAX, 0);
        x86_mov_membase_reg (p, X86_EBP, (MINV_POS + G_STRUCT_OFFSET (MonoInvocation, ex)), X86_EAX, 4);
        x86_mov_membase_reg (p, X86_EBP, (MINV_POS + G_STRUCT_OFFSET (MonoInvocation, ex_handler)), X86_EAX, 4);
-       x86_mov_membase_reg (p, X86_EBP, (MINV_POS + G_STRUCT_OFFSET (MonoInvocation, child)), X86_EAX, 4);
        x86_mov_membase_reg (p, X86_EBP, (MINV_POS + G_STRUCT_OFFSET (MonoInvocation, parent)), X86_EAX, 4);
        /*
         * Set the method pointer.
@@ -493,8 +480,15 @@ mono_create_method_pointer (MonoMethod *method)
                case MONO_TYPE_VOID:
                        break;
                case MONO_TYPE_BOOLEAN:
+               case MONO_TYPE_I1:
+               case MONO_TYPE_U1:
                        x86_mov_reg_membase (p, X86_EAX, X86_EAX, 0, 1);
                        break;
+               case MONO_TYPE_CHAR:
+               case MONO_TYPE_I2:
+               case MONO_TYPE_U2:
+                       x86_mov_reg_membase (p, X86_EAX, X86_EAX, 0, 2);
+                       break;
                case MONO_TYPE_I4:
                case MONO_TYPE_U4:
                case MONO_TYPE_I:
@@ -545,7 +539,7 @@ mono_create_method_pointer (MonoMethod *method)
        ji->code_size = p - code_buffer;
        ji->code_start = g_memdup (code_buffer, p - code_buffer);
 
-       mono_jit_info_table_add (mono_root_domain, ji);
+       mono_jit_info_table_add (mono_get_root_domain (), ji);
 
        return ji->code_start;
 }