[SRE] MonoError in encode_reflection_type and encode_custom_modifiers
[mono.git] / mono / metadata / reflection.c
index 7786598405280f56a2659bffba7de06af1edb0be..6a299dcbc9cbd99fe327b42acf1c09d0cfe532b4 100644 (file)
@@ -168,7 +168,7 @@ static guint32 encode_constant (MonoDynamicImage *assembly, MonoObject *val, gui
 static char*   type_get_qualified_name (MonoType *type, MonoAssembly *ass);
 static void    encode_type (MonoDynamicImage *assembly, MonoType *type, SigBuffer *buf);
 static void get_default_param_value_blobs (MonoMethod *method, char **blobs, guint32 *types);
-static MonoReflectionType *mono_reflection_type_get_underlying_system_type (MonoReflectionType* t);
+static MonoReflectionType *mono_reflection_type_get_underlying_system_type (MonoReflectionType* t, MonoError *error);
 static MonoType* mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve);
 static MonoReflectionType* mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *error);
 static gboolean is_sre_array (MonoClass *klass);
@@ -204,7 +204,7 @@ static void init_type_builder_generics (MonoObject *type);
                mono_array_set (arr, MonoReflectionType*, index, __type); \
 } while (0)
 
-#define mono_type_array_get_and_resolve(array, index) mono_reflection_type_get_handle ((MonoReflectionType*)mono_array_get (array, gpointer, index))
+#define mono_type_array_get_and_resolve(array, index, error) mono_reflection_type_get_handle ((MonoReflectionType*)mono_array_get (array, gpointer, index), error)
 
 #define CHECK_ADD4_OVERFLOW_UN(a, b) ((guint32)(0xFFFFFFFFU) - (guint32)(b) < (guint32)(a))
 #define CHECK_ADD8_OVERFLOW_UN(a, b) ((guint64)(0xFFFFFFFFFFFFFFFFUL) - (guint64)(b) < (guint64)(a))
@@ -218,6 +218,27 @@ static void init_type_builder_generics (MonoObject *type);
 #define ADDP_IS_GREATER_OR_OVF(a, b, c) (((a) + (b) > (c)) || CHECK_ADDP_OVERFLOW_UN (a, b))
 #define ADD_IS_GREATER_OR_OVF(a, b, c) (((a) + (b) > (c)) || CHECK_ADD4_OVERFLOW_UN (a, b))
 
+/* Class lazy loading functions */
+static GENERATE_GET_CLASS_WITH_CACHE (mono_assembly, System.Reflection, MonoAssembly)
+static GENERATE_GET_CLASS_WITH_CACHE (mono_module, System.Reflection, MonoModule)
+static GENERATE_GET_CLASS_WITH_CACHE (mono_generic_method, System.Reflection, MonoGenericMethod);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_generic_cmethod, System.Reflection, MonoGenericCMethod);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_method, System.Reflection, MonoMethod);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_cmethod, System.Reflection, MonoCMethod);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_field, System.Reflection, MonoField);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_event, System.Reflection, MonoEvent);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_property, System.Reflection, MonoProperty);
+static GENERATE_GET_CLASS_WITH_CACHE (mono_parameter_info, System.Reflection, MonoParameterInfo);
+static GENERATE_GET_CLASS_WITH_CACHE (missing, System.Reflection, Missing);
+static GENERATE_GET_CLASS_WITH_CACHE (method_body, System.Reflection, MethodBody);
+static GENERATE_GET_CLASS_WITH_CACHE (local_variable_info, System.Reflection, LocalVariableInfo);
+static GENERATE_GET_CLASS_WITH_CACHE (exception_handling_clause, System.Reflection, ExceptionHandlingClause);
+static GENERATE_GET_CLASS_WITH_CACHE (custom_attribute_typed_argument, System.Reflection, CustomAttributeTypedArgument);
+static GENERATE_GET_CLASS_WITH_CACHE (custom_attribute_named_argument, System.Reflection, CustomAttributeNamedArgument);
+static GENERATE_GET_CLASS_WITH_CACHE (type_builder, System.Reflection.Emit, TypeBuilder);
+static GENERATE_GET_CLASS_WITH_CACHE (marshal_as_attribute, System.Runtime.InteropServices, MarshalAsAttribute);
+static GENERATE_GET_CLASS_WITH_CACHE (dbnull, System, DBNull);
+
 // The dynamic images list is only needed to support the mempool reference tracking feature in checked-build.
 static GPtrArray *dynamic_images;
 static mono_mutex_t dynamic_images_mutex;
@@ -896,35 +917,43 @@ encode_type (MonoDynamicImage *assembly, MonoType *type, SigBuffer *buf)
 }
 
 static void
-encode_reflection_type (MonoDynamicImage *assembly, MonoReflectionType *type, SigBuffer *buf)
+encode_reflection_type (MonoDynamicImage *assembly, MonoReflectionType *type, SigBuffer *buf, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       mono_error_init (error);
+
        if (!type) {
                sigbuffer_add_value (buf, MONO_TYPE_VOID);
                return;
        }
 
-       encode_type (assembly, mono_reflection_type_get_handle (type), buf);
+       MonoType *t = mono_reflection_type_get_handle (type, error);
+       return_if_nok (error);
+       encode_type (assembly, t, buf);
 }
 
 static void
-encode_custom_modifiers (MonoDynamicImage *assembly, MonoArray *modreq, MonoArray *modopt, SigBuffer *buf)
+encode_custom_modifiers (MonoDynamicImage *assembly, MonoArray *modreq, MonoArray *modopt, SigBuffer *buf, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
        int i;
 
+       mono_error_init (error);
+
        if (modreq) {
                for (i = 0; i < mono_array_length (modreq); ++i) {
-                       MonoType *mod = mono_type_array_get_and_resolve (modreq, i);
+                       MonoType *mod = mono_type_array_get_and_resolve (modreq, i, error);
+                       return_if_nok (error);
                        sigbuffer_add_byte (buf, MONO_TYPE_CMOD_REQD);
                        sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod));
                }
        }
        if (modopt) {
                for (i = 0; i < mono_array_length (modopt); ++i) {
-                       MonoType *mod = mono_type_array_get_and_resolve (modopt, i);
+                       MonoType *mod = mono_type_array_get_and_resolve (modopt, i, error);
+                       return_if_nok (error);
                        sigbuffer_add_byte (buf, MONO_TYPE_CMOD_OPT);
                        sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod));
                }
@@ -971,10 +1000,12 @@ method_encode_signature (MonoDynamicImage *assembly, MonoMethodSignature *sig)
 #endif
 
 static guint32
-method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBuilder *mb)
+method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBuilder *mb, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       mono_error_init (error);
+
        /*
         * FIXME: reuse code from method_encode_signature().
         */
@@ -998,8 +1029,12 @@ method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBui
        if (ngparams)
                sigbuffer_add_value (&buf, ngparams);
        sigbuffer_add_value (&buf, nparams + notypes);
-       encode_custom_modifiers (assembly, mb->return_modreq, mb->return_modopt, &buf);
-       encode_reflection_type (assembly, mb->rtype, &buf);
+       encode_custom_modifiers (assembly, mb->return_modreq, mb->return_modopt, &buf, error);
+       if (!is_ok (error))
+               goto leave;
+       encode_reflection_type (assembly, mb->rtype, &buf, error);
+       if (!is_ok (error))
+               goto leave;
        for (i = 0; i < nparams; ++i) {
                MonoArray *modreq = NULL;
                MonoArray *modopt = NULL;
@@ -1009,9 +1044,13 @@ method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBui
                        modreq = mono_array_get (mb->param_modreq, MonoArray*, i);
                if (mb->param_modopt && (i < mono_array_length (mb->param_modopt)))
                        modopt = mono_array_get (mb->param_modopt, MonoArray*, i);
-               encode_custom_modifiers (assembly, modreq, modopt, &buf);
+               encode_custom_modifiers (assembly, modreq, modopt, &buf, error);
+               if (!is_ok (error))
+                       goto leave;
                pt = mono_array_get (mb->parameters, MonoReflectionType*, i);
-               encode_reflection_type (assembly, pt, &buf);
+               encode_reflection_type (assembly, pt, &buf, error);
+               if (!is_ok (error))
+                       goto leave;
        }
        if (notypes)
                sigbuffer_add_byte (&buf, MONO_TYPE_SENTINEL);
@@ -1019,10 +1058,13 @@ method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBui
                MonoReflectionType *pt;
 
                pt = mono_array_get (mb->opt_types, MonoReflectionType*, i);
-               encode_reflection_type (assembly, pt, &buf);
+               encode_reflection_type (assembly, pt, &buf, error);
+               if (!is_ok (error))
+                       goto leave;
        }
 
        idx = sigbuffer_add_to_blob_cached (assembly, &buf);
+leave:
        sigbuffer_free (&buf);
        return idx;
 }
@@ -1032,6 +1074,7 @@ encode_locals (MonoDynamicImage *assembly, MonoReflectionILGen *ilgen)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        MonoDynamicTable *table;
        guint32 *values;
        guint32 idx, sig_idx;
@@ -1048,7 +1091,11 @@ encode_locals (MonoDynamicImage *assembly, MonoReflectionILGen *ilgen)
                if (lb->is_pinned)
                        sigbuffer_add_value (&buf, MONO_TYPE_PINNED);
                
-               encode_reflection_type (assembly, (MonoReflectionType*)lb->type, &buf);
+               encode_reflection_type (assembly, (MonoReflectionType*)lb->type, &buf, &error);
+               if (!is_ok (&error)) {
+                       sigbuffer_free (&buf);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
        }
        sig_idx = sigbuffer_add_to_blob_cached (assembly, &buf);
        sigbuffer_free (&buf);
@@ -1098,6 +1145,7 @@ method_encode_clauses (MonoImage *image, MonoDynamicImage *assembly, MonoReflect
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        MonoExceptionClause *clauses;
        MonoExceptionClause *clause;
        MonoILExceptionInfo *ex_info;
@@ -1127,7 +1175,9 @@ method_encode_clauses (MonoImage *image, MonoDynamicImage *assembly, MonoReflect
                        clause->handler_offset = ex_block->start;
                        clause->handler_len = ex_block->len;
                        if (ex_block->extype) {
-                               clause->data.catch_class = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)ex_block->extype));
+                               MonoType *extype = mono_reflection_type_get_handle ((MonoReflectionType*)ex_block->extype, &error);
+                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                               clause->data.catch_class = mono_class_from_mono_type (extype);
                        } else {
                                if (ex_block->type == MONO_EXCEPTION_CLAUSE_FILTER)
                                        clause->data.filter_offset = ex_block->filter_offset;
@@ -1292,7 +1342,10 @@ fat_header:
                                        mono_image_add_stream_data (&assembly->code, (char*)&val, sizeof (guint32));
                                        finally_start = ex_block->start + ex_block->len;
                                        if (ex_block->extype) {
-                                               val = mono_metadata_token_from_dor (mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)ex_block->extype)));
+                                               MonoType *extype = mono_reflection_type_get_handle ((MonoReflectionType*)ex_block->extype, error);
+                                               return_val_if_nok (error, 0);
+
+                                               val = mono_metadata_token_from_dor (mono_image_typedef_or_ref (assembly, extype));
                                        } else {
                                                if (ex_block->type == MONO_EXCEPTION_CLAUSE_FILTER)
                                                        val = ex_block->filter_offset;
@@ -1447,7 +1500,7 @@ mono_custom_attrs_free (MonoCustomAttrInfo *ainfo)
 {
        MONO_REQ_GC_NEUTRAL_MODE;
 
-       if (!ainfo->cached)
+       if (ainfo && !ainfo->cached)
                g_free (ainfo);
 }
 
@@ -1587,10 +1640,10 @@ mono_image_basic_method (ReflectionMethodBuilder *mb, MonoDynamicImage *assembly
        values [MONO_METHOD_NAME] = string_heap_insert_mstring (&assembly->sheap, mb->name);
        values [MONO_METHOD_FLAGS] = mb->attrs;
        values [MONO_METHOD_IMPLFLAGS] = mb->iattrs;
-       values [MONO_METHOD_SIGNATURE] = method_builder_encode_signature (assembly, mb);
+       values [MONO_METHOD_SIGNATURE] = method_builder_encode_signature (assembly, mb, error);
+       return_val_if_nok (error, FALSE);
        values [MONO_METHOD_RVA] = method_encode_code (assembly, mb, error);
-       if (!mono_error_ok (error))
-               return FALSE;
+       return_val_if_nok (error, FALSE);
 
        table = &assembly->tables [MONO_TABLE_PARAM];
        values [MONO_METHOD_PARAMLIST] = table->next_idx;
@@ -1975,6 +2028,7 @@ field_encode_signature (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        SigBuffer buf;
        guint32 idx;
        guint32 typespec = 0;
@@ -1983,13 +2037,16 @@ field_encode_signature (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *
 
        init_type_builder_generics (fb->type);
 
-       type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type);
+       type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        klass = mono_class_from_mono_type (type);
 
        sigbuffer_init (&buf, 32);
        
        sigbuffer_add_value (&buf, 0x06);
-       encode_custom_modifiers (assembly, fb->modreq, fb->modopt, &buf);
+       encode_custom_modifiers (assembly, fb->modreq, fb->modopt, &buf, &error);
+       if (!is_ok (&error))
+               goto fail;
        /* encode custom attributes before the type */
 
        if (klass->generic_container)
@@ -2005,6 +2062,10 @@ field_encode_signature (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *
        idx = sigbuffer_add_to_blob_cached (assembly, &buf);
        sigbuffer_free (&buf);
        return idx;
+fail:
+       sigbuffer_free (&buf);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       g_assert_not_reached ();
 }
 
 static guint32
@@ -2112,6 +2173,7 @@ encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        char *str;
        SigBuffer buf;
        guint32 idx, len;
@@ -2155,9 +2217,11 @@ encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo)
                sigbuffer_add_value (&buf, 0);
                /* custom marshaler type name */
                if (minfo->marshaltype || minfo->marshaltyperef) {
-                       if (minfo->marshaltyperef)
-                               str = type_get_fully_qualified_name (mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef));
-                       else
+                       if (minfo->marshaltyperef) {
+                               MonoType *marshaltype = mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef, &error);
+                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                               str = type_get_fully_qualified_name (marshaltype);
+                       } else
                                str = mono_string_to_utf8 (minfo->marshaltype);
                        len = strlen (str);
                        sigbuffer_add_value (&buf, len);
@@ -2256,6 +2320,7 @@ property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBui
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        SigBuffer buf;
        guint32 nparams = 0;
        MonoReflectionMethodBuilder *mb = fb->get_method;
@@ -2273,25 +2338,40 @@ property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBui
                sigbuffer_add_byte (&buf, 0x08);
        sigbuffer_add_value (&buf, nparams);
        if (mb) {
-               encode_reflection_type (assembly, (MonoReflectionType*)mb->rtype, &buf);
+               encode_reflection_type (assembly, (MonoReflectionType*)mb->rtype, &buf, &error);
+               if (!is_ok (&error))
+                       goto fail;
                for (i = 0; i < nparams; ++i) {
                        MonoReflectionType *pt = mono_array_get (mb->parameters, MonoReflectionType*, i);
-                       encode_reflection_type (assembly, pt, &buf);
+                       encode_reflection_type (assembly, pt, &buf, &error);
+                       if (!is_ok (&error))
+                               goto fail;
                }
        } else if (smb && smb->parameters) {
                /* the property type is the last param */
-               encode_reflection_type (assembly, mono_array_get (smb->parameters, MonoReflectionType*, nparams), &buf);
+               encode_reflection_type (assembly, mono_array_get (smb->parameters, MonoReflectionType*, nparams), &buf, &error);
+               if (!is_ok (&error))
+                       goto fail;
+
                for (i = 0; i < nparams; ++i) {
                        MonoReflectionType *pt = mono_array_get (smb->parameters, MonoReflectionType*, i);
-                       encode_reflection_type (assembly, pt, &buf);
+                       encode_reflection_type (assembly, pt, &buf, &error);
+                       if (!is_ok (&error))
+                               goto fail;
                }
        } else {
-               encode_reflection_type (assembly, (MonoReflectionType*)fb->type, &buf);
+               encode_reflection_type (assembly, (MonoReflectionType*)fb->type, &buf, &error);
+               if (!is_ok (&error))
+                       goto fail;
        }
 
        idx = sigbuffer_add_to_blob_cached (assembly, &buf);
        sigbuffer_free (&buf);
        return idx;
+fail:
+       sigbuffer_free (&buf);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       g_assert_not_reached ();
 }
 
 static void
