Merge pull request #2802 from BrzVlad/feature-evacuation-opt2
[mono.git] / mono / mini / mini-trampolines.c
index a624f37d37e1aa1a857c73f886feaeee657cbca4..c464a0033a77c727829ba44f5e6acea3bba0e84c 100644 (file)
@@ -2,6 +2,7 @@
  * (C) 2003 Ximian, Inc.
  * (C) 2003-2011 Novell, Inc.
  * Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 #include <config.h>
 #include <glib.h>
@@ -1016,14 +1017,6 @@ mono_aot_plt_trampoline (mgreg_t *regs, guint8 *code, guint8 *aot_module,
                        mono_error_set_pending_exception (&error);
                        return NULL;
                }
-               if (mono_loader_get_last_error ()) {
-                       MonoError error;
-
-                       mono_error_init (&error);
-                       mono_error_set_from_loader_error (&error);
-                       mono_error_set_pending_exception (&error);
-                       return NULL;
-               }
                // FIXME: Error handling (how ?)
                g_assert (res);
        }
@@ -1065,36 +1058,6 @@ mono_rgctx_lazy_fetch_trampoline (mgreg_t *regs, guint8 *code, gpointer data, gu
        return res;
 }
 
-/*
- * Precompute data to speed up mono_delegate_trampoline ().
- * METHOD might be NULL.
- */
-static MonoDelegateTrampInfo*
-create_delegate_trampoline_data (MonoDomain *domain, MonoClass *klass, MonoMethod *method)
-{
-       MonoDelegateTrampInfo *tramp_data;
-       MonoMethod *invoke;
-       MonoError err;
-
-       // Precompute the delegate invoke impl and pass it to the delegate trampoline
-       invoke = mono_get_delegate_invoke (klass);
-       g_assert (invoke);
-
-       tramp_data = (MonoDelegateTrampInfo *)mono_domain_alloc0 (domain, sizeof (MonoDelegateTrampInfo));
-       tramp_data->invoke = invoke;
-       tramp_data->invoke_sig = mono_method_signature (invoke);
-       tramp_data->impl_this = mono_arch_get_delegate_invoke_impl (mono_method_signature (invoke), TRUE);
-       tramp_data->impl_nothis = mono_arch_get_delegate_invoke_impl (mono_method_signature (invoke), FALSE);
-       tramp_data->method = method;
-       if (method) {
-               mono_error_init (&err);
-               tramp_data->sig = mono_method_signature_checked (method, &err);
-               tramp_data->need_rgctx_tramp = mono_method_needs_static_rgctx_invoke (method, FALSE);
-       }
-
-       return tramp_data;
-}
-
 /**
  * mono_delegate_trampoline:
  *
@@ -1457,13 +1420,14 @@ mono_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_type, M
 }
 
 gpointer
-mono_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, gboolean add_sync_wrapper)
+mono_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, gboolean add_sync_wrapper, MonoError *error)
 {
-       MonoError error;
        MonoJitInfo *ji;
        gpointer code;
        guint32 code_size = 0;
 
+       mono_error_init (error);
+
        code = mono_jit_find_compiled_method_with_jit_info (domain, method, &ji);
        /*
         * We cannot recover the correct type of a shared generic
@@ -1475,9 +1439,9 @@ mono_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, gboolean ad
                return code;
 
        if (mono_llvm_only) {
-               code = mono_jit_compile_method (method, &error);
-               if (!mono_error_ok (&error))
-                       mono_error_raise_exception (&error);
+               code = mono_jit_compile_method (method, error);
+               if (!mono_error_ok (error))
+                       return NULL;
                return code;
        }
 
@@ -1516,11 +1480,12 @@ method_not_found (void)
 }
 
 gpointer
-mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method)
+mono_create_jit_trampoline (MonoDomain *domain, MonoMethod *method, MonoError *error)
 {
-       MonoError error;
        gpointer tramp;
 
+       mono_error_init (error);
+
        if (mono_aot_only) {
                /* Avoid creating trampolines if possible */
                gpointer code = mono_jit_find_compiled_method (domain, method);
@@ -1533,9 +1498,9 @@ mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method)
                                /* These wrappers are not generated */
                                return method_not_found;
                        /* Methods are lazily initialized on first call, so this can't lead recursion */
-                       code = mono_jit_compile_method (method, &error);
-                       if (!mono_error_ok (&error))
-                               mono_error_raise_exception (&error);
+                       code = mono_jit_compile_method (method, error);
+                       if (!mono_error_ok (error))
+                               return NULL;
                        return code;
                }
        }
@@ -1557,12 +1522,6 @@ mono_create_jit_trampoline_in_domain (MonoDomain *domain, MonoMethod *method)
        return tramp;
 }      
 
-gpointer
-mono_create_jit_trampoline (MonoMethod *method)
-{
-       return mono_create_jit_trampoline_in_domain (mono_domain_get (), method);
-}
-
 gpointer
 mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token)
 {
@@ -1588,11 +1547,13 @@ mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token)
 /*
  * mono_create_delegate_trampoline_info:
  *
- *   Create a delegate trampoline for the KLASS+METHOD pair.
+ *  Create a trampoline info structure for the KLASS+METHOD pair.
  */
 MonoDelegateTrampInfo*
 mono_create_delegate_trampoline_info (MonoDomain *domain, MonoClass *klass, MonoMethod *method)
 {
+       MonoMethod *invoke;
+       MonoError error;
        MonoDelegateTrampInfo *tramp_info;
        MonoClassMethodPair pair, *dpair;
        guint32 code_size = 0;
@@ -1605,8 +1566,20 @@ mono_create_delegate_trampoline_info (MonoDomain *domain, MonoClass *klass, Mono
        if (tramp_info)
                return tramp_info;
 
-       tramp_info = create_delegate_trampoline_data (domain, klass, method);
+       invoke = mono_get_delegate_invoke (klass);
+       g_assert (invoke);
 
+       tramp_info = (MonoDelegateTrampInfo *)mono_domain_alloc0 (domain, sizeof (MonoDelegateTrampInfo));
+       tramp_info->invoke = invoke;
+       tramp_info->invoke_sig = mono_method_signature (invoke);
+       tramp_info->impl_this = mono_arch_get_delegate_invoke_impl (mono_method_signature (invoke), TRUE);
+       tramp_info->impl_nothis = mono_arch_get_delegate_invoke_impl (mono_method_signature (invoke), FALSE);
+       tramp_info->method = method;
+       if (method) {
+               mono_error_init (&error);
+               tramp_info->sig = mono_method_signature_checked (method, &error);
+               tramp_info->need_rgctx_tramp = mono_method_needs_static_rgctx_invoke (method, FALSE);
+       }
        tramp_info->invoke_impl = mono_create_specific_trampoline (tramp_info, MONO_TRAMPOLINE_DELEGATE, domain, &code_size);
        g_assert (code_size);