#endif
#include "jit-icalls.h"
-
+#include <mono/utils/mono-error-internals.h>
void*
mono_ldftn (MonoMethod *method)
{
static void*
ldvirtfn_internal (MonoObject *obj, MonoMethod *method, gboolean gshared)
{
+ MonoError error;
MonoMethod *res;
MONO_ARCH_SAVE_REGS;
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 */
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;
return res;
}
+#ifdef MONO_ARCH_EMULATE_FCONV_TO_I8
+gint64
+mono_rconv_i8 (float v)
+{
+ return (gint64)v;
+}
+#endif
+
+gint64
+mono_rconv_ovf_i8 (float v)
+{
+ gint64 res;
+
+ res = (gint64)v;
+
+ if (isnan(v) || trunc (v) != res) {
+ mono_raise_exception (mono_get_exception_overflow ());
+ }
+ return res;
+}
+
+guint64
+mono_rconv_ovf_u8 (float v)
+{
+ guint64 res;
+
+ res = (guint64)v;
+ if (isnan(v) || trunc (v) != res) {
+ mono_raise_exception (mono_get_exception_overflow ());
+ }
+ return res;
+}
+
#ifdef MONO_ARCH_EMULATE_LCONV_TO_R8
double
mono_lconv_to_r8 (gint64 a)
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);
}
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);
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;
}
vt_slot += iface_offset;
}
m = klass->vtable [vt_slot];
+ if (cmethod->is_inflated)
+ m = mono_class_inflate_generic_method (m, mono_method_get_context (cmethod));
}
if (klass->valuetype && (m->klass == mono_defaults.object_class || m->klass == mono_defaults.enum_class->parent || m->klass == mono_defaults.enum_class))
/*