* Similar to mono_delegate_ctor ().
*/
void
-mono_llvmonly_init_delegate (MonoDelegate *del, MonoObject *target, MonoMethod *method)
+mono_llvmonly_init_delegate (MonoDelegate *del)
{
- MONO_OBJECT_SETREF (del, target, target);
- del->method = method;
- del->method_ptr = mono_compile_method (method);
+ MonoFtnDesc *ftndesc = *(MonoFtnDesc**)del->method_code;
- mini_init_delegate (del);
+ /*
+ * We store a MonoFtnDesc in del->method_code.
+ * It would be better to store an ftndesc in del->method_ptr too,
+ * but we don't have a a structure which could own its memory.
+ */
+ if (G_UNLIKELY (!ftndesc)) {
+ gpointer addr = mono_compile_method (del->method);
+ gpointer arg = mini_get_delegate_arg (del->method, addr);
+
+ ftndesc = mini_create_llvmonly_ftndesc (mono_domain_get (), addr, arg);
+ mono_memory_barrier ();
+ *del->method_code = (gpointer)ftndesc;
+ }
+ del->method_ptr = ftndesc->addr;
+ del->extra_arg = ftndesc->arg;
}
void
method = mono_object_get_virtual_method (target, method);
- MONO_OBJECT_SETREF (del, target, target);
del->method = method;
del->method_ptr = mono_compile_method (method);
-
- mini_init_delegate (del);
+ del->extra_arg = mini_get_delegate_arg (del->method, del->method_ptr);
}
MonoObject*