Fix the amd64 dyn call code after the this passing changes.
authorZoltan Varga <vargaz@gmail.com>
Sun, 31 Oct 2010 01:53:16 +0000 (02:53 +0100)
committerZoltan Varga <vargaz@gmail.com>
Sun, 31 Oct 2010 01:53:16 +0000 (02:53 +0100)
mono/mini/mini-amd64.c

index c3f3d32392e67dc3539a7f29d4dffd2e243ca649..f5eb94c075c6a0b5090d4ce18d5100b83d5e0a96 100644 (file)
@@ -2350,7 +2350,7 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
 {
        ArchDynCallInfo *dinfo = (ArchDynCallInfo*)info;
        DynCallArgs *p = (DynCallArgs*)buf;
-       int arg_index, greg, i;
+       int arg_index, greg, i, pindex;
        MonoMethodSignature *sig = dinfo->sig;
 
        g_assert (buf_len >= sizeof (DynCallArgs));
@@ -2360,15 +2360,18 @@ mono_arch_start_dyn_call (MonoDynCallInfo *info, gpointer **args, guint8 *ret, g
 
        arg_index = 0;
        greg = 0;
+       pindex = 0;
 
-       if (dinfo->cinfo->vtype_retaddr)
-               p->regs [greg ++] = (mgreg_t)ret;
-
-       if (sig->hasthis) {
+       if (sig->hasthis || dinfo->cinfo->vret_arg_index == 1) {
                p->regs [greg ++] = (mgreg_t)*(args [arg_index ++]);
+               if (!sig->hasthis)
+                       pindex = 1;
        }
 
-       for (i = 0; i < sig->param_count; i++) {
+       if (dinfo->cinfo->vtype_retaddr)
+               p->regs [greg ++] = (mgreg_t)ret;
+
+       for (i = pindex; i < sig->param_count; i++) {
                MonoType *t = mono_type_get_underlying_type (sig->params [i]);
                gpointer *arg = args [arg_index ++];