X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fjit-icalls.c;h=60ab0af5794c041c61a881d69d7d8dc06ff6a688;hb=20d845ca07479ece43da9e344c060e49887fd369;hp=45c7689a58ab09bf9e100b53049471ffabae6ab5;hpb=f777bc37a485df19a4700d5c41e9e58bdfa2ef54;p=mono.git diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c index 45c7689a58a..60ab0af5794 100644 --- a/mono/mini/jit-icalls.c +++ b/mono/mini/jit-icalls.c @@ -17,7 +17,7 @@ #endif #include "jit-icalls.h" - +#include void* mono_ldftn (MonoMethod *method) { @@ -33,6 +33,7 @@ mono_ldftn (MonoMethod *method) static void* ldvirtfn_internal (MonoObject *obj, MonoMethod *method, gboolean gshared) { + MonoError error; MonoMethod *res; MONO_ARCH_SAVE_REGS; @@ -51,7 +52,8 @@ ldvirtfn_internal (MonoObject *obj, MonoMethod *method, gboolean gshared) context.class_inst = res->klass->generic_container->context.class_inst; context.method_inst = mono_method_get_context (method)->method_inst; - res = mono_class_inflate_generic_method (res, &context); + res = mono_class_inflate_generic_method_checked (res, &context, &error); + mono_error_raise_exception (&error); } /* An rgctx wrapper is added by the trampolines no need to do it here */ @@ -825,11 +827,13 @@ mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) gpointer mono_ldtoken_wrapper (MonoImage *image, int token, MonoGenericContext *context) { + MonoError error; MonoClass *handle_class; gpointer res; MONO_ARCH_SAVE_REGS; - res = mono_ldtoken (image, token, &handle_class, context); + res = mono_ldtoken_checked (image, token, &handle_class, context, &error); + mono_error_raise_exception (&error); mono_class_init (handle_class); return res; @@ -1022,9 +1026,9 @@ mono_helper_ldstr_mscorlib (guint32 idx) MonoObject* mono_helper_newobj_mscorlib (guint32 idx) { - MonoClass *klass = mono_class_get (mono_defaults.corlib, MONO_TOKEN_TYPE_DEF | idx); - - g_assert (klass); + MonoError error; + MonoClass *klass = mono_class_get_checked (mono_defaults.corlib, MONO_TOKEN_TYPE_DEF | idx, &error); + mono_error_raise_exception (&error); return mono_object_new (mono_domain_get (), klass); } @@ -1061,6 +1065,7 @@ MonoObject* mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) { MonoJitTlsData *jit_tls = NULL; + MonoClass *oklass; if (mini_get_debug_options ()->better_cast_details) { jit_tls = mono_native_tls_get_value (mono_jit_tls_id); @@ -1070,13 +1075,14 @@ mono_object_castclass_unbox (MonoObject *obj, MonoClass *klass) if (!obj) return NULL; - if (klass->enumtype && obj->vtable->klass == klass->element_class) + oklass = obj->vtable->klass; + if ((klass->enumtype && oklass == klass->element_class) || (oklass->enumtype && klass == oklass->element_class)) return obj; if (mono_object_isinst (obj, klass)) return obj; if (mini_get_debug_options ()->better_cast_details) { - jit_tls->class_cast_from = obj->vtable->klass; + jit_tls->class_cast_from = oklass; jit_tls->class_cast_to = klass; }