[runtime] Move some mono_error_raise_exception () calls to icalls from utility functi...
[mono.git] / mono / metadata / icall.c
index 584dff8ffcf78022d1268bc95577924ec56dcaf9..82d2c58996f37486b8f9cc672dfb4240ad32197a 100644 (file)
@@ -6,10 +6,11 @@
  *   Paolo Molaro (lupus@ximian.com)
  *      Patrik Torstensson (patrik.torstensson@labs2.com)
  *   Marek Safar (marek.safar@gmail.com)
+ *   Aleksey Kliger (aleksey@xamarin.com)
  *
  * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
  * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
- * Copyright 2011-2014 Xamarin Inc (http://www.xamarin.com).
+ * Copyright 2011-2015 Xamarin Inc (http://www.xamarin.com).
  */
 
 #include <config.h>
 #include "decimal-ms.h"
 #include "number-ms.h"
 
+#if !defined(HOST_WIN32) && defined(HAVE_SYS_UTSNAME_H)
+#include <sys/utsname.h>
+#endif
+
 extern MonoString* ves_icall_System_Environment_GetOSVersionString (void);
 
 ICALL_EXPORT MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAssembly (void);
 
+/* Lazy class loading functions */
+static GENERATE_GET_CLASS_WITH_CACHE (system_version, System, Version)
+static GENERATE_GET_CLASS_WITH_CACHE (assembly_name, System.Reflection, AssemblyName)
+static GENERATE_GET_CLASS_WITH_CACHE (constructor_info, System.Reflection, ConstructorInfo)
+static GENERATE_GET_CLASS_WITH_CACHE (property_info, System.Reflection, PropertyInfo)
+static GENERATE_GET_CLASS_WITH_CACHE (event_info, System.Reflection, EventInfo)
+static GENERATE_GET_CLASS_WITH_CACHE (module, System.Reflection, Module)
+
 static MonoArray*
-type_array_from_modifiers (MonoImage *image, MonoType *type, int optional);
+type_array_from_modifiers (MonoImage *image, MonoType *type, int optional, MonoError *error);
 
 static inline MonoBoolean
 is_generic_parameter (MonoType *type)
@@ -113,10 +126,12 @@ is_generic_parameter (MonoType *type)
 }
 
 static void
-mono_class_init_or_throw (MonoClass *klass)
+mono_class_init_checked (MonoClass *klass, MonoError *error)
 {
+       mono_error_init (error);
+
        if (!mono_class_init (klass))
-               mono_raise_exception (mono_class_get_exception_for_failure (klass));
+               mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass));
 }
 
 ICALL_EXPORT MonoObject *
@@ -134,7 +149,7 @@ ves_icall_System_Array_GetValueImpl (MonoArray *arr, guint32 pos)
        if (ac->element_class->valuetype)
                return mono_value_box (arr->obj.vtable->domain, ac->element_class, ea);
        else
-               return *ea;
+               return (MonoObject *)*ea;
 }
 
 ICALL_EXPORT MonoObject *
@@ -514,6 +529,7 @@ ves_icall_System_Array_SetValue (MonoArray *arr, MonoObject *value,
 ICALL_EXPORT MonoArray *
 ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)
 {
+       MonoError error;
        MonoClass *aklass, *klass;
        MonoArray *array;
        uintptr_t *sizes, i;
@@ -534,7 +550,8 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *
        }
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))
                /* vectors are not the same as one dimensional arrays with no-zero bounds */
@@ -544,7 +561,7 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *
 
        aklass = mono_bounded_array_class_get (klass, mono_array_length (lengths), bounded);
 
-       sizes = alloca (aklass->rank * sizeof(intptr_t) * 2);
+       sizes = (uintptr_t *)alloca (aklass->rank * sizeof(intptr_t) * 2);
        for (i = 0; i < aklass->rank; ++i) {
                sizes [i] = mono_array_get (lengths, guint32, i);
                if (bounds)
@@ -553,7 +570,8 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *
                        sizes [i + aklass->rank] = 0;
        }
 
-       array = mono_array_new_full (mono_object_domain (type), aklass, sizes, (intptr_t*)sizes + aklass->rank);
+       array = mono_array_new_full_checked (mono_object_domain (type), aklass, sizes, (intptr_t*)sizes + aklass->rank, &error);
+       mono_error_set_pending_exception (&error);
 
        return array;
 }
@@ -561,6 +579,7 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *
 ICALL_EXPORT MonoArray *
 ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)
 {
+       MonoError error;
        MonoClass *aklass, *klass;
        MonoArray *array;
        uintptr_t *sizes, i;
@@ -582,7 +601,8 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray
        }
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint64, 0) != 0))
                /* vectors are not the same as one dimensional arrays with no-zero bounds */
@@ -592,7 +612,7 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray
 
        aklass = mono_bounded_array_class_get (klass, mono_array_length (lengths), bounded);
 
-       sizes = alloca (aklass->rank * sizeof(intptr_t) * 2);
+       sizes = (uintptr_t *)alloca (aklass->rank * sizeof(intptr_t) * 2);
        for (i = 0; i < aklass->rank; ++i) {
                sizes [i] = mono_array_get (lengths, guint64, i);
                if (bounds)
@@ -601,7 +621,8 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray
                        sizes [i + aklass->rank] = 0;
        }
 
-       array = mono_array_new_full (mono_object_domain (type), aklass, sizes, (intptr_t*)sizes + aklass->rank);
+       array = mono_array_new_full_checked (mono_object_domain (type), aklass, sizes, (intptr_t*)sizes + aklass->rank, &error);
+       mono_error_set_pending_exception (&error);
 
        return array;
 }
@@ -770,7 +791,7 @@ ves_icall_System_Array_SetGenericValueImpl (MonoArray *arr, guint32 pos, gpointe
 
        if (MONO_TYPE_IS_REFERENCE (&ec->byval_arg)) {
                g_assert (esize == sizeof (gpointer));
-               mono_gc_wbarrier_generic_store (ea, *(gpointer*)value);
+               mono_gc_wbarrier_generic_store (ea, *(MonoObject **)value);
        } else {
                g_assert (ec->inited);
                g_assert (esize == mono_class_value_size (ec, NULL));
@@ -815,14 +836,15 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoAr
        }
 
 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
-#define SWAP(n) {\
-       guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \
-       guint ## n *src = (guint ## n *) field_data; \
-       guint ## n *end = (guint ## n *)((char*)src + size); \
-\
-       for (; src < end; data++, src++) { \
-               *data = read ## n (src); \
-       } \
+#define SWAP(n) {                                                              \
+       guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0);     \
+       guint ## n *src = (guint ## n *) field_data;                            \
+       int i,                                                                  \
+           nEnt = (size / sizeof(guint ## n));                                 \
+                                                                               \
+       for (i = 0; i < nEnt; i++) {                                            \
+               data[i] = read ## n (&src[i]);                                  \
+       }                                                                       \
 }
 
        /* printf ("Initialize array with elements of %s type\n", klass->element_class->name); */
@@ -863,13 +885,19 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObj
 {
        if ((obj == NULL) || (! (obj->vtable->klass->valuetype)))
                return obj;
-       else
-               return mono_object_clone (obj);
+       else {
+               MonoError error;
+               MonoObject *ret = mono_object_clone_checked (obj, &error);
+               mono_error_set_pending_exception (&error);
+
+               return ret;
+       }
 }
 
 ICALL_EXPORT void
 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)
 {
+       MonoError error;
        MonoClass *klass;
        MonoVTable *vtable;
 
@@ -878,10 +906,18 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (Mo
        klass = mono_class_from_mono_type (handle);
        MONO_CHECK_ARG (handle, klass,);
 
-       vtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);
+       if (klass->generic_container)
+               return;
+
+       vtable = mono_class_vtable_full (mono_domain_get (), klass, &error);
+       if (!is_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return;
+       }
 
        /* This will call the type constructor */
-       mono_runtime_class_init (vtable);
+       if (!mono_runtime_class_init_full (vtable, &error))
+               mono_error_set_pending_exception (&error);
 }
 
 ICALL_EXPORT void
@@ -892,9 +928,18 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunModuleConstructor (M
        mono_image_check_for_module_cctor (image);
        if (image->has_module_cctor) {
                MonoClass *module_klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | 1, &error);
-               mono_error_raise_exception (&error);
+               if (!mono_error_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return;
+               }
                /*It's fine to raise the exception here*/
-               mono_runtime_class_init (mono_class_vtable_full (mono_domain_get (), module_klass, TRUE));
+               MonoVTable * vtable = mono_class_vtable_full (mono_domain_get (), module_klass, &error);
+               if (!is_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return;
+               }
+               if (!mono_runtime_class_init_full (vtable, &error))
+                       mono_error_set_pending_exception (&error);
        }
 }
 
@@ -929,7 +974,11 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_SufficientExecutionStac
 ICALL_EXPORT MonoObject *
 ves_icall_System_Object_MemberwiseClone (MonoObject *this_obj)
 {
-       return mono_object_clone (this_obj);
+       MonoError error;
+       MonoObject *ret = mono_object_clone_checked (this_obj, &error);
+       mono_error_set_pending_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT gint32
@@ -1103,16 +1152,22 @@ ves_icall_System_ValueType_Equals (MonoObject *this_obj, MonoObject *that, MonoA
 ICALL_EXPORT MonoReflectionType *
 ves_icall_System_Object_GetType (MonoObject *obj)
 {
+       MonoError error;
+       MonoReflectionType *ret;
 #ifndef DISABLE_REMOTING
        if (obj->vtable->klass == mono_defaults.transparent_proxy_class)
-               return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);
+               ret = mono_type_get_object_checked (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg, &error);
        else
 #endif
-               return mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);
+               ret = mono_type_get_object_checked (mono_object_domain (obj), &obj->vtable->klass->byval_arg, &error);
+
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT void
-mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
+ves_icall_MonoType_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
 {
        mtype->type = &obj->vtable->klass->byval_arg;
        g_assert (mtype->type->type);
@@ -1123,7 +1178,10 @@ ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *o
 {
        MONO_CHECK_ARG_NULL (obj, 0);
        
-       return mono_image_create_token (mb->dynamic_image, obj, create_open_instance, TRUE);
+       MonoError error;
+       gint32 result = mono_image_create_token (mb->dynamic_image, obj, create_open_instance, TRUE, &error);
+       mono_error_raise_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT gint32
@@ -1133,20 +1191,27 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,
 {
        MONO_CHECK_ARG_NULL (method, 0);
        
-       return mono_image_create_method_token (
-               mb->dynamic_image, (MonoObject *) method, opt_param_types);
+       MonoError error;
+       gint32 result = mono_image_create_method_token (
+               mb->dynamic_image, (MonoObject *) method, opt_param_types, &error);
+       mono_error_raise_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT void
 ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)
 {
-       mono_image_create_pefile (mb, file);
+       MonoError error;
+       mono_image_create_pefile (mb, file, &error);
+       mono_error_raise_exception (&error);
 }
 
 ICALL_EXPORT void
 ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)
 {
-       mono_image_build_metadata (mb);
+       MonoError error;
+       if (!mono_image_build_metadata (mb, &error))
+               mono_error_raise_exception (&error);
 }
 
 ICALL_EXPORT void
@@ -1158,10 +1223,10 @@ ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilder *mb, MonoObje
 ICALL_EXPORT MonoObject*
 ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, guint32 token)
 {
-       gpointer obj;
+       MonoObject *obj;
 
        mono_loader_lock ();
-       obj = mono_g_hash_table_lookup (mb->dynamic_image->tokens, GUINT_TO_POINTER (token));
+       obj = (MonoObject *)mono_g_hash_table_lookup (mb->dynamic_image->tokens, GUINT_TO_POINTER (token));
        mono_loader_unlock ();
 
        return obj;
@@ -1170,7 +1235,7 @@ ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, gui
 static gboolean
 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
 {
-       MonoMethod **dest = data;
+       MonoMethod **dest = (MonoMethod **)data;
 
        /* skip unmanaged frames */
        if (!managed)
@@ -1190,7 +1255,7 @@ get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer dat
 static gboolean
 get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
 {
-       MonoMethod **dest = data;
+       MonoMethod **dest = (MonoMethod **)data;
 
        /* skip unmanaged frames */
        if (!managed)
@@ -1208,7 +1273,7 @@ get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer
 static gboolean
 get_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
 {
-       MonoMethod **dest = data;
+       MonoMethod **dest = (MonoMethod **)data;
 
        /* skip unmanaged frames */
        if (!managed)
@@ -1232,7 +1297,7 @@ get_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed
 }
 
 static MonoReflectionType *
-type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase)
+type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoError *error)
 {
        MonoMethod *m, *dest;
 
@@ -1240,6 +1305,8 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase)
        MonoAssembly *assembly = NULL;
        gboolean type_resolve = FALSE;
 
+       mono_error_init (error);
+
        /*
         * We must compute the calling assembly as type loading must happen under a metadata context.
         * For example. The main assembly is a.exe and Type.GetType is called from dir/b.dll. Without
@@ -1287,39 +1354,15 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase)
        if (!type) 
                return NULL;
 
-       return mono_type_get_object (mono_domain_get (), type);
-}
-
-#ifdef UNUSED
-MonoReflectionType *
-mono_type_get (const char *str)
-{
-       char *copy = g_strdup (str);
-       MonoTypeNameParse info;
-       MonoReflectionType *type;
-       gboolean parsedOk;
-
-       parsedOk = mono_reflection_parse_type(copy, &info);
-       if (!parsedOk) {
-               mono_reflection_free_type_info (&info);
-               g_free(copy);
-               return NULL;
-       }
-
-       type = type_from_parsed_name (&info, FALSE);
-
-       mono_reflection_free_type_info (&info);
-       g_free(copy);
-
-       return type;
+       return mono_type_get_object_checked (mono_domain_get (), type, error);
 }
-#endif
 
 ICALL_EXPORT MonoReflectionType*
-ves_icall_type_from_name (MonoString *name,
-                         MonoBoolean throwOnError,
-                         MonoBoolean ignoreCase)
+ves_icall_System_Type_internal_from_name (MonoString *name,
+                                                                                 MonoBoolean throwOnError,
+                                                                                 MonoBoolean ignoreCase)
 {
+       MonoError error;
        char *str = mono_string_to_utf8 (name);
        MonoTypeNameParse info;
        MonoReflectionType *type;
@@ -1332,16 +1375,24 @@ ves_icall_type_from_name (MonoString *name,
                mono_reflection_free_type_info (&info);
                g_free (str);
                if (throwOnError) {
-                       mono_set_pending_exception(mono_get_exception_argument("typeName", "failed parse"));
+                       mono_set_pending_exception (mono_get_exception_argument("typeName", "failed parse"));
                }
                return NULL;
        }
 
-       type = type_from_parsed_name (&info, ignoreCase);
+       type = type_from_parsed_name (&info, ignoreCase, &error);
 
        mono_reflection_free_type_info (&info);
        g_free (str);
 
+       if (!mono_error_ok (&error)) {
+               if (throwOnError)
+                       mono_error_set_pending_exception (&error);
+               else
+                       mono_error_cleanup (&error);
+               return NULL;
+       }
+
        if (type == NULL){
                MonoException *e = NULL;
                
@@ -1360,11 +1411,16 @@ ves_icall_type_from_name (MonoString *name,
 
 
 ICALL_EXPORT MonoReflectionType*
-ves_icall_type_from_handle (MonoType *handle)
+ves_icall_System_Type_internal_from_handle (MonoType *handle)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoDomain *domain = mono_domain_get (); 
 
-       return mono_type_get_object (domain, handle);
+       ret = mono_type_get_object_checked (domain, handle, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 /* System.TypeCode */
@@ -1489,7 +1545,7 @@ mono_type_get_underlying_type_ignore_byref (MonoType *type)
 }
 
 ICALL_EXPORT guint32
-ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)
+ves_icall_RuntimeTypeHandle_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)
 {
        MonoClass *klass;
        MonoClass *klassc;
@@ -1528,15 +1584,17 @@ ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType
 }
 
 ICALL_EXPORT guint32
-ves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)
+ves_icall_RuntimeTypeHandle_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)
 {
+       MonoError error;
        MonoClass *klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
        return mono_object_isinst (obj, klass) != NULL;
 }
 
 ICALL_EXPORT guint32
-ves_icall_get_attributes (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetAttributes (MonoReflectionType *type)
 {
        MonoClass *klass = mono_class_from_mono_type (type->type);
        return klass->flags;
@@ -1545,6 +1603,7 @@ ves_icall_get_attributes (MonoReflectionType *type)
 ICALL_EXPORT MonoReflectionMarshalAsAttribute*
 ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionField *field)
 {
+       MonoError error;
        MonoClass *klass = field->field->parent;
        MonoMarshalType *info;
        MonoType *ftype;
@@ -1564,8 +1623,13 @@ ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionField *fie
                if (info->fields [i].field == field->field) {
                        if (!info->fields [i].mspec)
                                return NULL;
-                       else
-                               return mono_reflection_marshal_as_attribute_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);
+                       else {
+                               MonoReflectionMarshalAsAttribute* obj;
+                               obj = mono_reflection_marshal_as_attribute_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec, &error);
+                               if (!mono_error_ok (&error))
+                                       mono_error_set_pending_exception (&error);
+                               return obj;
+                       }
                }
        }
 
