Merge pull request #3059 from lateralusX/jlorenss/win-x64-dyncall-gsharedvt-support
[mono.git] / mono / mini / jit-icalls.c
index 13946834eec730ed76672cb91de14c153256a494..39abeb285497461e407cb5f3f1bfb3dd0fa96d7b 100644 (file)
@@ -1126,16 +1126,31 @@ mono_helper_compile_generic_method (MonoObject *obj, MonoMethod *method, gpointe
        return addr;
 }
 
+MonoString*
+ves_icall_mono_ldstr (MonoDomain *domain, MonoImage *image, guint32 idx)
+{
+       MonoError error;
+       MonoString *result = mono_ldstr_checked (domain, image, idx, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
+}
+
 MonoString*
 mono_helper_ldstr (MonoImage *image, guint32 idx)
 {
-       return mono_ldstr (mono_domain_get (), image, idx);
+       MonoError error;
+       MonoString *result = mono_ldstr_checked (mono_domain_get (), image, idx, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoString*
 mono_helper_ldstr_mscorlib (guint32 idx)
 {
-       return mono_ldstr (mono_domain_get (), mono_defaults.corlib, idx);
+       MonoError error;
+       MonoString *result = mono_ldstr_checked (mono_domain_get (), mono_defaults.corlib, idx, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoObject*
@@ -1427,6 +1442,14 @@ mono_generic_class_init (MonoVTable *vtable)
        mono_error_set_pending_exception (&error);
 }
 
+void
+ves_icall_mono_delegate_ctor (MonoObject *this_obj, MonoObject *target, gpointer addr)
+{
+       MonoError error;
+       mono_delegate_ctor (this_obj, target, addr, &error);
+       mono_error_set_pending_exception (&error);
+}
+
 gpointer
 mono_fill_class_rgctx (MonoVTable *vtable, int index)
 {
@@ -1553,7 +1576,8 @@ resolve_vcall (MonoVTable *vt, int slot, MonoMethod *imt_method, gpointer *out_a
        /* Same as in common_call_trampoline () */
 
        /* Avoid loading metadata or creating a generic vtable if possible */
-       addr = mono_aot_get_method_from_vt_slot (mono_domain_get (), vt, slot);
+       addr = mono_aot_get_method_from_vt_slot (mono_domain_get (), vt, slot, &error);
+       mono_error_raise_exception (&error); // FIXME: Don't raise here
        if (addr && !vt->klass->valuetype)
                return mono_create_ftnptr (mono_domain_get (), addr);
 
@@ -1845,3 +1869,17 @@ mono_interruption_checkpoint_from_trampoline (void)
        if (ex)
                mono_raise_exception (ex);
 }
+
+void
+mono_throw_method_access (MonoMethod *callee, MonoMethod *caller)
+{
+       char *callee_name = mono_method_full_name (callee, 1);
+       char *caller_name = mono_method_full_name (caller, 1);
+       MonoError error;
+
+       mono_error_init (&error);
+       mono_error_set_generic_error (&error, "System", "MethodAccessException", "Method `%s' is inaccessible from method `%s'\n", callee_name, caller_name);
+       mono_error_set_pending_exception (&error);
+       g_free (callee_name);
+       g_free (caller_name);
+}