{
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));
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 ++];