@@ -1575,6 +1639,7 @@ ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionField *fie
 ICALL_EXPORT MonoReflectionField*
 ves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField *handle, MonoType *type)
 {
+       MonoError error;
        gboolean found = FALSE;
        MonoClass *klass;
        MonoClass *k;
@@ -1599,7 +1664,9 @@ ves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField
                        return NULL;
        }
 
-       return mono_field_get_object (mono_domain_get (), klass, handle);
+       MonoReflectionField *result = mono_field_get_object_checked (mono_domain_get (), klass, handle, &error);
+       mono_error_raise_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoArray*
@@ -1607,9 +1674,16 @@ ves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *fie
 {
        MonoError error;
        MonoType *type = mono_field_get_type_checked (field->field, &error);
-       mono_error_raise_exception (&error);
+       MonoArray *res;
+
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
 
-       return type_array_from_modifiers (field->field->parent->image, type, optional);
+       res = type_array_from_modifiers (field->field->parent->image, type, optional, &error);
+       mono_error_raise_exception (&error);
+       return res;
 }
 
 ICALL_EXPORT int
@@ -1622,16 +1696,32 @@ ICALL_EXPORT void
 ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)
 {
        MonoError error;
+       MonoReflectionType *rt;
        MonoDomain *domain = mono_domain_get ();
        MonoMethodSignature* sig;
 
        sig = mono_method_signature_checked (method, &error);
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return;
+       }
 
+       rt = mono_type_get_object_checked (domain, &method->klass->byval_arg, &error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return;
+       }
+
+       MONO_STRUCT_SETREF (info, parent, rt);
+
+       rt = mono_type_get_object_checked (domain, sig->ret, &error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return;
+       }
+
+       MONO_STRUCT_SETREF (info, ret, rt);
 
-       MONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &method->klass->byval_arg));
-       MONO_STRUCT_SETREF (info, ret, mono_type_get_object (domain, sig->ret));
        info->attrs = method->flags;
        info->implattrs = method->iflags;
        if (sig->call_convention == MONO_CALL_DEFAULT)
@@ -1656,6 +1746,7 @@ ves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member)
 ICALL_EXPORT MonoReflectionMarshalAsAttribute*
 ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)
 {
+       MonoError error;
        MonoDomain *domain = mono_domain_get (); 
        MonoReflectionMarshalAsAttribute* res = NULL;
        MonoMarshalSpec **mspecs;
@@ -1664,8 +1755,13 @@ ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)
        mspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);
        mono_method_get_marshal_info (method, mspecs);
 
-       if (mspecs [0])
-               res = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [0]);
+       if (mspecs [0]) {
+               res = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [0], &error);
+               if (!mono_error_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
+       }
                
        for (i = mono_method_signature (method)->param_count; i >= 0; i--)
                if (mspecs [i])
@@ -1689,11 +1785,17 @@ ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
 ICALL_EXPORT MonoReflectionType*
 ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *parent;
 
        parent = declaring? field->field->parent: field->klass;
 
-       return mono_type_get_object (mono_object_domain (field), &parent->byval_arg);
+       ret = mono_type_get_object_checked (mono_object_domain (field), &parent->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
+
 }
 
 ICALL_EXPORT MonoObject *
@@ -1733,8 +1835,10 @@ ves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *ob
                mono_security_core_clr_ensure_reflection_access_field (cf);
 
        type = mono_field_get_type_checked (cf, &error);
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return;
+       }
 
        v = (gchar *) value;
        if (!type->byref) {
@@ -1778,11 +1882,15 @@ ves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *ob
                                 * This is complicated by the fact that Nullables have
                                 * a variable structure.
                                 */
-                               nullable = mono_object_new (mono_domain_get (), nklass);
+                               nullable = mono_object_new_checked (mono_domain_get (), nklass, &error);
+                               if (!mono_error_ok (&error)) {
+                                       mono_error_set_pending_exception (&error);
+                                       return;
+                               }
 
-                               mono_nullable_init (mono_object_unbox (nullable), value, nklass);
+                               mono_nullable_init ((guint8 *)mono_object_unbox (nullable), value, nklass);
 
-                               v = mono_object_unbox (nullable);
+                               v = (gchar *)mono_object_unbox (nullable);
                        }
                        else 
                                if (gclass->container_class->valuetype && (v != NULL))
@@ -1797,9 +1905,17 @@ ves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *ob
        }
 
        if (type->attrs & FIELD_ATTRIBUTE_STATIC) {
-               MonoVTable *vtable = mono_class_vtable_full (mono_object_domain (field), cf->parent, TRUE);
-               if (!vtable->initialized)
-                       mono_runtime_class_init (vtable);
+               MonoVTable *vtable = mono_class_vtable_full (mono_object_domain (field), cf->parent, &error);
+               if (!is_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return;
+               }
+               if (!vtable->initialized) {
+                       if (!mono_runtime_class_init_full (vtable, &error)) {
+                               mono_error_set_pending_exception (&error);
+                               return;
+                       }
+               }
                mono_field_static_set_value (vtable, cf, v);
        } else {
                mono_field_set_value (obj, cf, v);
@@ -1843,8 +1959,10 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *rfield)
        mono_class_init (field->parent);
 
        t = mono_field_get_type_checked (field, &error);
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
 
        if (!(t->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT)) {
                mono_set_pending_exception (mono_get_exception_invalid_operation (NULL));
@@ -1896,7 +2014,11 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *rfield)
                t->type = def_type;
                klass = mono_class_from_mono_type (t);
                g_free (t);
-               o = mono_object_new (domain, klass);
+               o = mono_object_new_checked (domain, klass, &error);
+               if (!mono_error_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
                v = ((gchar *) o) + sizeof (MonoObject);
                mono_get_constant_value_from_blob (domain, def_type, def_value, v);
                break;
@@ -1916,19 +2038,22 @@ ICALL_EXPORT MonoReflectionType*
 ves_icall_MonoField_ResolveType (MonoReflectionField *ref_field)
 {
        MonoError error;
-       MonoClassField *field = ref_field->field;
-       MonoType *type = mono_field_get_type_checked (field, &error);
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error);
-       return mono_type_get_object (mono_object_domain (ref_field), type);
-}
+       MonoReflectionType *ret;
+       MonoType *type;
 
-ICALL_EXPORT MonoReflectionType*
-ves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)
-{
-       MonoMethod *method = rmethod->method.method;
+       type = mono_field_get_type_checked (ref_field->field, &error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
 
-       return mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);
+       ret = mono_type_get_object_checked (mono_object_domain (ref_field), type, &error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
+
+       return ret;
 }
 
 /* From MonoProperty.cs */
@@ -1942,15 +2067,26 @@ typedef enum {
 } PInfo;
 
 ICALL_EXPORT void
-ves_icall_get_property_info (const MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)
+ves_icall_MonoPropertyInfo_get_property_info (const MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)
 {
+       MonoError error;
+       MonoReflectionType *rt;
+       MonoReflectionMethod *rm;
        MonoDomain *domain = mono_object_domain (property); 
        const MonoProperty *pproperty = property->property;
 
-       if ((req_info & PInfo_ReflectedType) != 0)
-               MONO_STRUCT_SETREF (info, parent, mono_type_get_object (domain, &property->klass->byval_arg));
-       if ((req_info & PInfo_DeclaringType) != 0)
-               MONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &pproperty->parent->byval_arg));
+       if ((req_info & PInfo_ReflectedType) != 0) {
+               rt = mono_type_get_object_checked (domain, &property->klass->byval_arg, &error);
+               mono_error_raise_exception (&error);
+
+               MONO_STRUCT_SETREF (info, parent, rt);
+       }
+       if ((req_info & PInfo_DeclaringType) != 0) {
+               rt = mono_type_get_object_checked (domain, &pproperty->parent->byval_arg, &error);
+               mono_error_raise_exception (&error);
+
+               MONO_STRUCT_SETREF (info, declaring_type, rt);
+       }
 
        if ((req_info & PInfo_Name) != 0)
                MONO_STRUCT_SETREF (info, name, mono_string_new (domain, pproperty->name));
