Merge pull request #2481 from ludovic-henry/monoerror-mono_array_new_full
[mono.git] / mono / mini / jit-icalls.c
index 6b14174edf64d98ccc56a9f514d8f1471bf5694a..83603d75367601a16901b5f5b46e19451d7c6488 100644 (file)
@@ -1643,13 +1643,25 @@ mono_init_vtable_slot (MonoVTable *vtable, int slot)
  * 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
@@ -1659,11 +1671,9 @@ mono_llvmonly_init_delegate_virtual (MonoDelegate *del, MonoObject *target, Mono
 
        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*