MonoMethodSignature *sig = info->sig;
MonoDomain *domain = mono_domain_get ();
MonoObject *(*runtime_invoke) (MonoObject *this_obj, void **params, MonoObject **exc, void* compiled_method);
- gpointer *args;
gpointer retval_ptr;
guint8 retval [256];
- gpointer *param_refs;
int i, pindex;
error_init (error);
* This code also handles invocation of gsharedvt methods directly, no
* out wrappers are used in that case.
*/
- args = (void **)g_alloca ((sig->param_count + sig->hasthis + 2) * sizeof (gpointer));
- param_refs = (gpointer*)g_alloca ((sig->param_count + sig->hasthis + 2) * sizeof (gpointer));
+ // allocate param_refs = param_count and args = param_count + hasthis + 2.
+ int const param_count = sig->param_count;
+ gpointer* const param_refs = g_newa (gpointer, param_count * 2 + sig->hasthis + 2);
+ gpointer* const args = param_refs + param_count;
pindex = 0;
/*
* The runtime invoke wrappers expects pointers to primitive types, so have to
if (sig->hasthis)
args [pindex ++] = &obj;
if (sig->ret->type != MONO_TYPE_VOID) {
- retval_ptr = (gpointer)&retval;
+ retval_ptr = &retval;
args [pindex ++] = &retval_ptr;
}
for (i = 0; i < sig->param_count; ++i) {