@@ -1958,14 +2094,30 @@ ves_icall_get_property_info (const MonoReflectionProperty *property, MonoPropert
        if ((req_info & PInfo_Attributes) != 0)
                info->attrs = pproperty->attrs;
 
-       if ((req_info & PInfo_GetMethod) != 0)
-               MONO_STRUCT_SETREF (info, get, pproperty->get &&
-                                                       (((pproperty->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) || pproperty->get->klass == property->klass) ?
-                                                       mono_method_get_object (domain, pproperty->get, property->klass): NULL);
-       if ((req_info & PInfo_SetMethod) != 0)
-               MONO_STRUCT_SETREF (info, set, pproperty->set &&
-                                                       (((pproperty->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) || pproperty->set->klass == property->klass) ?
-                                                       mono_method_get_object (domain, pproperty->set, property->klass): NULL);
+       if ((req_info & PInfo_GetMethod) != 0) {
+               if (pproperty->get &&
+                   (((pproperty->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) ||
+                    pproperty->get->klass == property->klass)) {
+                       rm = mono_method_get_object_checked (domain, pproperty->get, property->klass, &error);
+                       mono_error_raise_exception (&error);
+               } else {
+                       rm = NULL;
+               }
+
+               MONO_STRUCT_SETREF (info, get, rm);
+       }
+       if ((req_info & PInfo_SetMethod) != 0) {
+               if (pproperty->set &&
+                   (((pproperty->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) ||
+                    pproperty->set->klass == property->klass)) {
+                       rm =  mono_method_get_object_checked (domain, pproperty->set, property->klass, &error);
+                       mono_error_raise_exception (&error);
+               } else {
+                       rm = NULL;
+               }
+
+               MONO_STRUCT_SETREF (info, set, rm);
+       }
        /* 
         * There may be other methods defined for properties, though, it seems they are not exposed 
         * in the reflection API 
@@ -1973,18 +2125,52 @@ ves_icall_get_property_info (const MonoReflectionProperty *property, MonoPropert
 }
 
 ICALL_EXPORT void
-ves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)
+ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)
 {
+       MonoError error;
+       MonoReflectionType *rt;
+       MonoReflectionMethod *rm;
        MonoDomain *domain = mono_object_domain (event); 
 
-       MONO_STRUCT_SETREF (info, reflected_type, mono_type_get_object (domain, &event->klass->byval_arg));
-       MONO_STRUCT_SETREF (info, declaring_type, mono_type_get_object (domain, &event->event->parent->byval_arg));
+       rt = mono_type_get_object_checked (domain, &event->klass->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       MONO_STRUCT_SETREF (info, reflected_type, rt);
+
+       rt = mono_type_get_object_checked (domain, &event->event->parent->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       MONO_STRUCT_SETREF (info, declaring_type, rt);
 
        MONO_STRUCT_SETREF (info, name, mono_string_new (domain, event->event->name));
        info->attrs = event->event->attrs;
-       MONO_STRUCT_SETREF (info, add_method, event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL);
-       MONO_STRUCT_SETREF (info, remove_method, event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL);
-       MONO_STRUCT_SETREF (info, raise_method, event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL);
+
+       if (event->event->add) {
+               rm = mono_method_get_object_checked (domain, event->event->add, NULL, &error);
+               mono_error_raise_exception (&error);
+       } else {
+               rm = NULL;
+       }
+
+       MONO_STRUCT_SETREF (info, add_method, rm);
+
+       if (event->event->remove) {
+               rm = mono_method_get_object_checked (domain, event->event->remove, NULL, &error);
+               mono_error_raise_exception (&error);
+       } else {
+               rm = NULL;
+       }
+
+       MONO_STRUCT_SETREF (info, remove_method, rm);
+
+       if (event->event->raise) {
+               rm = mono_method_get_object_checked (domain, event->event->raise, NULL, &error);
+               mono_error_raise_exception (&error);
+       } else {
+               rm = NULL;
+       }
+
+       MONO_STRUCT_SETREF (info, raise_method, rm);
 
 #ifndef MONO_SMALL_CONFIG
        if (event->event->other) {
@@ -1993,8 +2179,11 @@ ves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)
                        n++;
                MONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n));
 
-               for (i = 0; i < n; i++)
-                       mono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));
+               for (i = 0; i < n; i++) {
+                       rm = mono_method_get_object_checked (domain, event->event->other [i], NULL, &error);
+                       mono_error_raise_exception (&error);
+                       mono_array_setref (info->other_methods, i, rm);
+               }
        }               
 #endif
 }
@@ -2030,8 +2219,9 @@ typedef struct {
 static void
 fill_iface_array (gpointer key, gpointer value, gpointer user_data)
 {
-       FillIfaceArrayData *data = user_data;
-       MonoClass *ic = key;
+       MonoReflectionType *rt;
+       FillIfaceArrayData *data = (FillIfaceArrayData *)user_data;
+       MonoClass *ic = (MonoClass *)key;
        MonoType *ret = &ic->byval_arg, *inflated = NULL;
 
        if (!mono_error_ok (data->error))
@@ -2043,7 +2233,11 @@ fill_iface_array (gpointer key, gpointer value, gpointer user_data)
                        return;
        }
 
-       mono_array_setref (data->iface_array, data->next_idx++, mono_type_get_object (data->domain, ret));
+       rt = mono_type_get_object_checked (data->domain, ret, data->error);
+       if (!mono_error_ok (data->error))
+               return;
+
+       mono_array_setref (data->iface_array, data->next_idx++, rt);
 
        if (inflated)
                mono_metadata_free_type (inflated);
@@ -2103,7 +2297,7 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
 
 fail:
        g_hash_table_destroy (iface_hash);
-       mono_error_raise_exception (&error);
+       mono_error_set_pending_exception (&error);
        return NULL;
 }
 
@@ -2118,9 +2312,12 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
        gpointer iter;
        int i = 0, len, ioffset;
        MonoDomain *domain;
+       MonoError error;
 
-       mono_class_init_or_throw (klass);
-       mono_class_init_or_throw (iclass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
+       mono_class_init_checked (iclass, &error);
+       mono_error_raise_exception (&error);
 
        mono_class_setup_vtable (klass);
 
@@ -2134,9 +2331,11 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
        mono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len));
        iter = NULL;
        while ((method = mono_class_get_methods (iclass, &iter))) {
-               member = mono_method_get_object (domain, method, iclass);
+               member = mono_method_get_object_checked (domain, method, iclass, &error);
+               mono_error_raise_exception (&error);
                mono_array_setref (*methods, i, member);
-               member = mono_method_get_object (domain, klass->vtable [i + ioffset], klass);
+               member = mono_method_get_object_checked (domain, klass->vtable [i + ioffset], klass, &error);
+               mono_error_raise_exception (&error);
                mono_array_setref (*targets, i, member);
                
                i ++;
@@ -2146,8 +2345,11 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
 ICALL_EXPORT void
 ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)
 {
+       MonoError error;
        MonoClass *klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (image_is_dynamic (klass->image)) {
                MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)type;
@@ -2159,83 +2361,122 @@ ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *
 }
 
 ICALL_EXPORT MonoReflectionType*
-ves_icall_MonoType_GetElementType (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetElementType (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass;
 
-       if (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY)
-               return mono_type_get_object (mono_object_domain (type), &type->type->data.klass->byval_arg);
+       if (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY) {
+               ret = mono_type_get_object_checked (mono_object_domain (type), &type->type->data.klass->byval_arg, &error);
+               mono_error_raise_exception (&error);
+
+               return ret;
+       }
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        // GetElementType should only return a type for:
        // Array Pointer PassedByRef
        if (type->type->byref)
-               return mono_type_get_object (mono_object_domain (type), &klass->byval_arg);
+               ret = mono_type_get_object_checked (mono_object_domain (type), &klass->byval_arg, &error);
        else if (klass->element_class && MONO_CLASS_IS_ARRAY (klass))
-               return mono_type_get_object (mono_object_domain (type), &klass->element_class->byval_arg);
+               ret = mono_type_get_object_checked (mono_object_domain (type), &klass->element_class->byval_arg, &error);
        else if (klass->element_class && type->type->type == MONO_TYPE_PTR)
-               return mono_type_get_object (mono_object_domain (type), &klass->element_class->byval_arg);
+               ret = mono_type_get_object_checked (mono_object_domain (type), &klass->element_class->byval_arg, &error);
        else
                return NULL;
+
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT MonoReflectionType*
-ves_icall_get_type_parent (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetBaseType (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
+
        if (type->type->byref)
                return NULL;
 
        MonoClass *klass = mono_class_from_mono_type (type->type);
-       return klass->parent ? mono_type_get_object (mono_object_domain (type), &klass->parent->byval_arg): NULL;
+       if (!klass->parent)
+               return NULL;
+
+       ret = mono_type_get_object_checked (mono_object_domain (type), &klass->parent->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_type_ispointer (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsPointer (MonoReflectionType *type)
 {
        return type->type->type == MONO_TYPE_PTR;
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_type_isprimitive (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsPrimitive (MonoReflectionType *type)
 {
        return (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U)));
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_type_isbyref (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsByRef (MonoReflectionType *type)
 {
        return type->type->byref;
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_type_iscomobject (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsComObject (MonoReflectionType *type)
 {
+       MonoError error;
        MonoClass *klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        return mono_class_is_com_object (klass);
 }
 
+ICALL_EXPORT guint32
+ves_icall_RuntimeTypeHandle_GetMetadataToken (MonoReflectionType *obj)
+{
+       return mono_reflection_get_token ((MonoObject*)obj);
+}
+
 ICALL_EXPORT MonoReflectionModule*
-ves_icall_MonoType_get_Module (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetModule (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionModule *result = NULL;
        MonoClass *klass = mono_class_from_mono_type (type->type);
-       return mono_module_get_object (mono_object_domain (type), klass->image);
+       result = mono_module_get_object_checked (mono_object_domain (type), klass->image, &error);
+       if (!mono_error_ok (&error))
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoReflectionAssembly*
-ves_icall_MonoType_get_Assembly (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetAssembly (MonoReflectionType *type)
 {
+       MonoError error;
        MonoDomain *domain = mono_domain_get (); 
        MonoClass *klass = mono_class_from_mono_type (type->type);
-       return mono_assembly_get_object (domain, klass->image->assembly);
+       MonoReflectionAssembly *result = mono_assembly_get_object_checked (domain, klass->image->assembly, &error);
+       if (!result)
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoReflectionType*
 ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoDomain *domain = mono_domain_get ();
        MonoClass *klass;
 
@@ -2251,7 +2492,13 @@ ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
                klass = mono_class_from_mono_type (type->type)->nested_in;
        }
 
-       return klass ? mono_type_get_object (domain, &klass->byval_arg) : NULL;
+       if (!klass)
+               return NULL;
+
+       ret = mono_type_get_object_checked (domain, &klass->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT MonoString*
@@ -2288,7 +2535,7 @@ ves_icall_MonoType_get_Namespace (MonoReflectionType *type)
 }
 
 ICALL_EXPORT gint32
-ves_icall_MonoType_GetArrayRank (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetArrayRank (MonoReflectionType *type)
 {
        MonoClass *klass;
 
@@ -2313,6 +2560,8 @@ create_type_array (MonoDomain *domain, MonoBoolean runtimeTypeArray, int count)
 ICALL_EXPORT MonoArray*
 ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type, MonoBoolean runtimeTypeArray)
 {
+       MonoError error;
+       MonoReflectionType *rt;
        MonoArray *res;
        MonoClass *klass, *pklass;
        MonoDomain *domain = mono_object_domain (type);
@@ -2324,14 +2573,22 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type, MonoBoolean ru
                MonoGenericContainer *container = klass->generic_container;
                res = create_type_array (domain, runtimeTypeArray, container->type_argc);
                for (i = 0; i < container->type_argc; ++i) {
-                       pklass = mono_class_from_generic_parameter (mono_generic_container_get_param (container, i), klass->image, FALSE);
-                       mono_array_setref (res, i, mono_type_get_object (domain, &pklass->byval_arg));
+                       pklass = mono_class_from_generic_parameter_internal (mono_generic_container_get_param (container, i));
+
+                       rt = mono_type_get_object_checked (domain, &pklass->byval_arg, &error);
+                       mono_error_raise_exception (&error);
+
+                       mono_array_setref (res, i, rt);
                }
        } else if (klass->generic_class) {
                MonoGenericInst *inst = klass->generic_class->context.class_inst;
                res = create_type_array (domain, runtimeTypeArray, inst->type_argc);
-               for (i = 0; i < inst->type_argc; ++i)
-                       mono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));
+               for (i = 0; i < inst->type_argc; ++i) {
+                       rt = mono_type_get_object_checked (domain, inst->type_argv [i], &error);
+                       mono_error_raise_exception (&error);
+
+                       mono_array_setref (res, i, rt);
+               }
        } else {
                res = NULL;
        }
@@ -2339,7 +2596,7 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type, MonoBoolean ru
 }
 
 ICALL_EXPORT gboolean
-ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsGenericTypeDefinition (MonoReflectionType *type)
 {
        MonoClass *klass;
 
@@ -2354,8 +2611,10 @@ ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
 }
 
 ICALL_EXPORT MonoReflectionType*
-ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_GetGenericTypeDefinition_impl (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass;
 
        if (type->type->byref)
@@ -2373,9 +2632,13 @@ ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
                tb = mono_class_get_ref_info (generic_class);
 
                if (generic_class->wastypebuilder && tb)
-                       return tb;
-               else
-                       return mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);
+                       return (MonoReflectionType *)tb;
+               else {
+                       ret = mono_type_get_object_checked (mono_object_domain (type), &generic_class->byval_arg, &error);
+                       mono_error_raise_exception (&error);
+
+                       return ret;
+               }
        }
        return NULL;
 }
@@ -2383,18 +2646,21 @@ ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
 ICALL_EXPORT MonoReflectionType*
 ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass;
        MonoType *geninst, **types;
        int i, count;
 
        g_assert (IS_MONOTYPE (type));
-       mono_class_init_or_throw (mono_class_from_mono_type (type->type));
+       mono_class_init_checked (mono_class_from_mono_type (type->type), &error);
+       mono_error_raise_exception (&error);
 
        count = mono_array_length (type_array);
        types = g_new0 (MonoType *, count);
 
        for (i = 0; i < count; i++) {
-               MonoReflectionType *t = mono_array_get (type_array, gpointer, i);
+               MonoReflectionType *t = (MonoReflectionType *)mono_array_get (type_array, gpointer, i);
                types [i] = t->type;
        }
 
@@ -2411,11 +2677,14 @@ ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)
                return NULL;
        }
 
-       return mono_type_get_object (mono_object_domain (type), geninst);
+       ret = mono_type_get_object_checked (mono_object_domain (type), geninst, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT gboolean
-ves_icall_Type_get_IsGenericType (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_HasInstantiation (MonoReflectionType *type)
 {
        MonoClass *klass;
 
@@ -2445,12 +2714,14 @@ ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)
 {
        g_assert (IS_MONOTYPE (type));
        g_assert (is_generic_parameter (type->type));
-       return mono_generic_param_info (type->type->data.generic_param)->flags;
+       return (GenericParameterAttributes)mono_generic_param_info (type->type->data.generic_param)->flags;
 }
 
 ICALL_EXPORT MonoArray *
 ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *rt;
        MonoGenericParamInfo *param_info;
        MonoDomain *domain;
        MonoClass **ptr;
@@ -2465,15 +2736,19 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
                ;
 
        res = mono_array_new (domain, mono_defaults.monotype_class, count);
-       for (i = 0; i < count; i++)
-               mono_array_setref (res, i, mono_type_get_object (domain, &param_info->constraints [i]->byval_arg));
+       for (i = 0; i < count; i++) {
+               rt = mono_type_get_object_checked (domain, &param_info->constraints [i]->byval_arg, &error);
+               mono_error_raise_exception (&error);
+
+               mono_array_setref (res, i, rt);
+       }
 
 
        return res;
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
+ves_icall_RuntimeTypeHandle_IsGenericVariable (MonoReflectionType *type)
 {
        return is_generic_parameter (type->type);
 }
@@ -2499,19 +2774,24 @@ ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type,
        MonoClass *klass;
        MonoMethod *method;
        gpointer iter;
+       MonoError error;
+       MonoReflectionMethod *ret = NULL;
                
        domain = ((MonoObject *)type)->vtable->domain;
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        iter = NULL;
        while ((method = mono_class_get_methods (klass, &iter))) {
-                if (method->token == generic->method->token)
-                        return mono_method_get_object (domain, method, klass);
+                if (method->token == generic->method->token) {
+                       ret = mono_method_get_object_checked (domain, method, klass, &error);
+                       mono_error_raise_exception (&error);
+               }
         }
 
-        return NULL;
+       return ret;
 }
 
 ICALL_EXPORT MonoReflectionMethod *
@@ -2519,6 +2799,8 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type)
 {
        MonoMethod *method;
        MonoType *type = ref_type->type;
+       MonoError error;
+       MonoReflectionMethod *ret = NULL;
 
        if (type->byref || (type->type != MONO_TYPE_MVAR && type->type != MONO_TYPE_VAR)) {
                mono_set_pending_exception (mono_get_exception_invalid_operation ("DeclaringMethod can only be used on generic arguments"));
@@ -2529,7 +2811,11 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *ref_type)
 
        method = mono_type_get_generic_param_owner (type)->owner.method;
        g_assert (method);
-       return mono_method_get_object (mono_object_domain (ref_type), method, method->klass);
+
+       ret = mono_method_get_object_checked (mono_object_domain (ref_type), method, method->klass, &error);
+       if (!mono_error_ok (&error))
+               mono_set_pending_exception (mono_error_convert_to_exception (&error));
+       return ret;
 }
 
 ICALL_EXPORT MonoBoolean
@@ -2562,7 +2848,7 @@ ves_icall_MonoMethod_GetPInvoke (MonoReflectionMethod *method, int* flags, MonoS
 
        if (image_is_dynamic (image)) {
                MonoReflectionMethodAux *method_aux = 
-                       g_hash_table_lookup (((MonoDynamicImage*)image)->method_aux_hash, method->method);
+                       (MonoReflectionMethodAux *)g_hash_table_lookup (((MonoDynamicImage*)image)->method_aux_hash, method->method);
                if (method_aux) {
                        import = method_aux->dllentry;
                        scope = method_aux->dll;
@@ -2594,6 +2880,8 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
 {
        MonoMethodInflated *imethod;
        MonoMethod *result;
+       MonoReflectionMethod *ret = NULL;
+       MonoError error;
 
        if (method->method->is_generic)
                return method;
@@ -2617,7 +2905,7 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
                 * the dynamic case as well ?
                 */
                mono_image_lock ((MonoImage*)image);
-               res = mono_g_hash_table_lookup (image->generic_def_objects, imethod);
+               res = (MonoReflectionMethod *)mono_g_hash_table_lookup (image->generic_def_objects, imethod);
                mono_image_unlock ((MonoImage*)image);
 
                if (res)
@@ -2628,13 +2916,17 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
                MonoClass *klass = ((MonoMethod *) imethod)->klass;
                /*Generic methods gets the context of the GTD.*/
                if (mono_class_get_context (klass)) {
-                       MonoError error;
                        result = mono_class_inflate_generic_method_full_checked (result, klass, mono_class_get_context (klass), &error);
-                       mono_error_raise_exception (&error);
+                       if (!mono_error_ok (&error))
+                               goto leave;
                }
        }
 
-       return mono_method_get_object (mono_object_domain (method), result, NULL);
+       ret = mono_method_get_object_checked (mono_object_domain (method), result, NULL, &error);
+leave:
+       if (!mono_error_ok (&error))
+               mono_error_set_pending_exception (&error);
+       return ret;
 }
 
 ICALL_EXPORT gboolean
@@ -2652,6 +2944,8 @@ ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method
 ICALL_EXPORT MonoArray*
 ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
 {
+       MonoError error;
+       MonoReflectionType *rt;
        MonoArray *res;
        MonoDomain *domain;
        int count, i;
@@ -2665,8 +2959,12 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
                        count = inst->type_argc;
                        res = mono_array_new (domain, mono_defaults.systemtype_class, count);
 
-                       for (i = 0; i < count; i++)
-                               mono_array_setref (res, i, mono_type_get_object (domain, inst->type_argv [i]));
+                       for (i = 0; i < count; i++) {
+                               rt = mono_type_get_object_checked (domain, inst->type_argv [i], &error);
+                               mono_error_raise_exception (&error);
+
+                               mono_array_setref (res, i, rt);
+                       }
 
                        return res;
                }
@@ -2678,10 +2976,12 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
        for (i = 0; i < count; i++) {
                MonoGenericContainer *container = mono_method_get_generic_container (method->method);
                MonoGenericParam *param = mono_generic_container_get_param (container, i);
-               MonoClass *pklass = mono_class_from_generic_parameter (
-                       param, method->method->klass->image, TRUE);
-               mono_array_setref (res, i,
-                               mono_type_get_object (domain, &pklass->byval_arg));
+               MonoClass *pklass = mono_class_from_generic_parameter_internal (param);
+
+               rt = mono_type_get_object_checked (domain, &pklass->byval_arg, &error);
+               mono_error_raise_exception (&error);
+
+               mono_array_setref (res, i, rt);
        }
 
        return res;
@@ -2690,6 +2990,7 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
 ICALL_EXPORT MonoObject *
 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, MonoArray *params, MonoException **exc) 
 {
+       MonoError error;
        /* 
         * Invoke from reflection is supposed to always be a virtual call (the API
         * is stupid), mono_runtime_invoke_*() calls the provided method, allowing
@@ -2707,7 +3008,8 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo
                mono_security_core_clr_ensure_reflection_access_method (m);
 
        if (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {
-               if (!mono_class_vtable_full (mono_object_domain (method), m->klass, FALSE)) {
+               if (!mono_class_vtable_full (mono_object_domain (method), m->klass, &error)) {
+                       mono_error_cleanup (&error); /* FIXME does this make sense? */
                        mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_class_get_exception_for_failure (m->klass));
                        return NULL;
                }
@@ -2761,22 +3063,30 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo
        }
        
        if (m->klass->rank && !strcmp (m->name, ".ctor")) {
+               MonoArray *arr;
                int i;
                uintptr_t *lengths;
                intptr_t *lower_bounds;
                pcount = mono_array_length (params);
-               lengths = alloca (sizeof (uintptr_t) * pcount);
+               lengths = (uintptr_t *)alloca (sizeof (uintptr_t) * pcount);
                /* Note: the synthetized array .ctors have int32 as argument type */
                for (i = 0; i < pcount; ++i)
                        lengths [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));
 
                if (m->klass->rank == 1 && sig->param_count == 2 && m->klass->element_class->rank) {
                        /* This is a ctor for jagged arrays. MS creates an array of arrays. */
-                       MonoArray *arr = mono_array_new_full (mono_object_domain (params), m->klass, lengths, NULL);
+                       arr = mono_array_new_full_checked (mono_object_domain (params), m->klass, lengths, NULL, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
 
                        for (i = 0; i < mono_array_length (arr); ++i) {
-                               MonoArray *subarray = mono_array_new_full (mono_object_domain (params), m->klass->element_class, &lengths [1], NULL);
-
+                               MonoArray *subarray = mono_array_new_full_checked (mono_object_domain (params), m->klass->element_class, &lengths [1], NULL, &error);
+                               if (!mono_error_ok (&error)) {
+                                       mono_error_set_pending_exception (&error);
+                                       return NULL;
+                               }
                                mono_array_setref_fast (arr, i, subarray);
                        }
                        return (MonoObject*)arr;
@@ -2784,18 +3094,30 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo
 
                if (m->klass->rank == pcount) {
                        /* Only lengths provided. */
-                       return (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, NULL);
+                       arr = mono_array_new_full_checked (mono_object_domain (params), m->klass, lengths, NULL, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+
+                       return (MonoObject*)arr;
                } else {
                        g_assert (pcount == (m->klass->rank * 2));
                        /* The arguments are lower-bound-length pairs */
-                       lower_bounds = g_alloca (sizeof (intptr_t) * pcount);
+                       lower_bounds = (intptr_t *)g_alloca (sizeof (intptr_t) * pcount);
 
                        for (i = 0; i < pcount / 2; ++i) {
                                lower_bounds [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, (i * 2)) + sizeof (MonoObject));
                                lengths [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, (i * 2) + 1) + sizeof (MonoObject));
                        }
 
-                       return (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);
+                       arr = mono_array_new_full_checked (mono_object_domain (params), m->klass, lengths, lower_bounds, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+
+                       return (MonoObject*)arr;
                }
        }
        return mono_runtime_invoke_array (m, obj, params, NULL);
@@ -2836,7 +3158,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M
                                        if (field_klass->valuetype)
                                                result = mono_value_box (domain, field_klass, (char *)this_arg + field->offset);
                                        else 
-                                               result = *((gpointer *)((char *)this_arg + field->offset));
+                                               result = (MonoObject *)*((gpointer *)((char *)this_arg + field->offset));
                                
                                        out_args = mono_array_new (domain, mono_defaults.object_class, 1);
                                        mono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args);