@@ -2359,6 +2439,7 @@ mono_image_get_event_info (MonoReflectionEventBuilder *eb, MonoDynamicImage *ass
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        MonoDynamicTable *table;
        guint32 *values;
        guint num_methods = 0;
@@ -2376,7 +2457,9 @@ mono_image_get_event_info (MonoReflectionEventBuilder *eb, MonoDynamicImage *ass
        values = table->values + eb->table_idx * MONO_EVENT_SIZE;
        values [MONO_EVENT_NAME] = string_heap_insert_mstring (&assembly->sheap, eb->name);
        values [MONO_EVENT_FLAGS] = eb->attrs;
-       values [MONO_EVENT_TYPE] = mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle (eb->type));
+       MonoType *ebtype = mono_reflection_type_get_handle (eb->type, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       values [MONO_EVENT_TYPE] = mono_image_typedef_or_ref (assembly, ebtype);
 
        /*
         * FIXME: we still don't handle 'other' methods 
@@ -2417,6 +2500,7 @@ encode_constraints (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynam
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       MonoError error;
        MonoDynamicTable *table;
        guint32 num_constraints, i;
        guint32 *values;
@@ -2434,9 +2518,10 @@ encode_constraints (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynam
                table_idx = table->next_idx ++;
                values = table->values + table_idx * MONO_GENPARCONSTRAINT_SIZE;
 
+               MonoType *gpbasetype = mono_reflection_type_get_handle (gparam->base_type, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                values [MONO_GENPARCONSTRAINT_GENERICPAR] = owner;
-               values [MONO_GENPARCONSTRAINT_CONSTRAINT] = mono_image_typedef_or_ref (
-                       assembly, mono_reflection_type_get_handle (gparam->base_type));
+               values [MONO_GENPARCONSTRAINT_CONSTRAINT] = mono_image_typedef_or_ref (assembly, gpbasetype);
        }
 
        for (i = 0; i < num_constraints; i++) {
@@ -2446,9 +2531,11 @@ encode_constraints (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynam
                table_idx = table->next_idx ++;
                values = table->values + table_idx * MONO_GENPARCONSTRAINT_SIZE;
 
+               MonoType *constraint_type = mono_reflection_type_get_handle (constraint, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                values [MONO_GENPARCONSTRAINT_GENERICPAR] = owner;
-               values [MONO_GENPARCONSTRAINT_CONSTRAINT] = mono_image_typedef_or_ref (
-                       assembly, mono_reflection_type_get_handle (constraint));
+               values [MONO_GENPARCONSTRAINT_CONSTRAINT] = mono_image_typedef_or_ref (assembly, constraint_type);
        }
 }
 
@@ -2491,7 +2578,10 @@ write_generic_param_entry (MonoDynamicImage *assembly, GenericParamTableEntry *e
        table_idx = table->next_idx ++;
        values = table->values + table_idx * MONO_GENERICPARAM_SIZE;
 
-       param = mono_reflection_type_get_handle ((MonoReflectionType*)entry->gparam)->data.generic_param;
+       MonoType *gparam_type = mono_reflection_type_get_handle ((MonoReflectionType*)entry->gparam, error);
+       return_val_if_nok (error, FALSE);
+
+       param = gparam_type->data.generic_param;
 
        values [MONO_GENERICPARAM_OWNER] = entry->owner;
        values [MONO_GENERICPARAM_FLAGS] = entry->gparam->attrs;
@@ -2833,12 +2923,17 @@ mono_image_get_methodref_token_for_methodbuilder (MonoDynamicImage *assembly, Mo
        if ((rmb.call_conv & ~0x60) != MONO_CALL_DEFAULT && (rmb.call_conv & ~0x60) != MONO_CALL_VARARG)
                rmb.call_conv = (rmb.call_conv & 0x60) | MONO_CALL_DEFAULT;
 
-       sig = method_builder_encode_signature (assembly, &rmb);
+       sig = method_builder_encode_signature (assembly, &rmb, error);
+       return_val_if_nok (error, 0);
 
        if (tb->generic_params)
                parent = create_generic_typespec (assembly, tb);
-       else
-               parent = mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)rmb.type));
+       else {
+               MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)rmb.type, error);
+               return_val_if_nok (error, 0);
+
+               parent = mono_image_typedef_or_ref (assembly, t);
+       }
 
        char *name = mono_string_to_utf8 (method->name);
 
@@ -2983,11 +3078,15 @@ mono_image_get_ctorbuilder_token (MonoDynamicImage *assembly, MonoReflectionCtor
 
        if (tb->generic_params)
                parent = create_generic_typespec (assembly, tb);
-       else
-               parent = mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)tb));
+       else {
+               MonoType * type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
+               return_val_if_nok (error, 0);
+               parent = mono_image_typedef_or_ref (assembly, type);
+       }
        
        name = mono_string_to_utf8 (rmb.name);
-       sig = method_builder_encode_signature (assembly, &rmb);
+       sig = method_builder_encode_signature (assembly, &rmb, error);
+       return_val_if_nok (error, 0);
 
        token = mono_image_add_memberef_row (assembly, parent, name, sig);
 
@@ -3067,6 +3166,7 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoObject *f, MonoCl
 static guint32
 mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFieldOnTypeBuilderInst *f)
 {
+       MonoError error;
        guint32 token;
        MonoClass *klass;
        MonoGenericClass *gclass;
@@ -3078,7 +3178,8 @@ mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFi
                return token;
        if (is_sre_field_builder (mono_object_class (f->fb))) {
                MonoReflectionFieldBuilder *fb = (MonoReflectionFieldBuilder *)f->fb;
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst);
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                klass = mono_class_from_mono_type (type);
                gclass = type->data.generic_class;
                g_assert (gclass->is_dynamic);
@@ -3091,7 +3192,8 @@ mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFi
                guint32 sig;
                MonoClassField *field = ((MonoReflectionField *)f->fb)->field;
 
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst);
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                klass = mono_class_from_mono_type (type);
 
                sig = fieldref_encode_signature (assembly, field->parent->image, field->type);
@@ -3126,7 +3228,8 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
                ReflectionMethodBuilder rmb;
                char *name;
 
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)c->inst);
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)c->inst, error);
+               return_val_if_nok (error, 0);
                klass = mono_class_from_mono_type (type);
 
                gclass = type->data.generic_class;
@@ -3135,16 +3238,18 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
                if (!reflection_methodbuilder_from_ctor_builder (&rmb, cb, error))
                        return 0;
 
-               name = mono_string_to_utf8 (rmb.name);
+               sig = method_builder_encode_signature (assembly, &rmb, error);
+               return_val_if_nok (error, 0);
 
-               sig = method_builder_encode_signature (assembly, &rmb);
+               name = mono_string_to_utf8 (rmb.name);
 
                token = mono_image_get_memberref_token (assembly, &klass->byval_arg, name, sig);
                g_free (name);
        } else if (is_sr_mono_cmethod (mono_object_class (c->cb))) {
                MonoMethod *mm = ((MonoReflectionMethod *)c->cb)->method;
 
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)c->inst);
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)c->inst, error);
+               return_val_if_nok (error, 0);
                klass = mono_class_from_mono_type (type);
 
                sig = method_encode_signature (assembly, mono_method_signature (mm));
@@ -3160,9 +3265,8 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
 }
 
 static MonoMethod*
-mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderInst *m)
+mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderInst *m, MonoError *error)
 {
-       MonoError error;
        MonoClass *klass;
        MonoGenericContext tmp_context;
        MonoType **type_argv;
@@ -3170,10 +3274,12 @@ mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderI
        MonoMethod *method, *inflated;
        int count, i;
 
+       mono_error_init (error);
+
        init_type_builder_generics ((MonoObject*)m->inst);
 
-       method = inflate_method (m->inst, (MonoObject*)m->mb, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       method = inflate_method (m->inst, (MonoObject*)m->mb, error);
+       return_val_if_nok (error, NULL);
 
        klass = method->klass;
 
@@ -3188,7 +3294,8 @@ mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderI
        type_argv = g_new0 (MonoType *, count);
        for (i = 0; i < count; i++) {
                MonoReflectionType *garg = (MonoReflectionType *)mono_array_get (m->method_args, gpointer, i);
-               type_argv [i] = mono_reflection_type_get_handle (garg);
+               type_argv [i] = mono_reflection_type_get_handle (garg, error);
+               return_val_if_nok (error, NULL);
        }
        ginst = mono_metadata_get_generic_inst (count, type_argv);
        g_free (type_argv);
@@ -3196,8 +3303,8 @@ mono_reflection_method_on_tb_inst_get_handle (MonoReflectionMethodOnTypeBuilderI
        tmp_context.class_inst = klass->generic_class ? klass->generic_class->context.class_inst : NULL;
        tmp_context.method_inst = ginst;
 
-       inflated = mono_class_inflate_generic_method_checked (method, &tmp_context, &error);
-       g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */
+       inflated = mono_class_inflate_generic_method_checked (method, &tmp_context, error);
+       mono_error_assert_ok (error);
        return inflated;
 }
 
@@ -3213,7 +3320,9 @@ mono_image_get_method_on_inst_token (MonoDynamicImage *assembly, MonoReflectionM
        if (m->method_args) {
                MonoMethod *inflated;
 
-               inflated = mono_reflection_method_on_tb_inst_get_handle (m);
+               inflated = mono_reflection_method_on_tb_inst_get_handle (m, error);
+               return_val_if_nok (error, 0);
+
                if (create_methodspec)
                        token = mono_image_get_methodspec_token (assembly, inflated);
                else
@@ -3231,7 +3340,8 @@ mono_image_get_method_on_inst_token (MonoDynamicImage *assembly, MonoReflectionM
                ReflectionMethodBuilder rmb;
                char *name;
 
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst);
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, error);
+               return_val_if_nok (error, 0);
                klass = mono_class_from_mono_type (type);
                gclass = type->data.generic_class;
                g_assert (gclass->is_dynamic);
@@ -3239,16 +3349,18 @@ mono_image_get_method_on_inst_token (MonoDynamicImage *assembly, MonoReflectionM
                if (!reflection_methodbuilder_from_method_builder (&rmb, mb, error))
                        return 0;
 
-               name = mono_string_to_utf8 (rmb.name);
+               sig = method_builder_encode_signature (assembly, &rmb, error);
+               return_val_if_nok (error, 0);
 
-               sig = method_builder_encode_signature (assembly, &rmb);
+               name = mono_string_to_utf8 (rmb.name);
 
                token = mono_image_get_memberref_token (assembly, &klass->byval_arg, name, sig);
                g_free (name);          
        } else if (is_sr_mono_method (mono_object_class (m->mb))) {
                MonoMethod *mm = ((MonoReflectionMethod *)m->mb)->method;
 
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst);
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, error);
+               return_val_if_nok (error, 0);
                klass = mono_class_from_mono_type (type);
 
                sig = method_encode_signature (assembly, mono_method_signature (mm));
@@ -3377,6 +3489,7 @@ mono_image_get_inflated_method_token (MonoDynamicImage *assembly, MonoMethod *m)
 static guint32
 create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb)
 {
+       MonoError error;
        MonoDynamicTable *table;
        MonoClass *klass;
        MonoType *type;
@@ -3390,7 +3503,8 @@ create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *
         * ie. what we'd normally use as the generic type in a TypeSpec signature.
         * Because of this, we must not insert it into the `typeref' hash table.
         */
-       type = mono_reflection_type_get_handle ((MonoReflectionType*)tb);
+       type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->typespec, type));
        if (token)
                return token;
@@ -3414,8 +3528,10 @@ create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *
                MonoReflectionGenericParam *gparam;
 
                gparam = mono_array_get (tb->generic_params, MonoReflectionGenericParam *, i);
+               MonoType *gparam_type = mono_reflection_type_get_handle ((MonoReflectionType*)gparam, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
 
-               encode_type (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)gparam), &buf);
+               encode_type (assembly, gparam_type, &buf);
        }
 
        table = &assembly->tables [MONO_TABLE_TYPESPEC];
@@ -3440,6 +3556,7 @@ create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *
 static MonoType*
 add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *modreq, MonoArray *modopt)
 {
+       MonoError error;
        int i, count, len, pos;
        MonoType *t;
 
@@ -3460,7 +3577,8 @@ add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *mod
        pos = 0;
        if (modreq) {
                for (i = 0; i < mono_array_length (modreq); ++i) {
-                       MonoType *mod = mono_type_array_get_and_resolve (modreq, i);
+                       MonoType *mod = mono_type_array_get_and_resolve (modreq, i, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        t->modifiers [pos].required = 1;
                        t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod);
                        pos ++;
@@ -3468,7 +3586,8 @@ add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *mod
        }
        if (modopt) {
                for (i = 0; i < mono_array_length (modopt); ++i) {
-                       MonoType *mod = mono_type_array_get_and_resolve (modopt, i);
+                       MonoType *mod = mono_type_array_get_and_resolve (modopt, i, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        t->modifiers [pos].required = 0;
                        t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod);
                        pos ++;
@@ -3494,6 +3613,7 @@ init_type_builder_generics (MonoObject *type)
 static guint32
 mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb)
 {
+       MonoError error;
        MonoDynamicTable *table;
        MonoType *custom = NULL, *type;
        guint32 *values;
@@ -3504,8 +3624,10 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
        if (token)
                return token;
 
+       MonoType *typeb = mono_reflection_type_get_handle (fb->typeb, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        /* FIXME: is this call necessary? */
-       mono_class_from_mono_type (mono_reflection_type_get_handle (fb->typeb));
+       mono_class_from_mono_type (typeb);
        name = mono_string_to_utf8 (fb->name);
 
        /*FIXME this is one more layer of ugliness due how types are created.*/
@@ -3513,7 +3635,9 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
 
        /* fb->type does not include the custom modifiers */
        /* FIXME: We should do this in one place when a fieldbuilder is created */
-       type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type);
+       type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
        if (fb->modreq || fb->modopt)
                type = custom = add_custom_modifiers (assembly, type, fb->modreq, fb->modopt);
 
@@ -3546,6 +3670,7 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
 static guint32
 mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper)
 {
+       MonoError error;
        SigBuffer buf;
        guint32 nargs;
        guint32 i, idx;
@@ -3582,7 +3707,9 @@ mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigH
 
        sigbuffer_add_byte (&buf, idx);
        sigbuffer_add_value (&buf, nargs);
-       encode_reflection_type (assembly, helper->return_type, &buf);
+       encode_reflection_type (assembly, helper->return_type, &buf, &error);
+       if (!is_ok (&error))
+               goto fail;
        for (i = 0; i < nargs; ++i) {
                MonoArray *modreqs = NULL;
                MonoArray *modopts = NULL;
@@ -3593,14 +3720,22 @@ mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigH
                if (helper->modopts && (i < mono_array_length (helper->modopts)))
                        modopts = mono_array_get (helper->modopts, MonoArray*, i);
 
-               encode_custom_modifiers (assembly, modreqs, modopts, &buf);
+               encode_custom_modifiers (assembly, modreqs, modopts, &buf, &error);
+               if (!is_ok (&error))
+                       goto fail;
                pt = mono_array_get (helper->arguments, MonoReflectionType*, i);
-               encode_reflection_type (assembly, pt, &buf);
+               encode_reflection_type (assembly, pt, &buf, &error);
+               if (!is_ok (&error))
+                       goto fail;
        }
        idx = sigbuffer_add_to_blob_cached (assembly, &buf);
        sigbuffer_free (&buf);
 
        return idx;
+fail:
+       sigbuffer_free (&buf);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       g_assert_not_reached ();
 }
 
 static guint32 
@@ -3646,6 +3781,7 @@ typedef struct {
 static guint32
 mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMethod *m)
 {
+       MonoError error;
        guint32 nparams, i;
        GList *tmp;
        char *name;
@@ -3660,10 +3796,19 @@ mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMetho
        sig->sentinelpos = -1;
        sig->call_convention = reflection_cc_to_file (m->call_conv);
        sig->param_count = nparams;
-       sig->ret = m->ret ? mono_reflection_type_get_handle (m->ret): &mono_defaults.void_class->byval_arg;
-       mtype = mono_reflection_type_get_handle (m->parent);
-       for (i = 0; i < nparams; ++i)
-               sig->params [i] = mono_type_array_get_and_resolve (m->parameters, i);
+       if (m->ret) {
+               sig->ret = mono_reflection_type_get_handle (m->ret, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       } else
+               sig->ret = &mono_defaults.void_class->byval_arg;
+
+       mtype = mono_reflection_type_get_handle (m->parent, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
+       for (i = 0; i < nparams; ++i) {
+               sig->params [i] = mono_type_array_get_and_resolve (m->parameters, i, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       }
 
        for (tmp = assembly->array_methods; tmp; tmp = tmp->next) {
                am = (ArrayMethod *)tmp->data;
@@ -3716,7 +3861,9 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon
        g_free (n);
        if (tb->parent && !(is_system && is_object) && 
                        !(tb->attrs & TYPE_ATTRIBUTE_INTERFACE)) { /* interfaces don't have a parent */
-               values [MONO_TYPEDEF_EXTENDS] = mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent));
+               MonoType *parent_type = mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent, error);
+               return_val_if_nok (error, FALSE);
+               values [MONO_TYPEDEF_EXTENDS] = mono_image_typedef_or_ref (assembly, parent_type);
        } else {
                values [MONO_TYPEDEF_EXTENDS] = 0;
        }
@@ -3747,8 +3894,10 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon
                values = table->values + (i + 1) * MONO_INTERFACEIMPL_SIZE;
                for (i = 0; i < mono_array_length (tb->interfaces); ++i) {
                        MonoReflectionType* iface = (MonoReflectionType*) mono_array_get (tb->interfaces, gpointer, i);
+                       MonoType *iface_type = mono_reflection_type_get_handle (iface, error);
+                       return_val_if_nok (error, FALSE);
                        values [MONO_INTERFACEIMPL_CLASS] = tb->table_idx;
-                       values [MONO_INTERFACEIMPL_INTERFACE] = mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle (iface));
+                       values [MONO_INTERFACEIMPL_INTERFACE] = mono_image_typedef_or_ref (assembly, iface_type);
                        values += MONO_INTERFACEIMPL_SIZE;
                }
        }
@@ -4102,10 +4251,14 @@ static void
 mono_image_fill_export_table (MonoDomain *domain, MonoReflectionTypeBuilder *tb,
        guint32 module_index, guint32 parent_index, MonoDynamicImage *assembly)
 {
+       MonoError error;
        MonoClass *klass;
        guint32 idx, i;
 
-       klass = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)tb));
+       MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)tb, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
+       klass = mono_class_from_mono_type (t);
 
        klass->type_token = mono_metadata_make_token (MONO_TABLE_TYPEDEF, tb->table_idx);
 
@@ -4184,6 +4337,7 @@ add_exported_type (MonoReflectionAssemblyBuilder *assemblyb, MonoDynamicImage *a
 static void
 mono_image_fill_export_table_from_type_forwarders (MonoReflectionAssemblyBuilder *assemblyb, MonoDynamicImage *assembly)
 {
+       MonoError error;
        MonoClass *klass;
        int i;
 
@@ -4196,7 +4350,8 @@ mono_image_fill_export_table_from_type_forwarders (MonoReflectionAssemblyBuilder
                if (!t)
                        continue;
 
-               type = mono_reflection_type_get_handle (t);
+               type = mono_reflection_type_get_handle (t, &error);
+               mono_error_assert_ok (&error);
                g_assert (type);
 
                klass = mono_class_from_mono_type (type);
@@ -4261,14 +4416,19 @@ compare_nested (const void *a, const void *b)
 static int
 compare_genericparam (const void *a, const void *b)
 {
+       MonoError error;
        const GenericParamTableEntry **a_entry = (const GenericParamTableEntry **) a;
        const GenericParamTableEntry **b_entry = (const GenericParamTableEntry **) b;
 
-       if ((*b_entry)->owner == (*a_entry)->owner)
+       if ((*b_entry)->owner == (*a_entry)->owner) {
+               MonoType *a_type = mono_reflection_type_get_handle ((MonoReflectionType*)(*a_entry)->gparam, &error);
+               mono_error_assert_ok (&error);
+               MonoType *b_type = mono_reflection_type_get_handle ((MonoReflectionType*)(*b_entry)->gparam, &error);
+               mono_error_assert_ok (&error);
                return 
-                       mono_type_get_generic_param_num (mono_reflection_type_get_handle ((MonoReflectionType*)(*a_entry)->gparam)) -
-                       mono_type_get_generic_param_num (mono_reflection_type_get_handle ((MonoReflectionType*)(*b_entry)->gparam));
-       else
+                       mono_type_get_generic_param_num (a_type) -
+                       mono_type_get_generic_param_num (b_type);
+       else
                return (*a_entry)->owner - (*b_entry)->owner;
 }
 
@@ -5185,7 +5345,8 @@ mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, Mon
 
                for (i = 0; i < nargs; i++) {
                        MonoReflectionType *rt = mono_array_get (opt_param_types, MonoReflectionType *, i);
-                       sig->params [old->param_count + i] = mono_reflection_type_get_handle (rt);
+                       sig->params [old->param_count + i] = mono_reflection_type_get_handle (rt, error);
+                       if (!is_ok (error)) goto fail;
                }
 
                parent = mono_image_typedef_or_ref (assembly, &method->klass->byval_arg);
@@ -5219,19 +5380,24 @@ mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, Mon
                sig->generic_param_count = ngparams;
                sig->param_count = nparams + nopt_args;
                sig->sentinelpos = nparams;
-               sig->ret = mono_reflection_type_get_handle (rmb.rtype);
+               sig->ret = mono_reflection_type_get_handle (rmb.rtype, error);
+               if (!is_ok (error)) goto fail;
 
                for (i = 0; i < nparams; i++) {
                        MonoReflectionType *rt = mono_array_get (rmb.parameters, MonoReflectionType *, i);
-                       sig->params [i] = mono_reflection_type_get_handle (rt);
+                       sig->params [i] = mono_reflection_type_get_handle (rt, error);
+                       if (!is_ok (error)) goto fail;
                }
 
                for (i = 0; i < nopt_args; i++) {
                        MonoReflectionType *rt = mono_array_get (opt_param_types, MonoReflectionType *, i);
-                       sig->params [nparams + i] = mono_reflection_type_get_handle (rt);
+                       sig->params [nparams + i] = mono_reflection_type_get_handle (rt, error);
+                       if (!is_ok (error)) goto fail;
                }
 
-               sig_token = method_builder_encode_signature (assembly, &rmb);
+               sig_token = method_builder_encode_signature (assembly, &rmb, error);
+               if (!is_ok (error))
+                       goto fail;
 
                parent = mono_image_create_token (assembly, obj, TRUE, TRUE, error);
                if (!mono_error_ok (error))
@@ -5328,27 +5494,32 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
                if (create_open_instance && tb->generic_params) {
                        MonoType *type;
                        init_type_builder_generics (obj);
-                       type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+                       type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+                       return_val_if_nok (error, 0);
                        token = mono_image_typedef_or_ref_full (assembly, type, TRUE);
                        token = mono_metadata_token_from_dor (token);
                } else if (tb->module->dynamic_image == assembly) {
                        token = tb->table_idx | MONO_TOKEN_TYPE_DEF;
                } else {
                        MonoType *type;
-                       type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+                       type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+                       return_val_if_nok (error, 0);
                        token = mono_metadata_token_from_dor (mono_image_typedef_or_ref (assembly, type));
                }
        } else if (strcmp (klass->name, "MonoType") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+               return_val_if_nok (error, 0);
                MonoClass *mc = mono_class_from_mono_type (type);
                token = mono_metadata_token_from_dor (
                        mono_image_typedef_or_ref_full (assembly, type, mc->generic_container == NULL || create_open_instance));
        } else if (strcmp (klass->name, "GenericTypeParameterBuilder") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+               return_val_if_nok (error, 0);
                token = mono_metadata_token_from_dor (
                        mono_image_typedef_or_ref (assembly, type));
        } else if (strcmp (klass->name, "MonoGenericClass") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+               return_val_if_nok (error, 0);
                token = mono_metadata_token_from_dor (
                        mono_image_typedef_or_ref (assembly, type));
        } else if (strcmp (klass->name, "MonoCMethod") == 0 ||
@@ -5400,7 +5571,8 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
                MonoReflectionSigHelper *s = (MonoReflectionSigHelper*)obj;
                token = MONO_TOKEN_SIGNATURE | mono_image_get_sighelper_token (assembly, s);
        } else if (strcmp (klass->name, "EnumBuilder") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+               return_val_if_nok (error, 0);
                token = mono_metadata_token_from_dor (
                        mono_image_typedef_or_ref (assembly, type));
        } else if (strcmp (klass->name, "FieldOnTypeBuilderInst") == 0) {
@@ -5417,9 +5589,10 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
                if (!mono_error_ok (error))
                        return 0;
        } else if (is_sre_array (klass) || is_sre_byref (klass) || is_sre_pointer (klass)) {
-               MonoReflectionType *type = (MonoReflectionType *)obj;
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+               return_val_if_nok (error, 0);
                token = mono_metadata_token_from_dor (
-                               mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle (type)));
+                               mono_image_typedef_or_ref (assembly, type));
        } else {
                g_error ("requested token for %s\n", klass->name);
        }
@@ -6661,12 +6834,11 @@ mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly)
        MonoError error;
        MonoReflectionAssembly *result;
        result = mono_assembly_get_object_checked (domain, assembly, &error);
-       if (!result)
-               mono_error_set_pending_exception (&error);
+       mono_error_cleanup (&error); /* FIXME new API that doesn't swallow the error */
        return result;
 }
 /*
- * mono_assembly_get_object:
+ * mono_assembly_get_object_checked:
  * @domain: an app domain
  * @assembly: an assembly
  *
@@ -6675,20 +6847,12 @@ mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly)
 MonoReflectionAssembly*
 mono_assembly_get_object_checked (MonoDomain *domain, MonoAssembly *assembly, MonoError *error)
 {
-       static MonoClass *assembly_type;
        MonoReflectionAssembly *res;
        
        mono_error_init (error);
 
        CHECK_OBJECT (MonoReflectionAssembly *, assembly, NULL);
-       if (!assembly_type) {
-               MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoAssembly");
-               if (klass == NULL)
-                       klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Assembly");
-               g_assert (klass);
-               assembly_type = klass;
-       }
-       res = (MonoReflectionAssembly *)mono_object_new_checked (domain, assembly_type, error);
+       res = (MonoReflectionAssembly *)mono_object_new_checked (domain, mono_class_get_mono_assembly_class (), error);
        if (!res)
                return NULL;
        res->assembly = assembly;
@@ -6711,20 +6875,12 @@ mono_module_get_object   (MonoDomain *domain, MonoImage *image)
 MonoReflectionModule*
 mono_module_get_object_checked (MonoDomain *domain, MonoImage *image, MonoError *error)
 {
-       static MonoClass *module_type;
        MonoReflectionModule *res;
        char* basename;
        
        mono_error_init (error);
        CHECK_OBJECT (MonoReflectionModule *, image, NULL);
-       if (!module_type) {
-               MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoModule");
-               if (klass == NULL)
-                       klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
-               g_assert (klass);
-               module_type = klass;
-       }
-       res = (MonoReflectionModule *)mono_object_new_checked (domain, module_type, error);
+       res = (MonoReflectionModule *)mono_object_new_checked (domain, mono_class_get_mono_module_class (), error);
        if (!res)
                return NULL;
 
@@ -6764,14 +6920,13 @@ mono_module_file_get_object (MonoDomain *domain, MonoImage *image, int table_ind
        MonoError error;
        MonoReflectionModule *result;
        result = mono_module_file_get_object_checked (domain, image, table_index, &error);
-       mono_error_raise_exception (&error);
+       mono_error_cleanup (&error); /* FIXME new API that doesn't swallow the error */
        return result;
 }
 
 MonoReflectionModule*
 mono_module_file_get_object_checked (MonoDomain *domain, MonoImage *image, int table_index, MonoError *error)
 {
-       static MonoClass *module_type;
        MonoReflectionModule *res;
        MonoTableInfo *table;
        guint32 cols [MONO_FILE_SIZE];
@@ -6781,14 +6936,7 @@ mono_module_file_get_object_checked (MonoDomain *domain, MonoImage *image, int t
        
        mono_error_init (error);
 
-       if (!module_type) {
-               MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoModule");
-               if (klass == NULL)
-                       klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
-               g_assert (klass);
-               module_type = klass;
-       }
-       res = (MonoReflectionModule *)mono_object_new_checked (domain, module_type, error);
+       res = (MonoReflectionModule *)mono_object_new_checked (domain, mono_class_get_mono_module_class (), error);
        if (!res)
                return NULL;
 
@@ -7065,10 +7213,6 @@ mono_method_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoClas
         * We use the same C representation for methods and constructors, but the type 
         * name in C# is different.
         */
-       static MonoClass *System_Reflection_MonoMethod = NULL;
-       static MonoClass *System_Reflection_MonoCMethod = NULL;
-       static MonoClass *System_Reflection_MonoGenericMethod = NULL;
-       static MonoClass *System_Reflection_MonoGenericCMethod = NULL;
        MonoReflectionType *rt;
        MonoClass *klass;
        MonoReflectionMethod *ret;
@@ -7082,19 +7226,9 @@ mono_method_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoClas
                        refclass = method->klass;
                CHECK_OBJECT (MonoReflectionMethod *, method, refclass);
                if ((*method->name == '.') && (!strcmp (method->name, ".ctor") || !strcmp (method->name, ".cctor"))) {
-                       if (!System_Reflection_MonoGenericCMethod) {
-                               System_Reflection_MonoGenericCMethod = mono_class_from_name_checked (mono_defaults.corlib, "System.Reflection", "MonoGenericCMethod", error);
-                               if (!mono_error_ok (error))
-                                       goto leave;
-                       }
-                       klass = System_Reflection_MonoGenericCMethod;
+                       klass = mono_class_get_mono_generic_cmethod_class ();
                } else {
-                       if (!System_Reflection_MonoGenericMethod) {
-                               System_Reflection_MonoGenericMethod = mono_class_from_name_checked (mono_defaults.corlib, "System.Reflection", "MonoGenericMethod", error);
-                               if (!mono_error_ok (error))
-                                       goto leave;
-                       }
-                       klass = System_Reflection_MonoGenericMethod;
+                       klass = mono_class_get_mono_generic_method_class ();
                }
                gret = (MonoReflectionGenericMethod*)mono_object_new_checked (domain, klass, error);
                if (!mono_error_ok (error))
@@ -7117,20 +7251,10 @@ mono_method_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoClas
 
        CHECK_OBJECT (MonoReflectionMethod *, method, refclass);
        if (*method->name == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0)) {
-               if (!System_Reflection_MonoCMethod) {
-                       System_Reflection_MonoCMethod = mono_class_from_name_checked (mono_defaults.corlib, "System.Reflection", "MonoCMethod", error);
-                       if (!mono_error_ok (error))
-                               goto leave;
-               }
-               klass = System_Reflection_MonoCMethod;
+               klass = mono_class_get_mono_cmethod_class ();
        }
        else {
-               if (!System_Reflection_MonoMethod) {
-                       System_Reflection_MonoMethod = mono_class_from_name_checked (mono_defaults.corlib, "System.Reflection", "MonoMethod", error);
-                       if (!mono_error_ok (error))
-                               goto leave;
-               }
-               klass = System_Reflection_MonoMethod;
+               klass = mono_class_get_mono_method_class ();
        }
        ret = (MonoReflectionMethod*)mono_object_new_checked (domain, klass, error);
        if (!mono_error_ok (error))
@@ -7209,14 +7333,11 @@ mono_field_get_object_checked (MonoDomain *domain, MonoClass *klass, MonoClassFi
 {
        MonoReflectionType *rt;
        MonoReflectionField *res;
-       static MonoClass *monofield_klass;
 
        mono_error_init (error);
 
        CHECK_OBJECT (MonoReflectionField *, field, klass);
-       if (!monofield_klass)
-               monofield_klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoField");
-       res = (MonoReflectionField *)mono_object_new_checked (domain, monofield_klass, error);
+       res = (MonoReflectionField *)mono_object_new_checked (domain, mono_class_get_mono_field_class (), error);
        if (!res)
                return NULL;
        res->klass = klass;
@@ -7277,14 +7398,11 @@ MonoReflectionProperty*
 mono_property_get_object_checked (MonoDomain *domain, MonoClass *klass, MonoProperty *property, MonoError *error)
 {
        MonoReflectionProperty *res;
-       static MonoClass *monoproperty_klass;
 
        mono_error_init (error);
 
        CHECK_OBJECT (MonoReflectionProperty *, property, klass);
-       if (!monoproperty_klass)
-               monoproperty_klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoProperty");
-       res = (MonoReflectionProperty *)mono_object_new_checked (domain, monoproperty_klass, error);
+       res = (MonoReflectionProperty *)mono_object_new_checked (domain, mono_class_get_mono_property_class (), error);
        if (!res)
                return NULL;
        res->klass = klass;
@@ -7326,12 +7444,9 @@ mono_event_get_object_checked (MonoDomain *domain, MonoClass *klass, MonoEvent *
 {
        MonoReflectionEvent *res;
        MonoReflectionMonoEvent *mono_event;
-       static MonoClass *monoevent_klass;
 
        CHECK_OBJECT (MonoReflectionEvent *, event, klass);
-       if (!monoevent_klass)
-               monoevent_klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoEvent");
-       mono_event = (MonoReflectionMonoEvent *)mono_object_new_checked (domain, monoevent_klass, error);
+       mono_event = (MonoReflectionMonoEvent *)mono_object_new_checked (domain, mono_class_get_mono_event_class (), error);
        if (!mono_event)
                return NULL;
        mono_event->klass = klass;
@@ -7358,7 +7473,7 @@ mono_get_reflection_missing_object (MonoDomain *domain)
        
        if (!missing_value_field) {
                MonoClass *missing_klass;
-               missing_klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Missing");
+               missing_klass = mono_class_get_missing_class ();
                mono_class_init (missing_klass);
                missing_value_field = mono_class_get_field_from_name (missing_klass, "Value");
                g_assert (missing_value_field);
@@ -7417,9 +7532,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
        if (!System_Reflection_ParameterInfo_array) {
                MonoClass *klass;
 
-               klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MonoParameterInfo");
-               if (!klass)
-                       klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "ParameterInfo");
+               klass = mono_class_get_mono_parameter_info_class ();
 
                mono_memory_barrier ();
                System_Reflection_ParameterInfo = klass; 
@@ -7565,9 +7678,6 @@ mono_param_get_objects (MonoDomain *domain, MonoMethod *method)
 MonoReflectionMethodBody*
 mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
 {
-       static MonoClass *System_Reflection_MethodBody = NULL;
-       static MonoClass *System_Reflection_LocalVariableInfo = NULL;
-       static MonoClass *System_Reflection_ExceptionHandlingClause = NULL;
        MonoError error;
        MonoReflectionMethodBody *ret;
        MonoMethodHeader *header;
@@ -7582,13 +7692,6 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
     if (method_is_dynamic (method))
         mono_raise_exception (mono_get_exception_invalid_operation (NULL));
 
-       if (!System_Reflection_MethodBody)
-               System_Reflection_MethodBody = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "MethodBody");
-       if (!System_Reflection_LocalVariableInfo)
-               System_Reflection_LocalVariableInfo = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "LocalVariableInfo");
-       if (!System_Reflection_ExceptionHandlingClause)
-               System_Reflection_ExceptionHandlingClause = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "ExceptionHandlingClause");
-
        CHECK_OBJECT (MonoReflectionMethodBody *, method, NULL);
 
        if ((method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
@@ -7599,7 +7702,8 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
                return NULL;
 
        image = method->klass->image;
-       header = mono_method_get_header (method);
+       header = mono_method_get_header_checked (method, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
 
        if (!image_is_dynamic (image)) {
                /* Obtain local vars signature token */
@@ -7623,7 +7727,7 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        } else
                local_var_sig_token = 0; //FIXME
 
-       ret = (MonoReflectionMethodBody*)mono_object_new_checked (domain, System_Reflection_MethodBody, &error);
+       ret = (MonoReflectionMethodBody*)mono_object_new_checked (domain, mono_class_get_method_body_class (), &error);
        mono_error_raise_exception (&error); /* FIXME don't raise here */
 
        ret->init_locals = header->init_locals;
@@ -7633,9 +7737,9 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        memcpy (mono_array_addr (ret->il, guint8, 0), header->code, header->code_size);
 
        /* Locals */
-       MONO_OBJECT_SETREF (ret, locals, mono_array_new_cached (domain, System_Reflection_LocalVariableInfo, header->num_locals));
+       MONO_OBJECT_SETREF (ret, locals, mono_array_new_cached (domain, mono_class_get_local_variable_info_class (), header->num_locals));
        for (i = 0; i < header->num_locals; ++i) {
-               MonoReflectionLocalVariableInfo *info = (MonoReflectionLocalVariableInfo*)mono_object_new_checked (domain, System_Reflection_LocalVariableInfo, &error);
+               MonoReflectionLocalVariableInfo *info = (MonoReflectionLocalVariableInfo*)mono_object_new_checked (domain, mono_class_get_local_variable_info_class (), &error);
                mono_error_raise_exception (&error); /* FIXME don't raise here */
 
                rt = mono_type_get_object_checked (domain, header->locals [i], &error);
@@ -7649,9 +7753,9 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        }
 
        /* Exceptions */
-       MONO_OBJECT_SETREF (ret, clauses, mono_array_new_cached (domain, System_Reflection_ExceptionHandlingClause, header->num_clauses));
+       MONO_OBJECT_SETREF (ret, clauses, mono_array_new_cached (domain, mono_class_get_exception_handling_clause_class (), header->num_clauses));
        for (i = 0; i < header->num_clauses; ++i) {
-               MonoReflectionExceptionHandlingClause *info = (MonoReflectionExceptionHandlingClause*)mono_object_new_checked (domain, System_Reflection_ExceptionHandlingClause, &error);
+               MonoReflectionExceptionHandlingClause *info = (MonoReflectionExceptionHandlingClause*)mono_object_new_checked (domain, mono_class_get_exception_handling_clause_class (), &error);
                mono_error_raise_exception (&error); /* FIXME don't raise here */
                MonoExceptionClause *clause = &header->clauses [i];
 
@@ -7693,8 +7797,7 @@ mono_get_dbnull_object (MonoDomain *domain)
        
        if (!dbnull_value_field) {
                MonoClass *dbnull_klass;
-               dbnull_klass = mono_class_from_name (mono_defaults.corlib, "System", "DBNull");
-               mono_class_init (dbnull_klass);
+               dbnull_klass = mono_class_get_dbnull_class ();
                dbnull_value_field = mono_class_get_field_from_name (dbnull_klass, "Value");
                g_assert (dbnull_value_field);
        }
@@ -8260,12 +8363,11 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
        if (!rootimage)
                rootimage = mono_defaults.corlib;
 
-       if (ignorecase) {
+       if (ignorecase)
                klass = mono_class_from_name_case_checked (image, info->name_space, info->name, error);
-               g_assert (mono_error_ok (error)); /* FIXME Don't swallow the error */
-       } else {
-               klass = mono_class_from_name (image, info->name_space, info->name);
-       }
+       else
+               klass = mono_class_from_name_checked (image, info->name_space, info->name, error);
+
        if (!klass)
                return NULL;
 
@@ -8446,7 +8548,7 @@ mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image,
        else {
                type = mono_reflection_get_type_internal (rootimage, image, info, ignorecase, &error);
        }
-       if (!mono_error_ok(&error))
+       if (!mono_error_ok (&error))
                mono_error_raise_exception (&error); /* FIXME don't raise here */
 
        if (type)
@@ -8470,7 +8572,9 @@ mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image,
        for (mod = info->nested; mod; mod = mod->next)
                g_string_append_printf (fullName, "+%s", (char*)mod->data);
 
-       assembly = mono_domain_try_type_resolve ( mono_domain_get (), fullName->str, NULL);
+       assembly = mono_domain_try_type_resolve_checked ( mono_domain_get (), fullName->str, NULL, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
        if (assembly) {
                if (assembly_is_dynamic (assembly->assembly))
                        type = mono_reflection_get_type_internal_dynamic (rootimage, assembly->assembly,
@@ -8545,6 +8649,7 @@ mono_reflection_type_from_name (char *name, MonoImage *image)
 guint32
 mono_reflection_get_token (MonoObject *obj)
 {
+       MonoError error;
        MonoClass *klass;
        guint32 token = 0;
 
@@ -8566,7 +8671,8 @@ mono_reflection_get_token (MonoObject *obj)
                MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)obj;
                token = tb->table_idx | MONO_TOKEN_TYPE_DEF;
        } else if (strcmp (klass->name, "MonoType") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                MonoClass *mc = mono_class_from_mono_type (type);
                if (!mono_class_init (mc))
                        mono_raise_exception (mono_class_get_exception_for_failure (mc));
@@ -8908,55 +9014,52 @@ handle_type:
 }
 
 static MonoObject*
-create_cattr_typed_arg (MonoType *t, MonoObject *val)
+create_cattr_typed_arg (MonoType *t, MonoObject *val, MonoError *error)
 {
-       static MonoClass *klass;
        static MonoMethod *ctor;
-       MonoError error;
        MonoObject *retval;
        void *params [2], *unboxed;
 
-       if (!klass)
-               klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "CustomAttributeTypedArgument");
+       mono_error_init (error);
+
        if (!ctor)
-               ctor = mono_class_get_method_from_name (klass, ".ctor", 2);
+               ctor = mono_class_get_method_from_name (mono_class_get_custom_attribute_typed_argument_class (), ".ctor", 2);
        
-       params [0] = mono_type_get_object_checked (mono_domain_get (), t, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       params [0] = mono_type_get_object_checked (mono_domain_get (), t, error);
+       return_val_if_nok (error, NULL);
 
        params [1] = val;
-       retval = mono_object_new_checked (mono_domain_get (), klass, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       retval = mono_object_new_checked (mono_domain_get (), mono_class_get_custom_attribute_typed_argument_class (), error);
+       return_val_if_nok (error, NULL);
        unboxed = mono_object_unbox (retval);
 
-       mono_runtime_invoke_checked (ctor, unboxed, params, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       mono_runtime_invoke_checked (ctor, unboxed, params, error);
+       return_val_if_nok (error, NULL);
 
        return retval;
 }
 
 static MonoObject*
-create_cattr_named_arg (void *minfo, MonoObject *typedarg)
+create_cattr_named_arg (void *minfo, MonoObject *typedarg, MonoError *error)
 {
-       static MonoClass *klass;
        static MonoMethod *ctor;
-       MonoError error;
        MonoObject *retval;
        void *unboxed, *params [2];
 
-       if (!klass)
-               klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "CustomAttributeNamedArgument");
+       mono_error_init (error);
+
        if (!ctor)
-               ctor = mono_class_get_method_from_name (klass, ".ctor", 2);
+               ctor = mono_class_get_method_from_name (mono_class_get_custom_attribute_named_argument_class (), ".ctor", 2);
 
        params [0] = minfo;
        params [1] = typedarg;
-       retval = mono_object_new_checked (mono_domain_get (), klass, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       retval = mono_object_new_checked (mono_domain_get (), mono_class_get_custom_attribute_named_argument_class (), error);
+       return_val_if_nok (error, NULL);
+
        unboxed = mono_object_unbox (retval);
 
-       mono_runtime_invoke_checked (ctor, unboxed, params, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       mono_runtime_invoke_checked (ctor, unboxed, params, error);
+       return_val_if_nok (error, NULL);
 
        return retval;
 }
@@ -9408,7 +9511,9 @@ mono_reflection_resolve_custom_attribute_data (MonoReflectionMethod *ref_method,
                MonoObject *obj = mono_array_get (typedargs, MonoObject*, i);
                MonoObject *typedarg;
 
-               typedarg = create_cattr_typed_arg (mono_method_signature (method)->params [i], obj);
+               typedarg = create_cattr_typed_arg (mono_method_signature (method)->params [i], obj, &error);
+               if (!is_ok (&error))
+                       goto leave;
                mono_array_setref (typedargs, i, typedarg);
        }
 
@@ -9426,8 +9531,12 @@ mono_reflection_resolve_custom_attribute_data (MonoReflectionMethod *ref_method,
                                goto leave;
                }
 
-               typedarg = create_cattr_typed_arg (arginfo [i].type, obj);
-               namedarg = create_cattr_named_arg (minfo, typedarg);
+               typedarg = create_cattr_typed_arg (arginfo [i].type, obj, &error);
+               if (!is_ok (&error))
+                       goto leave;
+               namedarg = create_cattr_named_arg (minfo, typedarg, &error);
+               if (!is_ok (&error))
+                       goto leave;
 
                mono_array_setref (namedargs, i, namedarg);
        }
@@ -9441,33 +9550,33 @@ leave:
 }
 
 static MonoObject*
-create_custom_attr_data (MonoImage *image, MonoCustomAttrEntry *cattr)
+create_custom_attr_data (MonoImage *image, MonoCustomAttrEntry *cattr, MonoError *error)
 {
        static MonoMethod *ctor;
 
-       MonoError error;
        MonoDomain *domain;
        MonoObject *attr;
        void *params [4];
 
+       mono_error_init (error);
+
        g_assert (image->assembly);
 
        if (!ctor)
                ctor = mono_class_get_method_from_name (mono_defaults.customattribute_data_class, ".ctor", 4);
 
        domain = mono_domain_get ();
-       attr = mono_object_new_checked (domain, mono_defaults.customattribute_data_class, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-       params [0] = mono_method_get_object_checked (domain, cattr->ctor, NULL, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-       params [1] = mono_assembly_get_object_checked (domain, image->assembly, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       attr = mono_object_new_checked (domain, mono_defaults.customattribute_data_class, error);
+       return_val_if_nok (error, NULL);
+       params [0] = mono_method_get_object_checked (domain, cattr->ctor, NULL, error);
+       return_val_if_nok (error, NULL);
+       params [1] = mono_assembly_get_object_checked (domain, image->assembly, error);
+       return_val_if_nok (error, NULL);
        params [2] = (gpointer)&cattr->data;
        params [3] = &cattr->data_size;
 
-       mono_runtime_invoke_checked (ctor, attr, params, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-
+       mono_runtime_invoke_checked (ctor, attr, params, error);
+       return_val_if_nok (error, NULL);
        return attr;
 }
 
@@ -9517,15 +9626,17 @@ mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo)
 }
 
 static MonoArray*
-mono_custom_attrs_data_construct (MonoCustomAttrInfo *cinfo)
+mono_custom_attrs_data_construct (MonoCustomAttrInfo *cinfo, MonoError *error)
 {
        MonoArray *result;
        MonoObject *attr;
        int i;
        
+       mono_error_init (error);
        result = mono_array_new (mono_domain_get (), mono_defaults.customattribute_data_class, cinfo->num_attrs);
        for (i = 0; i < cinfo->num_attrs; ++i) {
-               attr = create_custom_attr_data (cinfo->image, &cinfo->attrs [i]);
+               attr = create_custom_attr_data (cinfo->image, &cinfo->attrs [i], error);
+               return_val_if_nok (error, NULL);
                mono_array_setref (result, i, attr);
        }
        return result;
@@ -9538,6 +9649,19 @@ mono_custom_attrs_data_construct (MonoCustomAttrInfo *cinfo)
  */
 MonoCustomAttrInfo*
 mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
+{
+       MonoError error;
+       MonoCustomAttrInfo *result = mono_custom_attrs_from_index_checked (image, idx, &error);
+       mono_error_cleanup (&error); /* FIXME a better public API that doesn't swallow the error. */
+       return result;
+}
+/**
+ * mono_custom_attrs_from_index_checked:
+ *
+ * Returns: NULL if no attributes are found.  On error returns NULL and sets @error.
+ */
+MonoCustomAttrInfo*
+mono_custom_attrs_from_index_checked (MonoImage *image, guint32 idx, MonoError *error)
 {
        guint32 mtoken, i, len;
        guint32 cols [MONO_CUSTOM_ATTR_SIZE];
@@ -9547,6 +9671,8 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
        const char *data;
        MonoCustomAttrEntry* attr;
 
+       mono_error_init (error);
+
        ca = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
 
        i = mono_metadata_custom_attrs_from_index (image, idx);
@@ -9566,7 +9692,6 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
        ainfo->num_attrs = len;
        ainfo->image = image;
        for (i = len, tmp = list; i != 0; --i, tmp = tmp->next) {
-               MonoError error;
                mono_metadata_decode_row (ca, GPOINTER_TO_UINT (tmp->data), cols, MONO_CUSTOM_ATTR_SIZE);
                mtoken = cols [MONO_CUSTOM_ATTR_TYPE] >> MONO_CUSTOM_ATTR_TYPE_BITS;
                switch (cols [MONO_CUSTOM_ATTR_TYPE] & MONO_CUSTOM_ATTR_TYPE_MASK) {
@@ -9581,10 +9706,9 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
                        break;
                }
                attr = &ainfo->attrs [i - 1];
-               attr->ctor = mono_get_method_checked (image, mtoken, NULL, NULL, &error);
+               attr->ctor = mono_get_method_checked (image, mtoken, NULL, NULL, error);
                if (!attr->ctor) {
-                       g_warning ("Can't find custom attr constructor image: %s mtoken: 0x%08x due to %s", image->name, mtoken, mono_error_get_message (&error));
-                       mono_loader_set_error_from_mono_error (&error);
+                       g_warning ("Can't find custom attr constructor image: %s mtoken: 0x%08x due to %s", image->name, mtoken, mono_error_get_message (error));
                        g_list_free (list);
                        g_free (ainfo);
                        return NULL;
@@ -9608,9 +9732,20 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
 
 MonoCustomAttrInfo*
 mono_custom_attrs_from_method (MonoMethod *method)
+{
+       MonoError error;
+       MonoCustomAttrInfo* result = mono_custom_attrs_from_method_checked  (method, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_method_checked (MonoMethod *method, MonoError *error)
 {
        guint32 idx;
 
+       mono_error_init (error);
+
        /*
         * An instantiated method has the same cattrs as the generic method definition.
         *
@@ -9630,14 +9765,25 @@ mono_custom_attrs_from_method (MonoMethod *method)
        idx = mono_method_get_index (method);
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_METHODDEF;
-       return mono_custom_attrs_from_index (method->klass->image, idx);
+       return mono_custom_attrs_from_index_checked (method->klass->image, idx, error);
 }
 
 MonoCustomAttrInfo*
 mono_custom_attrs_from_class (MonoClass *klass)
+{
+       MonoError error;
+       MonoCustomAttrInfo *result = mono_custom_attrs_from_class_checked (klass, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_class_checked (MonoClass *klass, MonoError *error)
 {
        guint32 idx;
 
+       mono_error_init (error);
+
        if (klass->generic_class)
                klass = klass->generic_class->container_class;
 
@@ -9653,24 +9799,35 @@ mono_custom_attrs_from_class (MonoClass *klass)
                idx <<= MONO_CUSTOM_ATTR_BITS;
                idx |= MONO_CUSTOM_ATTR_TYPEDEF;
        }
-       return mono_custom_attrs_from_index (klass->image, idx);
+       return mono_custom_attrs_from_index_checked (klass->image, idx, error);
 }
 
 MonoCustomAttrInfo*
 mono_custom_attrs_from_assembly (MonoAssembly *assembly)
+{
+       MonoError error;
+       MonoCustomAttrInfo *result = mono_custom_attrs_from_assembly_checked (assembly, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_assembly_checked (MonoAssembly *assembly, MonoError *error)
 {
        guint32 idx;
        
+       mono_error_init (error);
+
        if (image_is_dynamic (assembly->image))
                return lookup_custom_attr (assembly->image, assembly);
        idx = 1; /* there is only one assembly */
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_ASSEMBLY;
-       return mono_custom_attrs_from_index (assembly->image, idx);
+       return mono_custom_attrs_from_index_checked (assembly->image, idx, error);
 }
 
 static MonoCustomAttrInfo*
-mono_custom_attrs_from_module (MonoImage *image)
+mono_custom_attrs_from_module (MonoImage *image, MonoError *error)
 {
        guint32 idx;
        
@@ -9679,11 +9836,20 @@ mono_custom_attrs_from_module (MonoImage *image)
        idx = 1; /* there is only one module */
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_MODULE;
-       return mono_custom_attrs_from_index (image, idx);
+       return mono_custom_attrs_from_index_checked (image, idx, error);
 }
 
 MonoCustomAttrInfo*
 mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property)
+{
+       MonoError error;
+       MonoCustomAttrInfo * result = mono_custom_attrs_from_property_checked (klass, property, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_property_checked (MonoClass *klass, MonoProperty *property, MonoError *error)
 {
        guint32 idx;
        
@@ -9694,11 +9860,20 @@ mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property)
        idx = find_property_index (klass, property);
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_PROPERTY;
-       return mono_custom_attrs_from_index (klass->image, idx);
+       return mono_custom_attrs_from_index_checked (klass->image, idx, error);
 }
 
 MonoCustomAttrInfo*
 mono_custom_attrs_from_event (MonoClass *klass, MonoEvent *event)
+{
+       MonoError error;
+       MonoCustomAttrInfo * result = mono_custom_attrs_from_event_checked (klass, event, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_event_checked (MonoClass *klass, MonoEvent *event, MonoError *error)
 {
        guint32 idx;
        
@@ -9709,13 +9884,24 @@ mono_custom_attrs_from_event (MonoClass *klass, MonoEvent *event)
        idx = find_event_index (klass, event);
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_EVENT;
-       return mono_custom_attrs_from_index (klass->image, idx);
+       return mono_custom_attrs_from_index_checked (klass->image, idx, error);
 }
 
 MonoCustomAttrInfo*
 mono_custom_attrs_from_field (MonoClass *klass, MonoClassField *field)
+{
+       MonoError error;
+       MonoCustomAttrInfo * result = mono_custom_attrs_from_field_checked (klass, field, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_field_checked (MonoClass *klass, MonoClassField *field, MonoError *error)
 {
        guint32 idx;
+       mono_error_init (error);
+
        if (image_is_dynamic (klass->image)) {
                field = mono_metadata_get_corresponding_field_from_generic_type_definition (field);
                return lookup_custom_attr (klass->image, field);
@@ -9723,7 +9909,7 @@ mono_custom_attrs_from_field (MonoClass *klass, MonoClassField *field)
        idx = find_field_index (klass, field);
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_FIELDDEF;
-       return mono_custom_attrs_from_index (klass->image, idx);
+       return mono_custom_attrs_from_index_checked (klass->image, idx, error);
 }
 
 /**
@@ -9737,6 +9923,25 @@ mono_custom_attrs_from_field (MonoClass *klass, MonoClassField *field)
  */
 MonoCustomAttrInfo*
 mono_custom_attrs_from_param (MonoMethod *method, guint32 param)
+{
+       MonoError error;
+       MonoCustomAttrInfo *result = mono_custom_attrs_from_param_checked (method, param, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+/**
+ * mono_custom_attrs_from_param_checked:
+ * @method: handle to the method that we want to retrieve custom parameter information from
+ * @param: parameter number, where zero represent the return value, and one is the first parameter in the method
+ * @error: set on error
+ *
+ * The result must be released with mono_custom_attrs_free().
+ *
+ * Returns: the custom attribute object for the specified parameter, or NULL if there are none.  On failure returns NULL and sets @error.
+ */
+MonoCustomAttrInfo*
+mono_custom_attrs_from_param_checked (MonoMethod *method, guint32 param, MonoError *error)
 {
        MonoTableInfo *ca;
        guint32 i, idx, method_index;
@@ -9744,6 +9949,8 @@ mono_custom_attrs_from_param (MonoMethod *method, guint32 param)
        MonoImage *image;
        MonoReflectionMethodAux *aux;
 
+       mono_error_init (error);
+
        /*
         * An instantiated method has the same cattrs as the generic method definition.
         *
@@ -9798,7 +10005,7 @@ mono_custom_attrs_from_param (MonoMethod *method, guint32 param)
        idx = i;
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_PARAMDEF;
-       return mono_custom_attrs_from_index (image, idx);
+       return mono_custom_attrs_from_index_checked (image, idx, error);
 }
 
 gboolean
@@ -9860,43 +10067,76 @@ mono_custom_attrs_get_attr_checked (MonoCustomAttrInfo *ainfo, MonoClass *attr_k
  */
 MonoCustomAttrInfo*
 mono_reflection_get_custom_attrs_info (MonoObject *obj)
+{
+       MonoError error;
+       MonoCustomAttrInfo *result = mono_reflection_get_custom_attrs_info_checked (obj, &error);
+       mono_error_assert_ok (&error);
+       return result;
+}
+
+/**
+ * mono_reflection_get_custom_attrs_info_checked:
+ * @obj: a reflection object handle
+ * @error: set on error
+ *
+ * Return the custom attribute info for attributes defined for the
+ * reflection handle @obj. The objects.
+ *
+ * On failure returns NULL and sets @error.
+ *
+ * FIXME this function leaks like a sieve for SRE objects.
+ */
+MonoCustomAttrInfo*
+mono_reflection_get_custom_attrs_info_checked (MonoObject *obj, MonoError *error)
 {
        MonoClass *klass;
        MonoCustomAttrInfo *cinfo = NULL;
        
+       mono_error_init (error);
+
        klass = obj->vtable->klass;
        if (klass == mono_defaults.monotype_class) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
+               return_val_if_nok (error, NULL);
                klass = mono_class_from_mono_type (type);
                /*We cannot mono_class_init the class from which we'll load the custom attributes since this must work with broken types.*/
-               cinfo = mono_custom_attrs_from_class (klass);
+               cinfo = mono_custom_attrs_from_class_checked (klass, error);
+               return_val_if_nok (error, NULL);
        } else if (strcmp ("Assembly", klass->name) == 0 || strcmp ("MonoAssembly", klass->name) == 0) {
                MonoReflectionAssembly *rassembly = (MonoReflectionAssembly*)obj;
-               cinfo = mono_custom_attrs_from_assembly (rassembly->assembly);
+               cinfo = mono_custom_attrs_from_assembly_checked (rassembly->assembly, error);
+               return_val_if_nok (error, NULL);
        } else if (strcmp ("Module", klass->name) == 0 || strcmp ("MonoModule", klass->name) == 0) {
                MonoReflectionModule *module = (MonoReflectionModule*)obj;
-               cinfo = mono_custom_attrs_from_module (module->image);
+               cinfo = mono_custom_attrs_from_module (module->image, error);
+               return_val_if_nok (error, NULL);
        } else if (strcmp ("MonoProperty", klass->name) == 0) {
                MonoReflectionProperty *rprop = (MonoReflectionProperty*)obj;
-               cinfo = mono_custom_attrs_from_property (rprop->property->parent, rprop->property);
+               cinfo = mono_custom_attrs_from_property_checked (rprop->property->parent, rprop->property, error);
+               return_val_if_nok (error, NULL);
        } else if (strcmp ("MonoEvent", klass->name) == 0) {
                MonoReflectionMonoEvent *revent = (MonoReflectionMonoEvent*)obj;
-               cinfo = mono_custom_attrs_from_event (revent->event->parent, revent->event);
+               cinfo = mono_custom_attrs_from_event_checked (revent->event->parent, revent->event, error);
+               return_val_if_nok (error, NULL);
        } else if (strcmp ("MonoField", klass->name) == 0) {
                MonoReflectionField *rfield = (MonoReflectionField*)obj;
-               cinfo = mono_custom_attrs_from_field (rfield->field->parent, rfield->field);
+               cinfo = mono_custom_attrs_from_field_checked (rfield->field->parent, rfield->field, error);
+               return_val_if_nok (error, NULL);
        } else if ((strcmp ("MonoMethod", klass->name) == 0) || (strcmp ("MonoCMethod", klass->name) == 0)) {
                MonoReflectionMethod *rmethod = (MonoReflectionMethod*)obj;
-               cinfo = mono_custom_attrs_from_method (rmethod->method);
+               cinfo = mono_custom_attrs_from_method_checked (rmethod->method, error);
+               return_val_if_nok (error, NULL);
        } else if ((strcmp ("MonoGenericMethod", klass->name) == 0) || (strcmp ("MonoGenericCMethod", klass->name) == 0)) {
                MonoReflectionMethod *rmethod = (MonoReflectionMethod*)obj;
-               cinfo = mono_custom_attrs_from_method (rmethod->method);
+               cinfo = mono_custom_attrs_from_method_checked (rmethod->method, error);
+               return_val_if_nok (error, NULL);
        } else if (strcmp ("ParameterInfo", klass->name) == 0 || strcmp ("MonoParameterInfo", klass->name) == 0) {
                MonoReflectionParameter *param = (MonoReflectionParameter*)obj;
                MonoClass *member_class = mono_object_class (param->MemberImpl);
                if (mono_class_is_reflection_method_or_constructor (member_class)) {
                        MonoReflectionMethod *rmethod = (MonoReflectionMethod*)param->MemberImpl;
-                       cinfo = mono_custom_attrs_from_param (rmethod->method, param->PositionImpl + 1);
+                       cinfo = mono_custom_attrs_from_param_checked (rmethod->method, param->PositionImpl + 1, error);
+                       return_val_if_nok (error, NULL);
                } else if (is_sr_mono_property (member_class)) {
                        MonoReflectionProperty *prop = (MonoReflectionProperty *)param->MemberImpl;
                        MonoMethod *method;
@@ -9904,12 +10144,15 @@ mono_reflection_get_custom_attrs_info (MonoObject *obj)
                                method = prop->property->set;
                        g_assert (method);
 
-                       cinfo = mono_custom_attrs_from_param (method, param->PositionImpl + 1);
+                       cinfo = mono_custom_attrs_from_param_checked (method, param->PositionImpl + 1, error);
+                       return_val_if_nok (error, NULL);
                } 
 #ifndef DISABLE_REFLECTION_EMIT
                else if (is_sre_method_on_tb_inst (member_class)) {/*XXX This is a workaround for Compiler Context*/
-                       MonoMethod *method = mono_reflection_method_on_tb_inst_get_handle ((MonoReflectionMethodOnTypeBuilderInst*)param->MemberImpl);
-                       cinfo = mono_custom_attrs_from_param (method, param->PositionImpl + 1);
+                       MonoMethod *method = mono_reflection_method_on_tb_inst_get_handle ((MonoReflectionMethodOnTypeBuilderInst*)param->MemberImpl, error);
+                       return_val_if_nok (error, NULL);
+                       cinfo = mono_custom_attrs_from_param_checked (method, param->PositionImpl + 1, error);
+                       return_val_if_nok (error, NULL);
                } else if (is_sre_ctor_on_tb_inst (member_class)) { /*XX This is a workaround for Compiler Context*/
                        MonoReflectionCtorOnTypeBuilderInst *c = (MonoReflectionCtorOnTypeBuilderInst*)param->MemberImpl;
                        MonoMethod *method = NULL;
@@ -9920,16 +10163,17 @@ mono_reflection_get_custom_attrs_info (MonoObject *obj)
                        else
                                g_error ("mono_reflection_get_custom_attrs_info:: can't handle a CTBI with base_method of type %s", mono_type_get_full_name (member_class));
 
-                       cinfo = mono_custom_attrs_from_param (method, param->PositionImpl + 1);
+                       cinfo = mono_custom_attrs_from_param_checked (method, param->PositionImpl + 1, error);
+                       return_val_if_nok (error, NULL);
                } 
 #endif
                else {
                        char *type_name = mono_type_get_full_name (member_class);
-                       char *msg = g_strdup_printf ("Custom attributes on a ParamInfo with member %s are not supported", type_name);
-                       MonoException *ex = mono_get_exception_not_supported  (msg);
+                       mono_error_set_generic_error (error, "System", "NotSupportedException",
+                                                     "Custom attributes on a ParamInfo with member %s are not supported",
+                                                     type_name);
                        g_free (type_name);
-                       g_free (msg);
-                       mono_raise_exception (ex);
+                       return NULL;
                }
        } else if (strcmp ("AssemblyBuilder", klass->name) == 0) {
                MonoReflectionAssemblyBuilder *assemblyb = (MonoReflectionAssemblyBuilder*)obj;
@@ -9951,7 +10195,8 @@ mono_reflection_get_custom_attrs_info (MonoObject *obj)
                cinfo = mono_custom_attrs_from_builders (NULL, &((MonoReflectionTypeBuilder*)fb->typeb)->module->dynamic_image->image, fb->cattrs);
        } else if (strcmp ("MonoGenericClass", klass->name) == 0) {
                MonoReflectionGenericClass *gclass = (MonoReflectionGenericClass*)obj;
-               cinfo = mono_reflection_get_custom_attrs_info ((MonoObject*)gclass->generic_type);
+               cinfo = mono_reflection_get_custom_attrs_info_checked ((MonoObject*)gclass->generic_type, error);
+               return_val_if_nok (error, NULL);
        } else { /* handle other types here... */
                g_error ("get custom attrs not yet supported for %s", klass->name);
        }
@@ -9976,7 +10221,8 @@ mono_reflection_get_custom_attrs_by_type (MonoObject *obj, MonoClass *attr_klass
 
        mono_error_init (error);
 
-       cinfo = mono_reflection_get_custom_attrs_info (obj);
+       cinfo = mono_reflection_get_custom_attrs_info_checked (obj, error);
+       return_val_if_nok (error, NULL);
        if (cinfo) {
                result = mono_custom_attrs_construct_by_type (cinfo, attr_klass, error);
                if (!result)
@@ -9984,9 +10230,7 @@ mono_reflection_get_custom_attrs_by_type (MonoObject *obj, MonoClass *attr_klass
                if (!cinfo->cached)
                        mono_custom_attrs_free (cinfo);
        } else {
-               /* FIXME add MonoError to mono_reflection_get_custom_attrs_info */
-               if (mono_loader_get_last_error ())
-                       return NULL;
+               mono_loader_assert_no_error ();
                result = mono_array_new_cached (mono_domain_get (), mono_defaults.attribute_class, 0);
        }
 
@@ -10019,36 +10263,62 @@ mono_reflection_get_custom_attrs (MonoObject *obj)
  */
 MonoArray*
 mono_reflection_get_custom_attrs_data (MonoObject *obj)
+{
+       MonoError error;
+       MonoArray* result;
+       result = mono_reflection_get_custom_attrs_data_checked (obj, &error);
+       mono_error_cleanup (&error); /* FIXME new API that doesn't swallow the error */
+       return result;
+}
+
+/*
+ * mono_reflection_get_custom_attrs_data_checked:
+ * @obj: a reflection obj handle
+ * @error: set on error
+ *
+ * Returns an array of System.Reflection.CustomAttributeData,
+ * which include information about attributes reflected on
+ * types loaded using the Reflection Only methods
+ */
+MonoArray*
+mono_reflection_get_custom_attrs_data_checked (MonoObject *obj, MonoError *error)
 {
        MonoArray *result;
        MonoCustomAttrInfo *cinfo;
 
-       cinfo = mono_reflection_get_custom_attrs_info (obj);
+       mono_error_init (error);
+
+       cinfo = mono_reflection_get_custom_attrs_info_checked (obj, error);
+       return_val_if_nok (error, NULL);
        if (cinfo) {
-               result = mono_custom_attrs_data_construct (cinfo);
+               result = mono_custom_attrs_data_construct (cinfo, error);
+               return_val_if_nok (error, NULL);
                if (!cinfo->cached)
                        mono_custom_attrs_free (cinfo);
        } else
                result = mono_array_new (mono_domain_get (), mono_defaults.customattribute_data_class, 0);
 
+       if (mono_loader_get_last_error ())
+               mono_error_set_from_loader_error (error);
+
        return result;
 }
 
 static MonoReflectionType*
-mono_reflection_type_get_underlying_system_type (MonoReflectionType* t)
+mono_reflection_type_get_underlying_system_type (MonoReflectionType* t, MonoError *error)
 {
        static MonoMethod *method_get_underlying_system_type = NULL;
-       MonoError error;
        MonoReflectionType *rt;
        MonoMethod *usertype_method;
 
+       mono_error_init (error);
+
        if (!method_get_underlying_system_type)
                method_get_underlying_system_type = mono_class_get_method_from_name (mono_defaults.systemtype_class, "get_UnderlyingSystemType", 0);
 
        usertype_method = mono_object_get_virtual_method ((MonoObject *) t, method_get_underlying_system_type);
 
-       rt = (MonoReflectionType *) mono_runtime_invoke_checked (usertype_method, t, NULL, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       rt = (MonoReflectionType *) mono_runtime_invoke_checked (usertype_method, t, NULL, error);
 
        return rt;
 }
@@ -10134,17 +10404,19 @@ is_sre_ctor_on_tb_inst (MonoClass *klass)
 }
 
 MonoType*
-mono_reflection_type_get_handle (MonoReflectionType* ref)
+mono_reflection_type_get_handle (MonoReflectionType* ref, MonoError *error)
 {
        MonoClass *klass;
+       mono_error_init (error);
+
        if (!ref)
                return NULL;
        if (ref->type)
                return ref->type;
 
        if (is_usertype (ref)) {
-               ref = mono_reflection_type_get_underlying_system_type (ref);
-               if (ref == NULL || is_usertype (ref))
+               ref = mono_reflection_type_get_underlying_system_type (ref, error);
+               if (ref == NULL || is_usertype (ref) || !is_ok (error))
                        return NULL;
                if (ref->type)
                        return ref->type;
@@ -10155,7 +10427,8 @@ mono_reflection_type_get_handle (MonoReflectionType* ref)
        if (is_sre_array (klass)) {
                MonoType *res;
                MonoReflectionArrayType *sre_array = (MonoReflectionArrayType*)ref;
-               MonoType *base = mono_reflection_type_get_handle (sre_array->element_type);
+               MonoType *base = mono_reflection_type_get_handle (sre_array->element_type, error);
+               return_val_if_nok (error, NULL);
                g_assert (base);
                if (sre_array->rank == 0) //single dimentional array
                        res = &mono_array_class_get (mono_class_from_mono_type (base), 1)->byval_arg;
@@ -10166,7 +10439,8 @@ mono_reflection_type_get_handle (MonoReflectionType* ref)
        } else if (is_sre_byref (klass)) {
                MonoType *res;
                MonoReflectionDerivedType *sre_byref = (MonoReflectionDerivedType*)ref;
-               MonoType *base = mono_reflection_type_get_handle (sre_byref->element_type);
+               MonoType *base = mono_reflection_type_get_handle (sre_byref->element_type, error);
+               return_val_if_nok (error, NULL);
                g_assert (base);
                res = &mono_class_from_mono_type (base)->this_arg;
                sre_byref->type.type = res;
@@ -10174,7 +10448,8 @@ mono_reflection_type_get_handle (MonoReflectionType* ref)
        } else if (is_sre_pointer (klass)) {
                MonoType *res;
                MonoReflectionDerivedType *sre_pointer = (MonoReflectionDerivedType*)ref;
-               MonoType *base = mono_reflection_type_get_handle (sre_pointer->element_type);
+               MonoType *base = mono_reflection_type_get_handle (sre_pointer->element_type, error);
+               return_val_if_nok (error, NULL);
                g_assert (base);
                res = &mono_ptr_class_get (base)->byval_arg;
                sre_pointer->type.type = res;
@@ -10188,8 +10463,8 @@ mono_reflection_type_get_handle (MonoReflectionType* ref)
                types = g_new0 (MonoType*, count);
                for (i = 0; i < count; ++i) {
                        MonoReflectionType *t = (MonoReflectionType *)mono_array_get (gclass->type_arguments, gpointer, i);
-                       types [i] = mono_reflection_type_get_handle (t);
-                       if (!types[i]) {
+                       types [i] = mono_reflection_type_get_handle (t, error);
+                       if (!types[i] || !is_ok (error)) {
                                g_free (types);
                                return NULL;
                        }
@@ -10206,18 +10481,20 @@ mono_reflection_type_get_handle (MonoReflectionType* ref)
        return NULL;
 }
 
-
-
 void
 mono_reflection_create_unmanaged_type (MonoReflectionType *type)
 {
-       mono_reflection_type_get_handle (type);
+       MonoError error;
+       mono_reflection_type_get_handle (type, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 void
 mono_reflection_register_with_runtime (MonoReflectionType *type)
 {
-       MonoType *res = mono_reflection_type_get_handle (type);
+       MonoError error;
+       MonoType *res = mono_reflection_type_get_handle (type, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        MonoDomain *domain = mono_object_domain ((MonoObject*)type);
        MonoClass *klass;
 
@@ -10246,6 +10523,7 @@ mono_reflection_register_with_runtime (MonoReflectionType *type)
  */
 static MonoMethodSignature*
 parameters_to_signature (MonoImage *image, MonoArray *parameters) {
+       MonoError error;
        MonoMethodSignature *sig;
        int count, i;
 
@@ -10254,8 +10532,10 @@ parameters_to_signature (MonoImage *image, MonoArray *parameters) {
        sig = (MonoMethodSignature *)image_g_malloc0 (image, MONO_SIZEOF_METHOD_SIGNATURE + sizeof (MonoType*) * count);
        sig->param_count = count;
        sig->sentinelpos = -1; /* FIXME */
-       for (i = 0; i < count; ++i)
-               sig->params [i] = mono_type_array_get_and_resolve (parameters, i);
+       for (i = 0; i < count; ++i) {
+               sig->params [i] = mono_type_array_get_and_resolve (parameters, i, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       }
        return sig;
 }
 
@@ -10277,22 +10557,34 @@ ctor_builder_to_signature (MonoImage *image, MonoReflectionCtorBuilder *ctor) {
  */
 static MonoMethodSignature*
 method_builder_to_signature (MonoImage *image, MonoReflectionMethodBuilder *method) {
+       MonoError error;
        MonoMethodSignature *sig;
 
        sig = parameters_to_signature (image, method->parameters);
        sig->hasthis = method->attrs & METHOD_ATTRIBUTE_STATIC? 0: 1;
-       sig->ret = method->rtype? mono_reflection_type_get_handle ((MonoReflectionType*)method->rtype): &mono_defaults.void_class->byval_arg;
+       if (method->rtype) {
+               sig->ret = mono_reflection_type_get_handle ((MonoReflectionType*)method->rtype, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       } else {
+               sig->ret = &mono_defaults.void_class->byval_arg;
+       }
        sig->generic_param_count = method->generic_params ? mono_array_length (method->generic_params) : 0;
        return sig;
 }
 
 static MonoMethodSignature*
 dynamic_method_to_signature (MonoReflectionDynamicMethod *method) {
+       MonoError error;
        MonoMethodSignature *sig;
 
        sig = parameters_to_signature (NULL, method->parameters);
        sig->hasthis = method->attrs & METHOD_ATTRIBUTE_STATIC? 0: 1;
-       sig->ret = method->rtype? mono_reflection_type_get_handle (method->rtype): &mono_defaults.void_class->byval_arg;
+       if (method->rtype) {
+               sig->ret = mono_reflection_type_get_handle (method->rtype, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       } else {
+               sig->ret = &mono_defaults.void_class->byval_arg;
+       }
        sig->generic_param_count = 0;
        return sig;
 }
@@ -10300,11 +10592,13 @@ dynamic_method_to_signature (MonoReflectionDynamicMethod *method) {
 static void
 get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type)
 {
+       MonoError error;
        MonoClass *klass = mono_object_class (prop);
        if (strcmp (klass->name, "PropertyBuilder") == 0) {
                MonoReflectionPropertyBuilder *pb = (MonoReflectionPropertyBuilder *)prop;
                *name = mono_string_to_utf8 (pb->name);
-               *type = mono_reflection_type_get_handle ((MonoReflectionType*)pb->type);
+               *type = mono_reflection_type_get_handle ((MonoReflectionType*)pb->type, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
        } else {
                MonoReflectionProperty *p = (MonoReflectionProperty *)prop;
                *name = g_strdup (p->property->name);
@@ -10318,11 +10612,13 @@ get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type)
 static void
 get_field_name_and_type (MonoObject *field, char **name, MonoType **type)
 {
+       MonoError error;
        MonoClass *klass = mono_object_class (field);
        if (strcmp (klass->name, "FieldBuilder") == 0) {
                MonoReflectionFieldBuilder *fb = (MonoReflectionFieldBuilder *)field;
                *name = mono_string_to_utf8 (fb->name);
-               *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type);
+               *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
        } else {
                MonoReflectionField *f = (MonoReflectionField *)field;
                *name = g_strdup (mono_field_get_name (f->field));
@@ -10415,7 +10711,8 @@ mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *er
                return type;
 
        if (is_usertype (type)) {
-               type = mono_reflection_type_get_underlying_system_type (type);
+               type = mono_reflection_type_get_underlying_system_type (type, error);
+               return_val_if_nok (error, NULL);
                if (is_usertype (type)) {
                        mono_error_set_generic_error (error, "System", "NotSupportedException", "User defined subclasses of System.Type are not yet supported22");
                        return NULL;
@@ -10439,6 +10736,7 @@ mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *er
 static void
 encode_cattr_value (MonoAssembly *assembly, char *buffer, char *p, char **retbuffer, char **retp, guint32 *buflen, MonoType *type, MonoObject *arg, char *argval)
 {
+       MonoError error;
        MonoTypeEnum simple_type;
        
        if ((p-buffer) + 10 >= *buflen) {
@@ -10513,12 +10811,15 @@ handle_enum:
        case MONO_TYPE_CLASS: {
                char *str;
                guint32 slen;
+               MonoType *arg_type;
                if (!arg) {
                        *p++ = 0xFF;
                        break;
                }
 handle_type:
-               str = type_get_qualified_name (mono_reflection_type_get_handle ((MonoReflectionType*)arg), NULL);
+               arg_type = mono_reflection_type_get_handle ((MonoReflectionType*)arg, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               str = type_get_qualified_name (arg_type, NULL);
                slen = strlen (str);
                if ((p-buffer) + 10 + slen >= *buflen) {
                        char *newbuf;
@@ -10819,12 +11120,17 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
        mono_loader_lock ();
 
        if (tb->parent) {
+               MonoType *parent_type = mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent, &error);
+               if (!is_ok (&error)) {
+                       mono_loader_unlock ();
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
                /* check so we can compile corlib correctly */
                if (strcmp (mono_object_class (tb->parent)->name, "TypeBuilder") == 0) {
                        /* mono_class_setup_mono_type () guaranteess type->data.klass is valid */
-                       parent = mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent)->data.klass;
+                       parent = parent_type->data.klass;
                } else {
-                       parent = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent));
+                       parent = mono_class_from_mono_type (parent_type);
                }
        } else {
                parent = NULL;
@@ -10912,7 +11218,9 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
 
        if (tb->nesting_type) {
                g_assert (tb->nesting_type->type);
-               klass->nested_in = mono_class_from_mono_type (mono_reflection_type_get_handle (tb->nesting_type));
+               MonoType *nesting_type = mono_reflection_type_get_handle (tb->nesting_type, &error);
+               if (!is_ok (&error)) goto failure;
+               klass->nested_in = mono_class_from_mono_type (nesting_type);
        }
 
        /*g_print ("setup %s as %s (%p)\n", klass->name, ((MonoObject*)tb)->vtable->klass->name, tb);*/
@@ -10947,6 +11255,7 @@ mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb)
 void
 mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
 {
+       MonoError error;
        MonoClass *klass;
        int count, i;
 
@@ -10969,7 +11278,9 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
 
        for (i = 0; i < count; i++) {
                MonoReflectionGenericParam *gparam = (MonoReflectionGenericParam *)mono_array_get (tb->generic_params, gpointer, i);
-               MonoGenericParamFull *param = (MonoGenericParamFull *) mono_reflection_type_get_handle ((MonoReflectionType*)gparam)->data.generic_param;
+               MonoType *param_type = mono_reflection_type_get_handle ((MonoReflectionType*)gparam, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoGenericParamFull *param = (MonoGenericParamFull *) param_type->data.generic_param;
                klass->generic_container->type_params [i] = *param;
                /*Make sure we are a diferent type instance */
                klass->generic_container->type_params [i].param.owner = klass->generic_container;
@@ -10991,6 +11302,7 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
 void
 mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
 {
+       MonoError error;
        MonoClass *klass;
 
        klass = mono_class_from_mono_type (tb->type.type);
@@ -11006,12 +11318,21 @@ mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
 
                fb = mono_array_get (tb->fields, MonoReflectionFieldBuilder*, 0);
 
-               if (!mono_type_is_valid_enum_basetype (mono_reflection_type_get_handle ((MonoReflectionType*)fb->type))) {
+               MonoType *field_type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+               if (!is_ok (&error)) {
+                       mono_loader_unlock ();
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
+               if (!mono_type_is_valid_enum_basetype (field_type)) {
                        mono_loader_unlock ();
                        return;
                }
 
-               enum_basetype = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type);
+               enum_basetype = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+               if (!is_ok (&error)) {
+                       mono_loader_unlock ();
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
                klass->element_class = mono_class_from_mono_type (enum_basetype);
                if (!klass->element_class)
                        klass->element_class = mono_class_from_mono_type (enum_basetype);
@@ -11036,6 +11357,7 @@ static MonoMarshalSpec*
 mono_marshal_spec_from_builder (MonoImage *image, MonoAssembly *assembly,
                                                                MonoReflectionMarshal *minfo)
 {
+       MonoError error;
        MonoMarshalSpec *res;
 
        res = image_g_new0 (image, MonoMarshalSpec, 1);
@@ -11062,9 +11384,12 @@ mono_marshal_spec_from_builder (MonoImage *image, MonoAssembly *assembly,
                break;
 
        case MONO_NATIVE_CUSTOM:
-               if (minfo->marshaltyperef)
+               if (minfo->marshaltyperef) {
+                       MonoType *marshaltyperef = mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        res->data.custom_data.custom_name =
-                               type_get_fully_qualified_name (mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef));
+                               type_get_fully_qualified_name (marshaltyperef);
+               }
                if (minfo->mcookie)
                        res->data.custom_data.cookie = mono_string_to_utf8 (minfo->mcookie);
                break;
@@ -11081,20 +11406,13 @@ MonoReflectionMarshalAsAttribute*
 mono_reflection_marshal_as_attribute_from_marshal_spec (MonoDomain *domain, MonoClass *klass,
                                                        MonoMarshalSpec *spec, MonoError *error)
 {
-       static MonoClass *System_Reflection_Emit_MarshalAsAttribute;
        MonoReflectionType *rt;
        MonoReflectionMarshalAsAttribute *minfo;
        MonoType *mtype;
 
        mono_error_init (error);
        
-       if (!System_Reflection_Emit_MarshalAsAttribute) {
-               System_Reflection_Emit_MarshalAsAttribute = mono_class_from_name (
-                  mono_defaults.corlib, "System.Runtime.InteropServices", "MarshalAsAttribute");
-               g_assert (System_Reflection_Emit_MarshalAsAttribute);
-       }
-
-       minfo = (MonoReflectionMarshalAsAttribute*)mono_object_new_checked (domain, System_Reflection_Emit_MarshalAsAttribute, error);
+       minfo = (MonoReflectionMarshalAsAttribute*)mono_object_new_checked (domain, mono_class_get_marshal_as_attribute_class (), error);
        if (!minfo)
                return NULL;
        minfo->utype = spec->native;
@@ -11251,7 +11569,9 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
                                mono_array_get (rmb->ilgen->locals, MonoReflectionLocalBuilder*, i);
 
                        header->locals [i] = image_g_new0 (image, MonoType, 1);
-                       memcpy (header->locals [i], mono_reflection_type_get_handle ((MonoReflectionType*)lb->type), MONO_SIZEOF_TYPE);
+                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)lb->type, &error);
+                       mono_error_assert_ok (&error);
+                       memcpy (header->locals [i], type, MONO_SIZEOF_TYPE);
                }
 
                header->num_clauses = num_clauses;
@@ -11280,7 +11600,9 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
                for (i = 0; i < count; i++) {
                        MonoReflectionGenericParam *gp =
                                mono_array_get (rmb->generic_params, MonoReflectionGenericParam*, i);
-                       MonoGenericParamFull *param = (MonoGenericParamFull *) mono_reflection_type_get_handle ((MonoReflectionType*)gp)->data.generic_param;
+                       MonoType *gp_type = mono_reflection_type_get_handle ((MonoReflectionType*)gp, &error);
+                       mono_error_assert_ok (&error);
+                       MonoGenericParamFull *param = (MonoGenericParamFull *) gp_type->data.generic_param;
                        container->type_params [i] = *param;
                }
 
@@ -11463,7 +11785,12 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder*
        field->name = mono_string_to_utf8_image (klass->image, fb->name, &error);
        g_assert (mono_error_ok (&error));
        if (fb->attrs || fb->modreq || fb->modopt) {
-               field->type = mono_metadata_type_dup (NULL, mono_reflection_type_get_handle ((MonoReflectionType*)fb->type));
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+               if (!is_ok (&error)) {
+                       g_free (field);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
+               field->type = mono_metadata_type_dup (NULL, type);
                field->type->attrs = fb->attrs;
 
                g_assert (image_is_dynamic (klass->image));
@@ -11472,7 +11799,11 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder*
                field->type = mono_metadata_type_dup (klass->image, custom);
                g_free (custom);
        } else {
-               field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type);
+               field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
+               if (!is_ok (&error)) {
+                       g_free (field);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
        }
        if (fb->offset != -1)
                field->offset = fb->offset;
@@ -11488,6 +11819,7 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder*
 MonoType*
 mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types)
 {
+       MonoError error;
        MonoClass *klass;
        MonoReflectionTypeBuilder *tb = NULL;
        gboolean is_dynamic = FALSE;
@@ -11513,7 +11845,10 @@ mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc
        if (tb && tb->generic_container)
                mono_reflection_create_generic_class (tb);
 
-       klass = mono_class_from_mono_type (mono_reflection_type_get_handle (type));
+       MonoType *t = mono_reflection_type_get_handle (type, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
+       klass = mono_class_from_mono_type (t);
        if (!klass->generic_container) {
                mono_loader_unlock ();
                return NULL;
@@ -11562,12 +11897,13 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        if (!strcmp (rmethod->object.vtable->klass->name, "MethodBuilder")) {
 #ifndef DISABLE_REFLECTION_EMIT
                MonoReflectionMethodBuilder *mb = NULL;
-               MonoReflectionTypeBuilder *tb;
+               MonoType *tb;
                MonoClass *klass;
 
                mb = (MonoReflectionMethodBuilder *) rmethod;
-               tb = (MonoReflectionTypeBuilder *) mb->type;
-               klass = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)tb));
+               tb = mono_reflection_type_get_handle ((MonoReflectionType*)mb->type, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               klass = mono_class_from_mono_type (tb);
 
                method = methodbuilder_to_mono_method (klass, mb, &error);
                if (!method)
@@ -11592,7 +11928,11 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        type_argv = g_new0 (MonoType *, count);
        for (i = 0; i < count; i++) {
                MonoReflectionType *garg = (MonoReflectionType *)mono_array_get (types, gpointer, i);
-               type_argv [i] = mono_reflection_type_get_handle (garg);
+               type_argv [i] = mono_reflection_type_get_handle (garg, &error);
+               if (!is_ok (&error)) {
+                       g_free (type_argv);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
        }
        ginst = mono_metadata_get_generic_inst (count, type_argv);
        g_free (type_argv);
@@ -11680,9 +12020,13 @@ inflate_method (MonoReflectionType *type, MonoObject *obj, MonoError *error)
 
        if (is_sre_generic_instance (type_class)) {
                MonoReflectionGenericClass *mgc = (MonoReflectionGenericClass*)type;
-               gklass = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)mgc->generic_type));
+               MonoType *generic_type = mono_reflection_type_get_handle ((MonoReflectionType*)mgc->generic_type, error);
+               return_val_if_nok (error, NULL);
+               gklass = mono_class_from_mono_type (generic_type);
        } else if (is_sre_type_builder (type_class)) {
-               gklass = mono_class_from_mono_type (mono_reflection_type_get_handle (type));
+               MonoType *t = mono_reflection_type_get_handle (type, error);
+               return_val_if_nok (error, NULL);
+               gklass = mono_class_from_mono_type (t);
        } else if (type->type) {
                gklass = mono_class_from_mono_type (type->type);
                gklass = mono_class_get_generic_type_definition (gklass);
@@ -11709,20 +12053,24 @@ inflate_method (MonoReflectionType *type, MonoObject *obj, MonoError *error)
                g_error ("can't handle type %s", obj->vtable->klass->name);
        }
 
-       return inflate_mono_method (mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)type)), method, obj);
+       MonoType *t = mono_reflection_type_get_handle (type, error);
+       return_val_if_nok (error, NULL);
+       return inflate_mono_method (mono_class_from_mono_type (t), method, obj);
 }
 
 /*TODO avoid saving custom attrs for generic classes as it's enough to have them on the generic type definition.*/
 void
 mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *fields)
 {
+       MonoError error;
        MonoGenericClass *gclass;
        MonoDynamicGenericClass *dgclass;
        MonoClass *klass, *gklass;
        MonoType *gtype;
        int i;
 
-       gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type);
+       gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        klass = mono_class_from_mono_type (gtype);
        g_assert (gtype->type == MONO_TYPE_GENERICINST);
        gclass = gtype->data.generic_class;
@@ -11745,6 +12093,7 @@ mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, Mono
        dgclass->field_generic_types = mono_image_set_new0 (gclass->owner, MonoType*, dgclass->count_fields);
 
        for (i = 0; i < dgclass->count_fields; i++) {
+               MonoError error;
                MonoObject *obj = (MonoObject *)mono_array_get (fields, gpointer, i);
                MonoClassField *field, *inflated_field = NULL;
 
@@ -11759,8 +12108,9 @@ mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, Mono
 
                dgclass->fields [i] = *field;
                dgclass->fields [i].parent = klass;
-               dgclass->fields [i].type = mono_class_inflate_generic_type (
-                       field->type, mono_generic_class_get_context ((MonoGenericClass *) dgclass));
+               dgclass->fields [i].type = mono_class_inflate_generic_type_checked (
+                       field->type, mono_generic_class_get_context ((MonoGenericClass *) dgclass), &error);
+               mono_error_assert_ok (&error); /* FIXME don't swallow the error */
                dgclass->field_generic_types [i] = field->type;
                MONO_GC_REGISTER_ROOT_IF_MOVING (dgclass->field_objects [i], MONO_ROOT_SOURCE_REFLECTION, "dynamic generic class field object");
                dgclass->field_objects [i] = obj;
@@ -11845,7 +12195,9 @@ fix_partial_generic_class (MonoClass *klass)
 
                for (i = 0; i < gklass->interface_count; ++i) {
                        MonoError error;
-                       MonoType *iface_type = mono_class_inflate_generic_type (&gklass->interfaces [i]->byval_arg, mono_class_get_context (klass));
+                       MonoType *iface_type = mono_class_inflate_generic_type_checked (&gklass->interfaces [i]->byval_arg, mono_class_get_context (klass), &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                        klass->interfaces [i] = mono_class_from_mono_type (iface_type);
                        mono_metadata_free_type (iface_type);
 
@@ -11860,9 +12212,11 @@ fix_partial_generic_class (MonoClass *klass)
                klass->fields = image_g_new0 (klass->image, MonoClassField, klass->field.count);
 
                for (i = 0; i < klass->field.count; i++) {
+                       MonoError error;
                        klass->fields [i] = gklass->fields [i];
                        klass->fields [i].parent = klass;
-                       klass->fields [i].type = mono_class_inflate_generic_type (gklass->fields [i].type, mono_class_get_context (klass));
+                       klass->fields [i].type = mono_class_inflate_generic_type_checked (gklass->fields [i].type, mono_class_get_context (klass), &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                }
        }
 
@@ -11942,7 +12296,8 @@ ensure_runtime_vtable (MonoClass *klass, MonoError *error)
                        klass->interface_count = mono_array_length (tb->interfaces);
                        klass->interfaces = (MonoClass **)mono_image_alloc (klass->image, sizeof (MonoClass*) * klass->interface_count);
                        for (i = 0; i < klass->interface_count; ++i) {
-                               MonoType *iface = mono_type_array_get_and_resolve (tb->interfaces, i);
+                               MonoType *iface = mono_type_array_get_and_resolve (tb->interfaces, i, error);
+                               return_val_if_nok (error, FALSE);
                                klass->interfaces [i] = mono_class_from_mono_type (iface);
                                if (!ensure_runtime_vtable (klass->interfaces [i], error))
                                        return FALSE;
@@ -11984,6 +12339,7 @@ ensure_runtime_vtable (MonoClass *klass, MonoError *error)
 static MonoMethod*
 mono_reflection_method_get_handle (MonoObject *method)
 {
+       MonoError error;
        MonoClass *klass = mono_object_class (method);
        if (is_sr_mono_method (klass) || is_sr_mono_generic_method (klass)) {
                MonoReflectionMethod *sr_method = (MonoReflectionMethod*)method;
@@ -11998,9 +12354,11 @@ mono_reflection_method_get_handle (MonoObject *method)
                MonoMethod *result;
                /*FIXME move this to a proper method and unify with resolve_object*/
                if (m->method_args) {
-                       result = mono_reflection_method_on_tb_inst_get_handle (m);
+                       result = mono_reflection_method_on_tb_inst_get_handle (m, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                } else {
-                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst);
+                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        MonoClass *inflated_klass = mono_class_from_mono_type (type);
                        MonoMethod *mono_method;
 
@@ -12125,10 +12483,13 @@ typebuilder_setup_fields (MonoClass *klass, MonoError *error)
                if (!mono_error_ok (error))
                        return;
                if (fb->attrs) {
-                       field->type = mono_metadata_type_dup (klass->image, mono_reflection_type_get_handle ((MonoReflectionType*)fb->type));
+                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, error);
+                       return_if_nok (error);
+                       field->type = mono_metadata_type_dup (klass->image, type);
                        field->type->attrs = fb->attrs;
                } else {
-                       field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type);
+                       field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, error);
+                       return_if_nok (error);
                }
 
                if ((fb->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA) && (rva_data = fb->rva_data)) {
@@ -12221,7 +12582,9 @@ mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, Mon
        MonoEvent *event = g_new0 (MonoEvent, 1);
        MonoClass *klass;
 
-       klass = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)tb));
+       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       klass = mono_class_from_mono_type (type);
 
        event->parent = klass;
        event->attrs = eb->attrs;
@@ -12469,7 +12832,9 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
                for (i = 0; i < mono_array_length (tb->subtypes); ++i) {
                        MonoReflectionTypeBuilder *subtb = mono_array_get (tb->subtypes, MonoReflectionTypeBuilder*, i);
                        mono_class_alloc_ext (klass);
-                       klass->ext->nested_classes = g_list_prepend_image (klass->image, klass->ext->nested_classes, mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)subtb)));
+                       MonoType *subtype = mono_reflection_type_get_handle ((MonoReflectionType*)subtb, &error);
+                       if (!is_ok (&error)) goto failure;
+                       klass->ext->nested_classes = g_list_prepend_image (klass->image, klass->ext->nested_classes, mono_class_from_mono_type (subtype));
                }
        }
 
@@ -12557,8 +12922,10 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
 
        if (gparam->mbuilder) {
                if (!gparam->mbuilder->generic_container) {
-                       MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)gparam->mbuilder->type;
-                       MonoClass *klass = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)tb));
+                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->mbuilder->type, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
+                       MonoClass *klass = mono_class_from_mono_type (tb);
                        gparam->mbuilder->generic_container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
                        gparam->mbuilder->generic_container->is_method = TRUE;
                        /* 
@@ -12571,7 +12938,9 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
                param->param.owner = gparam->mbuilder->generic_container;
        } else if (gparam->tbuilder) {
                if (!gparam->tbuilder->generic_container) {
-                       MonoClass *klass = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)gparam->tbuilder));
+                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->tbuilder, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoClass *klass = mono_class_from_mono_type (tb);
                        gparam->tbuilder->generic_container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
                        gparam->tbuilder->generic_container->owner.klass = klass;
                }
@@ -12607,7 +12976,8 @@ mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig)
        if (assembly != NULL){
                for (i = 0; i < na; ++i) {
                        MonoReflectionType *type = mono_array_get (sig->arguments, MonoReflectionType*, i);
-                       encode_reflection_type (assembly, type, &buf);
+                       encode_reflection_type (assembly, type, &buf, &error);
+                       if (!is_ok (&error)) goto fail;
                }
        }
 
@@ -12615,8 +12985,11 @@ mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig)
        result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, buflen);
        memcpy (mono_array_addr (result, char, 0), buf.buf, buflen);
        sigbuffer_free (&buf);
-
        return result;
+fail:
+       sigbuffer_free (&buf);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       return NULL;
 }
 
 MonoArray *
@@ -12637,7 +13010,9 @@ mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig)
        sigbuffer_add_value (&buf, 0x06);
        for (i = 0; i < na; ++i) {
                MonoReflectionType *type = mono_array_get (sig->arguments, MonoReflectionType*, i);
-               encode_reflection_type (assembly, type, &buf);
+               encode_reflection_type (assembly, type, &buf, &error);
+               if (!is_ok (&error))
+                       goto fail;
        }
 
        buflen = buf.p - buf.buf;
@@ -12646,6 +13021,10 @@ mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig)
        sigbuffer_free (&buf);
 
        return result;
+fail:
+       sigbuffer_free (&buf);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       return NULL;
 }
 
 typedef struct {
@@ -12680,6 +13059,7 @@ free_dynamic_method (void *dynamic_method)
 void 
 mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
 {
+       MonoError error;
        MonoReferenceQueue *queue;
        MonoMethod *handle;
        DynamicMethodReleaseData *release_data;
@@ -12755,7 +13135,16 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
                rmb.refs [i + 1] = handle_class;
        }               
 
-       klass = mb->owner ? mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)mb->owner)) : mono_defaults.object_class;
+       if (mb->owner) {
+               MonoType *owner_type = mono_reflection_type_get_handle ((MonoReflectionType*)mb->owner, &error);
+               if (!is_ok (&error)) {
+                       g_free (rmb.refs);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
+               klass = mono_class_from_mono_type (owner_type);
+       } else {
+               klass = mono_defaults.object_class;
+       }
 
        mb->mhandle = handle = reflection_methodbuilder_to_mono_method (klass, &rmb, sig);
        release_data = g_new (DynamicMethodReleaseData, 1);
@@ -12864,10 +13253,13 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean
 static void
 ensure_complete_type (MonoClass *klass)
 {
+       MonoError error;
+
        if (image_is_dynamic (klass->image) && !klass->wastypebuilder && mono_class_get_ref_info (klass)) {
                MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)mono_class_get_ref_info (klass);
 
-               mono_domain_try_type_resolve (mono_domain_get (), NULL, (MonoObject*)tb);
+               mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
 
                // Asserting here could break a lot of code
                //g_assert (klass->wastypebuilder);
@@ -12886,20 +13278,25 @@ ensure_complete_type (MonoClass *klass)
 static gpointer
 resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, MonoGenericContext *context)
 {
+       MonoError error;
        gpointer result = NULL;
 
        if (strcmp (obj->vtable->klass->name, "String") == 0) {
-               result = mono_string_intern ((MonoString*)obj);
+               result = mono_string_intern_checked ((MonoString*)obj, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                *handle_class = mono_defaults.string_class;
                g_assert (result);
        } else if (strcmp (obj->vtable->klass->name, "MonoType") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                MonoClass *mc = mono_class_from_mono_type (type);
                if (!mono_class_init (mc))
                        mono_raise_exception (mono_class_get_exception_for_failure (mc));
 
                if (context) {
-                       MonoType *inflated = mono_class_inflate_generic_type (type, context);
+                       MonoType *inflated = mono_class_inflate_generic_type_checked (type, context, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                        result = mono_class_from_mono_type (inflated);
                        mono_metadata_free_type (inflated);
                } else {
@@ -12926,7 +13323,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                        /* Type is not yet created */
                        MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)mb->type;
 
-                       mono_domain_try_type_resolve (mono_domain_get (), NULL, (MonoObject*)tb);
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
 
                        /*
                         * Hopefully this has been filled in by calling CreateType() on the
@@ -12951,7 +13349,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                if (!result) {
                        MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)cb->type;
 
-                       mono_domain_try_type_resolve (mono_domain_get (), NULL, (MonoObject*)tb);
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        result = cb->mhandle;
                }
                if (context) {
@@ -12965,7 +13364,9 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
 
                ensure_complete_type (field->parent);
                if (context) {
-                       MonoType *inflated = mono_class_inflate_generic_type (&field->parent->byval_arg, context);
+                       MonoType *inflated = mono_class_inflate_generic_type_checked (&field->parent->byval_arg, context, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                        MonoClass *klass = mono_class_from_mono_type (inflated);
                        MonoClassField *inflated_field;
                        gpointer iter = NULL;
@@ -12988,13 +13389,16 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                if (!result) {
                        MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)fb->typeb;
 
-                       mono_domain_try_type_resolve (mono_domain_get (), NULL, (MonoObject*)tb);
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        result = fb->handle;
                }
 
                if (fb->handle && fb->handle->parent->generic_container) {
                        MonoClass *klass = fb->handle->parent;
-                       MonoType *type = mono_class_inflate_generic_type (&klass->byval_arg, context);
+                       MonoType *type = mono_class_inflate_generic_type_checked (&klass->byval_arg, context, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                        MonoClass *inflated = mono_class_from_mono_type (type);
 
                        result = mono_class_get_field_from_name (inflated, mono_field_get_name (fb->handle));
@@ -13004,7 +13408,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                *handle_class = mono_defaults.fieldhandle_class;
        } else if (strcmp (obj->vtable->klass->name, "TypeBuilder") == 0) {
                MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)obj;
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)tb); 
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                MonoClass *klass;
 
                klass = type->data.klass;
@@ -13013,7 +13418,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                        result = klass;
                }
                else {
-                       mono_domain_try_type_resolve (mono_domain_get (), NULL, (MonoObject*)tb);
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        result = type->data.klass;
                        g_assert (result);
                }
@@ -13044,8 +13450,10 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                sig->param_count = nargs;
                /* TODO: Copy type ? */
                sig->ret = helper->return_type->type;
-               for (i = 0; i < nargs; ++i)
-                       sig->params [i] = mono_type_array_get_and_resolve (helper->arguments, i);
+               for (i = 0; i < nargs; ++i) {
+                       sig->params [i] = mono_type_array_get_and_resolve (helper->arguments, i, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
 
                result = sig;
                *handle_class = NULL;
@@ -13056,15 +13464,21 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                result = method->mhandle;
                *handle_class = mono_defaults.methodhandle_class;
        } else if (strcmp (obj->vtable->klass->name, "GenericTypeParameterBuilder") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj);
-               type = mono_class_inflate_generic_type (type, context);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               type = mono_class_inflate_generic_type_checked (type, context, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                result = mono_class_from_mono_type (type);
                *handle_class = mono_defaults.typehandle_class;
                g_assert (result);
                mono_metadata_free_type (type);
        } else if (strcmp (obj->vtable->klass->name, "MonoGenericClass") == 0) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj);
-               type = mono_class_inflate_generic_type (type, context);
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               type = mono_class_inflate_generic_type_checked (type, context, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                result = mono_class_from_mono_type (type);
                *handle_class = mono_defaults.typehandle_class;
                g_assert (result);
@@ -13082,7 +13496,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                else
                        g_error ("resolve_object:: can't handle a FTBI with base_method of type %s", mono_type_get_full_name (mono_object_class (f->fb)));
 
-               type = mono_class_inflate_generic_type (mono_reflection_type_get_handle ((MonoReflectionType*)f->inst), context);
+               MonoType *finst = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               type = mono_class_inflate_generic_type_checked (finst, context, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                inflated = mono_class_from_mono_type (type);
 
                result = field = mono_class_get_field_from_name (inflated, mono_field_get_name (field));
@@ -13092,7 +13510,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                *handle_class = mono_defaults.fieldhandle_class;
        } else if (strcmp (obj->vtable->klass->name, "ConstructorOnTypeBuilderInst") == 0) {
                MonoReflectionCtorOnTypeBuilderInst *c = (MonoReflectionCtorOnTypeBuilderInst*)obj;
-               MonoType *type = mono_class_inflate_generic_type (mono_reflection_type_get_handle ((MonoReflectionType*)c->inst), context);
+               MonoType *cinst = mono_reflection_type_get_handle ((MonoReflectionType*)c->inst, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoType *type = mono_class_inflate_generic_type_checked (cinst, context, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                MonoClass *inflated_klass = mono_class_from_mono_type (type);
                MonoMethod *method;
 
@@ -13109,14 +13531,18 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
        } else if (strcmp (obj->vtable->klass->name, "MethodOnTypeBuilderInst") == 0) {
                MonoReflectionMethodOnTypeBuilderInst *m = (MonoReflectionMethodOnTypeBuilderInst*)obj;
                if (m->method_args) {
-                       result = mono_reflection_method_on_tb_inst_get_handle (m);
+                       result = mono_reflection_method_on_tb_inst_get_handle (m, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        if (context) {
-                               MonoError error;
                                result = mono_class_inflate_generic_method_checked ((MonoMethod *)result, context, &error);
-                               g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */
+                               mono_error_assert_ok (&error);
                        }
                } else {
-                       MonoType *type = mono_class_inflate_generic_type (mono_reflection_type_get_handle ((MonoReflectionType*)m->inst), context);
+                       MonoType *minst = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *type = mono_class_inflate_generic_type_checked (minst, context, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                        MonoClass *inflated_klass = mono_class_from_mono_type (type);
                        MonoMethod *method;
 
@@ -13139,7 +13565,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                gpointer iter;
                char *name;
 
-               mtype = mono_reflection_type_get_handle (m->parent);
+               mtype = mono_reflection_type_get_handle (m->parent, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
                klass = mono_class_from_mono_type (mtype);
 
                /* Find the method */
@@ -13162,10 +13589,13 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                                is_sre_byref (mono_object_get_class(obj)) ||
                                is_sre_pointer (mono_object_get_class(obj))) {
                MonoReflectionType *ref_type = (MonoReflectionType *)obj;
-               MonoType *type = mono_reflection_type_get_handle (ref_type);
+               MonoType *type = mono_reflection_type_get_handle (ref_type, &error);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
 
                if (context) {
-                       MonoType *inflated = mono_class_inflate_generic_type (type, context);
+                       MonoType *inflated = mono_class_inflate_generic_type_checked (type, context, &error);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
                        result = mono_class_from_mono_type (inflated);
                        mono_metadata_free_type (inflated);
                } else {
@@ -13769,15 +14199,10 @@ mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass)
        MonoError error;
        MonoObject *res, *exc;
        void *params [1];
-       static MonoClass *System_Reflection_Emit_TypeBuilder = NULL;
        static MonoMethod *method = NULL;
 
-       if (!System_Reflection_Emit_TypeBuilder) {
-               System_Reflection_Emit_TypeBuilder = mono_class_from_name (mono_defaults.corlib, "System.Reflection.Emit", "TypeBuilder");
-               g_assert (System_Reflection_Emit_TypeBuilder);
-       }
        if (method == NULL) {
-               method = mono_class_get_method_from_name (System_Reflection_Emit_TypeBuilder, "IsAssignableTo", 1);
+               method = mono_class_get_method_from_name (mono_class_get_type_builder_class (), "IsAssignableTo", 1);
                g_assert (method);
        }
 
@@ -13811,7 +14236,10 @@ mono_reflection_type_get_type (MonoReflectionType *reftype)
 {
        g_assert (reftype);
 
-       return mono_reflection_type_get_handle (reftype);
+       MonoError error;
+       MonoType *result = mono_reflection_type_get_handle (reftype, &error);
+       mono_error_assert_ok (&error);
+       return result;
 }
 
 /**