@@ -2872,7 +3194,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M
                                MonoClassField* field = mono_class_get_field_from_name (k, str);
                                if (field) {
                                        MonoClass *field_klass =  mono_class_from_mono_type (field->type);
-                                       MonoObject *val = mono_array_get (params, gpointer, 2);
+                                       MonoObject *val = (MonoObject *)mono_array_get (params, gpointer, 2);
 
                                        if (field_klass->valuetype) {
                                                size = mono_type_size (field->type, &align);
@@ -2967,19 +3289,19 @@ write_enum_value (char *mem, int type, guint64 value)
        }
        case MONO_TYPE_U2:
        case MONO_TYPE_I2: {
-               guint16 *p = (void*)mem;
+               guint16 *p = (guint16 *)mem;
                *p = value;
                break;
        }
        case MONO_TYPE_U4:
        case MONO_TYPE_I4: {
-               guint32 *p = (void*)mem;
+               guint32 *p = (guint32 *)mem;
                *p = value;
                break;
        }
        case MONO_TYPE_U8:
        case MONO_TYPE_I8: {
-               guint64 *p = (void*)mem;
+               guint64 *p = (guint64 *)mem;
                *p = value;
                break;
        }
@@ -2992,6 +3314,7 @@ write_enum_value (char *mem, int type, guint64 value)
 ICALL_EXPORT MonoObject *
 ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, guint64 value)
 {
+       MonoError error;
        MonoDomain *domain; 
        MonoClass *enumc;
        MonoObject *res;
@@ -3000,11 +3323,13 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, guint64 value)
        domain = mono_object_domain (enumType); 
        enumc = mono_class_from_mono_type (enumType->type);
 
-       mono_class_init_or_throw (enumc);
+       mono_class_init_checked (enumc, &error);
+       mono_error_raise_exception (&error);
 
        etype = mono_class_enum_basetype (enumc);
 
-       res = mono_object_new (domain, enumc);
+       res = mono_object_new_checked (domain, enumc, &error);
+       mono_error_raise_exception (&error);
        write_enum_value ((char *)res + sizeof (MonoObject), etype->type, value);
 
        return res;
@@ -3025,6 +3350,7 @@ ves_icall_System_Enum_InternalHasFlag (MonoObject *a, MonoObject *b)
 ICALL_EXPORT MonoObject *
 ves_icall_System_Enum_get_value (MonoObject *eobj)
 {
+       MonoError error;
        MonoObject *res;
        MonoClass *enumc;
        gpointer dst;
@@ -3037,7 +3363,8 @@ ves_icall_System_Enum_get_value (MonoObject *eobj)
        g_assert (eobj->vtable->klass->enumtype);
        
        enumc = mono_class_from_mono_type (mono_class_enum_basetype (eobj->vtable->klass));
-       res = mono_object_new (mono_object_domain (eobj), enumc);
+       res = mono_object_new_checked (mono_object_domain (eobj), enumc, &error);
+       mono_error_raise_exception (&error);
        dst = (char *)res + sizeof (MonoObject);
        src = (char *)eobj + sizeof (MonoObject);
        size = mono_class_value_size (enumc, NULL);
@@ -3050,11 +3377,14 @@ ves_icall_System_Enum_get_value (MonoObject *eobj)
 ICALL_EXPORT MonoReflectionType *
 ves_icall_System_Enum_get_underlying_type (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoType *etype;
        MonoClass *klass;
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        etype = mono_class_enum_basetype (klass);
        if (!etype) {
@@ -3062,7 +3392,10 @@ ves_icall_System_Enum_get_underlying_type (MonoReflectionType *type)
                return NULL;
        }
 
-       return mono_type_get_object (mono_object_domain (type), etype);
+       ret = mono_type_get_object_checked (mono_object_domain (type), etype, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT int
@@ -3153,6 +3486,7 @@ ves_icall_System_Enum_get_hashcode (MonoObject *eobj)
 ICALL_EXPORT MonoBoolean
 ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionType *type, MonoArray **values, MonoArray **names)
 {
+       MonoError error;
        MonoDomain *domain = mono_object_domain (type); 
        MonoClass *enumc = mono_class_from_mono_type (type->type);
        guint j = 0, nvalues;
@@ -3162,7 +3496,8 @@ ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionType *type, MonoArray
        guint64 field_value, previous_value = 0;
        gboolean sorted = TRUE;
 
-       mono_class_init_or_throw (enumc);
+       mono_class_init_checked (enumc, &error);
+       mono_error_raise_exception (&error);
 
        if (!enumc->enumtype) {
                mono_set_pending_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum."));
@@ -3226,6 +3561,7 @@ enum {
 ICALL_EXPORT MonoArray*
 ves_icall_Type_GetFields_internal (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoReflectionType *reftype)
 {
+       MonoError error;
        MonoDomain *domain; 
        MonoClass *startklass, *klass, *refklass;
        MonoArray *res;
@@ -3247,7 +3583,7 @@ ves_icall_Type_GetFields_internal (MonoReflectionType *type, MonoString *name, g
        mono_ptr_array_init (tmp_array, 2, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection fields list");
        
 handle_parent: 
-       if (klass->exception_type != MONO_EXCEPTION_NONE) {
+       if (mono_class_has_failure (klass)) {
                mono_ptr_array_destroy (tmp_array);
                mono_set_pending_exception (mono_class_get_exception_for_failure (klass));
                return NULL;
@@ -3292,7 +3628,9 @@ handle_parent:
                                continue;
                }
 
-               member = (MonoObject*)mono_field_get_object (domain, refklass, field);
+               member = (MonoObject*)mono_field_get_object_checked (domain, refklass, field, &error);
+               if (!mono_error_ok (&error))
+                   goto fail;
                mono_ptr_array_append (tmp_array, member);
        }
        if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
@@ -3309,6 +3647,10 @@ handle_parent:
                g_free (utf8_name);
 
        return res;
+fail:
+       mono_ptr_array_destroy (tmp_array);
+       mono_error_raise_exception (&error);
+       g_assert_not_reached ();
 }
 
 static gboolean
@@ -3358,7 +3700,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla
 
        mono_class_setup_methods (klass);
        mono_class_setup_vtable (klass);
-       if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())
+       if (mono_class_has_failure (klass) || mono_loader_get_last_error ())
                goto loader_error;
 
        if (is_generic_parameter (&klass->byval_arg))
@@ -3374,7 +3716,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla
 handle_parent:
        mono_class_setup_methods (klass);
        mono_class_setup_vtable (klass);
-       if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())
+       if (mono_class_has_failure (klass) || mono_loader_get_last_error ())
                goto loader_error;              
 
        iter = NULL;
@@ -3431,7 +3773,7 @@ loader_error:
                g_free (method_slots);
        g_ptr_array_free (array, TRUE);
 
-       if (klass->exception_type != MONO_EXCEPTION_NONE) {
+       if (mono_class_has_failure (klass)) {
                *ex = mono_class_get_exception_for_failure (klass);
        } else {
                *ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());
@@ -3444,6 +3786,7 @@ ICALL_EXPORT MonoArray*
 ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
 {
        static MonoClass *MethodInfo_array;
+       MonoError error;
        MonoDomain *domain; 
        MonoArray *res;
        MonoVTable *array_vtable;
@@ -3453,6 +3796,8 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui
        MonoClass *klass, *refklass;
        int i;
 
+       mono_error_init (&error);
+
        if (!MethodInfo_array) {
                MonoClass *klass = mono_array_class_get (mono_defaults.method_info_class, 1);
                mono_memory_barrier ();
@@ -3462,9 +3807,17 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui
        klass = mono_class_from_mono_type (type->type);
        refklass = mono_class_from_mono_type (reftype->type);
        domain = ((MonoObject *)type)->vtable->domain;
-       array_vtable = mono_class_vtable_full (domain, MethodInfo_array, TRUE);
-       if (type->type->byref)
-               return mono_array_new_specific (array_vtable, 0);
+       array_vtable = mono_class_vtable_full (domain, MethodInfo_array, &error);
+       if (!is_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
+       if (type->type->byref) {
+               res = mono_array_new_specific_checked (array_vtable, 0, &error);
+               mono_error_set_pending_exception (&error);
+
+               return res;
+       }
 
        if (name)
                mname = mono_string_to_utf8 (name);
@@ -3476,14 +3829,24 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui
                return NULL;
        }
 
-       res = mono_array_new_specific (array_vtable, method_array->len);
+       res = mono_array_new_specific_checked (array_vtable, method_array->len, &error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
 
        for (i = 0; i < method_array->len; ++i) {
-               MonoMethod *method = g_ptr_array_index (method_array, i);
-               mono_array_setref (res, i, mono_method_get_object (domain, method, refklass));
+               MonoMethod *method = (MonoMethod *)g_ptr_array_index (method_array, i);
+               MonoReflectionMethod *rm = mono_method_get_object_checked (domain, method, refklass, &error);
+               if (!mono_error_ok (&error))
+                       goto failure;
+               mono_array_setref (res, i, rm);
        }
 
+failure:
        g_ptr_array_free (method_array, TRUE);
+       if (!mono_error_ok (&error))
+               mono_set_pending_exception (mono_error_convert_to_exception (&error));
        return res;
 }
 
@@ -3491,7 +3854,6 @@ ICALL_EXPORT MonoArray*
 ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
 {
        MonoDomain *domain; 
-       static MonoClass *System_Reflection_ConstructorInfo;
        MonoClass *startklass, *klass, *refklass;
        MonoArray *res;
        MonoMethod *method;
@@ -3499,6 +3861,7 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag
        int i, match;
        gpointer iter = NULL;
        MonoPtrArray tmp_array;
+       MonoError error;
        
        mono_ptr_array_init (tmp_array, 4, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection constructors list"); /*FIXME, guestimating*/
 
@@ -3508,12 +3871,8 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag
        klass = startklass = mono_class_from_mono_type (type->type);
        refklass = mono_class_from_mono_type (reftype->type);
 
-       if (!System_Reflection_ConstructorInfo)
-               System_Reflection_ConstructorInfo = mono_class_from_name (
-                       mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
-
        mono_class_setup_methods (klass);
-       if (klass->exception_type != MONO_EXCEPTION_NONE) {
+       if (mono_class_has_failure (klass)) {
                mono_set_pending_exception (mono_class_get_exception_for_failure (klass));
                return NULL;
        }
@@ -3544,12 +3903,16 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag
 
                if (!match)
                        continue;
-               member = (MonoObject*)mono_method_get_object (domain, method, refklass);
+               member = (MonoObject*)mono_method_get_object_checked (domain, method, refklass, &error);
+               if (!mono_error_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
 
                mono_ptr_array_append (tmp_array, member);
        }
 
-       res = mono_array_new_cached (domain, System_Reflection_ConstructorInfo, mono_ptr_array_size (tmp_array));
+       res = mono_array_new_cached (domain, mono_class_get_constructor_info_class (), mono_ptr_array_size (tmp_array));
 
        for (i = 0; i < mono_ptr_array_size (tmp_array); ++i)
                mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));
@@ -3620,9 +3983,8 @@ property_accessor_nonpublic (MonoMethod* accessor, gboolean start_klass)
 ICALL_EXPORT MonoArray*
 ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
 {
-       MonoException *ex;
+       MonoError error;
        MonoDomain *domain; 
-       static MonoClass *System_Reflection_PropertyInfo;
        MonoClass *startklass, *klass;
        MonoArray *res;
        MonoMethod *method;
@@ -3635,15 +3997,13 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name,
        GHashTable *properties = NULL;
        MonoPtrArray tmp_array;
 
+       mono_error_init (&error);
+       
        mono_ptr_array_init (tmp_array, 8, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection properties list"); /*This the average for ASP.NET types*/
 
-       if (!System_Reflection_PropertyInfo)
-               System_Reflection_PropertyInfo = mono_class_from_name (
-                       mono_defaults.corlib, "System.Reflection", "PropertyInfo");
-
        domain = ((MonoObject *)type)->vtable->domain;
        if (type->type->byref)
-               return mono_array_new_cached (domain, System_Reflection_PropertyInfo, 0);
+               return mono_array_new_cached (domain, mono_class_get_property_info_class (), 0);
        klass = startklass = mono_class_from_mono_type (type->type);
 
        if (name != NULL) {
@@ -3655,7 +4015,7 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name,
 handle_parent:
        mono_class_setup_methods (klass);
        mono_class_setup_vtable (klass);
-       if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())
+       if (mono_class_has_failure (klass) || mono_loader_get_last_error ())
                goto loader_error;
 
        iter = NULL;
@@ -3702,7 +4062,10 @@ handle_parent:
                if (g_hash_table_lookup (properties, prop))
                        continue;
 
-               mono_ptr_array_append (tmp_array, mono_property_get_object (domain, startklass, prop));
+               MonoReflectionProperty *pr = mono_property_get_object_checked (domain, startklass, prop, &error);
+               if (!pr)
+                       goto failure;
+               mono_ptr_array_append (tmp_array, pr);
                
                g_hash_table_insert (properties, prop, prop);
        }
@@ -3712,7 +4075,7 @@ handle_parent:
        g_hash_table_destroy (properties);
        g_free (propname);
 
-       res = mono_array_new_cached (domain, System_Reflection_PropertyInfo, mono_ptr_array_size (tmp_array));
+       res = mono_array_new_cached (domain, mono_class_get_property_info_class (), mono_ptr_array_size (tmp_array));
        for (i = 0; i < mono_ptr_array_size (tmp_array); ++i)
                mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));
 
@@ -3720,20 +4083,25 @@ handle_parent:
 
        return res;
 
+
+
 loader_error:
+       if (mono_class_has_failure (klass)) {
+               mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass));
+       } else {
+               mono_error_set_from_loader_error (&error);
+               mono_loader_clear_error ();
+       }
+
+failure:
        if (properties)
                g_hash_table_destroy (properties);
        if (name)
                g_free (propname);
        mono_ptr_array_destroy (tmp_array);
 
-       if (klass->exception_type != MONO_EXCEPTION_NONE) {
-               ex = mono_class_get_exception_for_failure (klass);
-       } else {
-               ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());
-               mono_loader_clear_error ();
-       }
-       mono_set_pending_exception (ex);
+       mono_error_set_pending_exception (&error);
+
        return NULL;
 }
 
@@ -3755,9 +4123,8 @@ event_equal (MonoEvent *event1, MonoEvent *event2)
 ICALL_EXPORT MonoArray*
 ves_icall_Type_GetEvents_internal (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoReflectionType *reftype)
 {
-       MonoException *ex;
+       MonoError error;
        MonoDomain *domain; 
-       static MonoClass *System_Reflection_EventInfo;
        MonoClass *startklass, *klass;
        MonoArray *res;
        MonoMethod *method;
@@ -3769,22 +4136,20 @@ ves_icall_Type_GetEvents_internal (MonoReflectionType *type, MonoString *name, g
        GHashTable *events = NULL;
        MonoPtrArray tmp_array;
 
+       mono_error_init (&error);
+       
        mono_ptr_array_init (tmp_array, 4, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection events list");
 
-       if (!System_Reflection_EventInfo)
-               System_Reflection_EventInfo = mono_class_from_name (
-                       mono_defaults.corlib, "System.Reflection", "EventInfo");
-
        domain = mono_object_domain (type);
        if (type->type->byref)
-               return mono_array_new_cached (domain, System_Reflection_EventInfo, 0);
+               return mono_array_new_cached (domain, mono_class_get_event_info_class (), 0);
        klass = startklass = mono_class_from_mono_type (type->type);
 
        events = g_hash_table_new (event_hash, (GEqualFunc)event_equal);
 handle_parent:
        mono_class_setup_methods (klass);
        mono_class_setup_vtable (klass);
-       if (klass->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ())
+       if (mono_class_has_failure (klass) || mono_loader_get_last_error ())
                goto loader_error;
 
        iter = NULL;
@@ -3839,7 +4204,11 @@ handle_parent:
                if (g_hash_table_lookup (events, event))
                        continue;
 
-               mono_ptr_array_append (tmp_array, mono_event_get_object (domain, startklass, event));
+               MonoReflectionEvent *ev_obj;
+               ev_obj = mono_event_get_object_checked (domain, startklass, event, &error);
+               if (!ev_obj)
+                       goto failure;
+               mono_ptr_array_append (tmp_array, ev_obj);
 
                g_hash_table_insert (events, event, event);
        }
@@ -3848,7 +4217,7 @@ handle_parent:
 
        g_hash_table_destroy (events);
 
-       res = mono_array_new_cached (domain, System_Reflection_EventInfo, mono_ptr_array_size (tmp_array));
+       res = mono_array_new_cached (domain, mono_class_get_event_info_class (), mono_ptr_array_size (tmp_array));
 
        for (i = 0; i < mono_ptr_array_size (tmp_array); ++i)
                mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));
@@ -3861,24 +4230,34 @@ handle_parent:
        return res;
 
 loader_error:
-       mono_ptr_array_destroy (tmp_array);
-       if (klass->exception_type != MONO_EXCEPTION_NONE) {
-               ex = mono_class_get_exception_for_failure (klass);
+       if (mono_class_has_failure (klass)) {
+               mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass));
        } else {
-               ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());
+               mono_error_set_from_loader_error (&error);
                mono_loader_clear_error ();
        }
-       mono_set_pending_exception (ex);
+
+failure:
+       
+       if (events != NULL)
+               g_hash_table_destroy (events);
+       if (utf8_name != NULL)
+               g_free (utf8_name);
+
+       mono_ptr_array_destroy (tmp_array);
+
+       mono_error_set_pending_exception (&error);
        return NULL;
 }
 
 ICALL_EXPORT MonoArray*
 ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint32 bflags)
 {
+       MonoError error;
+       MonoReflectionType *rt;
        MonoDomain *domain; 
        MonoClass *klass;
        MonoArray *res;
-       MonoObject *member;
        int i, match;
        MonoClass *nested;
        gpointer iter;
@@ -3926,8 +4305,10 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint
                                continue;
                }
 
-               member = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);
-               mono_ptr_array_append (tmp_array, member);
+               rt = mono_type_get_object_checked (domain, &nested->byval_arg, &error);
+               mono_error_raise_exception (&error);
+
+               mono_ptr_array_append (tmp_array, (MonoObject*) rt);
        }
 
        res = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array));
@@ -3946,6 +4327,8 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint
 ICALL_EXPORT MonoReflectionType*
 ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        gchar *str;
        MonoType *type = NULL;
        MonoTypeNameParse info;
@@ -4041,7 +4424,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
                MonoClass *klass = mono_type_get_class (type);
 
                /* need to report exceptions ? */
-               if (throwOnError && klass->exception_type) {
+               if (throwOnError && mono_class_has_failure (klass)) {
                        /* report SecurityException (or others) that occured when loading the assembly */
                        MonoException *exc = mono_class_get_exception_for_failure (klass);
                        mono_loader_clear_error ();
@@ -4051,7 +4434,10 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
        }
 
        /* g_print ("got it\n"); */
-       return mono_type_get_object (mono_object_domain (assembly), type);
+       ret = mono_type_get_object_checked (mono_object_domain (assembly), type, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 static gboolean
@@ -4144,9 +4530,11 @@ ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAs
 ICALL_EXPORT MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)
 {
+       MonoError error;
        gchar *name;
        MonoAssembly *res;
        MonoImageOpenStatus status;
+       MonoReflectionAssembly* result = NULL;
        
        name = mono_string_to_utf8 (mname);
        res = mono_assembly_load_with_partial_name (name, &status);
@@ -4155,7 +4543,10 @@ ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname,
 
        if (res == NULL)
                return NULL;
-       return mono_assembly_get_object (mono_domain_get (), res);
+       result = mono_assembly_get_object_checked (mono_domain_get (), res, &error);
+       if (!result)
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoString *
@@ -4187,21 +4578,34 @@ ICALL_EXPORT MonoReflectionMethod*
 ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly) 
 {
        MonoError error;
+       MonoReflectionMethod *res = NULL;
        MonoMethod *method;
+
        guint32 token = mono_image_get_entry_point (assembly->assembly->image);
 
        if (!token)
                return NULL;
        method = mono_get_method_checked (assembly->assembly->image, token, NULL, NULL, &error);
-       mono_error_raise_exception (&error);
+       if (!mono_error_ok (&error))
+               goto leave;
+
+       res = mono_method_get_object_checked (mono_object_domain (assembly), method, NULL, &error);
 
-       return mono_method_get_object (mono_object_domain (assembly), method, NULL);
+leave:
+       if (!mono_error_ok (&error))
+               mono_error_set_pending_exception (&error);
+       return res;
 }
 
 ICALL_EXPORT MonoReflectionModule*
 ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAssembly *assembly) 
 {
-       return mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);
+       MonoError error;
+       MonoReflectionModule *result = NULL;
+       result = mono_module_get_object_checked (mono_object_domain (assembly), assembly->assembly->image, &error);
+       if (!mono_error_ok (&error))
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoArray*
@@ -4220,21 +4624,18 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAss
 }
 
 static MonoObject*
-create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)
+create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision, MonoError *error)
 {
-       static MonoClass *System_Version = NULL;
        static MonoMethod *create_version = NULL;
        MonoObject *result;
        gpointer args [4];
+
+       mono_error_init (error);
        
-       if (!System_Version) {
-               System_Version = mono_class_from_name (mono_defaults.corlib, "System", "Version");
-               g_assert (System_Version);
-       }
 
        if (!create_version) {
                MonoMethodDesc *desc = mono_method_desc_new (":.ctor(int,int,int,int)", FALSE);
-               create_version = mono_method_desc_search_in_class (desc, System_Version);
+               create_version = mono_method_desc_search_in_class (desc, mono_class_get_system_version_class ());
                g_assert (create_version);
                mono_method_desc_free (desc);
        }
@@ -4243,8 +4644,11 @@ create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build,
        args [1] = &minor;
        args [2] = &build;
        args [3] = &revision;
-       result = mono_object_new (domain, System_Version);
-       mono_runtime_invoke (create_version, result, args, NULL);
+       result = mono_object_new_checked (domain, mono_class_get_system_version_class (), error);
+       return_val_if_nok (error, NULL);
+
+       mono_runtime_invoke_checked (create_version, result, args, error);
+       return_val_if_nok (error, NULL);
 
        return result;
 }
@@ -4252,22 +4656,19 @@ create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build,
 ICALL_EXPORT MonoArray*
 ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly) 
 {
-       static MonoClass *System_Reflection_AssemblyName;
+       MonoError error;
        MonoArray *result;
        MonoDomain *domain = mono_object_domain (assembly);
        int i, count = 0;
        static MonoMethod *create_culture = NULL;
        MonoImage *image = assembly->assembly->image;
        MonoTableInfo *t;
-
-       if (!System_Reflection_AssemblyName)
-               System_Reflection_AssemblyName = mono_class_from_name (
-                       mono_defaults.corlib, "System.Reflection", "AssemblyName");
+       MonoObject *o;
 
        t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
        count = t->rows;
 
-       result = mono_array_new (domain, System_Reflection_AssemblyName, count);
+       result = mono_array_new (domain, mono_class_get_assembly_name_class (), count);
 
        if (count > 0 && !create_culture) {
                MonoMethodDesc *desc = mono_method_desc_new (
@@ -4278,13 +4679,15 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
        }
 
        for (i = 0; i < count; i++) {
+               MonoObject *version;
                MonoReflectionAssemblyName *aname;
                guint32 cols [MONO_ASSEMBLYREF_SIZE];
 
                mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);
 
-               aname = (MonoReflectionAssemblyName *) mono_object_new (
-                       domain, System_Reflection_AssemblyName);
+               aname = (MonoReflectionAssemblyName *) mono_object_new_checked (
+                       domain, mono_class_get_assembly_name_class (), &error);
+               mono_error_raise_exception (&error);
 
                MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));
 
@@ -4295,14 +4698,22 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                aname->flags = cols [MONO_ASSEMBLYREF_FLAGS];
                aname->versioncompat = 1; /* SameMachine (default) */
                aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
-               MONO_OBJECT_SETREF (aname, version, create_version (domain, aname->major, aname->minor, aname->build, aname->revision));
+
+               version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision, &error);
+               mono_error_raise_exception (&error);
+
+               MONO_OBJECT_SETREF (aname, version, version);
 
                if (create_culture) {
                        gpointer args [2];
                        MonoBoolean assembly_ref = 1;
                        args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
                        args [1] = &assembly_ref;
-                       MONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));
+
+                       o = mono_runtime_invoke_checked (create_culture, NULL, args, &error);
+                       mono_error_raise_exception (&error);
+
+                       MONO_OBJECT_SETREF (aname, cultureInfo, o);
                }
                
                if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
@@ -4350,6 +4761,7 @@ g_concat_dir_and_file (const char *dir, const char *file)
 ICALL_EXPORT void *
 ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module) 
 {
+       MonoError error;
        char *n = mono_string_to_utf8 (name);
        MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
        guint32 i;
@@ -4384,7 +4796,10 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflection
        else
                module = assembly->assembly->image;
 
-       mono_gc_wbarrier_generic_store (ref_module, (MonoObject*) mono_module_get_object (mono_domain_get (), module));
+       
+       MonoReflectionModule *rm = mono_module_get_object_checked (mono_domain_get (), module, &error);
+       mono_error_raise_exception (&error);
+       mono_gc_wbarrier_generic_store (ref_module, (MonoObject*) rm);
 
        return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);
 }
@@ -4392,6 +4807,7 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflection
 ICALL_EXPORT gboolean
 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)
 {
+       MonoError error;
        MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
        int i;
        guint32 cols [MONO_MANIFEST_SIZE];
@@ -4437,7 +4853,13 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec
                                mono_set_pending_exception (ex);
                                return FALSE;
                        }
-                       MONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]));
+                       MonoReflectionAssembly *assm_obj;
+                       assm_obj = mono_assembly_get_object_checked (mono_domain_get (), assembly->assembly->image->references [i - 1], &error);
+                       if (!assm_obj) {
+                               mono_error_set_pending_exception (&error);
+                               return FALSE;
+                       }
+                       MONO_OBJECT_SETREF (info, assembly, assm_obj);
 
                        /* Obtain info recursively */
                        ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
@@ -4504,6 +4926,7 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a
 ICALL_EXPORT MonoArray*
 ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)
 {
+       MonoError error;
        MonoDomain *domain = mono_domain_get();
        MonoArray *res;
        MonoClass *klass;
@@ -4528,21 +4951,28 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly
                if (modules [i])
                        real_module_count ++;
 
-       klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
+       klass = mono_class_get_module_class ();
        res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
 
-       mono_array_setref (res, 0, mono_module_get_object (domain, image));
+       MonoReflectionModule *image_obj = mono_module_get_object_checked (domain, image, &error);
+       mono_error_raise_exception (&error);
+       mono_array_setref (res, 0, image_obj);
        j = 1;
        for (i = 0; i < module_count; ++i)
                if (modules [i]) {
-                       mono_array_setref (res, j, mono_module_get_object (domain, modules[i]));
+                       MonoReflectionModule *rm = mono_module_get_object_checked (domain, modules[i], &error);
+                       mono_error_raise_exception (&error);
+                       mono_array_setref (res, j, rm);
                        ++j;
                }
 
        for (i = 0; i < file_count; ++i, ++j) {
                mono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE);
-               if (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)
-                       mono_array_setref (res, j, mono_module_file_get_object (domain, image, i));
+               if (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA) {
+                       MonoReflectionModule *rm = mono_module_file_get_object_checked (domain, image, i, &error);
+                       mono_error_raise_exception (&error);
+                       mono_array_setref (res, j, rm);
+               }
                else {
                        MonoImage *m = mono_image_load_file_for_image (image, i + 1);
                        if (!m) {
@@ -4550,7 +4980,9 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly
                                mono_set_pending_exception (mono_get_exception_file_not_found2 (NULL, fname));
                                return NULL;
                        }
-                       mono_array_setref (res, j, mono_module_get_object (domain, m));
+                       MonoReflectionModule *rm = mono_module_get_object_checked (domain, m, &error);
+                       mono_error_raise_exception (&error);
+                       mono_array_setref (res, j, rm);
                }
        }
 
@@ -4560,12 +4992,22 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly
 ICALL_EXPORT MonoReflectionMethod*
 ves_icall_GetCurrentMethod (void) 
 {
+       MonoReflectionMethod *res = NULL;
+       MonoError error;
+
        MonoMethod *m = mono_method_get_last_managed ();
 
+       if (!m) {
+               mono_set_pending_exception (mono_get_exception_not_supported ("Stack walks are not supported on this platform."));
+               return NULL;
+       }
+
        while (m->is_inflated)
                m = ((MonoMethodInflated*)m)->declaring;
 
-       return mono_method_get_object (mono_domain_get (), m, NULL);
+       res = mono_method_get_object_checked (mono_domain_get (), m, NULL, &error);
+       mono_error_raise_exception (&error);
+       return res;
 }
 
 
@@ -4591,7 +5033,7 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)
        }
 
        mono_class_setup_methods (method->klass);
-       if (method->klass->exception_type)
+       if (mono_class_has_failure (method->klass))
                return NULL;
        for (i = 0; i < method->klass->method.count; ++i) {
                if (method->klass->methods [i] == method) {
@@ -4600,7 +5042,7 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)
                }       
        }
        mono_class_setup_methods (klass);
-       if (klass->exception_type)
+       if (mono_class_has_failure (klass))
                return NULL;
        g_assert (offset >= 0 && offset < klass->method.count);
        return klass->methods [offset];
@@ -4609,6 +5051,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)
 ICALL_EXPORT MonoReflectionMethod*
 ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMethod *method, MonoType *type)
 {
+       MonoReflectionMethod *res = NULL;
+       MonoError error;
        MonoClass *klass;
        if (type) {
                klass = mono_class_from_mono_type (type);
@@ -4621,7 +5065,9 @@ ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMeth
                }
        } else
                klass = method->klass;
-       return mono_method_get_object (mono_domain_get (), method, klass);
+       res = mono_method_get_object_checked (mono_domain_get (), method, klass, &error);
+       mono_error_raise_exception (&error);
+       return res;
 }
 
 ICALL_EXPORT MonoReflectionMethodBody*
@@ -4633,30 +5079,42 @@ ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method
 ICALL_EXPORT MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
 {
+       MonoError error;
+       MonoReflectionAssembly *result;
        MonoMethod *dest = NULL;
 
        mono_stack_walk_no_il (get_executing, &dest);
        g_assert (dest);
-       return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
+       result = mono_assembly_get_object_checked (mono_domain_get (), dest->klass->image->assembly, &error);
+       if (!result)
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 
 ICALL_EXPORT MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
 {
+       MonoError error;
+       MonoReflectionAssembly *result;
        MonoDomain* domain = mono_domain_get ();
 
        if (!domain->entry_assembly)
                return NULL;
 
-       return mono_assembly_get_object (domain, domain->entry_assembly);
+       result = mono_assembly_get_object_checked (domain, domain->entry_assembly, &error);
+       if (!result)
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
 {
+       MonoError error;
        MonoMethod *m;
        MonoMethod *dest;
+       MonoReflectionAssembly *result;
 
        dest = NULL;
        mono_stack_walk_no_il (get_executing, &dest);
@@ -4664,7 +5122,14 @@ ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
        mono_stack_walk_no_il (get_caller_no_reflection, &dest);
        if (!dest)
                dest = m;
-       return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
+       if (!m) {
+               mono_set_pending_exception (mono_get_exception_not_supported ("Stack walks are not supported on this platform."));
+               return NULL;
+       }
+       result = mono_assembly_get_object_checked (mono_domain_get (), dest->klass->image->assembly, &error);
+       if (!result)
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoString *
@@ -4701,8 +5166,11 @@ ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full
 ICALL_EXPORT int
 vell_icall_MonoType_get_core_clr_security_level (MonoReflectionType *rfield)
 {
+       MonoError error;
        MonoClass *klass = mono_class_from_mono_type (rfield->type);
-       mono_class_init_or_throw (klass);
+
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
        return mono_security_core_clr_class_level (klass);
 }
 
@@ -4721,15 +5189,18 @@ ves_icall_MonoMethod_get_core_clr_security_level (MonoReflectionMethod *rfield)
 }
 
 static void
-fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token)
+fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version, gboolean default_publickey, gboolean default_token, MonoError *error)
 {
        static MonoMethod *create_culture = NULL;
+       MonoObject *obj;
        gpointer args [2];
        guint32 pkey_len;
        const char *pkey_ptr;
        gchar *codebase;
        MonoBoolean assembly_ref = 0;
 
+       mono_error_init (error);
+
        MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));
        aname->major = name->major;
        aname->minor = name->minor;
@@ -4740,8 +5211,14 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
        aname->versioncompat = 1; /* SameMachine (default) */
        aname->processor_architecture = name->arch;
 
-       if (by_default_version)
-               MONO_OBJECT_SETREF (aname, version, create_version (domain, name->major, name->minor, name->build, name->revision));
+       if (by_default_version) {
+               MonoObject *version;
+
+               version = create_version (domain, name->major, name->minor, name->build, name->revision, error);
+               return_if_nok (error);
+
+               MONO_OBJECT_SETREF (aname, version, version);
+       }
 
        codebase = NULL;
        if (absolute != NULL && *absolute != '\0') {
@@ -4784,7 +5261,11 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
        if (name->culture) {
                args [0] = mono_string_new (domain, name->culture);
                args [1] = &assembly_ref;
-               MONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));
+
+               obj = mono_runtime_invoke_checked (create_culture, NULL, args, error);
+               return_if_nok (error);
+
+               MONO_OBJECT_SETREF (aname, cultureInfo, obj);
        }
 
        if (name->public_key) {
@@ -4835,20 +5316,19 @@ ves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assem
 ICALL_EXPORT void
 ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
 {
+       MonoError error;
        gchar *absolute;
        MonoAssembly *mass = assembly->assembly;
 
        if (g_path_is_absolute (mass->image->name)) {
-               fill_reflection_assembly_name (mono_object_domain (assembly),
-                       aname, &mass->aname, mass->image->name, TRUE,
-                       TRUE, TRUE);
+               fill_reflection_assembly_name (mono_object_domain (assembly), aname, &mass->aname, mass->image->name, TRUE, TRUE, TRUE, &error);
+               mono_error_set_pending_exception (&error);
                return;
        }
        absolute = g_build_filename (mass->basedir, mass->image->name, NULL);
 
-       fill_reflection_assembly_name (mono_object_domain (assembly),
-               aname, &mass->aname, absolute, TRUE, TRUE,
-               TRUE);
+       fill_reflection_assembly_name (mono_object_domain (assembly), aname, &mass->aname, absolute, TRUE, TRUE, TRUE, &error);
+       mono_error_set_pending_exception (&error);
 
        g_free (absolute);
 }
@@ -4856,6 +5336,7 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly,
 ICALL_EXPORT void
 ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
 {
+       MonoError error;
        char *filename;
        MonoImageOpenStatus status = MONO_IMAGE_OK;
        gboolean res;
@@ -4891,11 +5372,11 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname,
                return;
        }
 
-       fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename,
-               TRUE, FALSE, TRUE);
+       fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename, TRUE, FALSE, TRUE, &error);
+       mono_error_set_pending_exception (&error);
 
-       g_free (filename);
        mono_image_close (image);
+       g_free (filename);
 }
 
 ICALL_EXPORT MonoBoolean
@@ -4943,13 +5424,16 @@ mono_module_type_is_visible (MonoTableInfo *tdef, MonoImage *image, int type)
 }
 
 static MonoArray*
-mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly)
+mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **exceptions, MonoBoolean exportedOnly, MonoError *error)
 {
+       MonoReflectionType *rt;
        MonoArray *res;
        MonoClass *klass;
        MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
        int i, count;
 
+       mono_error_init (error);
+
        /* we start the count from 1 because we skip the special type <Module> */
        if (exportedOnly) {
                count = 0;
@@ -4965,14 +5449,17 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti
        count = 0;
        for (i = 1; i < tdef->rows; ++i) {
                if (!exportedOnly || mono_module_type_is_visible (tdef, image, i + 1)) {
-                       MonoError error;
-                       klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, &error);
+                       klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, error);
                        mono_loader_assert_no_error (); /* Plug any leaks */
+                       mono_error_assert_ok (error);
                        
                        if (klass) {
-                               mono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));
+                               rt = mono_type_get_object_checked (domain, &klass->byval_arg, error);
+                               return_val_if_nok (error, NULL);
+
+                               mono_array_setref (res, count, rt);
                        } else {
-                               MonoException *ex = mono_error_convert_to_exception (&error);
+                               MonoException *ex = mono_error_convert_to_exception (error);
                                mono_array_setref (*exceptions, count, ex);
                        }
                        count++;
@@ -4985,6 +5472,7 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti
 ICALL_EXPORT MonoArray*
 ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
 {
+       MonoError error;
        MonoArray *res = NULL;
        MonoArray *exceptions = NULL;
        MonoImage *image = NULL;
@@ -4998,7 +5486,8 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
        g_assert (!assembly_is_dynamic (assembly->assembly));
        image = assembly->assembly->image;
        table = &image->tables [MONO_TABLE_FILE];
-       res = mono_module_get_types (domain, image, &exceptions, exportedOnly);
+       res = mono_module_get_types (domain, image, &exceptions, exportedOnly, &error);
+       mono_error_raise_exception (&error);
 
        /* Append data from all modules in the assembly */
        for (i = 0; i < table->rows; ++i) {
@@ -5006,7 +5495,11 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                        MonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);
                        if (loaded_image) {
                                MonoArray *ex2;
-                               MonoArray *res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly);
+                               MonoArray *res2;
+
+                               res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly, &error);
+                               mono_error_raise_exception (&error);
+
                                /* Append the new types to the end of the array */
                                if (mono_array_length (res2) > 0) {
                                        guint32 len1, len2;
@@ -5038,12 +5531,12 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
 
        ex_count = 0;
        for (i = 0; i < len; i++) {
-               MonoReflectionType *t = mono_array_get (res, gpointer, i);
+               MonoReflectionType *t = (MonoReflectionType *)mono_array_get (res, gpointer, i);
                MonoClass *klass;
 
                if (t) {
                        klass = mono_type_get_class (t->type);
-                       if ((klass != NULL) && klass->exception_type) {
+                       if ((klass != NULL) && mono_class_has_failure (klass)) {
                                /* keep the class in the list */
                                list = g_list_append (list, klass);
                                /* and replace Type with NULL */
@@ -5065,7 +5558,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                exl = mono_array_new (domain, mono_defaults.exception_class, length);
                /* Types for which mono_class_get_checked () succeeded */
                for (i = 0, tmp = list; tmp; i++, tmp = tmp->next) {
-                       MonoException *exc = mono_class_get_exception_for_failure (tmp->data);
+                       MonoException *exc = mono_class_get_exception_for_failure ((MonoClass *)tmp->data);
                        mono_array_setref (exl, i, exc);
                }
                /* Types for which it don't */
@@ -5092,6 +5585,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
 ICALL_EXPORT gboolean
 ves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)
 {
+       MonoError error;
        MonoAssemblyName aname;
        MonoDomain *domain = mono_object_domain (name);
        char *val;
@@ -5106,8 +5600,8 @@ ves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *
                return FALSE;
        }
        
-       fill_reflection_assembly_name (domain, name, &aname, "", is_version_defined,
-               FALSE, is_token_defined);
+       fill_reflection_assembly_name (domain, name, &aname, "", is_version_defined, FALSE, is_token_defined, &error);
+       mono_error_set_pending_exception (&error);
 
        mono_assembly_name_free (&aname);
        g_free ((guint8*) aname.public_key);
@@ -5120,6 +5614,7 @@ ICALL_EXPORT MonoReflectionType*
 ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
 {
        MonoError error;
+       MonoReflectionType *ret;
        MonoDomain *domain = mono_object_domain (module); 
        MonoClass *klass;
 
@@ -5130,8 +5625,18 @@ ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
                return NULL;
 
        klass = mono_class_get_checked (module->image, 1 | MONO_TOKEN_TYPE_DEF, &error);
-       mono_error_raise_exception (&error);
-       return mono_type_get_object (domain, &klass->byval_arg);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
+
+       ret = mono_type_get_object_checked (domain, &klass->byval_arg, &error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
+
+       return ret;
 }
 
 ICALL_EXPORT void
@@ -5184,13 +5689,18 @@ ves_icall_System_Reflection_Module_GetMDStreamVersion (MonoImage *image)
 ICALL_EXPORT MonoArray*
 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
 {
+       MonoError error;
        MonoArray *exceptions;
        int i;
 
        if (!module->image)
                return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);
        else {
-               MonoArray *res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE);
+               MonoArray *res;
+
+               res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE, &error);
+               mono_error_raise_exception (&error);
+
                for (i = 0; i < mono_array_length (exceptions); ++i) {
                        MonoException *ex = mono_array_get (exceptions, MonoException *, i);
                        if (ex) {
@@ -5257,12 +5767,12 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t
 
        if (image_is_dynamic (image)) {
                if ((table == MONO_TABLE_TYPEDEF) || (table == MONO_TABLE_TYPEREF)) {
-                       klass = mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
+                       klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
                        return klass ? &klass->byval_arg : NULL;
                }
 
                init_generic_context_from_args (&context, type_args, method_args);
-               klass = mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context);
+               klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context);
                return klass ? &klass->byval_arg : NULL;
        }
 
@@ -5275,7 +5785,10 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t
        klass = mono_class_get_checked (image, token, &error);
        if (klass)
                klass = mono_class_inflate_generic_class_checked (klass, &context, &error);
-       mono_error_raise_exception (&error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
 
        if (klass)
                return &klass->byval_arg;
@@ -5303,7 +5816,7 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32
 
        if (image_is_dynamic (image)) {
                if (table == MONO_TABLE_METHOD)
-                       return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
+                       return (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
 
                if ((table == MONO_TABLE_MEMBERREF) && !(mono_memberref_is_method (image, token))) {
                        *resolve_error = ResolveTokenError_BadTable;
@@ -5311,7 +5824,7 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32
                }
 
                init_generic_context_from_args (&context, type_args, method_args);
-               return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context);
+               return (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context);
        }
 
        if ((index <= 0) || (index > image->tables [table].rows)) {
@@ -5325,7 +5838,7 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32
 
        init_generic_context_from_args (&context, type_args, method_args);
        method = mono_get_method_checked (image, token, NULL, &context, &error);
-       mono_error_raise_exception (&error);
+       mono_error_set_pending_exception (&error);
 
        return method;
 }
@@ -5344,7 +5857,7 @@ ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32
        }
 
        if (image_is_dynamic (image))
-               return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
+               return (MonoString *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
 
        if ((index <= 0) || (index >= image->heap_us.size)) {
                *error = ResolveTokenError_OutOfRange;
@@ -5376,7 +5889,7 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32
 
        if (image_is_dynamic (image)) {
                if (table == MONO_TABLE_FIELD)
-                       return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
+                       return (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL);
 
                if (mono_memberref_is_method (image, token)) {
                        *resolve_error = ResolveTokenError_BadTable;
@@ -5384,7 +5897,7 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32
                }
 
                init_generic_context_from_args (&context, type_args, method_args);
-               return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context);
+               return (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context);
        }
 
        if ((index <= 0) || (index > image->tables [table].rows)) {
@@ -5398,7 +5911,7 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32
 
        init_generic_context_from_args (&context, type_args, method_args);
        field = mono_field_from_token_checked (image, token, &klass, &context, &error);
-       mono_error_raise_exception (&error);
+       mono_error_set_pending_exception (&error);
        
        return field;
 }
@@ -5407,6 +5920,8 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32
 ICALL_EXPORT MonoObject*
 ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error)
 {
+       MonoError merror;
+       MonoObject *ret;
        int table = mono_metadata_token_table (token);
 
        *error = ResolveTokenError_Other;
@@ -5416,38 +5931,54 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32
        case MONO_TABLE_TYPEREF:
        case MONO_TABLE_TYPESPEC: {
                MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error);
-               if (t)
-                       return (MonoObject*)mono_type_get_object (mono_domain_get (), t);
+               if (t) {
+                       ret = (MonoObject*) mono_type_get_object_checked (mono_domain_get (), t, &merror);
+                       mono_error_raise_exception (&merror);
+
+                       return ret;
+               }
                else
                        return NULL;
        }
        case MONO_TABLE_METHOD:
        case MONO_TABLE_METHODSPEC: {
                MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);
-               if (m)
-                       return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
-               else
+               if (m) {
+                       ret = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), m, m->klass, &merror);
+                       mono_error_raise_exception (&merror);
+
+                       return ret;
+               } else
                        return NULL;
        }               
        case MONO_TABLE_FIELD: {
                MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);
-               if (f)
-                       return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
+               if (f) {
+                       ret =(MonoObject*)mono_field_get_object_checked (mono_domain_get (), f->parent, f, &merror);
+                       mono_error_raise_exception (&merror);
+                       return ret;
+               }
                else
                        return NULL;
        }
        case MONO_TABLE_MEMBERREF:
                if (mono_memberref_is_method (image, token)) {
                        MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error);
-                       if (m)
-                               return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
-                       else
+                       if (m) {
+                               ret = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), m, m->klass, &merror);
+                               mono_error_raise_exception (&merror);
+
+                               return ret;
+                       } else
                                return NULL;
                }
                else {
                        MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error);
-                       if (f)
-                               return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
+                       if (f) {
+                               ret = (MonoObject*)mono_field_get_object_checked (mono_domain_get (), f->parent, f, &merror);
+                               mono_error_raise_exception (&merror);
+                               return ret;
+                       }
                        else
                                return NULL;
                }
@@ -5495,6 +6026,8 @@ ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 t
 ICALL_EXPORT MonoReflectionType*
 ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass;
        int isbyref = 0, rank;
        char *str = mono_string_to_utf8 (smodifiers);
@@ -5512,9 +6045,13 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon
                        }
                        isbyref = 1;
                        p++;
+
                        g_free (str);
-                       return mono_type_get_object (mono_object_domain (tb), &klass->this_arg);
-                       break;
+
+                       ret = mono_type_get_object_checked (mono_object_domain (tb), &klass->this_arg, &error);
+                       mono_error_raise_exception (&error);
+
+                       return ret;
                case '*':
                        klass = mono_ptr_class_get (&klass->byval_arg);
                        mono_class_init (klass);
@@ -5546,12 +6083,17 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon
                        break;
                }
        }
+
        g_free (str);
-       return mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);
+
+       ret = mono_type_get_object_checked (mono_object_domain (tb), &klass->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_Type_IsArrayImpl (MonoReflectionType *t)
+ves_icall_RuntimeTypeHandle_IsArray (MonoReflectionType *t)
 {
        MonoType *type;
        MonoBoolean res;
@@ -5563,71 +6105,96 @@ ves_icall_Type_IsArrayImpl (MonoReflectionType *t)
 }
 
 static void
-check_for_invalid_type (MonoClass *klass)
+check_for_invalid_type (MonoClass *klass, MonoError *error)
 {
        char *name;
        MonoString *str;
+
+       mono_error_init (error);
+
        if (klass->byval_arg.type != MONO_TYPE_TYPEDBYREF)
                return;
 
        name = mono_type_get_full_name (klass);
        str =  mono_string_new (mono_domain_get (), name);
        g_free (name);
-       mono_raise_exception ((MonoException*)mono_get_exception_type_load (str, NULL));
+       mono_error_set_exception_instance (error, mono_get_exception_type_load (str, NULL));
 
 }
 ICALL_EXPORT MonoReflectionType *
 ves_icall_Type_make_array_type (MonoReflectionType *type, int rank)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass, *aklass;
 
        klass = mono_class_from_mono_type (type->type);
-       check_for_invalid_type (klass);
+       check_for_invalid_type (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (rank == 0) //single dimentional array
                aklass = mono_array_class_get (klass, 1);
        else
                aklass = mono_bounded_array_class_get (klass, rank, TRUE);
 
-       return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
+       ret = mono_type_get_object_checked (mono_object_domain (type), &aklass->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT MonoReflectionType *
 ves_icall_Type_make_byref_type (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass;
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
-       check_for_invalid_type (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
+       check_for_invalid_type (klass, &error);
+       mono_error_raise_exception (&error);
+
+       ret = mono_type_get_object_checked (mono_object_domain (type), &klass->this_arg, &error);
+       mono_error_raise_exception (&error);
 
-       return mono_type_get_object (mono_object_domain (type), &klass->this_arg);
+       return ret;
 }
 
 ICALL_EXPORT MonoReflectionType *
 ves_icall_Type_MakePointerType (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoReflectionType *ret;
        MonoClass *klass, *pklass;
 
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
-       check_for_invalid_type (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
+       check_for_invalid_type (klass, &error);
+       mono_error_raise_exception (&error);
 
        pklass = mono_ptr_class_get (type->type);
 
-       return mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);
+       ret = mono_type_get_object_checked (mono_object_domain (type), &pklass->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 
 ICALL_EXPORT MonoObject *
 ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,
                                                   MonoReflectionMethod *info, MonoBoolean throwOnBindFailure)
 {
+       MonoError error;
        MonoClass *delegate_class = mono_class_from_mono_type (type->type);
        MonoObject *delegate;
        gpointer func;
        MonoMethod *method = info->method;
 
-       mono_class_init_or_throw (delegate_class);
+       mono_class_init_checked (delegate_class, &error);
+       mono_error_raise_exception (&error);
 
        mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);
 
@@ -5636,7 +6203,8 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon
                        return NULL;
        }
 
-       delegate = mono_object_new (mono_object_domain (type), delegate_class);
+       delegate = mono_object_new_checked (mono_object_domain (type), delegate_class, &error);
+       mono_error_raise_exception (&error);
 
        if (method_is_dynamic (method)) {
                /* Creating a trampoline would leak memory */
@@ -5656,11 +6224,13 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon
 ICALL_EXPORT MonoMulticastDelegate *
 ves_icall_System_Delegate_AllocDelegateLike_internal (MonoDelegate *delegate)
 {
+       MonoError error;
        MonoMulticastDelegate *ret;
 
        g_assert (mono_class_has_parent (mono_object_class (delegate), mono_defaults.multicastdelegate_class));
 
-       ret = (MonoMulticastDelegate*) mono_object_new (mono_object_domain (delegate), mono_object_class (delegate));
+       ret = (MonoMulticastDelegate*) mono_object_new_checked (mono_object_domain (delegate), mono_object_class (delegate), &error);
+       mono_error_raise_exception (&error);
        ret->delegate.invoke_impl = mono_runtime_create_delegate_trampoline (mono_object_class (delegate));
 
        return ret;
@@ -5669,7 +6239,11 @@ ves_icall_System_Delegate_AllocDelegateLike_internal (MonoDelegate *delegate)
 ICALL_EXPORT MonoReflectionMethod*
 ves_icall_System_Delegate_GetVirtualMethod_internal (MonoDelegate *delegate)
 {
-       return mono_method_get_object (mono_domain_get (), mono_object_get_virtual_method (delegate->target, delegate->method), mono_object_class (delegate->target));
+       MonoReflectionMethod *ret = NULL;
+       MonoError error;
+       ret = mono_method_get_object_checked (mono_domain_get (), mono_object_get_virtual_method (delegate->target, delegate->method), mono_object_class (delegate->target), &error);
+       mono_error_raise_exception (&error);
+       return ret;
 }
 
 /* System.Buffer */
@@ -5769,6 +6343,7 @@ ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, Mo
 ICALL_EXPORT MonoObject *
 ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this_obj, MonoString *class_name)
 {
+       MonoError error;
        MonoDomain *domain = mono_object_domain (this_obj); 
        MonoObject *res;
        MonoRealProxy *rp = ((MonoRealProxy *)this_obj);
@@ -5776,24 +6351,36 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this_obj, MonoStri
        MonoType *type;
        MonoClass *klass;
 
-       res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
+       res = mono_object_new_checked (domain, mono_defaults.transparent_proxy_class, &error);
+       mono_error_raise_exception (&error);
        tp = (MonoTransparentProxy*) res;
        
        MONO_OBJECT_SETREF (tp, rp, rp);
        type = ((MonoReflectionType *)rp->class_to_proxy)->type;
        klass = mono_class_from_mono_type (type);
 
+       // mono_remote_class_vtable cannot handle errors well, so force any loading error to occur early
+       mono_class_setup_vtable (klass);
+       if (mono_class_has_failure (klass)) {
+               mono_set_pending_exception (mono_class_get_exception_for_failure (klass));
+               return NULL;
+       }
+
        tp->custom_type_info = (mono_object_isinst (this_obj, mono_defaults.iremotingtypeinfo_class) != NULL);
        tp->remote_class = mono_remote_class (domain, class_name, klass);
 
-       res->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);
+       res->vtable = (MonoVTable *)mono_remote_class_vtable (domain, tp->remote_class, rp);
        return res;
 }
 
 ICALL_EXPORT MonoReflectionType *
 ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
 {
-       return mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);
+       MonoError error;
+       MonoReflectionType *ret = mono_type_get_object_checked (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg, &error);
+       mono_error_raise_exception (&error);
+
+       return ret;
 }
 #endif
 
@@ -5819,19 +6406,31 @@ ves_icall_System_Environment_get_MachineName (void)
        buf = g_new (gunichar2, len);
 
        result = NULL;
-       if (GetComputerName (buf, (PDWORD) &len))
-               result = mono_string_new_utf16 (mono_domain_get (), buf, len);
+       if (GetComputerName (buf, (PDWORD) &len)) {
+               MonoError error;
+               result = mono_string_new_utf16_checked (mono_domain_get (), buf, len, &error);
+               mono_error_raise_exception (&error);
+       }
 
        g_free (buf);
        return result;
 #elif !defined(DISABLE_SOCKETS)
-       gchar buf [256];
        MonoString *result;
-
-       if (gethostname (buf, sizeof (buf)) == 0)
+       char *buf;
+       int n;
+#if defined _SC_HOST_NAME_MAX
+       n = sysconf (_SC_HOST_NAME_MAX);
+       if (n == -1)
+#endif
+       n = 512;
+       buf = g_malloc (n+1);
+       
+       if (gethostname (buf, n) == 0){
+               buf [n] = 0;
                result = mono_string_new (mono_domain_get (), buf);
-       else
+       else
                result = NULL;
+       g_free (buf);
        
        return result;
 #else
@@ -5871,6 +6470,28 @@ ves_icall_System_Environment_get_NewLine (void)
 #endif
 }
 
+ICALL_EXPORT MonoBoolean
+ves_icall_System_Environment_GetIs64BitOperatingSystem (void)
+{
+#if SIZEOF_VOID_P == 8
+       return TRUE;
+#else
+#ifdef HOST_WIN32
+       gboolean isWow64Process = FALSE;
+       if (IsWow64Process (GetCurrentProcess (), &isWow64Process)) {
+               return (MonoBoolean)isWow64Process;
+       }
+#elif defined(HAVE_SYS_UTSNAME_H)
+       struct utsname name;
+
+       if (uname (&name) >= 0) {
+               return strcmp (name.machine, "x86_64") == 0 || strncmp (name.machine, "aarch64", 7) == 0 || strncmp (name.machine, "ppc64", 5) == 0;
+       }
+#endif
+       return FALSE;
+#endif
+}
+
 ICALL_EXPORT MonoString *
 ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)
 {
@@ -5952,7 +6573,9 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
                        if (*env_string != '=') {
                                equal_str = wcschr(env_string, '=');
                                g_assert(equal_str);
-                               str = mono_string_new_utf16 (domain, env_string, equal_str-env_string);
+                               MonoError error;
+                               str = mono_string_new_utf16_checked (domain, env_string, equal_str-env_string, &error);
+                               mono_error_raise_exception (&error);
                                mono_array_setref (names, n, str);
                                n++;
                        }
@@ -6041,7 +6664,8 @@ ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, M
        utf8_value = mono_string_to_utf8_checked (value, &error);
        if (!mono_error_ok (&error)) {
                g_free (utf8_name);
-               mono_error_raise_exception (&error);
+               mono_error_set_pending_exception (&error);
+               return;
        }
        g_setenv (utf8_name, utf8_value, TRUE);
 
@@ -6093,7 +6717,10 @@ ves_icall_System_Environment_GetWindowsFolderPath (int folder)
                int len = 0;
                while (path [len])
                        ++ len;
-               return mono_string_new_utf16 (mono_domain_get (), path, len);
+               MonoError error;
+               MonoString *res = mono_string_new_utf16_checked (mono_domain_get (), path, len, &error);
+               mono_error_raise_exception (&error);
+               return res;
        }
 #else
        g_warning ("ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!");
@@ -6104,6 +6731,7 @@ ves_icall_System_Environment_GetWindowsFolderPath (int folder)
 ICALL_EXPORT MonoArray *
 ves_icall_System_Environment_GetLogicalDrives (void)
 {
+       MonoError error;
         gunichar2 buf [256], *ptr, *dname;
        gunichar2 *u16;
        guint initial_size = 127, size = 128;
@@ -6121,7 +6749,7 @@ ves_icall_System_Environment_GetLogicalDrives (void)
                if (size > initial_size) {
                        if (ptr != buf)
                                g_free (ptr);
-                       ptr = g_malloc0 ((size + 1) * sizeof (gunichar2));
+                       ptr = (gunichar2 *)g_malloc0 ((size + 1) * sizeof (gunichar2));
                        initial_size = size;
                        size++;
                }
@@ -6142,7 +6770,8 @@ ves_icall_System_Environment_GetLogicalDrives (void)
                len = 0;
                u16 = dname;
                while (*u16) { u16++; len ++; }
-               drivestr = mono_string_new_utf16 (domain, dname, len);
+               drivestr = mono_string_new_utf16_checked (domain, dname, len, &error);
+               mono_error_raise_exception (&error);
                mono_array_setref (result, ndrives++, drivestr);
                while (*dname++);
        } while (*dname);
@@ -6296,6 +6925,9 @@ ICALL_EXPORT MonoReflectionMethod *
 ves_icall_Remoting_RemotingServices_GetVirtualMethod (
        MonoReflectionType *rtype, MonoReflectionMethod *rmethod)
 {
+       MonoReflectionMethod *ret = NULL;
+       MonoError error;
+
        MonoClass *klass;
        MonoMethod *method;
        MonoMethod **vtable;
@@ -6306,7 +6938,8 @@ ves_icall_Remoting_RemotingServices_GetVirtualMethod (
 
        method = rmethod->method;
        klass = mono_class_from_mono_type (rtype->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (MONO_CLASS_IS_INTERFACE (klass))
                return NULL;
@@ -6341,17 +6974,24 @@ ves_icall_Remoting_RemotingServices_GetVirtualMethod (
        if (!res)
                return NULL;
 
-       return mono_method_get_object (mono_domain_get (), res, NULL);
+       ret = mono_method_get_object_checked (mono_domain_get (), res, NULL, &error);
+       mono_error_raise_exception (&error);
+       return ret;
 }
 
 ICALL_EXPORT void
 ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)
 {
+       MonoError error;
        MonoClass *klass;
        MonoVTable* vtable;
 
        klass = mono_class_from_mono_type (type->type);
-       vtable = mono_class_vtable_full (mono_domain_get (), klass, TRUE);
+       vtable = mono_class_vtable_full (mono_domain_get (), klass, &error);
+       if (!is_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return;
+       }
 
        mono_vtable_set_is_remote (vtable, enable);
 }
@@ -6369,12 +7009,15 @@ ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (Mo
 ICALL_EXPORT MonoObject *
 ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)
 {
+       MonoError error;
        MonoClass *klass;
        MonoDomain *domain;
+       MonoObject *ret;
        
        domain = mono_object_domain (type);
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (MONO_CLASS_IS_INTERFACE (klass) || (klass->flags & TYPE_ATTRIBUTE_ABSTRACT)) {
                mono_set_pending_exception (mono_get_exception_argument ("type", "Type cannot be instantiated"));
@@ -6385,8 +7028,16 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas
                g_assert (klass->rank == 1);
                return (MonoObject *) mono_array_new (domain, klass->element_class, 0);
        } else {
+               MonoVTable *vtable = mono_class_vtable_full (domain, klass, &error);
+               if (!is_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
                /* Bypass remoting object creation check */
-               return mono_object_new_alloc_specific (mono_class_vtable_full (domain, klass, TRUE));
+               ret = mono_object_new_alloc_specific_checked (vtable, &error);
+               mono_error_set_pending_exception (&error);
+
+               return ret;
        }
 }
 
@@ -6433,7 +7084,7 @@ ves_icall_System_IO_DriveInfo_GetDriveType (MonoString *root_path_name)
 #endif
 
 ICALL_EXPORT gpointer
-ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)
+ves_icall_RuntimeMethodHandle_GetFunctionPointer (MonoMethod *method)
 {
        return mono_compile_method (method);
 }
@@ -6488,7 +7139,7 @@ get_bundled_app_config (void)
                return NULL;
 
        len = config_file_path_length - config_ext_length;
-       module = g_malloc0 (len + 1);
+       module = (gchar *)g_malloc0 (len + 1);
        memcpy (module, config_file_path, len);
        // Get the config file from the module name
        app_config = mono_config_string_for_assembly_file (module);
@@ -6552,7 +7203,7 @@ ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result,
        *result = NULL;
        *size = 0;
        image = assembly->assembly->image;
-       entry = mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);
+       entry = (MonoPEResourceDataEntry *)mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);
        if (!entry)
                return FALSE;
 
@@ -6602,24 +7253,33 @@ ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoS
 ICALL_EXPORT MonoObject *
 ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)
 {
+       MonoError error;
+       MonoObject *result;
        MonoClass *klass;
        MonoDomain *domain;
        
        domain = mono_object_domain (type);
        klass = mono_class_from_mono_type (type->type);
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
        if (mono_class_is_nullable (klass))
                /* No arguments -> null */
                return NULL;
 
-       return mono_object_new (domain, klass);
+       result = mono_object_new_checked (domain, klass, &error);
+       mono_error_raise_exception (&error);
+       return result;
 }
 
 ICALL_EXPORT MonoReflectionMethod *
 ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definition)
 {
+       MonoReflectionMethod *ret = NULL;
+       MonoError error;
+
        MonoClass *klass, *parent;
+       MonoGenericContext *generic_inst = NULL;
        MonoMethod *method = m->method;
        MonoMethod *result = NULL;
        int slot;
@@ -6637,21 +7297,82 @@ ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definiti
                return m;
 
        klass = method->klass;
-       if (klass->generic_class)
+       if (klass->generic_class) {
+               generic_inst = mono_class_get_context (klass);
                klass = klass->generic_class->container_class;
+       }
 
        if (definition) {
                /* At the end of the loop, klass points to the eldest class that has this virtual function slot. */
                for (parent = klass->parent; parent != NULL; parent = parent->parent) {
+                       /* on entry, klass is either a plain old non-generic class and generic_inst == NULL
+                          or klass is the generic container class and generic_inst is the instantiation.
+
+                          when we go to the parent, if the parent is an open constructed type, we need to
+                          replace the type parameters by the definitions from the generic_inst, and then take it
+                          apart again into the klass and the generic_inst.
+
+                          For cases like this:
+                          class C<T> : B<T, int> {
+                              public override void Foo () { ... }
+                          }
+                          class B<U,V> : A<HashMap<U,V>> {
+                              public override void Foo () { ... }
+                          }
+                          class A<X> {
+                              public virtual void Foo () { ... }
+                          }
+
+                          if at each iteration the parent isn't open, we can skip inflating it.  if at some
+                          iteration the parent isn't generic (after possible inflation), we set generic_inst to
+                          NULL;
+                       */
+                       MonoGenericContext *parent_inst = NULL;
+                       if (mono_class_is_open_constructed_type (mono_class_get_type (parent))) {
+                               MonoError error;
+                               parent = mono_class_inflate_generic_class_checked (parent, generic_inst, &error);
+                               if (!mono_error_ok (&error)) {
+                                       mono_error_set_pending_exception (&error);
+                                       return NULL;
+                               }
+                       }
+                       if (parent->generic_class) {
+                               parent_inst = mono_class_get_context (parent);
+                               parent = parent->generic_class->container_class;
+                       }
+
                        mono_class_setup_vtable (parent);
                        if (parent->vtable_size <= slot)
                                break;
                        klass = parent;
+                       generic_inst = parent_inst;
                }
        } else {
                klass = klass->parent;
                if (!klass)
                        return m;
+               if (mono_class_is_open_constructed_type (mono_class_get_type (klass))) {
+                       klass = mono_class_inflate_generic_class_checked (klass, generic_inst, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+
+                       generic_inst = NULL;
+               }
+               if (klass->generic_class) {
+                       generic_inst = mono_class_get_context (klass);
+                       klass = klass->generic_class->container_class;
+               }
+
+       }
+
+       if (generic_inst) {
+               klass = mono_class_inflate_generic_class_checked (klass, generic_inst, &error);
+               if (!mono_error_ok (&error)) {
+                       mono_error_set_pending_exception (&error);
+                       return NULL;
+               }
        }
 
        if (klass == method->klass)
@@ -6677,7 +7398,9 @@ ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definiti
        if (result == NULL)
                return m;
 
-       return mono_method_get_object (mono_domain_get (), result, NULL);
+       ret = mono_method_get_object_checked (mono_domain_get (), result, NULL, &error);
+       mono_error_raise_exception (&error);
+       return ret;
 }
 
 ICALL_EXPORT MonoString*
@@ -6799,7 +7522,7 @@ ICALL_EXPORT MonoObject*
 mono_TypedReference_ToObject (MonoTypedRef* tref)
 {
        if (MONO_TYPE_IS_REFERENCE (tref->type)) {
-               MonoObject** objp = tref->value;
+               MonoObject** objp = (MonoObject **)tref->value;
                return *objp;
        }
 
@@ -6849,15 +7572,18 @@ mono_TypedReference_MakeTypedReferenceInternal (MonoObject *target, MonoArray *f
 }
 
 static void
-prelink_method (MonoMethod *method)
+prelink_method (MonoMethod *method, MonoError *error)
 {
        const char *exc_class, *exc_arg;
+
+       mono_error_init (error);
        if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
                return;
        mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
        if (exc_class) {
-               mono_raise_exception( 
-                       mono_exception_from_name_msg (mono_defaults.corlib, "System", exc_class, exc_arg ) );
+               mono_error_set_exception_instance (error,
+                       mono_exception_from_name_msg (mono_defaults.corlib, "System", exc_class, exc_arg));
+               return;
        }
        /* create the wrapper, too? */
 }
@@ -6865,20 +7591,27 @@ prelink_method (MonoMethod *method)
 ICALL_EXPORT void
 ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)
 {
-       prelink_method (method->method);
+       MonoError error;
+
+       prelink_method (method->method, &error);
+       mono_error_raise_exception (&error);
 }
 
 ICALL_EXPORT void
 ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)
 {
+       MonoError error;
        MonoClass *klass = mono_class_from_mono_type (type->type);
        MonoMethod* m;
        gpointer iter = NULL;
 
-       mono_class_init_or_throw (klass);
+       mono_class_init_checked (klass, &error);
+       mono_error_raise_exception (&error);
 
-       while ((m = mono_class_get_methods (klass, &iter)))
-               prelink_method (m);
+       while ((m = mono_class_get_methods (klass, &iter))) {
+               prelink_method (m, &error);
+               mono_error_raise_exception (&error);
+       }
 }
 
 /* These parameters are "readonly" in corlib/System/NumberFormatter.cs */
@@ -6901,14 +7634,15 @@ ves_icall_System_NumberFormatter_GetFormatterTables (guint64 const **mantissas,
 /*
  * We return NULL for no modifiers so the corlib code can return Type.EmptyTypes
  * and avoid useless allocations.
- * 
- * MAY THROW
  */
 static MonoArray*
-type_array_from_modifiers (MonoImage *image, MonoType *type, int optional)
+type_array_from_modifiers (MonoImage *image, MonoType *type, int optional, MonoError *error)
 {
+       MonoReflectionType *rt;
        MonoArray *res;
        int i, count = 0;
+
+       mono_error_init (error);
        for (i = 0; i < type->num_mods; ++i) {
                if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required))
                        count++;
@@ -6919,10 +7653,13 @@ type_array_from_modifiers (MonoImage *image, MonoType *type, int optional)
        count = 0;
        for (i = 0; i < type->num_mods; ++i) {
                if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) {
-                       MonoError error;
-                       MonoClass *klass = mono_class_get_checked (image, type->modifiers [i].token, &error);
-                       mono_error_raise_exception (&error); /* this is safe, no cleanup needed on callers */ 
-                       mono_array_setref (res, count, mono_type_get_object (mono_domain_get (), &klass->byval_arg));
+                       MonoClass *klass = mono_class_get_checked (image, type->modifiers [i].token, error);
+                       return_val_if_nok (error, NULL);
+
+                       rt = mono_type_get_object_checked (mono_domain_get (), &klass->byval_arg, error);
+                       return_val_if_nok (error, NULL);
+
+                       mono_array_setref (res, count, rt);
                        count++;
                }
        }
@@ -6930,14 +7667,16 @@ type_array_from_modifiers (MonoImage *image, MonoType *type, int optional)
 }
 
 ICALL_EXPORT MonoArray*
-param_info_get_type_modifiers (MonoReflectionParameter *param, MonoBoolean optional)
+ves_icall_ParameterInfo_GetTypeModifiers (MonoReflectionParameter *param, MonoBoolean optional)
 {
+       MonoError error;
        MonoType *type = param->ClassImpl->type;
        MonoClass *member_class = mono_object_class (param->MemberImpl);
        MonoMethod *method = NULL;
        MonoImage *image;
        int pos;
        MonoMethodSignature *sig;
+       MonoArray *res;
 
        if (mono_class_is_reflection_method_or_constructor (member_class)) {
                MonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;
@@ -6965,7 +7704,9 @@ param_info_get_type_modifiers (MonoReflectionParameter *param, MonoBoolean optio
        else
                type = sig->params [pos];
 
-       return type_array_from_modifiers (image, type, optional);
+       res = type_array_from_modifiers (image, type, optional, &error);
+       mono_error_raise_exception (&error);
+       return res;
 }
 
 static MonoType*
@@ -6983,14 +7724,18 @@ get_property_type (MonoProperty *prop)
 }
 
 ICALL_EXPORT MonoArray*
-property_info_get_type_modifiers (MonoReflectionProperty *property, MonoBoolean optional)
+ves_icall_MonoPropertyInfo_GetTypeModifiers (MonoReflectionProperty *property, MonoBoolean optional)
 {
+       MonoError error;
        MonoType *type = get_property_type (property->property);
        MonoImage *image = property->klass->image;
+       MonoArray *res;
 
        if (!type)
                return NULL;
-       return type_array_from_modifiers (image, type, optional);
+       res = type_array_from_modifiers (image, type, optional, &error);
+       mono_error_raise_exception (&error);
+       return res;
 }
 
 /*
@@ -7044,13 +7789,19 @@ property_info_get_default_value (MonoReflectionProperty *property)
 ICALL_EXPORT MonoBoolean
 custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)
 {
+       MonoError error;
        MonoClass *attr_class = mono_class_from_mono_type (attr_type->type);
        MonoCustomAttrInfo *cinfo;
        gboolean found;
 
-       mono_class_init_or_throw (attr_class);
+       mono_class_init_checked (attr_class, &error);
+       mono_error_raise_exception (&error);
 
-       cinfo = mono_reflection_get_custom_attrs_info (obj);
+       cinfo = mono_reflection_get_custom_attrs_info_checked (obj, &error);
+       if (!is_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return FALSE;
+       }
        if (!cinfo)
                return FALSE;
        found = mono_custom_attrs_has_attr (cinfo, attr_class);
@@ -7066,11 +7817,16 @@ custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)
        MonoArray *res;
        MonoError error;
 
-       if (attr_class)
-               mono_class_init_or_throw (attr_class);
+       if (attr_class) {
+               mono_class_init_checked (attr_class, &error);
+               mono_error_raise_exception (&error);
+       }
 
        res = mono_reflection_get_custom_attrs_by_type (obj, attr_class, &error);
-       mono_error_raise_exception (&error);
+       if (!mono_error_ok (&error)) {
+               mono_error_set_pending_exception (&error);
+               return NULL;
+       }
 
        if (mono_loader_get_last_error ()) {
                mono_set_pending_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ()));
@@ -7080,6 +7836,17 @@ custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)
        }
 }
 
+ICALL_EXPORT MonoArray*
+ves_icall_MonoCustomAttrs_GetCustomAttributesDataInternal (MonoObject *obj)
+{
+       MonoError error;
+       MonoArray *result;
+       result = mono_reflection_get_custom_attrs_data_checked (obj, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
+}
+
+
 ICALL_EXPORT MonoString*
 ves_icall_Mono_Runtime_GetDisplayName (void)
 {
@@ -7095,6 +7862,7 @@ ves_icall_Mono_Runtime_GetDisplayName (void)
 ICALL_EXPORT MonoString*
 ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code)
 {
+       MonoError error;
        MonoString *message;
        guint32 ret;
        gunichar2 buf[256];
@@ -7105,7 +7873,8 @@ ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code)
        if (ret == 0) {
                message = mono_string_new (mono_domain_get (), "Error looking up error string");
        } else {
-               message = mono_string_new_utf16 (mono_domain_get (), buf, ret);
+               message = mono_string_new_utf16_checked (mono_domain_get (), buf, ret, &error);
+               mono_error_raise_exception (&error);
        }
        
        return message;
@@ -7125,6 +7894,76 @@ ves_icall_System_StackFrame_GetILOffsetFromFile (MonoString *path, guint32 metho
        return il_offset;
 }
 
+ICALL_EXPORT gpointer
+ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcess (void)
+{
+       return GetCurrentProcess ();
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_GetExitCodeProcess (gpointer handle, gint32 *exitcode)
+{
+       return GetExitCodeProcess (handle, (guint32*) exitcode);
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_CloseProcess (gpointer handle)
+{
+#if defined(TARGET_WIN32) || defined(HOST_WIN32)
+       return CloseHandle (handle);
+#else
+       return CloseProcess (handle);
+#endif
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_TerminateProcess (gpointer handle, gint32 exitcode)
+{
+       return TerminateProcess (handle, exitcode);
+}
+
+ICALL_EXPORT gint32
+ves_icall_Microsoft_Win32_NativeMethods_WaitForInputIdle (gpointer handle, gint32 milliseconds)
+{
+       return WaitForInputIdle (handle, milliseconds);
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_GetProcessWorkingSetSize (gpointer handle, gsize *min, gsize *max)
+{
+       return GetProcessWorkingSetSize (handle, min, max);
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_SetProcessWorkingSetSize (gpointer handle, gsize min, gsize max)
+{
+       return SetProcessWorkingSetSize (handle, min, max);
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_GetProcessTimes (gpointer handle, gint64 *creationtime, gint64 *exittime, gint64 *kerneltime, gint64 *usertime)
+{
+       return GetProcessTimes (handle, (LPFILETIME) creationtime, (LPFILETIME) exittime, (LPFILETIME) kerneltime, (LPFILETIME) usertime);
+}
+
+ICALL_EXPORT gint32
+ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcessId (void)
+{
+       return mono_process_current_pid ();
+}
+
+ICALL_EXPORT gint32
+ves_icall_Microsoft_Win32_NativeMethods_GetPriorityClass (gpointer handle)
+{
+       return GetPriorityClass (handle);
+}
+
+ICALL_EXPORT MonoBoolean
+ves_icall_Microsoft_Win32_NativeMethods_SetPriorityClass (gpointer handle, gint32 priorityClass)
+{
+       return SetPriorityClass (handle, priorityClass);
+}
+
 #ifndef DISABLE_ICALL_TABLES
 
 #define ICALL_TYPE(id,name,first)
@@ -7317,6 +8156,42 @@ mono_icall_cleanup (void)
        mono_os_mutex_destroy (&icall_mutex);
 }
 
+/**
+ * mono_add_internal_call:
+ * @name: method specification to surface to the managed world
+ * @method: pointer to a C method to invoke when the method is called
+ *
+ * This method surfaces the C function pointed by @method as a method
+ * that has been surfaced in managed code with the method specified in
+ * @name as an internal call.
+ *
+ * Internal calls are surfaced to all app domains loaded and they are
+ * accessibly by a type with the specified name.
+ *
+ * You must provide a fully qualified type name, that is namespaces
+ * and type name, followed by a colon and the method name, with an
+ * optional signature to bind.
+ *
+ * For example, the following are all valid declarations:
+ *
+ * "MyApp.Services.ScriptService:Accelerate"
+ * "MyApp.Services.ScriptService:Slowdown(int,bool)"
+ *
+ * You use method parameters in cases where there might be more than
+ * one surface method to managed code.  That way you can register different
+ * internal calls for different method overloads.
+ *
+ * The internal calls are invoked with no marshalling.   This means that .NET
+ * types like System.String are exposed as `MonoString *` parameters.   This is
+ * different than the way that strings are surfaced in P/Invoke.
+ *
+ * For more information on how the parameters are marshalled, see the
+ * <a href="http://www.mono-project.com/docs/advanced/embedding/">Mono Embedding</a>
+ * page.
+ *
+ * See the <a  href="mono-api-methods.html#method-desc">Method Description</a>
+ * reference for more information on the format of method descriptions.
+ */
 void
 mono_add_internal_call (const char *name, gconstpointer method)
 {
@@ -7340,7 +8215,7 @@ compare_method_imap (const void *key, const void *elem)
 static gpointer
 find_method_icall (const IcallTypeDesc *imap, const char *name)
 {
-       const guint16 *nameslot = mono_binary_search (name, icall_names_idx + imap->first_icall, icall_desc_num_icalls (imap), sizeof (icall_names_idx [0]), compare_method_imap);
+       const guint16 *nameslot = (const guint16 *)mono_binary_search (name, icall_names_idx + imap->first_icall, icall_desc_num_icalls (imap), sizeof (icall_names_idx [0]), compare_method_imap);
        if (!nameslot)
                return NULL;
        return (gpointer)icall_functions [(nameslot - &icall_names_idx [0])];
@@ -7356,7 +8231,7 @@ compare_class_imap (const void *key, const void *elem)
 static const IcallTypeDesc*
 find_class_icalls (const char *name)
 {
-       const guint16 *nameslot = mono_binary_search (name, icall_type_names_idx, Icall_type_num, sizeof (icall_type_names_idx [0]), compare_class_imap);
+       const guint16 *nameslot = (const guint16 *)mono_binary_search (name, icall_type_names_idx, Icall_type_num, sizeof (icall_type_names_idx [0]), compare_class_imap);
        if (!nameslot)
                return NULL;
        return &icall_type_descs [nameslot - &icall_type_names_idx [0]];
@@ -7615,48 +8490,48 @@ mono_lookup_icall_symbol (MonoMethod *m)
 }
 
 static MonoType*
-type_from_typename (char *typename)
+type_from_typename (char *type_name)
 {
        MonoClass *klass = NULL;        /* assignment to shut GCC warning up */
 
-       if (!strcmp (typename, "int"))
+       if (!strcmp (type_name, "int"))
                klass = mono_defaults.int_class;
-       else if (!strcmp (typename, "ptr"))
+       else if (!strcmp (type_name, "ptr"))
                klass = mono_defaults.int_class;
-       else if (!strcmp (typename, "void"))
+       else if (!strcmp (type_name, "void"))
                klass = mono_defaults.void_class;
-       else if (!strcmp (typename, "int32"))
+       else if (!strcmp (type_name, "int32"))
                klass = mono_defaults.int32_class;
-       else if (!strcmp (typename, "uint32"))
+       else if (!strcmp (type_name, "uint32"))
                klass = mono_defaults.uint32_class;
-       else if (!strcmp (typename, "int8"))
+       else if (!strcmp (type_name, "int8"))
                klass = mono_defaults.sbyte_class;
-       else if (!strcmp (typename, "uint8"))
+       else if (!strcmp (type_name, "uint8"))
                klass = mono_defaults.byte_class;
-       else if (!strcmp (typename, "int16"))
+       else if (!strcmp (type_name, "int16"))
                klass = mono_defaults.int16_class;
-       else if (!strcmp (typename, "uint16"))
+       else if (!strcmp (type_name, "uint16"))
                klass = mono_defaults.uint16_class;
-       else if (!strcmp (typename, "long"))
+       else if (!strcmp (type_name, "long"))
                klass = mono_defaults.int64_class;
-       else if (!strcmp (typename, "ulong"))
+       else if (!strcmp (type_name, "ulong"))
                klass = mono_defaults.uint64_class;
-       else if (!strcmp (typename, "float"))
+       else if (!strcmp (type_name, "float"))
                klass = mono_defaults.single_class;
-       else if (!strcmp (typename, "double"))
+       else if (!strcmp (type_name, "double"))
                klass = mono_defaults.double_class;
-       else if (!strcmp (typename, "object"))
+       else if (!strcmp (type_name, "object"))
                klass = mono_defaults.object_class;
-       else if (!strcmp (typename, "obj"))
+       else if (!strcmp (type_name, "obj"))
                klass = mono_defaults.object_class;
-       else if (!strcmp (typename, "string"))
+       else if (!strcmp (type_name, "string"))
                klass = mono_defaults.string_class;
-       else if (!strcmp (typename, "bool"))
+       else if (!strcmp (type_name, "bool"))
                klass = mono_defaults.boolean_class;
-       else if (!strcmp (typename, "boolean"))
+       else if (!strcmp (type_name, "boolean"))
                klass = mono_defaults.boolean_class;
        else {
-               g_error ("%s", typename);
+               g_error ("%s", type_name);
                g_assert_not_reached ();
        }
        return &klass->byval_arg;
@@ -7675,7 +8550,7 @@ mono_create_icall_signature (const char *sigstr)
        MonoImage *corlib = mono_defaults.corlib;
 
        mono_image_lock (corlib);
-       res = g_hash_table_lookup (corlib->helper_signatures, sigstr);
+       res = (MonoMethodSignature *)g_hash_table_lookup (corlib->helper_signatures, sigstr);
        mono_image_unlock (corlib);
 
        if (res)
@@ -7709,7 +8584,7 @@ mono_create_icall_signature (const char *sigstr)
        g_strfreev (parts);
 
        mono_image_lock (corlib);
-       res2 = g_hash_table_lookup (corlib->helper_signatures, sigstr);
+       res2 = (MonoMethodSignature *)g_hash_table_lookup (corlib->helper_signatures, sigstr);
        if (res2)
                res = res2; /*Value is allocated in the image pool*/
        else
@@ -7726,7 +8601,7 @@ mono_find_jit_icall_by_name (const char *name)
        g_assert (jit_icall_hash_name);
 
        mono_icall_lock ();
-       info = g_hash_table_lookup (jit_icall_hash_name, name);
+       info = (MonoJitICallInfo *)g_hash_table_lookup (jit_icall_hash_name, name);
        mono_icall_unlock ();
        return info;
 }
@@ -7738,7 +8613,7 @@ mono_find_jit_icall_by_addr (gconstpointer addr)
        g_assert (jit_icall_hash_addr);
 
        mono_icall_lock ();
-       info = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
+       info = (MonoJitICallInfo *)g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
        mono_icall_unlock ();
 
        return info;
@@ -7768,7 +8643,7 @@ mono_lookup_jit_icall_symbol (const char *name)
        const char *res = NULL;
 
        mono_icall_lock ();
-       info = g_hash_table_lookup (jit_icall_hash_name, name);
+       info = (MonoJitICallInfo *)g_hash_table_lookup (jit_icall_hash_name, name);
        if (info)
                res = info->c_symbol;
        mono_icall_unlock ();