Merge pull request #2820 from kumpera/license-change-rebased
[mono.git] / mono / metadata / reflection.c
index f2a8ad1d80ba8b68e62dee86772715e7096c65fd..200c41e5f804fa015801317184020629b1c46501 100644 (file)
@@ -8,6 +8,7 @@
  * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
  * Copyright 2011 Rodrigo Kumpera
  *
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 #include <config.h>
 #include "mono/utils/mono-digest.h"
@@ -149,27 +150,27 @@ const unsigned char table_sizes [MONO_TABLE_NUM] = {
 static guint32 mono_image_get_methodref_token (MonoDynamicImage *assembly, MonoMethod *method, gboolean create_typespec);
 static guint32 mono_image_get_methodbuilder_token (MonoDynamicImage *assembly, MonoReflectionMethodBuilder *mb, gboolean create_open_instance, MonoError *error);
 static guint32 mono_image_get_ctorbuilder_token (MonoDynamicImage *assembly, MonoReflectionCtorBuilder *cb, MonoError *error);
-static guint32 mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper);
+static guint32 mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper, MonoError *error);
 static gboolean ensure_runtime_vtable (MonoClass *klass, MonoError  *error);
-static gpointer resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, MonoGenericContext *context);
+static gpointer resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, MonoGenericContext *context, MonoError *error);
 static guint32 mono_image_get_methodref_token_for_methodbuilder (MonoDynamicImage *assembly, MonoReflectionMethodBuilder *method, MonoError *error);
 static guint32 encode_generic_method_sig (MonoDynamicImage *assembly, MonoGenericContext *context);
 static gpointer register_assembly (MonoDomain *domain, MonoReflectionAssembly *res, MonoAssembly *assembly);
 static gboolean reflection_methodbuilder_from_method_builder (ReflectionMethodBuilder *rmb, MonoReflectionMethodBuilder *mb, MonoError *error);
 static gboolean reflection_methodbuilder_from_ctor_builder (ReflectionMethodBuilder *rmb, MonoReflectionCtorBuilder *mb, MonoError *error);
-static guint32 create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb);
+static guint32 create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb, MonoError *error);
 #endif
 
 static guint32 mono_image_typedef_or_ref (MonoDynamicImage *assembly, MonoType *type);
 static guint32 mono_image_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboolean try_typespec);
 static void    mono_image_get_generic_param_info (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynamicImage *assembly);
-static guint32 encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo);
+static guint32 encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo, MonoError *error);
 static guint32 encode_constant (MonoDynamicImage *assembly, MonoObject *val, guint32 *ret_type);
 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, MonoError *error);
-static MonoType* mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve);
+static MonoType* mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve, MonoError *error);
 static MonoReflectionType* mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *error);
 static gboolean is_sre_array (MonoClass *klass);
 static gboolean is_sre_byref (MonoClass *klass);
@@ -187,6 +188,8 @@ static gboolean is_sr_mono_property (MonoClass *klass);
 static gboolean is_sre_method_on_tb_inst (MonoClass *klass);
 static gboolean is_sre_ctor_on_tb_inst (MonoClass *klass);
 
+static gboolean type_is_reference (MonoType *type);
+
 static guint32 mono_image_get_methodspec_token (MonoDynamicImage *assembly, MonoMethod *method);
 static guint32 mono_image_get_inflated_method_token (MonoDynamicImage *assembly, MonoMethod *m);
 static MonoMethod * inflate_method (MonoReflectionType *type, MonoObject *obj, MonoError *error);
@@ -1704,7 +1707,8 @@ mono_image_basic_method (ReflectionMethodBuilder *mb, MonoDynamicImage *assembly
                                        alloc_table (mtable, mtable->rows);
                                        mvalues = mtable->values + mtable->rows * MONO_FIELD_MARSHAL_SIZE;
                                        mvalues [MONO_FIELD_MARSHAL_PARENT] = (table->next_idx << MONO_HAS_FIELD_MARSHAL_BITS) | MONO_HAS_FIELD_MARSHAL_PARAMDEF;
-                                       mvalues [MONO_FIELD_MARSHAL_NATIVE_TYPE] = encode_marshal_blob (assembly, pb->marshal_info);
+                                       mvalues [MONO_FIELD_MARSHAL_NATIVE_TYPE] = encode_marshal_blob (assembly, pb->marshal_info, error);
+                                       return_val_if_nok (error, FALSE);
                                }
                                pb->table_idx = table->next_idx++;
                                if (pb->attrs & PARAM_ATTRIBUTE_HAS_DEFAULT) {
@@ -2191,11 +2195,12 @@ handle_enum:
 }
 
 static guint32
-encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo)
+encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       MonoError error;
+       mono_error_init (error);
+
        char *str;
        SigBuffer buf;
        guint32 idx, len;
@@ -2240,8 +2245,11 @@ encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo)
                /* custom marshaler type name */
                if (minfo->marshaltype || minfo->marshaltyperef) {
                        if (minfo->marshaltyperef) {
-                               MonoType *marshaltype = mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef, &error);
-                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                               MonoType *marshaltype = mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef, error);
+                               if (!is_ok (error)) {
+                                       sigbuffer_free (&buf);
+                                       return 0;
+                               }
                                str = type_get_fully_qualified_name (marshaltype);
                        } else
                                str = mono_string_to_utf8 (minfo->marshaltype);
@@ -2272,11 +2280,12 @@ encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo)
 }
 
 static void
-mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *assembly)
+mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *assembly, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       MonoError error;
+       mono_error_init (error);
+
        MonoDynamicTable *table;
        guint32 *values;
 
@@ -2289,8 +2298,8 @@ mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *ass
        values = table->values + fb->table_idx * MONO_FIELD_SIZE;
        values [MONO_FIELD_NAME] = string_heap_insert_mstring (&assembly->sheap, fb->name);
        values [MONO_FIELD_FLAGS] = fb->attrs;
-       values [MONO_FIELD_SIGNATURE] = field_encode_signature (assembly, fb, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       values [MONO_FIELD_SIGNATURE] = field_encode_signature (assembly, fb, error);
+       return_if_nok (error);
 
 
        if (fb->offset != -1) {
@@ -2336,16 +2345,18 @@ mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *ass
                alloc_table (table, table->rows);
                values = table->values + table->rows * MONO_FIELD_MARSHAL_SIZE;
                values [MONO_FIELD_MARSHAL_PARENT] = (fb->table_idx << MONO_HAS_FIELD_MARSHAL_BITS) | MONO_HAS_FIELD_MARSHAL_FIELDSREF;
-               values [MONO_FIELD_MARSHAL_NATIVE_TYPE] = encode_marshal_blob (assembly, fb->marshal_info);
+               values [MONO_FIELD_MARSHAL_NATIVE_TYPE] = encode_marshal_blob (assembly, fb->marshal_info, error);
+               return_if_nok (error);
        }
 }
 
 static guint32
-property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBuilder *fb)
+property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBuilder *fb, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       MonoError error;
+       mono_error_init (error);
+
        SigBuffer buf;
        guint32 nparams = 0;
        MonoReflectionMethodBuilder *mb = fb->get_method;
@@ -2363,30 +2374,30 @@ 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, &error);
-               if (!is_ok (&error))
+               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, &error);
-                       if (!is_ok (&error))
+                       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, &error);
-               if (!is_ok (&error))
+               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, &error);
-                       if (!is_ok (&error))
+                       encode_reflection_type (assembly, pt, &buf, error);
+                       if (!is_ok (error))
                                goto fail;
                }
        } else {
-               encode_reflection_type (assembly, (MonoReflectionType*)fb->type, &buf, &error);
-               if (!is_ok (&error))
+               encode_reflection_type (assembly, (MonoReflectionType*)fb->type, &buf, error);
+               if (!is_ok (error))
                        goto fail;
        }
 
@@ -2395,15 +2406,16 @@ property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBui
        return idx;
 fail:
        sigbuffer_free (&buf);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-       g_assert_not_reached ();
+       return 0;
 }
 
 static void
-mono_image_get_property_info (MonoReflectionPropertyBuilder *pb, MonoDynamicImage *assembly)
+mono_image_get_property_info (MonoReflectionPropertyBuilder *pb, MonoDynamicImage *assembly, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       mono_error_init (error);
+
        MonoDynamicTable *table;
        guint32 *values;
        guint num_methods = 0;
@@ -2422,7 +2434,9 @@ mono_image_get_property_info (MonoReflectionPropertyBuilder *pb, MonoDynamicImag
        values = table->values + pb->table_idx * MONO_PROPERTY_SIZE;
        values [MONO_PROPERTY_NAME] = string_heap_insert_mstring (&assembly->sheap, pb->name);
        values [MONO_PROPERTY_FLAGS] = pb->attrs;
-       values [MONO_PROPERTY_TYPE] = property_encode_signature (assembly, pb);
+       values [MONO_PROPERTY_TYPE] = property_encode_signature (assembly, pb, error);
+       return_if_nok (error);
+
 
        /* FIXME: we still don't handle 'other' methods */
        if (pb->get_method) num_methods ++;
@@ -2460,11 +2474,10 @@ mono_image_get_property_info (MonoReflectionPropertyBuilder *pb, MonoDynamicImag
 }
 
 static void
-mono_image_get_event_info (MonoReflectionEventBuilder *eb, MonoDynamicImage *assembly)
+mono_image_get_event_info (MonoReflectionEventBuilder *eb, MonoDynamicImage *assembly, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       MonoError error;
        MonoDynamicTable *table;
        guint32 *values;
        guint num_methods = 0;
@@ -2482,8 +2495,8 @@ 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;
-       MonoType *ebtype = mono_reflection_type_get_handle (eb->type, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       MonoType *ebtype = mono_reflection_type_get_handle (eb->type, error);
+       return_if_nok (error);
        values [MONO_EVENT_TYPE] = mono_image_typedef_or_ref (assembly, ebtype);
 
        /*
@@ -2521,11 +2534,12 @@ mono_image_get_event_info (MonoReflectionEventBuilder *eb, MonoDynamicImage *ass
 }
 
 static void
-encode_constraints (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynamicImage *assembly)
+encode_constraints (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynamicImage *assembly, MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       MonoError error;
+       mono_error_init (error);
+
        MonoDynamicTable *table;
        guint32 num_constraints, i;
        guint32 *values;
@@ -2543,8 +2557,8 @@ 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 */
+               MonoType *gpbasetype = mono_reflection_type_get_handle (gparam->base_type, error);
+               return_if_nok (error);
                values [MONO_GENPARCONSTRAINT_GENERICPAR] = owner;
                values [MONO_GENPARCONSTRAINT_CONSTRAINT] = mono_image_typedef_or_ref (assembly, gpbasetype);
        }
@@ -2556,8 +2570,8 @@ 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 */
+               MonoType *constraint_type = mono_reflection_type_get_handle (constraint, error);
+               return_if_nok (error);
 
                values [MONO_GENPARCONSTRAINT_GENERICPAR] = owner;
                values [MONO_GENPARCONSTRAINT_CONSTRAINT] = mono_image_typedef_or_ref (assembly, constraint_type);
@@ -2616,7 +2630,8 @@ write_generic_param_entry (MonoDynamicImage *assembly, GenericParamTableEntry *e
        if (!mono_image_add_cattrs (assembly, table_idx, MONO_CUSTOM_ATTR_GENERICPAR, entry->gparam->cattrs, error))
                return FALSE;
 
-       encode_constraints (entry->gparam, table_idx, assembly);
+       encode_constraints (entry->gparam, table_idx, assembly, error);
+       return_val_if_nok (error, FALSE);
 
        return TRUE;
 }
@@ -2951,9 +2966,10 @@ mono_image_get_methodref_token_for_methodbuilder (MonoDynamicImage *assembly, Mo
        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 {
+       if (tb->generic_params) {
+               parent = create_generic_typespec (assembly, tb, error);
+               return_val_if_nok (error, 0);
+       } else {
                MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)rmb.type, error);
                return_val_if_nok (error, 0);
 
@@ -3101,9 +3117,10 @@ mono_image_get_ctorbuilder_token (MonoDynamicImage *assembly, MonoReflectionCtor
        if (!reflection_methodbuilder_from_ctor_builder (&rmb, mb, error))
                return 0;
 
-       if (tb->generic_params)
-               parent = create_generic_typespec (assembly, tb);
-       else {
+       if (tb->generic_params) {
+               parent = create_generic_typespec (assembly, tb, error);
+               return_val_if_nok (error, 0);
+       } 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);
@@ -3189,9 +3206,8 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoObject *f, MonoCl
 }
 
 static guint32
-mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFieldOnTypeBuilderInst *f)
+mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFieldOnTypeBuilderInst *f, MonoError *error)
 {
-       MonoError error;
        guint32 token;
        MonoClass *klass;
        MonoGenericClass *gclass;
@@ -3203,23 +3219,23 @@ 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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->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);
 
+               guint32 sig_token = field_encode_signature (assembly, fb, error);
+               return_val_if_nok (error, 0);
                name = mono_string_to_utf8 (fb->name);
-               guint32 sig_token = field_encode_signature (assembly, fb, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
                token = mono_image_get_memberref_token (assembly, &klass->byval_arg, name, sig_token);
                g_free (name);          
        } else if (is_sr_mono_field (mono_object_class (f->fb))) {
                guint32 sig;
                MonoClassField *field = ((MonoReflectionField *)f->fb)->field;
 
-               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               type = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst, error);
+               return_val_if_nok (error, 0);
                klass = mono_class_from_mono_type (type);
 
                sig = fieldref_encode_signature (assembly, field->parent->image, field->type);
@@ -3513,9 +3529,8 @@ mono_image_get_inflated_method_token (MonoDynamicImage *assembly, MonoMethod *m)
 }
 
 static guint32
-create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb)
+create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb, MonoError *error)
 {
-       MonoError error;
        MonoDynamicTable *table;
        MonoClass *klass;
        MonoType *type;
@@ -3529,8 +3544,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, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
+       return_val_if_nok (error, 0);
        token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->typespec, type));
        if (token)
                return token;
@@ -3554,8 +3569,9 @@ 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 */
+               MonoType *gparam_type = mono_reflection_type_get_handle ((MonoReflectionType*)gparam, error);
+               if (!is_ok (error))
+                       goto fail;
 
                encode_type (assembly, gparam_type, &buf);
        }
@@ -3574,18 +3590,22 @@ create_generic_typespec (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *
        g_hash_table_insert (assembly->typespec, type, GUINT_TO_POINTER(token));
        table->next_idx ++;
        return token;
+fail:
+       sigbuffer_free (&buf);
+       return 0;
 }
 
 /*
  * Return a copy of TYPE, adding the custom modifiers in MODREQ and MODOPT.
  */
 static MonoType*
-add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *modreq, MonoArray *modopt)
+add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *modreq, MonoArray *modopt, MonoError *error)
 {
-       MonoError error;
        int i, count, len, pos;
        MonoType *t;
 
+       mono_error_init (error);
+
        count = 0;
        if (modreq)
                count += mono_array_length (modreq);
@@ -3603,8 +3623,9 @@ 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, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *mod = mono_type_array_get_and_resolve (modreq, i, error);
+                       if (!is_ok (error))
+                               goto fail;
                        t->modifiers [pos].required = 1;
                        t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod);
                        pos ++;
@@ -3612,8 +3633,9 @@ 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, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *mod = mono_type_array_get_and_resolve (modopt, i, error);
+                       if (!is_ok (error))
+                               goto fail;
                        t->modifiers [pos].required = 0;
                        t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod);
                        pos ++;
@@ -3621,6 +3643,9 @@ add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *mod
        }
 
        return t;
+fail:
+       g_free (t);
+       return NULL;
 }
 
 static void
@@ -3637,40 +3662,43 @@ init_type_builder_generics (MonoObject *type)
 }
 
 static guint32
-mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb)
+mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb, MonoError *error)
 {
-       MonoError error;
        MonoDynamicTable *table;
        MonoType *custom = NULL, *type;
        guint32 *values;
        guint32 token, pclass, parent, sig;
        gchar *name;
 
+       mono_error_init (error);
+
        token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, fb));
        if (token)
                return token;
 
-       MonoType *typeb = mono_reflection_type_get_handle (fb->typeb, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       MonoType *typeb = mono_reflection_type_get_handle (fb->typeb, error);
+       return_val_if_nok (error, 0);
        /* FIXME: is this call necessary? */
        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.*/
        init_type_builder_generics (fb->type);
 
        /* 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, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, error);
+       return_val_if_nok (error, 0);
 
-       if (fb->modreq || fb->modopt)
-               type = custom = add_custom_modifiers (assembly, type, fb->modreq, fb->modopt);
+       if (fb->modreq || fb->modopt) {
+               type = custom = add_custom_modifiers (assembly, type, fb->modreq, fb->modopt, error);
+               return_val_if_nok (error, 0);
+       }
 
        sig = fieldref_encode_signature (assembly, NULL, type);
        g_free (custom);
 
-       parent = create_generic_typespec (assembly, (MonoReflectionTypeBuilder *) fb->typeb);
+       parent = create_generic_typespec (assembly, (MonoReflectionTypeBuilder *) fb->typeb, error);
+       return_val_if_nok (error, 0);
        g_assert ((parent & MONO_TYPEDEFORREF_MASK) == MONO_TYPEDEFORREF_TYPESPEC);
        
        pclass = MONO_MEMBERREF_PARENT_TYPESPEC;
@@ -3678,6 +3706,8 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
 
        table = &assembly->tables [MONO_TABLE_MEMBERREF];
 
+       name = mono_string_to_utf8 (fb->name);
+
        if (assembly->save) {
                alloc_table (table, table->rows + 1);
                values = table->values + table->next_idx * MONO_MEMBERREF_SIZE;
@@ -3694,13 +3724,14 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
 }
 
 static guint32
-mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper)
+mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper, MonoError *error)
 {
-       MonoError error;
        SigBuffer buf;
        guint32 nargs;
        guint32 i, idx;
 
+       mono_error_init (error);
+
        if (!assembly->save)
                return 0;
 
@@ -3733,8 +3764,8 @@ 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, &error);
-       if (!is_ok (&error))
+       encode_reflection_type (assembly, helper->return_type, &buf, error);
+       if (!is_ok (error))
                goto fail;
        for (i = 0; i < nargs; ++i) {
                MonoArray *modreqs = NULL;
@@ -3746,12 +3777,12 @@ 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, &error);
-               if (!is_ok (&error))
+               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, &error);
-               if (!is_ok (&error))
+               encode_reflection_type (assembly, pt, &buf, error);
+               if (!is_ok (error))
                        goto fail;
        }
        idx = sigbuffer_add_to_blob_cached (assembly, &buf);
@@ -3760,17 +3791,18 @@ mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigH
        return idx;
 fail:
        sigbuffer_free (&buf);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-       g_assert_not_reached ();
+       return 0;
 }
 
 static guint32 
-mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper)
+mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHelper *helper, MonoError *error)
 {
        guint32 idx;
        MonoDynamicTable *table;
        guint32 *values;
 
+       mono_error_init (error);
+
        table = &assembly->tables [MONO_TABLE_STANDALONESIG];
        idx = table->next_idx ++;
        table->rows ++;
@@ -3778,8 +3810,9 @@ mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHel
        values = table->values + idx * MONO_STAND_ALONE_SIGNATURE_SIZE;
 
        values [MONO_STAND_ALONE_SIGNATURE] =
-               mono_reflection_encode_sighelper (assembly, helper);
-
+               mono_reflection_encode_sighelper (assembly, helper, error);
+       return_val_if_nok (error, 0);
+       
        return idx;
 }
 
@@ -3805,17 +3838,17 @@ typedef struct {
 
 #ifndef DISABLE_REFLECTION_EMIT
 static guint32
-mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMethod *m)
+mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMethod *m, MonoError *error)
 {
-       MonoError error;
        guint32 nparams, i;
        GList *tmp;
-       char *name;
+       char *name = NULL;
        MonoMethodSignature *sig;
-       ArrayMethod *am;
+       ArrayMethod *am = NULL;
        MonoType *mtype;
 
-       name = mono_string_to_utf8 (m->name);
+       mono_error_init (error);
+
        nparams = mono_array_length (m->parameters);
        sig = (MonoMethodSignature *)g_malloc0 (MONO_SIZEOF_METHOD_SIGNATURE + sizeof (MonoType*) * nparams);
        sig->hasthis = 1;
@@ -3823,19 +3856,23 @@ mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMetho
        sig->call_convention = reflection_cc_to_file (m->call_conv);
        sig->param_count = nparams;
        if (m->ret) {
-               sig->ret = mono_reflection_type_get_handle (m->ret, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               sig->ret = mono_reflection_type_get_handle (m->ret, error);
+               if (!is_ok (error))
+                       goto fail;
        } 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 */
+       mtype = mono_reflection_type_get_handle (m->parent, error);
+       if (!is_ok (error))
+               goto fail;
 
        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 */
+               sig->params [i] = mono_type_array_get_and_resolve (m->parameters, i, error);
+               if (!is_ok (error))
+                       goto fail;
        }
 
+       name = mono_string_to_utf8 (m->name);
        for (tmp = assembly->array_methods; tmp; tmp = tmp->next) {
                am = (ArrayMethod *)tmp->data;
                if (strcmp (name, am->name) == 0 && 
@@ -3856,6 +3893,12 @@ mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMetho
        assembly->array_methods = g_list_prepend (assembly->array_methods, am);
        m->table_idx = am->token & 0xffffff;
        return am->token;
+fail:
+       g_free (am);
+       g_free (name);
+       g_free (sig);
+       return 0;
+
 }
 
 /*
@@ -3933,9 +3976,11 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon
                table = &assembly->tables [MONO_TABLE_FIELD];
                table->rows += tb->num_fields;
                alloc_table (table, table->rows);
-               for (i = 0; i < tb->num_fields; ++i)
+               for (i = 0; i < tb->num_fields; ++i) {
                        mono_image_get_field_info (
-                               mono_array_get (tb->fields, MonoReflectionFieldBuilder*, i), assembly);
+                               mono_array_get (tb->fields, MonoReflectionFieldBuilder*, i), assembly, error);
+                       return_val_if_nok (error, FALSE);
+               }
        }
 
        /* handle constructors */
@@ -3974,9 +4019,11 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon
                values = table->values + table->rows * MONO_EVENT_MAP_SIZE;
                values [MONO_EVENT_MAP_PARENT] = tb->table_idx;
                values [MONO_EVENT_MAP_EVENTLIST] = assembly->tables [MONO_TABLE_EVENT].next_idx;
-               for (i = 0; i < mono_array_length (tb->events); ++i)
+               for (i = 0; i < mono_array_length (tb->events); ++i) {
                        mono_image_get_event_info (
-                               mono_array_get (tb->events, MonoReflectionEventBuilder*, i), assembly);
+                               mono_array_get (tb->events, MonoReflectionEventBuilder*, i), assembly, error);
+                       return_val_if_nok (error, FALSE);
+               }
        }
        if (tb->properties && mono_array_length (tb->properties)) {
                table = &assembly->tables [MONO_TABLE_PROPERTY];
@@ -3988,9 +4035,11 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon
                values = table->values + table->rows * MONO_PROPERTY_MAP_SIZE;
                values [MONO_PROPERTY_MAP_PARENT] = tb->table_idx;
                values [MONO_PROPERTY_MAP_PROPERTY_LIST] = assembly->tables [MONO_TABLE_PROPERTY].next_idx;
-               for (i = 0; i < mono_array_length (tb->properties); ++i)
+               for (i = 0; i < mono_array_length (tb->properties); ++i) {
                        mono_image_get_property_info (
-                               mono_array_get (tb->properties, MonoReflectionPropertyBuilder*, i), assembly);
+                               mono_array_get (tb->properties, MonoReflectionPropertyBuilder*, i), assembly, error);
+                       return_val_if_nok (error, FALSE);
+               }
        }
 
        /* handle generic parameters */
@@ -4275,14 +4324,16 @@ mono_image_fill_export_table_from_class (MonoDomain *domain, MonoClass *klass,
 
 static void
 mono_image_fill_export_table (MonoDomain *domain, MonoReflectionTypeBuilder *tb,
-       guint32 module_index, guint32 parent_index, MonoDynamicImage *assembly)
+                             guint32 module_index, guint32 parent_index, MonoDynamicImage *assembly,
+                             MonoError *error)
 {
-       MonoError error;
        MonoClass *klass;
        guint32 idx, i;
 
-       MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)tb, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       mono_error_init (error);
+
+       MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
+       return_if_nok (error);
 
        klass = mono_class_from_mono_type (t);
 
@@ -4296,8 +4347,10 @@ mono_image_fill_export_table (MonoDomain *domain, MonoReflectionTypeBuilder *tb,
         * We need to do this ourselves since klass->nested_classes is not set up.
         */
        if (tb->subtypes) {
-               for (i = 0; i < mono_array_length (tb->subtypes); ++i)
-                       mono_image_fill_export_table (domain, mono_array_get (tb->subtypes, MonoReflectionTypeBuilder*, i), module_index, idx, assembly);
+               for (i = 0; i < mono_array_length (tb->subtypes); ++i) {
+                       mono_image_fill_export_table (domain, mono_array_get (tb->subtypes, MonoReflectionTypeBuilder*, i), module_index, idx, assembly, error);
+                       return_if_nok (error);
+               }
        }
 }
 
@@ -5022,7 +5075,7 @@ load_public_key (MonoArray *pkey, MonoDynamicImage *assembly) {
 }
 
 static void
-mono_image_emit_manifest (MonoReflectionModuleBuilder *moduleb)
+mono_image_emit_manifest (MonoReflectionModuleBuilder *moduleb, MonoError *error)
 {
        MonoDynamicTable *table;
        MonoDynamicImage *assembly;
@@ -5032,6 +5085,8 @@ mono_image_emit_manifest (MonoReflectionModuleBuilder *moduleb)
        int i;
        guint32 module_index;
 
+       mono_error_init (error);
+
        assemblyb = moduleb->assemblyb;
        assembly = moduleb->dynamic_image;
        domain = mono_object_domain (assemblyb);
@@ -5063,7 +5118,8 @@ mono_image_emit_manifest (MonoReflectionModuleBuilder *moduleb)
                        if (file_module->types) {
                                for (j = 0; j < file_module->num_types; ++j) {
                                        MonoReflectionTypeBuilder *tb = mono_array_get (file_module->types, MonoReflectionTypeBuilder*, j);
-                                       mono_image_fill_export_table (domain, tb, module_index, 0, assembly);
+                                       mono_image_fill_export_table (domain, tb, module_index, 0, assembly, error);
+                                       return_if_nok (error);
                                }
                        }
                }
@@ -5132,7 +5188,8 @@ mono_image_build_metadata (MonoReflectionModuleBuilder *moduleb, MonoError *erro
        assembly->text_rva = START_TEXT_RVA;
 
        if (moduleb->is_main) {
-               mono_image_emit_manifest (moduleb);
+               mono_image_emit_manifest (moduleb, error);
+               return_val_if_nok (error, FALSE);
        }
 
        table = &assembly->tables [MONO_TABLE_TYPEDEF];
@@ -5168,9 +5225,13 @@ mono_image_build_metadata (MonoReflectionModuleBuilder *moduleb, MonoError *erro
                table = &assembly->tables [MONO_TABLE_FIELD];
                table->rows += mono_array_length (moduleb->global_fields);
                alloc_table (table, table->rows);
-               for (i = 0; i < mono_array_length (moduleb->global_fields); ++i)
+               for (i = 0; i < mono_array_length (moduleb->global_fields); ++i) {
                        mono_image_get_field_info (
-                               mono_array_get (moduleb->global_fields, MonoReflectionFieldBuilder*, i), assembly);
+                               mono_array_get (moduleb->global_fields, MonoReflectionFieldBuilder*, i), assembly,
+                               error);
+                       if (!is_ok (error))
+                               goto leave;
+               }
        }
 
        table = &assembly->tables [MONO_TABLE_MODULE];
@@ -5475,7 +5536,7 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
        /* Check for user defined reflection objects */
        /* TypeDelegator is the only corlib type which doesn't look like a MonoReflectionType */
        if (klass->image != mono_defaults.corlib || (strcmp (klass->name, "TypeDelegator") == 0)) {
-               mono_error_set_generic_error (error, "System", "NotSupportedException", "User defined subclasses of System.Type are not yet supported");
+               mono_error_set_not_supported (error, "User defined subclasses of System.Type are not yet supported");
                return 0;
        }
 
@@ -5507,7 +5568,8 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
                MonoReflectionFieldBuilder *fb = (MonoReflectionFieldBuilder *)obj;
                MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)fb->typeb;
                if (tb->generic_params) {
-                       token = mono_image_get_generic_field_token (assembly, fb);
+                       token = mono_image_get_generic_field_token (assembly, fb, error);
+                       return_val_if_nok (error, 0);
                } else {
                        if (tb->module->dynamic_image == assembly) {
                                token = fb->table_idx | MONO_TOKEN_FIELD_DEF;
@@ -5592,10 +5654,12 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
                /*g_print ("got token 0x%08x for %s\n", token, f->field->name);*/
        } else if (strcmp (klass->name, "MonoArrayMethod") == 0) {
                MonoReflectionArrayMethod *m = (MonoReflectionArrayMethod *)obj;
-               token = mono_image_get_array_token (assembly, m);
+               token = mono_image_get_array_token (assembly, m, error);
+               return_val_if_nok (error, 0);
        } else if (strcmp (klass->name, "SignatureHelper") == 0) {
                MonoReflectionSigHelper *s = (MonoReflectionSigHelper*)obj;
-               token = MONO_TOKEN_SIGNATURE | mono_image_get_sighelper_token (assembly, s);
+               token = MONO_TOKEN_SIGNATURE | mono_image_get_sighelper_token (assembly, s, error);
+               return_val_if_nok (error, 0);
        } else if (strcmp (klass->name, "EnumBuilder") == 0) {
                MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType *)obj, error);
                return_val_if_nok (error, 0);
@@ -5603,7 +5667,8 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
                        mono_image_typedef_or_ref (assembly, type));
        } else if (strcmp (klass->name, "FieldOnTypeBuilderInst") == 0) {
                MonoReflectionFieldOnTypeBuilderInst *f = (MonoReflectionFieldOnTypeBuilderInst*)obj;
-               token = mono_image_get_field_on_inst_token (assembly, f);
+               token = mono_image_get_field_on_inst_token (assembly, f, error);
+               return_val_if_nok (error, 0);
        } else if (strcmp (klass->name, "ConstructorOnTypeBuilderInst") == 0) {
                MonoReflectionCtorOnTypeBuilderInst *c = (MonoReflectionCtorOnTypeBuilderInst*)obj;
                token = mono_image_get_ctor_on_inst_token (assembly, c, create_open_instance, error);
@@ -6606,10 +6671,8 @@ mono_image_create_pefile (MonoReflectionModuleBuilder *mb, HANDLE file, MonoErro
 #ifndef DISABLE_REFLECTION_EMIT
 
 MonoReflectionModule *
-mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName)
+mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName, MonoError *error)
 {
-       MonoError error;
-       MonoReflectionModule *result = NULL;
        char *name;
        MonoImage *image;
        MonoImageOpenStatus status;
@@ -6618,17 +6681,18 @@ mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *f
        MonoImage **new_modules;
        gboolean *new_modules_loaded;
        
+       mono_error_init (error);
+       
        name = mono_string_to_utf8 (fileName);
 
        image = mono_image_open (name, &status);
        if (!image) {
-               MonoException *exc;
                if (status == MONO_IMAGE_ERROR_ERRNO)
-                       exc = mono_get_exception_file_not_found (fileName);
+                       mono_error_set_exception_instance (error, mono_get_exception_file_not_found (fileName));
                else
-                       exc = mono_get_exception_bad_image_format (name);
+                       mono_error_set_bad_image_name (error, name, NULL);
                g_free (name);
-               mono_raise_exception (exc);
+               return NULL;
        }
 
        g_free (name);
@@ -6656,12 +6720,11 @@ mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *f
        mono_assembly_load_references (image, &status);
        if (status) {
                mono_image_close (image);
-               mono_raise_exception (mono_get_exception_file_not_found (fileName));
+               mono_error_set_exception_instance (error, mono_get_exception_file_not_found (fileName));
+               return NULL;
        }
 
-       result = mono_module_get_object_checked (mono_domain_get (), image, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-       return result;
+       return mono_module_get_object_checked (mono_domain_get (), image, error);
 }
 
 #endif /* DISABLE_REFLECTION_EMIT */
@@ -7494,6 +7557,7 @@ mono_event_get_object_checked (MonoDomain *domain, MonoClass *klass, MonoEvent *
 static MonoObject *
 mono_get_reflection_missing_object (MonoDomain *domain)
 {
+       MonoError error;
        MonoObject *obj;
        static MonoClassField *missing_value_field = NULL;
        
@@ -7504,8 +7568,8 @@ mono_get_reflection_missing_object (MonoDomain *domain)
                missing_value_field = mono_class_get_field_from_name (missing_klass, "Value");
                g_assert (missing_value_field);
        }
-       obj = mono_field_get_value_object (domain, missing_value_field, NULL); 
-       g_assert (obj);
+       obj = mono_field_get_value_object_checked (domain, missing_value_field, NULL, &error);
+       mono_error_assert_ok (&error);
        return obj;
 }
 
@@ -7534,11 +7598,10 @@ get_reflection_missing (MonoDomain *domain, MonoObject **reflection_missing)
  * in the method @method.
  */
 MonoArray*
-mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass)
+mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error)
 {
        static MonoClass *System_Reflection_ParameterInfo;
        static MonoClass *System_Reflection_ParameterInfo_array;
-       MonoError error;
        MonoArray *res = NULL;
        MonoReflectionMethod *member = NULL;
        MonoReflectionParameter *param = NULL;
@@ -7553,7 +7616,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
        MonoReflectionType *rt;
        int i;
 
-       mono_error_init (&error);
+       mono_error_init (error);
        
        if (!System_Reflection_ParameterInfo_array) {
                MonoClass *klass;
@@ -7569,12 +7632,12 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
                System_Reflection_ParameterInfo_array = klass;
        }
 
-       sig = mono_method_signature_checked (method, &error);
-       if (!mono_error_ok (&error))
+       sig = mono_method_signature_checked (method, error);
+       if (!mono_error_ok (error))
                goto leave;
 
        if (!sig->param_count) {
-               res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), 0, &error);
+               res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), 0, error);
                if (!res)
                        goto leave;
 
@@ -7586,7 +7649,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
         */
        CHECK_OBJECT (MonoArray*, &(method->signature), refclass);
 
-       member = mono_method_get_object_checked (domain, method, refclass, &error);
+       member = mono_method_get_object_checked (domain, method, refclass, error);
        if (!member)
                goto leave;
        names = g_new (char *, sig->param_count);
@@ -7595,17 +7658,17 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
        mspecs = g_new (MonoMarshalSpec*, sig->param_count + 1);
        mono_method_get_marshal_info (method, mspecs);
 
-       res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), sig->param_count, &error);
+       res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), sig->param_count, error);
        if (!res)
                goto leave;
 
        pinfo_vtable = mono_class_vtable (domain, System_Reflection_ParameterInfo);
        for (i = 0; i < sig->param_count; ++i) {
-               param = (MonoReflectionParameter *) mono_object_new_specific_checked (pinfo_vtable, &error);
+               param = (MonoReflectionParameter *) mono_object_new_specific_checked (pinfo_vtable, error);
                if (!param)
                        goto leave;
 
-               rt = mono_type_get_object_checked (domain, sig->params [i], &error);
+               rt = mono_type_get_object_checked (domain, sig->params [i], error);
                if (!rt)
                        goto leave;
 
@@ -7646,7 +7709,10 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
                        } else
                                type->data.klass = mono_class_from_mono_type (type);
 
-                       MONO_OBJECT_SETREF (param, DefaultValueImpl, mono_get_object_from_blob (domain, type, blobs [i]));
+                       MonoObject *default_val_obj = mono_get_object_from_blob (domain, type, blobs [i], error);
+                       if (!is_ok (error))
+                               goto leave;
+                       MONO_OBJECT_SETREF (param, DefaultValueImpl, default_val_obj);
 
                        /* Type in the Constant table is MONO_TYPE_CLASS for nulls */
                        if (types [i] != MONO_TYPE_CLASS && !param->DefaultValueImpl) {
@@ -7660,7 +7726,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla
 
                if (mspecs [i + 1]) {
                        MonoReflectionMarshalAsAttribute* mobj;
-                       mobj = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [i + 1], &error);
+                       mobj = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [i + 1], error);
                        if (!mobj)
                                goto leave;
                        MONO_OBJECT_SETREF (param, MarshalAsImpl, (MonoObject*)mobj);
@@ -7683,7 +7749,8 @@ leave:
        }
        g_free (mspecs);
 
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       if (!is_ok (error))
+               return NULL;
        
        CACHE_OBJECT (MonoArray *, &(method->signature), res, refclass);
 }
@@ -7691,7 +7758,10 @@ leave:
 MonoArray*
 mono_param_get_objects (MonoDomain *domain, MonoMethod *method)
 {
-       return mono_param_get_objects_internal (domain, method, NULL);
+       MonoError error;
+       MonoArray *result = mono_param_get_objects_internal (domain, method, NULL, &error);
+       mono_error_assert_ok (&error);
+       return result;
 }
 
 /*
@@ -7705,18 +7775,39 @@ MonoReflectionMethodBody*
 mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
 {
        MonoError error;
+       MonoReflectionMethodBody *result = mono_method_body_get_object_checked (domain, method, &error);
+       mono_error_cleanup (&error); /* FIXME better API that doesn't swallow the error */
+       return result;
+}
+
+/**
+ * mono_method_body_get_object_checked:
+ * @domain: an app domain
+ * @method: a method
+ * @error: set on error
+ *
+ * Return an System.Reflection.MethodBody object representing the
+ * method @method.  On failure, returns NULL and sets @error.
+ */
+MonoReflectionMethodBody*
+mono_method_body_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoError *error)
+{
        MonoReflectionMethodBody *ret;
        MonoMethodHeader *header;
        MonoImage *image;
        MonoReflectionType *rt;
        guint32 method_rva, local_var_sig_token;
-    char *ptr;
+       char *ptr;
        unsigned char format, flags;
        int i;
 
+       mono_error_init (error);
+
        /* for compatibility with .net */
-    if (method_is_dynamic (method))
-        mono_raise_exception (mono_get_exception_invalid_operation (NULL));
+       if (method_is_dynamic (method)) {
+               mono_error_set_generic_error (error, "System", "InvalidOperationException", "");
+               return NULL;
+       }
 
        CHECK_OBJECT (MonoReflectionMethodBody *, method, NULL);
 
@@ -7728,8 +7819,8 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
                return NULL;
 
        image = method->klass->image;
-       header = mono_method_get_header_checked (method, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       header = mono_method_get_header_checked (method, error);
+       return_val_if_nok (error, NULL);
 
        if (!image_is_dynamic (image)) {
                /* Obtain local vars signature token */
@@ -7753,8 +7844,9 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        } else
                local_var_sig_token = 0; //FIXME
 
-       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 = (MonoReflectionMethodBody*)mono_object_new_checked (domain, mono_class_get_method_body_class (), error);
+       if (!is_ok (error))
+               goto fail;
 
        ret->init_locals = header->init_locals;
        ret->max_stack = header->max_stack;
@@ -7765,11 +7857,13 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        /* 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, mono_class_get_local_variable_info_class (), &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoReflectionLocalVariableInfo *info = (MonoReflectionLocalVariableInfo*)mono_object_new_checked (domain, mono_class_get_local_variable_info_class (), error);
+               if (!is_ok (error))
+                       goto fail;
 
-               rt = mono_type_get_object_checked (domain, header->locals [i], &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               rt = mono_type_get_object_checked (domain, header->locals [i], error);
+               if (!is_ok (error))
+                       goto fail;
 
                MONO_OBJECT_SETREF (info, local_type, rt);
 
@@ -7781,8 +7875,9 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        /* Exceptions */
        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, mono_class_get_exception_handling_clause_class (), &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoReflectionExceptionHandlingClause *info = (MonoReflectionExceptionHandlingClause*)mono_object_new_checked (domain, mono_class_get_exception_handling_clause_class (), error);
+               if (!is_ok (error))
+                       goto fail;
                MonoExceptionClause *clause = &header->clauses [i];
 
                info->flags = clause->flags;
@@ -7793,8 +7888,9 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
                if (clause->flags == MONO_EXCEPTION_CLAUSE_FILTER)
                        info->filter_offset = clause->data.filter_offset;
                else if (clause->data.catch_class) {
-                       rt = mono_type_get_object_checked (mono_domain_get (), &clause->data.catch_class->byval_arg, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       rt = mono_type_get_object_checked (mono_domain_get (), &clause->data.catch_class->byval_arg, error);
+                       if (!is_ok (error))
+                               goto fail;
 
                        MONO_OBJECT_SETREF (info, catch_type, rt);
                }
@@ -7805,6 +7901,10 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
        mono_metadata_free_mh (header);
        CACHE_OBJECT (MonoReflectionMethodBody *, method, ret, NULL);
        return ret;
+
+fail:
+       mono_metadata_free_mh (header);
+       return NULL;
 }
 
 /**
@@ -7818,6 +7918,7 @@ mono_method_body_get_object (MonoDomain *domain, MonoMethod *method)
 MonoObject *
 mono_get_dbnull_object (MonoDomain *domain)
 {
+       MonoError error;
        MonoObject *obj;
        static MonoClassField *dbnull_value_field = NULL;
        
@@ -7827,8 +7928,8 @@ mono_get_dbnull_object (MonoDomain *domain)
                dbnull_value_field = mono_class_get_field_from_name (dbnull_klass, "Value");
                g_assert (dbnull_value_field);
        }
-       obj = mono_field_get_value_object (domain, dbnull_value_field, NULL); 
-       g_assert (obj);
+       obj = mono_field_get_value_object_checked (domain, dbnull_value_field, NULL, &error);
+       mono_error_assert_ok (&error);
        return obj;
 }
 
@@ -7900,21 +8001,22 @@ get_default_param_value_blobs (MonoMethod *method, char **blobs, guint32 *types)
 }
 
 MonoObject *
-mono_get_object_from_blob (MonoDomain *domain, MonoType *type, const char *blob)
+mono_get_object_from_blob (MonoDomain *domain, MonoType *type, const char *blob, MonoError *error)
 {
-       MonoError error;
        void *retval;
        MonoClass *klass;
        MonoObject *object;
        MonoType *basetype = type;
 
+       mono_error_init (error);
+
        if (!blob)
                return NULL;
        
        klass = mono_class_from_mono_type (type);
        if (klass->valuetype) {
-               object = mono_object_new_checked (domain, klass, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               object = mono_object_new_checked (domain, klass, error);
+               return_val_if_nok (error, NULL);
                retval = ((gchar *) object + sizeof (MonoObject));
                if (klass->enumtype)
                        basetype = mono_class_enum_basetype (klass);
@@ -8335,12 +8437,14 @@ mono_reflection_parse_type (char *name, MonoTypeNameParse *info)
 }
 
 static MonoType*
-_mono_reflection_get_type_from_info (MonoTypeNameParse *info, MonoImage *image, gboolean ignorecase)
+_mono_reflection_get_type_from_info (MonoTypeNameParse *info, MonoImage *image, gboolean ignorecase, MonoError *error)
 {
        gboolean type_resolve = FALSE;
        MonoType *type;
        MonoImage *rootimage = image;
 
+       mono_error_init (error);
+
        if (info->assembly.name) {
                MonoAssembly *assembly = mono_assembly_loaded (&info->assembly);
                if (!assembly && image && image->assembly && mono_assembly_names_equal (&info->assembly, &image->assembly->aname))
@@ -8360,10 +8464,11 @@ _mono_reflection_get_type_from_info (MonoTypeNameParse *info, MonoImage *image,
                image = mono_defaults.corlib;
        }
 
-       type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve);
+       type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve, error);
        if (type == NULL && !info->assembly.name && image != mono_defaults.corlib) {
+               mono_error_cleanup (error);
                image = mono_defaults.corlib;
-               type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve);
+               type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve, error);
        }
 
        return type;
@@ -8466,7 +8571,7 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
                for (i = 0; i < info->type_arguments->len; i++) {
                        MonoTypeNameParse *subinfo = (MonoTypeNameParse *)g_ptr_array_index (info->type_arguments, i);
 
-                       type_args [i] = _mono_reflection_get_type_from_info (subinfo, rootimage, ignorecase);
+                       type_args [i] = _mono_reflection_get_type_from_info (subinfo, rootimage, ignorecase, error);
                        if (!type_args [i]) {
                                g_free (type_args);
                                return NULL;
@@ -8478,7 +8583,7 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
                        return NULL;
 
                instance = mono_reflection_bind_generic_parameters (
-                       the_type, info->type_arguments->len, type_args);
+                       the_type, info->type_arguments->len, type_args, error);
 
                g_free (type_args);
                if (!instance)
@@ -8516,9 +8621,30 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
 
 MonoType*
 mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve) {
-       return mono_reflection_get_type_with_rootimage(image, image, info, ignorecase, type_resolve);
+       MonoError error;
+       MonoType *result = mono_reflection_get_type_with_rootimage (image, image, info, ignorecase, type_resolve, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
+
+/**
+ * mono_reflection_get_type_checked:
+ * @image: a metadata context
+ * @info: type description structure
+ * @ignorecase: flag for case-insensitive string compares
+ * @type_resolve: whenever type resolve was already tried
+ * @error: set on error.
+ *
+ * Build a MonoType from the type description in @info. On failure returns NULL and sets @error.
+ *
+ */
+MonoType*
+mono_reflection_get_type_checked (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve, MonoError *error) {
+       mono_error_init (error);
+       return mono_reflection_get_type_with_rootimage (image, image, info, ignorecase, type_resolve, error);
 }
 
+
 static MonoType*
 mono_reflection_get_type_internal_dynamic (MonoImage *rootimage, MonoAssembly *assembly, MonoTypeNameParse *info, gboolean ignorecase, MonoError *error)
 {
@@ -8561,21 +8687,21 @@ mono_reflection_get_type_internal_dynamic (MonoImage *rootimage, MonoAssembly *a
 }
        
 MonoType*
-mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve)
+mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve, MonoError *error)
 {
-       MonoError error;
        MonoType *type;
        MonoReflectionAssembly *assembly;
        GString *fullName;
        GList *mod;
 
+       mono_error_init (error);
+
        if (image && image_is_dynamic (image))
-               type = mono_reflection_get_type_internal_dynamic (rootimage, image->assembly, info, ignorecase, &error);
+               type = mono_reflection_get_type_internal_dynamic (rootimage, image->assembly, info, ignorecase, error);
        else {
-               type = mono_reflection_get_type_internal (rootimage, image, info, ignorecase, &error);
+               type = mono_reflection_get_type_internal (rootimage, image, info, ignorecase, error);
        }
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       return_val_if_nok (error, NULL);
 
        if (type)
                return type;
@@ -8598,20 +8724,22 @@ 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_checked ( mono_domain_get (), fullName->str, NULL, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       assembly = mono_domain_try_type_resolve_checked ( mono_domain_get (), fullName->str, NULL, error);
+       if (!is_ok (error)) {
+               g_string_free (fullName, TRUE);
+               return NULL;
+       }
 
        if (assembly) {
                if (assembly_is_dynamic (assembly->assembly))
                        type = mono_reflection_get_type_internal_dynamic (rootimage, assembly->assembly,
-                                                                         info, ignorecase, &error);
+                                                                         info, ignorecase, error);
                else
                        type = mono_reflection_get_type_internal (rootimage, assembly->assembly->image, 
-                                                                 info, ignorecase, &error);
+                                                                 info, ignorecase, error);
        }
        g_string_free (fullName, TRUE);
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       return_val_if_nok (error, NULL);
        return type;
 }
 
@@ -8649,17 +8777,43 @@ mono_reflection_free_type_info (MonoTypeNameParse *info)
 MonoType*
 mono_reflection_type_from_name (char *name, MonoImage *image)
 {
-       MonoType *type = NULL;
-       MonoTypeNameParse info;
-       char *tmp;
+       MonoError error;
+       MonoType  *result = mono_reflection_type_from_name_checked (name, image, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
 
-       /* Make a copy since parse_type modifies its argument */
-       tmp = g_strdup (name);
-       
-       /*g_print ("requested type %s\n", str);*/
-       if (mono_reflection_parse_type (tmp, &info)) {
-               type = _mono_reflection_get_type_from_info (&info, image, FALSE);
-       }
+/**
+ * mono_reflection_type_from_name_checked:
+ * @name: type name.
+ * @image: a metadata context (can be NULL).
+ * @error: set on errror.
+ *
+ * Retrieves a MonoType from its @name. If the name is not fully qualified,
+ * it defaults to get the type from @image or, if @image is NULL or loading
+ * from it fails, uses corlib.  On failure returns NULL and sets @error.
+ * 
+ */
+MonoType*
+mono_reflection_type_from_name_checked (char *name, MonoImage *image, MonoError *error)
+{
+       MonoType *type = NULL;
+       MonoTypeNameParse info;
+       char *tmp;
+
+       mono_error_init (error);
+       /* Make a copy since parse_type modifies its argument */
+       tmp = g_strdup (name);
+       
+       /*g_print ("requested type %s\n", str);*/
+       if (mono_reflection_parse_type (tmp, &info)) {
+               type = _mono_reflection_get_type_from_info (&info, image, FALSE, error);
+               if (!is_ok (error)) {
+                       g_free (tmp);
+                       mono_reflection_free_type_info (&info);
+                       return NULL;
+               }
+       }
 
        g_free (tmp);
        mono_reflection_free_type_info (&info);
@@ -8676,9 +8830,27 @@ guint32
 mono_reflection_get_token (MonoObject *obj)
 {
        MonoError error;
+       guint32 result = mono_reflection_get_token_checked (obj, &error);
+       mono_error_assert_ok (&error);
+       return result;
+}
+
+/**
+ * mono_reflection_get_token_checked:
+ * @obj: the object
+ * @error: set on error
+ *
+ *   Return the metadata token of @obj which should be an object
+ * representing a metadata element.  On failure sets @error.
+ */
+guint32
+mono_reflection_get_token_checked (MonoObject *obj, MonoError *error)
+{
        MonoClass *klass;
        guint32 token = 0;
 
+       mono_error_init (error);
+
        klass = obj->vtable->klass;
 
        if (strcmp (klass->name, "MethodBuilder") == 0) {
@@ -8697,11 +8869,13 @@ 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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, error);
+               return_val_if_nok (error, 0);
                MonoClass *mc = mono_class_from_mono_type (type);
-               if (!mono_class_init (mc))
-                       mono_raise_exception (mono_class_get_exception_for_failure (mc));
+               if (!mono_class_init (mc)) {
+                       mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (mc));
+                       return 0;
+               }
 
                token = mc->type_token;
        } else if (strcmp (klass->name, "MonoCMethod") == 0 ||
@@ -8727,7 +8901,7 @@ mono_reflection_get_token (MonoObject *obj)
 
                                g_assert (field_index >= 0 && field_index < dgclass->count_fields);
                                obj = dgclass->field_objects [field_index];
-                               return mono_reflection_get_token (obj);
+                               return mono_reflection_get_token_checked (obj, error);
                        }
                }
                token = mono_class_get_field_token (f->field);
@@ -8752,10 +8926,9 @@ mono_reflection_get_token (MonoObject *obj)
        } else if (strcmp (klass->name, "Assembly") == 0 || strcmp (klass->name, "MonoAssembly") == 0) {
                token = mono_metadata_make_token (MONO_TABLE_ASSEMBLY, 1);
        } else {
-               gchar *msg = g_strdup_printf ("MetadataToken is not supported for type '%s.%s'", klass->name_space, klass->name);
-               MonoException *ex = mono_get_exception_not_implemented (msg);
-               g_free (msg);
-               mono_raise_exception (ex);
+               mono_error_set_not_implemented (error, "MetadataToken is not supported for type '%s.%s'",
+                                               klass->name_space, klass->name);
+               return 0;
        }
 
        return token;
@@ -8772,11 +8945,13 @@ load_cattr_enum_type (MonoImage *image, const char *p, const char **end, MonoErr
 
        n = (char *)g_memdup (p, slen + 1);
        n [slen] = 0;
-       t = mono_reflection_type_from_name (n, image);
+       t = mono_reflection_type_from_name_checked (n, image, error);
        if (!t) {
-               /* FIXME the error should come from mono_reflection_type_from_name as it will have type/assembly names split */
+               char *msg = g_strdup (mono_error_get_message (error));
+               mono_error_cleanup (error);
                /* We don't free n, it's consumed by mono_error */
-               mono_error_set_type_load_name (error, n, NULL, "Could not load enum type %s while decoding custom attribute", n);
+               mono_error_set_type_load_name (error, n, NULL, "Could not load enum type %s while decoding custom attribute: %s", n, msg);
+               g_free (msg);
                return NULL;
        }
        g_free (n);
@@ -8877,11 +9052,13 @@ handle_type:
                slen = mono_metadata_decode_value (p, &p);
                n = (char *)g_memdup (p, slen + 1);
                n [slen] = 0;
-               t = mono_reflection_type_from_name (n, image);
+               t = mono_reflection_type_from_name_checked (n, image, error);
                if (!t) {
-                       /* FIXME the error should come from mono_reflection_type_from_name as it will have type/assembly names split */
+                       char *msg = g_strdup (mono_error_get_message (error));
+                       mono_error_cleanup (error);
                        /* We don't free n, it's consumed by mono_error */
-                       mono_error_set_type_load_name (error, n, NULL, "Could not load type %s while decoding custom attribute", n);
+                       mono_error_set_type_load_name (error, n, NULL, "Could not load type %s while decoding custom attribute: %msg", n, msg);
+                       g_free (msg);
                        return NULL;
                }
                g_free (n);
@@ -8930,11 +9107,13 @@ handle_type:
                        slen = mono_metadata_decode_value (p, &p);
                        n = (char *)g_memdup (p, slen + 1);
                        n [slen] = 0;
-                       t = mono_reflection_type_from_name (n, image);
+                       t = mono_reflection_type_from_name_checked (n, image, error);
                        if (!t) {
-                               /* FIXME the error should come from mono_reflection_type_from_name as it will have type/assembly names split */
+                               char *msg = g_strdup (mono_error_get_message (error));
+                               mono_error_cleanup (error);
                                /* We don't free n, it's consumed by mono_error */
-                               mono_error_set_type_load_name (error, n, NULL, "Could not load type %s while decoding custom attribute", n);
+                               mono_error_set_type_load_name (error, n, NULL, "Could not load type %s while decoding custom attribute: %s", n, msg);
+                               g_free (msg);
                                return NULL;
                        }
                        g_free (n);
@@ -9039,6 +9218,28 @@ handle_type:
        return NULL;
 }
 
+static MonoObject*
+load_cattr_value_boxed (MonoDomain *domain, MonoImage *image, MonoType *t, const char* p, const char** end, MonoError *error)
+{
+       mono_error_init (error);
+
+       gboolean is_ref = type_is_reference (t);
+
+       void *val = load_cattr_value (image, t, p, end, error);
+       if (!is_ok (error)) {
+               if (is_ref)
+                       g_free (val);
+               return NULL;
+       }
+
+       if (is_ref)
+               return (MonoObject*)val;
+
+       MonoObject *boxed = mono_value_box_checked (domain, mono_class_from_mono_type (t), val, error);
+       g_free (val);
+       return boxed;
+}
+
 static MonoObject*
 create_cattr_typed_arg (MonoType *t, MonoObject *val, MonoError *error)
 {
@@ -9374,21 +9575,10 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth
        p += 2;
        for (i = 0; i < mono_method_signature (method)->param_count; ++i) {
                MonoObject *obj;
-               void *val;
 
-               val = load_cattr_value (image, mono_method_signature (method)->params [i], p, &p, error);
-               if (!mono_error_ok (error)) {
-                       if (!type_is_reference (mono_method_signature (method)->params [i]))
-                               g_free (val);
-                       return;
-               }
-
-               obj = (MonoObject *)(type_is_reference (mono_method_signature (method)->params [i]) ?
-                       val : mono_value_box (domain, mono_class_from_mono_type (mono_method_signature (method)->params [i]), val));
+               obj = load_cattr_value_boxed (domain, image, mono_method_signature (method)->params [i], p, &p, error);
+               return_if_nok (error);
                mono_array_setref (typedargs, i, obj);
-
-               if (!type_is_reference (mono_method_signature (method)->params [i]))
-                       g_free (val);
        }
 
        named = p;
@@ -9431,7 +9621,6 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth
                if (named_type == 0x53) {
                        MonoObject *obj;
                        MonoClassField *field = mono_class_get_field_from_name (attrklass, name);
-                       void *val;
 
                        if (!field) {
                                g_free (name);
@@ -9441,23 +9630,17 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth
                        arginfo [j].type = field->type;
                        arginfo [j].field = field;
 
-                       val = load_cattr_value (image, field->type, named, &named, error);
-                       if (!mono_error_ok (error)) {
-                               if (!type_is_reference (field->type))
-                                       g_free (val);
+                       obj = load_cattr_value_boxed (domain, image, field->type, named, &named, error);
+                       if (!is_ok (error)) {
                                g_free (name);
                                return;
                        }
-
-                       obj = (MonoObject *)(type_is_reference (field->type) ? val : mono_value_box (domain, mono_class_from_mono_type (field->type), val));
                        mono_array_setref (namedargs, j, obj);
-                       if (!type_is_reference (field->type))
-                               g_free (val);
+
                } else if (named_type == 0x54) {
                        MonoObject *obj;
                        MonoType *prop_type;
                        MonoProperty *prop = mono_class_get_property_from_name (attrklass, name);
-                       void *val;
 
                        if (!prop || !prop->set) {
                                g_free (name);
@@ -9470,18 +9653,12 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth
                        arginfo [j].type = prop_type;
                        arginfo [j].prop = prop;
 
-                       val = load_cattr_value (image, prop_type, named, &named, error);
-                       if (!mono_error_ok (error)) {
-                               if (!type_is_reference (prop_type))
-                                       g_free (val);
+                       obj = load_cattr_value_boxed (domain, image, prop_type, named, &named, error);
+                       if (!is_ok (error)) {
                                g_free (name);
                                return;
                        }
-
-                       obj = (MonoObject *)(type_is_reference (prop_type) ? val : mono_value_box (domain, mono_class_from_mono_type (prop_type), val));
                        mono_array_setref (namedargs, j, obj);
-                       if (!type_is_reference (prop_type))
-                               g_free (val);
                }
                g_free (name);
        }
@@ -10195,7 +10372,7 @@ mono_reflection_get_custom_attrs_info_checked (MonoObject *obj, MonoError *error
 #endif
                else {
                        char *type_name = mono_type_get_full_name (member_class);
-                       mono_error_set_generic_error (error, "System", "NotSupportedException",
+                       mono_error_set_not_supported (error,
                                                      "Custom attributes on a ParamInfo with member %s are not supported",
                                                      type_name);
                        g_free (type_name);
@@ -10496,7 +10673,7 @@ mono_reflection_type_get_handle (MonoReflectionType* ref, MonoError *error)
                        }
                }
 
-               res = mono_reflection_bind_generic_parameters (gclass->generic_type, count, types);
+               res = mono_reflection_bind_generic_parameters (gclass->generic_type, count, types, error);
                g_free (types);
                g_assert (res);
                gclass->type.type = res;
@@ -10515,17 +10692,20 @@ mono_reflection_create_unmanaged_type (MonoReflectionType *type)
        mono_error_set_pending_exception (&error);
 }
 
-void
-mono_reflection_register_with_runtime (MonoReflectionType *type)
+static gboolean
+reflection_register_with_runtime (MonoReflectionType *type, MonoError *error)
 {
-       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;
 
-       if (!res)
-               mono_raise_exception (mono_get_exception_argument (NULL, "Invalid generic instantiation, one or more arguments are not proper user types"));
+       mono_error_init (error);
+
+       MonoType *res = mono_reflection_type_get_handle (type, error);
+
+       if (!res && is_ok (error)) {
+               mono_error_set_argument (error, NULL, "Invalid generic instantiation, one or more arguments are not proper user types");
+       }
+       return_val_if_nok (error, FALSE);
 
        klass = mono_class_from_mono_type (res);
 
@@ -10542,25 +10722,39 @@ mono_reflection_register_with_runtime (MonoReflectionType *type)
        }
        mono_domain_unlock (domain);
        mono_loader_unlock ();
+
+       return TRUE;
+}
+
+void
+mono_reflection_register_with_runtime (MonoReflectionType *type)
+{
+       MonoError error;
+       (void) reflection_register_with_runtime (type, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 /**
  * LOCKING: Assumes the loader lock is held.
  */
 static MonoMethodSignature*
-parameters_to_signature (MonoImage *image, MonoArray *parameters) {
-       MonoError error;
+parameters_to_signature (MonoImage *image, MonoArray *parameters, MonoError *error) {
        MonoMethodSignature *sig;
        int count, i;
 
+       mono_error_init (error);
+
        count = parameters? mono_array_length (parameters): 0;
 
        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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               sig->params [i] = mono_type_array_get_and_resolve (parameters, i, error);
+               if (!is_ok (error)) {
+                       image_g_free (image, sig);
+                       return NULL;
+               }
        }
        return sig;
 }
@@ -10569,10 +10763,13 @@ parameters_to_signature (MonoImage *image, MonoArray *parameters) {
  * LOCKING: Assumes the loader lock is held.
  */
 static MonoMethodSignature*
-ctor_builder_to_signature (MonoImage *image, MonoReflectionCtorBuilder *ctor) {
+ctor_builder_to_signature (MonoImage *image, MonoReflectionCtorBuilder *ctor, MonoError *error) {
        MonoMethodSignature *sig;
 
-       sig = parameters_to_signature (image, ctor->parameters);
+       mono_error_init (error);
+
+       sig = parameters_to_signature (image, ctor->parameters, error);
+       return_val_if_nok (error, NULL);
        sig->hasthis = ctor->attrs & METHOD_ATTRIBUTE_STATIC? 0: 1;
        sig->ret = &mono_defaults.void_class->byval_arg;
        return sig;
@@ -10582,15 +10779,20 @@ ctor_builder_to_signature (MonoImage *image, MonoReflectionCtorBuilder *ctor) {
  * LOCKING: Assumes the loader lock is held.
  */
 static MonoMethodSignature*
-method_builder_to_signature (MonoImage *image, MonoReflectionMethodBuilder *method) {
-       MonoError error;
+method_builder_to_signature (MonoImage *image, MonoReflectionMethodBuilder *method, MonoError *error) {
        MonoMethodSignature *sig;
 
-       sig = parameters_to_signature (image, method->parameters);
+       mono_error_init (error);
+
+       sig = parameters_to_signature (image, method->parameters, error);
+       return_val_if_nok (error, NULL);
        sig->hasthis = method->attrs & METHOD_ATTRIBUTE_STATIC? 0: 1;
        if (method->rtype) {
-               sig->ret = mono_reflection_type_get_handle ((MonoReflectionType*)method->rtype, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               sig->ret = mono_reflection_type_get_handle ((MonoReflectionType*)method->rtype, error);
+               if (!is_ok (error)) {
+                       image_g_free (image, sig);
+                       return NULL;
+               }
        } else {
                sig->ret = &mono_defaults.void_class->byval_arg;
        }
@@ -10599,15 +10801,20 @@ method_builder_to_signature (MonoImage *image, MonoReflectionMethodBuilder *meth
 }
 
 static MonoMethodSignature*
-dynamic_method_to_signature (MonoReflectionDynamicMethod *method) {
-       MonoError error;
+dynamic_method_to_signature (MonoReflectionDynamicMethod *method, MonoError *error) {
        MonoMethodSignature *sig;
 
-       sig = parameters_to_signature (NULL, method->parameters);
+       mono_error_init (error);
+
+       sig = parameters_to_signature (NULL, method->parameters, error);
+       return_val_if_nok (error, NULL);
        sig->hasthis = method->attrs & METHOD_ATTRIBUTE_STATIC? 0: 1;
        if (method->rtype) {
-               sig->ret = mono_reflection_type_get_handle (method->rtype, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               sig->ret = mono_reflection_type_get_handle (method->rtype, error);
+               if (!is_ok (error)) {
+                       g_free (sig);
+                       return NULL;
+               }
        } else {
                sig->ret = &mono_defaults.void_class->byval_arg;
        }
@@ -10616,15 +10823,14 @@ dynamic_method_to_signature (MonoReflectionDynamicMethod *method) {
 }
 
 static void
-get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type)
+get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type, MonoError *error)
 {
-       MonoError error;
+       mono_error_init (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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               *type = mono_reflection_type_get_handle ((MonoReflectionType*)pb->type, error);
        } else {
                MonoReflectionProperty *p = (MonoReflectionProperty *)prop;
                *name = g_strdup (p->property->name);
@@ -10636,15 +10842,14 @@ get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type)
 }
 
 static void
-get_field_name_and_type (MonoObject *field, char **name, MonoType **type)
+get_field_name_and_type (MonoObject *field, char **name, MonoType **type, MonoError *error)
 {
-       MonoError error;
+       mono_error_init (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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, error);
        } else {
                MonoReflectionField *f = (MonoReflectionField *)field;
                *name = g_strdup (mono_field_get_name (f->field));
@@ -10740,14 +10945,15 @@ mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *er
                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");
+                       mono_error_set_not_supported (error, "User defined subclasses of System.Type are not yet supported22");
                        return NULL;
                }
        }
 
        return type;
 }
-/*
+/**
+ * encode_cattr_value:
  * Encode a value in a custom attribute stream of bytes.
  * The value to encode is either supplied as an object in argument val
  * (valuetypes are boxed), or as a pointer to the data in the
@@ -10758,13 +10964,14 @@ mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *er
  * @buflen contains the size of the buffer and is used to return the new buffer size
  * if this needs to be realloced.
  * @retbuffer and @retp return the start and the position of the buffer
+ * @error set on error.
  */
 static void
-encode_cattr_value (MonoAssembly *assembly, char *buffer, char *p, char **retbuffer, char **retp, guint32 *buflen, MonoType *type, MonoObject *arg, char *argval)
+encode_cattr_value (MonoAssembly *assembly, char *buffer, char *p, char **retbuffer, char **retp, guint32 *buflen, MonoType *type, MonoObject *arg, char *argval, MonoError *error)
 {
-       MonoError error;
        MonoTypeEnum simple_type;
        
+       mono_error_init (error);
        if ((p-buffer) + 10 >= *buflen) {
                char *newbuf;
                *buflen *= 2;
@@ -10843,8 +11050,9 @@ handle_enum:
                        break;
                }
 handle_type:
-               arg_type = mono_reflection_type_get_handle ((MonoReflectionType*)arg, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               arg_type = mono_reflection_type_get_handle ((MonoReflectionType*)arg, error);
+               return_if_nok (error);
+
                str = type_get_qualified_name (arg_type, NULL);
                slen = strlen (str);
                if ((p-buffer) + 10 + slen >= *buflen) {
@@ -10887,19 +11095,22 @@ handle_type:
                        char *elptr = mono_array_addr ((MonoArray*)arg, char, 0);
                        int elsize = mono_class_array_element_size (arg_eclass);
                        for (i = 0; i < len; ++i) {
-                               encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &arg_eclass->byval_arg, NULL, elptr);
+                               encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &arg_eclass->byval_arg, NULL, elptr, error);
+                               return_if_nok (error);
                                elptr += elsize;
                        }
                } else if (eclass->valuetype && arg_eclass->valuetype) {
                        char *elptr = mono_array_addr ((MonoArray*)arg, char, 0);
                        int elsize = mono_class_array_element_size (eclass);
                        for (i = 0; i < len; ++i) {
-                               encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &eclass->byval_arg, NULL, elptr);
+                               encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &eclass->byval_arg, NULL, elptr, error);
+                               return_if_nok (error);
                                elptr += elsize;
                        }
                } else {
                        for (i = 0; i < len; ++i) {
-                               encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &eclass->byval_arg, mono_array_get ((MonoArray*)arg, MonoObject*, i), NULL);
+                               encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &eclass->byval_arg, mono_array_get ((MonoArray*)arg, MonoObject*, i), NULL, error);
+                               return_if_nok (error);
                        }
                }
                break;
@@ -10923,10 +11134,14 @@ handle_type:
                
                klass = mono_object_class (arg);
 
-               if (mono_object_isinst (arg, mono_defaults.systemtype_class)) {
+               if (mono_object_isinst_checked (arg, mono_defaults.systemtype_class, error)) {
                        *p++ = 0x50;
                        goto handle_type;
-               } else if (klass->enumtype) {
+               } else {
+                       return_if_nok (error);
+               }
+
+               if (klass->enumtype) {
                        *p++ = 0x55;
                } else if (klass == mono_defaults.string_class) {
                        simple_type = MONO_TYPE_STRING;
@@ -10939,7 +11154,8 @@ handle_type:
                                *p++ = 0x51;
                        else
                                *p++ = klass->element_class->byval_arg.type;
-                       encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &klass->byval_arg, arg, NULL);
+                       encode_cattr_value (assembly, buffer, p, &buffer, &p, buflen, &klass->byval_arg, arg, NULL, error);
+                       return_if_nok (error);
                        break;
                } else if (klass->byval_arg.type >= MONO_TYPE_BOOLEAN && klass->byval_arg.type <= MONO_TYPE_R8) {
                        *p++ = simple_type = klass->byval_arg.type;
@@ -11004,9 +11220,12 @@ encode_field_or_prop_type (MonoType *type, char *p, char **retp)
 
 #ifndef DISABLE_REFLECTION_EMIT
 static void
-encode_named_val (MonoReflectionAssembly *assembly, char *buffer, char *p, char **retbuffer, char **retp, guint32 *buflen, MonoType *type, char *name, MonoObject *value)
+encode_named_val (MonoReflectionAssembly *assembly, char *buffer, char *p, char **retbuffer, char **retp, guint32 *buflen, MonoType *type, char *name, MonoObject *value, MonoError *error)
 {
        int len;
+
+       mono_error_init (error);
+
        /* Preallocate a large enough buffer */
        if (type->type == MONO_TYPE_VALUETYPE && type->data.klass->enumtype) {
                char *str = type_get_qualified_name (type, NULL);
@@ -11036,12 +11255,13 @@ encode_named_val (MonoReflectionAssembly *assembly, char *buffer, char *p, char
        mono_metadata_encode_value (len, p, &p);
        memcpy (p, name, len);
        p += len;
-       encode_cattr_value (assembly->assembly, buffer, p, &buffer, &p, buflen, type, value, NULL);
+       encode_cattr_value (assembly->assembly, buffer, p, &buffer, &p, buflen, type, value, NULL, error);
+       return_if_nok (error);
        *retp = p;
        *retbuffer = buffer;
 }
 
-/*
+/**
  * mono_reflection_get_custom_attrs_blob:
  * @ctor: custom attribute constructor
  * @ctorArgs: arguments o the constructor
@@ -11057,15 +11277,44 @@ encode_named_val (MonoReflectionAssembly *assembly, char *buffer, char *p, char
 MonoArray*
 mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) 
 {
-       MonoArray *result;
+       MonoError error;
+       MonoArray *result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, &error);
+       mono_error_cleanup (&error); /* FIXME better API that doesn't swallow the error */
+       return result;
+}
+
+/**
+ * mono_reflection_get_custom_attrs_blob_checked:
+ * @ctor: custom attribute constructor
+ * @ctorArgs: arguments o the constructor
+ * @properties:
+ * @propValues:
+ * @fields:
+ * @fieldValues:
+ * @error: set on error
+ * 
+ * Creates the blob of data that needs to be saved in the metadata and that represents
+ * the custom attributed described by @ctor, @ctorArgs etc.
+ * Returns: a Byte array representing the blob of data.  On failure returns NULL and sets @error.
+ */
+MonoArray*
+mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error) 
+{
+       MonoArray *result = NULL;
        MonoMethodSignature *sig;
        MonoObject *arg;
        char *buffer, *p;
        guint32 buflen, i;
 
+       mono_error_init (error);
+
        if (strcmp (ctor->vtable->klass->name, "MonoCMethod")) {
                /* sig is freed later so allocate it in the heap */
-               sig = ctor_builder_to_signature (NULL, (MonoReflectionCtorBuilder*)ctor);
+               sig = ctor_builder_to_signature (NULL, (MonoReflectionCtorBuilder*)ctor, error);
+               if (!is_ok (error)) {
+                       g_free (sig);
+                       return NULL;
+               }
        } else {
                sig = mono_method_signature (((MonoReflectionMethod*)ctor)->method);
        }
@@ -11078,7 +11327,8 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj
        *p++ = 0;
        for (i = 0; i < sig->param_count; ++i) {
                arg = mono_array_get (ctorArgs, MonoObject*, i);
-               encode_cattr_value (assembly->assembly, buffer, p, &buffer, &p, &buflen, sig->params [i], arg, NULL);
+               encode_cattr_value (assembly->assembly, buffer, p, &buffer, &p, &buflen, sig->params [i], arg, NULL, error);
+               if (!is_ok (error)) goto leave;
        }
        i = 0;
        if (properties)
@@ -11094,10 +11344,12 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj
                        char *pname;
 
                        prop = (MonoObject *)mono_array_get (properties, gpointer, i);
-                       get_prop_name_and_type (prop, &pname, &ptype);
+                       get_prop_name_and_type (prop, &pname, &ptype, error);
+                       if (!is_ok (error)) goto leave;
                        *p++ = 0x54; /* PROPERTY signature */
-                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ptype, pname, (MonoObject*)mono_array_get (propValues, gpointer, i));
+                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ptype, pname, (MonoObject*)mono_array_get (propValues, gpointer, i), error);
                        g_free (pname);
+                       if (!is_ok (error)) goto leave;
                }
        }
 
@@ -11108,10 +11360,12 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj
                        char *fname;
 
                        field = (MonoObject *)mono_array_get (fields, gpointer, i);
-                       get_field_name_and_type (field, &fname, &ftype);
+                       get_field_name_and_type (field, &fname, &ftype, error);
+                       if (!is_ok (error)) goto leave;
                        *p++ = 0x53; /* FIELD signature */
-                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ftype, fname, (MonoObject*)mono_array_get (fieldValues, gpointer, i));
+                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ftype, fname, (MonoObject*)mono_array_get (fieldValues, gpointer, i), error);
                        g_free (fname);
+                       if (!is_ok (error)) goto leave;
                }
        }
 
@@ -11120,36 +11374,40 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj
        result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, buflen);
        p = mono_array_addr (result, char, 0);
        memcpy (p, buffer, buflen);
+leave:
        g_free (buffer);
        if (strcmp (ctor->vtable->klass->name, "MonoCMethod"))
                g_free (sig);
        return result;
 }
 
-/*
- * mono_reflection_setup_internal_class:
+/**
+ * reflection_setup_internal_class:
  * @tb: a TypeBuilder object
+ * @error: set on error
  *
  * Creates a MonoClass that represents the TypeBuilder.
  * This is a trick that lets us simplify a lot of reflection code
  * (and will allow us to support Build and Run assemblies easier).
+ *
+ * Returns TRUE on success. On failure, returns FALSE and sets @error.
  */
-void
-mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
+static gboolean
+reflection_setup_internal_class (MonoReflectionTypeBuilder *tb, MonoError *error)
 {
-       MonoError error;
        MonoClass *klass, *parent;
 
-       RESOLVE_TYPE (tb->parent, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       mono_error_init (error);
+       RESOLVE_TYPE (tb->parent, error);
+       return_val_if_nok (error, FALSE);
 
        mono_loader_lock ();
 
        if (tb->parent) {
-               MonoType *parent_type = mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent, &error);
-               if (!is_ok (&error)) {
+               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 */
+                       return FALSE;
                }
                /* check so we can compile corlib correctly */
                if (strcmp (mono_object_class (tb->parent)->name, "TypeBuilder") == 0) {
@@ -11171,7 +11429,7 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
                mono_class_setup_parent (klass, parent);
                mono_class_setup_mono_type (klass);
                mono_loader_unlock ();
-               return;
+               return TRUE;
        }
 
        klass = (MonoClass *)mono_image_alloc0 (&tb->module->dynamic_image->image, sizeof (MonoClass));
@@ -11179,11 +11437,11 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
        klass->image = &tb->module->dynamic_image->image;
 
        klass->inited = 1; /* we lie to the runtime */
-       klass->name = mono_string_to_utf8_image (klass->image, tb->name, &error);
-       if (!mono_error_ok (&error))
+       klass->name = mono_string_to_utf8_image (klass->image, tb->name, error);
+       if (!is_ok (error))
                goto failure;
-       klass->name_space = mono_string_to_utf8_image (klass->image, tb->nspace, &error);
-       if (!mono_error_ok (&error))
+       klass->name_space = mono_string_to_utf8_image (klass->image, tb->nspace, error);
+       if (!is_ok (error))
                goto failure;
        klass->type_token = MONO_TOKEN_TYPE_DEF | tb->table_idx;
        klass->flags = tb->attrs;
@@ -11244,8 +11502,8 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
 
        if (tb->nesting_type) {
                g_assert (tb->nesting_type->type);
-               MonoType *nesting_type = mono_reflection_type_get_handle (tb->nesting_type, &error);
-               if (!is_ok (&error)) goto failure;
+               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);
        }
 
@@ -11254,11 +11512,29 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
        mono_profiler_class_loaded (klass, MONO_PROFILE_OK);
        
        mono_loader_unlock ();
-       return;
+       return TRUE;
 
 failure:
        mono_loader_unlock ();
-       mono_error_raise_exception (&error);
+       return FALSE;
+}
+
+/**
+ * mono_reflection_setup_internal_class:
+ * @tb: a TypeBuilder object
+ *
+ * (icall)
+ * Creates a MonoClass that represents the TypeBuilder.
+ * This is a trick that lets us simplify a lot of reflection code
+ * (and will allow us to support Build and Run assemblies easier).
+ *
+ */
+void
+mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
+{
+       MonoError error;
+       (void) reflection_setup_internal_class (tb, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 /*
@@ -11319,18 +11595,22 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
        klass->generic_container->context.class_inst = mono_get_shared_generic_inst (klass->generic_container);
 }
 
-/*
- * mono_reflection_create_internal_class:
+/**
+ * reflection_create_internal_class:
  * @tb: a TypeBuilder object
+ * @error: set on error
  *
  * Actually create the MonoClass that is associated with the TypeBuilder.
+ * On success returns TRUE, on failure returns FALSE and sets @error.
+ *
  */
-void
-mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
+static gboolean
+reflection_create_internal_class (MonoReflectionTypeBuilder *tb, MonoError *error)
 {
-       MonoError error;
+
        MonoClass *klass;
 
+       mono_error_init (error);
        klass = mono_class_from_mono_type (tb->type.type);
 
        mono_loader_lock ();
@@ -11344,20 +11624,20 @@ mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
 
                fb = mono_array_get (tb->fields, MonoReflectionFieldBuilder*, 0);
 
-               MonoType *field_type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
-               if (!is_ok (&error)) {
+               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 */
+                       return FALSE;
                }
                if (!mono_type_is_valid_enum_basetype (field_type)) {
                        mono_loader_unlock ();
-                       return;
+                       return TRUE;
                }
 
-               enum_basetype = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
-               if (!is_ok (&error)) {
+               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 */
+                       return FALSE;
                }
                klass->element_class = mono_class_from_mono_type (enum_basetype);
                if (!klass->element_class)
@@ -11377,16 +11657,33 @@ mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
                mono_class_setup_vtable_general (klass, NULL, 0, NULL);
        }
        mono_loader_unlock ();
+       return TRUE;
+}
+
+/**
+ * mono_reflection_create_internal_class:
+ * @tb: a TypeBuilder object
+ *
+ * (icall)
+ * Actually create the MonoClass that is associated with the TypeBuilder.
+ */
+void
+mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
+{
+       MonoError error;
+       (void) reflection_create_internal_class (tb, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 static MonoMarshalSpec*
 mono_marshal_spec_from_builder (MonoImage *image, MonoAssembly *assembly,
-                                                               MonoReflectionMarshal *minfo)
+                               MonoReflectionMarshal *minfo, MonoError *error)
 {
-       MonoError error;
        MonoMarshalSpec *res;
 
-       res = image_g_new0 (image, MonoMarshalSpec, 1);
+       mono_error_init (error);
+
+       res = image_g_new0 (image, MonoMarshalSpec, 1);
        res->native = (MonoMarshalNative)minfo->type;
 
        switch (minfo->type) {
@@ -11411,8 +11708,11 @@ mono_marshal_spec_from_builder (MonoImage *image, MonoAssembly *assembly,
 
        case MONO_NATIVE_CUSTOM:
                if (minfo->marshaltyperef) {
-                       MonoType *marshaltyperef = mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *marshaltyperef = mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef, error);
+                       if (!is_ok (error)) {
+                               image_g_free (image, res);
+                               return NULL;
+                       }
                        res->data.custom_data.custom_name =
                                type_get_fully_qualified_name (marshaltyperef);
                }
@@ -11458,7 +11758,9 @@ mono_reflection_marshal_as_attribute_from_marshal_spec (MonoDomain *domain, Mono
 
        case MONO_NATIVE_CUSTOM:
                if (spec->data.custom_data.custom_name) {
-                       mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, klass->image);
+                       mtype = mono_reflection_type_from_name_checked (spec->data.custom_data.custom_name, klass->image, error);
+                       return_val_if_nok  (error, NULL);
+
                        if (mtype) {
                                rt = mono_type_get_object_checked (domain, mtype, error);
                                if (!rt)
@@ -11731,7 +12033,12 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
                                        if (specs == NULL)
                                                specs = image_g_new0 (image, MonoMarshalSpec*, sig->param_count + 1);
                                        specs [pb->position] = 
-                                               mono_marshal_spec_from_builder (image, klass->image->assembly, pb->marshal_info);
+                                               mono_marshal_spec_from_builder (image, klass->image->assembly, pb->marshal_info, &error);
+                                       if (!is_ok (&error)) {
+                                               mono_loader_unlock ();
+                                               image_g_free (image, specs);
+                                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                                       }
                                }
                        }
                }
@@ -11756,8 +12063,10 @@ ctorbuilder_to_mono_method (MonoClass *klass, MonoReflectionCtorBuilder* mb, Mon
        MonoMethodSignature *sig;
 
        mono_loader_lock ();
-       sig = ctor_builder_to_signature (klass->image, mb);
+       g_assert (klass->image != NULL);
+       sig = ctor_builder_to_signature (klass->image, mb, error);
        mono_loader_unlock ();
+       return_val_if_nok (error, NULL);
 
        if (!reflection_methodbuilder_from_ctor_builder (&rmb, mb, error))
                return NULL;
@@ -11783,8 +12092,10 @@ methodbuilder_to_mono_method (MonoClass *klass, MonoReflectionMethodBuilder* mb,
        mono_error_init (error);
 
        mono_loader_lock ();
-       sig = method_builder_to_signature (klass->image, mb);
+       g_assert (klass->image != NULL);
+       sig = method_builder_to_signature (klass->image, mb, error);
        mono_loader_unlock ();
+       return_val_if_nok (error, NULL);
 
        if (!reflection_methodbuilder_from_method_builder (&rmb, mb, error))
                return NULL;
@@ -11801,35 +12112,40 @@ methodbuilder_to_mono_method (MonoClass *klass, MonoReflectionMethodBuilder* mb,
 }
 
 static MonoClassField*
-fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder* fb)
+fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder* fb, MonoError *error)
 {
        MonoClassField *field;
        MonoType *custom;
-       MonoError error;
+
+       mono_error_init (error);
 
        field = g_new0 (MonoClassField, 1);
 
-       field->name = mono_string_to_utf8_image (klass->image, fb->name, &error);
-       g_assert (mono_error_ok (&error));
+       field->name = mono_string_to_utf8_image (klass->image, fb->name, error);
+       mono_error_assert_ok (error);
        if (fb->attrs || fb->modreq || fb->modopt) {
-               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
-               if (!is_ok (&error)) {
+               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 */
+                       return NULL;
                }
                field->type = mono_metadata_type_dup (NULL, type);
                field->type->attrs = fb->attrs;
 
                g_assert (image_is_dynamic (klass->image));
-               custom = add_custom_modifiers ((MonoDynamicImage*)klass->image, field->type, fb->modreq, fb->modopt);
+               custom = add_custom_modifiers ((MonoDynamicImage*)klass->image, field->type, fb->modreq, fb->modopt, error);
                g_free (field->type);
+               if (!is_ok (error)) {
+                       g_free (field);
+                       return NULL;
+               }
                field->type = mono_metadata_type_dup (klass->image, custom);
                g_free (custom);
        } else {
-               field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, &error);
-               if (!is_ok (&error)) {
+               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 */
+                       return NULL;
                }
        }
        if (fb->offset != -1)
@@ -11843,15 +12159,26 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder*
 }
 #endif
 
+/**
+ * mono_reflection_bind_generic_parameters:
+ * @type: a managed type object (which should be some kind of generic (instance? definition?))
+ * @type_args: the number of type arguments to bind
+ * @types: array of type arguments
+ * @error: set on error
+ *
+ * Given a managed type object for a generic type instance, binds each of its arguments to the specified types.
+ * Returns the MonoType* for the resulting type instantiation.  On failure returns NULL and sets @error.
+ */
 MonoType*
-mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types)
+mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc, MonoType **types, MonoError *error)
 {
-       MonoError error;
        MonoClass *klass;
        MonoReflectionTypeBuilder *tb = NULL;
        gboolean is_dynamic = FALSE;
        MonoClass *geninst;
 
+       mono_error_init (error);
+       
        mono_loader_lock ();
 
        if (is_sre_type_builder (mono_object_class (type))) {
@@ -11872,12 +12199,16 @@ mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc
        if (tb && tb->generic_container)
                mono_reflection_create_generic_class (tb);
 
-       MonoType *t = mono_reflection_type_get_handle (type, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       MonoType *t = mono_reflection_type_get_handle (type, error);
+       if (!is_ok (error)) {
+               mono_loader_unlock ();
+               return NULL;
+       }
 
        klass = mono_class_from_mono_type (t);
        if (!klass->generic_container) {
                mono_loader_unlock ();
+               mono_error_set_type_load_class (error, klass, "Cannot bind generic parameters of a non-generic type");
                return NULL;
        }
 
@@ -12086,29 +12417,30 @@ inflate_method (MonoReflectionType *type, MonoObject *obj, MonoError *error)
 }
 
 /*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)
+static gboolean
+reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *fields, MonoError *error)
 {
-       MonoError error;
        MonoGenericClass *gclass;
        MonoDynamicGenericClass *dgclass;
        MonoClass *klass, *gklass;
        MonoType *gtype;
        int i;
 
-       gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       mono_error_init (error);
+
+       gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type, error);
+       return_val_if_nok (error, FALSE);
        klass = mono_class_from_mono_type (gtype);
        g_assert (gtype->type == MONO_TYPE_GENERICINST);
        gclass = gtype->data.generic_class;
 
        if (!gclass->is_dynamic)
-               return;
+               return TRUE;
 
        dgclass = (MonoDynamicGenericClass *) gclass;
 
        if (dgclass->initialized)
-               return;
+               return TRUE;
 
        gklass = gclass->container_class;
        mono_class_init (gklass);
@@ -12120,13 +12452,13 @@ 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;
 
-               if (!strcmp (obj->vtable->klass->name, "FieldBuilder"))
-                       inflated_field = field = fieldbuilder_to_mono_class_field (klass, (MonoReflectionFieldBuilder *) obj);
-               else if (!strcmp (obj->vtable->klass->name, "MonoField"))
+               if (!strcmp (obj->vtable->klass->name, "FieldBuilder")) {
+                       inflated_field = field = fieldbuilder_to_mono_class_field (klass, (MonoReflectionFieldBuilder *) obj, error);
+                       return_val_if_nok (error, FALSE);
+               } else if (!strcmp (obj->vtable->klass->name, "MonoField"))
                        field = ((MonoReflectionField *) obj)->field;
                else {
                        field = NULL; /* prevent compiler warning */
@@ -12136,8 +12468,8 @@ 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_checked (
-                       field->type, mono_generic_class_get_context ((MonoGenericClass *) dgclass), &error);
-               mono_error_assert_ok (&error); /* FIXME don't swallow the error */
+                       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;
@@ -12150,6 +12482,15 @@ mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, Mono
        }
 
        dgclass->initialized = TRUE;
+       return TRUE;
+}
+
+void
+mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, MonoArray *fields)
+{
+       MonoError error;
+       (void) reflection_generic_class_initialize (type, fields, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 void
@@ -12169,21 +12510,34 @@ mono_reflection_free_dynamic_generic_class (MonoGenericClass *gclass)
        }
 }
 
-static void
-fix_partial_generic_class (MonoClass *klass)
+/**
+ * fix_partial_generic_class:
+ * @klass: a generic instantiation MonoClass
+ * @error: set on error
+ *
+ * Assumes that the generic container of @klass has its vtable
+ * initialized, and updates the parent class, insterfaces, methods and
+ * fields of @klass by inflating the types using the generic context.
+ *
+ * On success returns TRUE, on failure returns FALSE and sets @error.
+ *
+ */
+static gboolean
+fix_partial_generic_class (MonoClass *klass, MonoError *error)
 {
        MonoClass *gklass = klass->generic_class->container_class;
        MonoDynamicGenericClass *dgclass;
        int i;
 
+       mono_error_init (error);
+
        if (klass->wastypebuilder)
-               return;
+               return TRUE;
 
        dgclass = (MonoDynamicGenericClass *)  klass->generic_class;
        if (klass->parent != gklass->parent) {
-               MonoError error;
-               MonoType *parent_type = mono_class_inflate_generic_type_checked (&gklass->parent->byval_arg, &klass->generic_class->context, &error);
-               if (mono_error_ok (&error)) {
+               MonoType *parent_type = mono_class_inflate_generic_type_checked (&gklass->parent->byval_arg, &klass->generic_class->context, error);
+               if (mono_error_ok (error)) {
                        MonoClass *parent = mono_class_from_mono_type (parent_type);
                        mono_metadata_free_type (parent_type);
                        if (parent != klass->parent) {
@@ -12192,26 +12546,23 @@ fix_partial_generic_class (MonoClass *klass)
                                mono_class_setup_parent (klass, parent);
                        }
                } else {
-                       mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, NULL);
-                       mono_error_cleanup (&error);
                        if (gklass->wastypebuilder)
                                klass->wastypebuilder = TRUE;
-                       return;
+                       return FALSE;
                }
        }
 
        if (!dgclass->initialized)
-               return;
+               return TRUE;
 
        if (klass->method.count != gklass->method.count) {
                klass->method.count = gklass->method.count;
                klass->methods = (MonoMethod **)mono_image_alloc (klass->image, sizeof (MonoMethod*) * (klass->method.count + 1));
 
                for (i = 0; i < klass->method.count; i++) {
-                       MonoError error;
                        klass->methods [i] = mono_class_inflate_generic_method_full_checked (
-                               gklass->methods [i], klass, mono_class_get_context (klass), &error);
-                       g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */
+                               gklass->methods [i], klass, mono_class_get_context (klass), error);
+                       mono_error_assert_ok (error);
                }
        }
 
@@ -12221,15 +12572,14 @@ fix_partial_generic_class (MonoClass *klass)
                klass->interfaces_packed = NULL; /*make setup_interface_offsets happy*/
 
                for (i = 0; i < gklass->interface_count; ++i) {
-                       MonoError error;
-                       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 */
+                       MonoType *iface_type = mono_class_inflate_generic_type_checked (&gklass->interfaces [i]->byval_arg, mono_class_get_context (klass), error);
+                       return_val_if_nok (error, FALSE);
 
                        klass->interfaces [i] = mono_class_from_mono_type (iface_type);
                        mono_metadata_free_type (iface_type);
 
-                       ensure_runtime_vtable (klass->interfaces [i], &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       if (!ensure_runtime_vtable (klass->interfaces [i], error))
+                               return FALSE;
                }
                klass->interfaces_inited = 1;
        }
@@ -12239,18 +12589,17 @@ 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_checked (gklass->fields [i].type, mono_class_get_context (klass), &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       klass->fields [i].type = mono_class_inflate_generic_type_checked (gklass->fields [i].type, mono_class_get_context (klass), error);
+                       return_val_if_nok (error, FALSE);
                }
        }
 
        /*We can only finish with this klass once it's parent has as well*/
        if (gklass->wastypebuilder)
                klass->wastypebuilder = TRUE;
-       return;
+       return TRUE;
 }
 
 /**
@@ -12271,9 +12620,7 @@ ensure_generic_class_runtime_vtable (MonoClass *klass, MonoError *error)
        if (!ensure_runtime_vtable (gklass, error))
                return FALSE;
 
-       fix_partial_generic_class (klass);
-
-       return TRUE;
+       return fix_partial_generic_class (klass, error);
 }
 
 /**
@@ -12332,8 +12679,10 @@ ensure_runtime_vtable (MonoClass *klass, MonoError *error)
                        klass->interfaces_inited = 1;
                }
        } else if (klass->generic_class){
-               if (!ensure_generic_class_runtime_vtable (klass, error))
+               if (!ensure_generic_class_runtime_vtable (klass, error)) {
+                       mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, NULL);
                        return FALSE;
+               }
        }
 
        if (klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
@@ -12364,9 +12713,9 @@ ensure_runtime_vtable (MonoClass *klass, MonoError *error)
 }
 
 static MonoMethod*
-mono_reflection_method_get_handle (MonoObject *method)
+mono_reflection_method_get_handle (MonoObject *method, MonoError *error)
 {
-       MonoError error;
+       mono_error_init (error);
        MonoClass *klass = mono_object_class (method);
        if (is_sr_mono_method (klass) || is_sr_mono_generic_method (klass)) {
                MonoReflectionMethod *sr_method = (MonoReflectionMethod*)method;
@@ -12381,11 +12730,10 @@ 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, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       result = mono_reflection_method_on_tb_inst_get_handle (m, error);
                } else {
-                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, error);
+                       return_val_if_nok (error, NULL);
                        MonoClass *inflated_klass = mono_class_from_mono_type (type);
                        MonoMethod *mono_method;
 
@@ -12406,12 +12754,13 @@ mono_reflection_method_get_handle (MonoObject *method)
 }
 
 void
-mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides)
+mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides, MonoError *error)
 {
        MonoReflectionTypeBuilder *tb;
        int i, j, onum;
        MonoReflectionMethod *m;
 
+       mono_error_init (error);
        *overrides = NULL;
        *num_overrides = 0;
 
@@ -12445,7 +12794,8 @@ mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides
                                for (j = 0; j < mono_array_length (mb->override_methods); ++j) {
                                        m = mono_array_get (mb->override_methods, MonoReflectionMethod*, j);
 
-                                       (*overrides) [onum * 2] = mono_reflection_method_get_handle ((MonoObject*)m);
+                                       (*overrides) [onum * 2] = mono_reflection_method_get_handle ((MonoObject*)m, error);
+                                       return_if_nok (error);
                                        (*overrides) [onum * 2 + 1] = mb->mhandle;
 
                                        g_assert (mb->mhandle);
@@ -12549,7 +12899,7 @@ typebuilder_setup_fields (MonoClass *klass, MonoError *error)
        }
 
        klass->instance_size = MAX (klass->instance_size, real_size);
-       mono_class_layout_fields (klass);
+       mono_class_layout_fields (klass, klass->instance_size);
 }
 
 static void
@@ -12602,15 +12952,19 @@ typebuilder_setup_properties (MonoClass *klass, MonoError *error)
        }
 }
 
-MonoReflectionEvent *
-mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb)
+static MonoReflectionEvent *
+reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb, MonoError *error)
 {
-       MonoError error;
+       mono_error_init (error);
+
        MonoEvent *event = g_new0 (MonoEvent, 1);
        MonoClass *klass;
 
-       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
+       if (!is_ok (error)) {
+               g_free (event);
+               return NULL;
+       }
        klass = mono_class_from_mono_type (type);
 
        event->parent = klass;
@@ -12636,11 +12990,26 @@ mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, Mon
        }
 #endif
 
-       MonoReflectionEvent *ev_obj = mono_event_get_object_checked (mono_object_domain (tb), klass, event, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       MonoReflectionEvent *ev_obj = mono_event_get_object_checked (mono_object_domain (tb), klass, event, error);
+       if (!is_ok (error)) {
+#ifndef MONO_SMALL_CONFIG
+               g_free (event->other);
+#endif
+               g_free (event);
+               return NULL;
+       }
        return ev_obj;
 }
 
+MonoReflectionEvent *
+mono_reflection_event_builder_get_event_info (MonoReflectionTypeBuilder *tb, MonoReflectionEventBuilder *eb)
+{
+       MonoError error;
+       MonoReflectionEvent *result = reflection_event_builder_get_event_info (tb, eb, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
+}
+
 static void
 typebuilder_setup_events (MonoClass *klass, MonoError *error)
 {
@@ -12690,16 +13059,34 @@ typebuilder_setup_events (MonoClass *klass, MonoError *error)
        }
 }
 
+struct remove_instantiations_user_data
+{
+       MonoClass *klass;
+       MonoError *error;
+};
+
 static gboolean
 remove_instantiations_of_and_ensure_contents (gpointer key,
                                                  gpointer value,
                                                  gpointer user_data)
 {
+       struct remove_instantiations_user_data *data = (struct remove_instantiations_user_data*)user_data;
        MonoType *type = (MonoType*)key;
-       MonoClass *klass = (MonoClass*)user_data;
+       MonoClass *klass = data->klass;
+       gboolean already_failed = !is_ok (data->error);
+       MonoError lerror;
+       MonoError *error = already_failed ? &lerror : data->error;
 
        if ((type->type == MONO_TYPE_GENERICINST) && (type->data.generic_class->container_class == klass)) {
-               fix_partial_generic_class (mono_class_from_mono_type (type)); //Ensure it's safe to use it.
+               MonoClass *inst_klass = mono_class_from_mono_type (type);
+               //Ensure it's safe to use it.
+               if (!fix_partial_generic_class (inst_klass, error)) {
+                       mono_class_set_failure (inst_klass, MONO_EXCEPTION_TYPE_LOAD, NULL);
+                       // Marked the class with failure, but since some other instantiation already failed,
+                       // just report that one, and swallow the error from this one.
+                       if (already_failed)
+                               mono_error_cleanup (error);
+               }
                return TRUE;
        } else
                return FALSE;
@@ -12730,6 +13117,8 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
        MonoReflectionType* res;
        int i, j;
 
+       mono_error_init (&error);
+
        domain = mono_object_domain (tb);
        klass = mono_class_from_mono_type (tb->type.type);
 
@@ -12737,22 +13126,28 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
         * Check for user defined Type subclasses.
         */
        RESOLVE_TYPE (tb->parent, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       if (!is_ok (&error))
+               goto failure_unlocked;
        check_array_for_usertypes (tb->interfaces, &error);
-       mono_error_raise_exception (&error); /*FIXME don't raise here */
+       if (!is_ok (&error))
+               goto failure_unlocked;
        if (tb->fields) {
                for (i = 0; i < mono_array_length (tb->fields); ++i) {
                        MonoReflectionFieldBuilder *fb = (MonoReflectionFieldBuilder *)mono_array_get (tb->fields, gpointer, i);
                        if (fb) {
                                RESOLVE_TYPE (fb->type, &error);
-                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                check_array_for_usertypes (fb->modreq, &error);
-                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                check_array_for_usertypes (fb->modopt, &error);
-                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                if (fb->marshal_info && fb->marshal_info->marshaltyperef) {
                                        RESOLVE_TYPE (fb->marshal_info->marshaltyperef, &error);
-                                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                                       if (!is_ok (&error))
+                                               goto failure_unlocked;
                                }
                        }
                }
@@ -12762,22 +13157,28 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
                        MonoReflectionMethodBuilder *mb = (MonoReflectionMethodBuilder *)mono_array_get (tb->methods, gpointer, i);
                        if (mb) {
                                RESOLVE_TYPE (mb->rtype, &error);
-                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                check_array_for_usertypes (mb->return_modreq, &error);
-                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                check_array_for_usertypes (mb->return_modopt, &error);
-                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                check_array_for_usertypes (mb->parameters, &error);
-                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                if (mb->param_modreq)
                                        for (j = 0; j < mono_array_length (mb->param_modreq); ++j) {
                                                check_array_for_usertypes (mono_array_get (mb->param_modreq, MonoArray*, j), &error);
-                                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                                               if (!is_ok (&error))
+                                                       goto failure_unlocked;
                                        }
                                if (mb->param_modopt)
                                        for (j = 0; j < mono_array_length (mb->param_modopt); ++j) {
                                                check_array_for_usertypes (mono_array_get (mb->param_modopt, MonoArray*, j), &error);
-                                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                                               if (!is_ok (&error))
+                                                       goto failure_unlocked;
                                        }
                        }
                }
@@ -12787,16 +13188,19 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
                        MonoReflectionCtorBuilder *mb = (MonoReflectionCtorBuilder *)mono_array_get (tb->ctors, gpointer, i);
                        if (mb) {
                                check_array_for_usertypes (mb->parameters, &error);
-                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                               if (!is_ok (&error))
+                                       goto failure_unlocked;
                                if (mb->param_modreq)
                                        for (j = 0; j < mono_array_length (mb->param_modreq); ++j) {
                                                check_array_for_usertypes (mono_array_get (mb->param_modreq, MonoArray*, j), &error);
-                                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                                               if (!is_ok (&error))
+                                                       goto failure_unlocked;
                                        }
                                if (mb->param_modopt)
                                        for (j = 0; j < mono_array_length (mb->param_modopt); ++j) {
                                                check_array_for_usertypes (mono_array_get (mb->param_modopt, MonoArray*, j), &error);
-                                               mono_error_raise_exception (&error); /*FIXME don't raise here */
+                                               if (!is_ok (&error))
+                                                       goto failure_unlocked;
                                        }
                        }
                }
@@ -12815,7 +13219,7 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
                mono_loader_unlock ();
 
                res = mono_type_get_object_checked (mono_object_domain (tb), &klass->byval_arg, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               mono_error_set_pending_exception (&error);
 
                return res;
        }
@@ -12843,7 +13247,7 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
                        mono_domain_unlock (domain);
 
                        res = mono_type_get_object_checked (mono_object_domain (tb), &klass->byval_arg, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       mono_error_set_pending_exception (&error);
 
                        return res;
                }
@@ -12904,19 +13308,28 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
         *
         * Together with this we must ensure the contents of all instances to match the created type.
         */
-       if (domain->type_hash && klass->generic_container)
-               mono_g_hash_table_foreach_remove (domain->type_hash, remove_instantiations_of_and_ensure_contents, klass);
+       if (domain->type_hash && klass->generic_container) {
+               struct remove_instantiations_user_data data;
+               data.klass = klass;
+               data.error = &error;
+               mono_error_assert_ok (&error);
+               mono_g_hash_table_foreach_remove (domain->type_hash, remove_instantiations_of_and_ensure_contents, &data);
+               if (!is_ok (&error))
+                       goto failure;
+       }
 
        mono_domain_unlock (domain);
        mono_loader_unlock ();
 
        if (klass->enumtype && !mono_class_is_valid_enum (klass)) {
                mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, NULL);
-               mono_raise_exception (mono_get_exception_type_load (tb->name, NULL));
+               mono_error_set_type_load_class (&error, klass, "Not a valid enumeration");
+               goto failure_unlocked;
        }
 
        res = mono_type_get_object_checked (mono_object_domain (tb), &klass->byval_arg, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       if (!is_ok (&error))
+               goto failure_unlocked;
 
        g_assert (res != (MonoReflectionType*)tb);
 
@@ -12927,30 +13340,32 @@ failure:
        klass->wastypebuilder = TRUE;
        mono_domain_unlock (domain);
        mono_loader_unlock ();
-       mono_error_raise_exception (&error);
+failure_unlocked:
+       mono_error_set_pending_exception (&error);
        return NULL;
 }
 
-void
-mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam)
+static gboolean
+reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam, MonoError *error)
 {
        MonoGenericParamFull *param;
        MonoImage *image;
        MonoClass *pklass;
-       MonoError error;
+
+       mono_error_init (error);
 
        image = &gparam->tbuilder->module->dynamic_image->image;
 
        param = mono_image_new0 (image, MonoGenericParamFull, 1);
 
-       param->info.name = mono_string_to_utf8_image (image, gparam->name, &error);
-       g_assert (mono_error_ok (&error));
+       param->info.name = mono_string_to_utf8_image (image, gparam->name, error);
+       mono_error_assert_ok (error);
        param->param.num = gparam->index;
 
        if (gparam->mbuilder) {
                if (!gparam->mbuilder->generic_container) {
-                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->mbuilder->type, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->mbuilder->type, error);
+                       return_val_if_nok (error, FALSE);
 
                        MonoClass *klass = mono_class_from_mono_type (tb);
                        gparam->mbuilder->generic_container = (MonoGenericContainer *)mono_image_alloc0 (klass->image, sizeof (MonoGenericContainer));
@@ -12965,8 +13380,8 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
                param->param.owner = gparam->mbuilder->generic_container;
        } else if (gparam->tbuilder) {
                if (!gparam->tbuilder->generic_container) {
-                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->tbuilder, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *tb = mono_reflection_type_get_handle ((MonoReflectionType*)gparam->tbuilder, error);
+                       return_val_if_nok (error, FALSE);
                        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;
@@ -12980,8 +13395,19 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
 
        mono_class_set_ref_info (pklass, gparam);
        mono_image_append_class_to_reflection_info_set (pklass);
+
+       return TRUE;
 }
 
+void
+mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam)
+{
+       MonoError error;
+       (void) reflection_initialize_generic_parameter (gparam, &error);
+       mono_error_set_pending_exception (&error);
+}
+
+
 MonoArray *
 mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig)
 {
@@ -13083,10 +13509,9 @@ free_dynamic_method (void *dynamic_method)
        g_free (data);
 }
 
-void 
-mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
+static gboolean
+reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb, MonoError *error)
 {
-       MonoError error;
        MonoReferenceQueue *queue;
        MonoMethod *handle;
        DynamicMethodReleaseData *release_data;
@@ -13097,8 +13522,12 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
        GSList *l;
        int i;
 
-       if (mono_runtime_is_shutting_down ())
-               mono_raise_exception (mono_get_exception_invalid_operation (""));
+       mono_error_init (error);
+
+       if (mono_runtime_is_shutting_down ()) {
+               mono_error_set_generic_error (error, "System", "InvalidOperationException", "");
+               return FALSE;
+       }
 
        if (!(queue = dynamic_method_queue)) {
                mono_loader_lock ();
@@ -13107,7 +13536,8 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
                mono_loader_unlock ();
        }
 
-       sig = dynamic_method_to_signature (mb);
+       sig = dynamic_method_to_signature (mb, error);
+       return_val_if_nok (error, FALSE);
 
        reflection_methodbuilder_from_dynamic_method (&rmb, mb);
 
@@ -13145,7 +13575,11 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
                        handle_class = mono_defaults.methodhandle_class;
                } else {
                        MonoException *ex = NULL;
-                       ref = resolve_object (mb->module->image, obj, &handle_class, NULL);
+                       ref = resolve_object (mb->module->image, obj, &handle_class, NULL, error);
+                       if (!is_ok  (error)) {
+                               g_free (rmb.refs);
+                               return FALSE;
+                       }
                        if (!ref)
                                ex = mono_get_exception_type_load (NULL, NULL);
                        else if (mono_security_core_clr_enabled ())
@@ -13153,8 +13587,8 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
 
                        if (ex) {
                                g_free (rmb.refs);
-                               mono_raise_exception (ex);
-                               return;
+                               mono_error_set_exception_instance (error, ex);
+                               return FALSE;
                        }
                }
 
@@ -13163,10 +13597,10 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
        }               
 
        if (mb->owner) {
-               MonoType *owner_type = mono_reflection_type_get_handle ((MonoReflectionType*)mb->owner, &error);
-               if (!is_ok (&error)) {
+               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 */
+                       return FALSE;
                }
                klass = mono_class_from_mono_type (owner_type);
        } else {
@@ -13207,6 +13641,16 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
                domain->method_to_dyn_method = g_hash_table_new (NULL, NULL);
        g_hash_table_insert (domain->method_to_dyn_method, handle, (gpointer)(size_t)mono_gchandle_new_weakref ((MonoObject *)mb, TRUE));
        mono_domain_unlock (domain);
+
+       return TRUE;
+}
+
+void
+mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
+{
+       MonoError error;
+       (void) reflection_create_dynamic_method (mb, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 #endif /* DISABLE_REFLECTION_EMIT */
@@ -13252,23 +13696,28 @@ mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32
  * LOCKING: Take the loader lock
  */
 gpointer
-mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean valid_token, MonoClass **handle_class, MonoGenericContext *context)
+mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean valid_token, MonoClass **handle_class, MonoGenericContext *context, MonoError *error)
 {
        MonoDynamicImage *assembly = (MonoDynamicImage*)image;
        MonoObject *obj;
        MonoClass *klass;
 
+       mono_error_init (error);
+       
        obj = lookup_dyn_token (assembly, token);
        if (!obj) {
                if (valid_token)
                        g_error ("Could not find required dynamic token 0x%08x", token);
-               else
+               else {
+                       mono_error_set_execution_engine (error, "Could not find dynamic token 0x%08x", token);
                        return NULL;
+               }
        }
 
        if (!handle_class)
                handle_class = &klass;
-       return resolve_object (image, obj, handle_class, context);
+       gpointer result = resolve_object (image, obj, handle_class, context, error);
+       return result;
 }
 
 /*
@@ -13278,15 +13727,15 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean
  * dynamic types.
  */
 static void
-ensure_complete_type (MonoClass *klass)
+ensure_complete_type (MonoClass *klass, MonoError *error)
 {
-       MonoError error;
+       mono_error_init (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_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, error);
+               return_if_nok (error);
 
                // Asserting here could break a lot of code
                //g_assert (klass->wastypebuilder);
@@ -13297,32 +13746,36 @@ ensure_complete_type (MonoClass *klass)
                int i;
 
                for (i = 0; i < inst->type_argc; ++i) {
-                       ensure_complete_type (mono_class_from_mono_type (inst->type_argv [i]));
+                       ensure_complete_type (mono_class_from_mono_type (inst->type_argv [i]), error);
+                       return_if_nok (error);
                }
        }
 }
 
 static gpointer
-resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, MonoGenericContext *context)
+resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, MonoGenericContext *context, MonoError *error)
 {
-       MonoError error;
        gpointer result = NULL;
 
+       mono_error_init (error);
+
        if (strcmp (obj->vtable->klass->name, "String") == 0) {
-               result = mono_string_intern_checked ((MonoString*)obj, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               result = mono_string_intern_checked ((MonoString*)obj, error);
+               return_val_if_nok (error, NULL);
                *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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, error);
+               return_val_if_nok (error, NULL);
                MonoClass *mc = mono_class_from_mono_type (type);
-               if (!mono_class_init (mc))
-                       mono_raise_exception (mono_class_get_exception_for_failure (mc));
+               if (!mono_class_init (mc)) {
+                       mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (mc));
+                       return NULL;
+               }
 
                if (context) {
-                       MonoType *inflated = mono_class_inflate_generic_type_checked (type, context, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *inflated = mono_class_inflate_generic_type_checked (type, context, error);
+                       return_val_if_nok (error, NULL);
 
                        result = mono_class_from_mono_type (inflated);
                        mono_metadata_free_type (inflated);
@@ -13337,9 +13790,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                   strcmp (obj->vtable->klass->name, "MonoGenericMethod") == 0) {
                result = ((MonoReflectionMethod*)obj)->method;
                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 */
+                       result = mono_class_inflate_generic_method_checked ((MonoMethod *)result, context, error);
+                       mono_error_assert_ok (error);
                }
                *handle_class = mono_defaults.methodhandle_class;
                g_assert (result);
@@ -13350,8 +13802,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_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, error);
+                       return_val_if_nok (error, NULL);
 
                        /*
                         * Hopefully this has been filled in by calling CreateType() on the
@@ -13364,9 +13816,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                        result = mb->mhandle;
                }
                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 */
+                       result = mono_class_inflate_generic_method_checked ((MonoMethod *)result, context, error);
+                       mono_error_assert_ok (error);
                }
                *handle_class = mono_defaults.methodhandle_class;
        } else if (strcmp (obj->vtable->klass->name, "ConstructorBuilder") == 0) {
@@ -13376,23 +13827,24 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                if (!result) {
                        MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)cb->type;
 
-                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, error);
+                       return_val_if_nok (error, NULL);
                        result = cb->mhandle;
                }
                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 */
+                       result = mono_class_inflate_generic_method_checked ((MonoMethod *)result, context, error);
+                       mono_error_assert_ok (error);
                }
                *handle_class = mono_defaults.methodhandle_class;
        } else if (strcmp (obj->vtable->klass->name, "MonoField") == 0) {
                MonoClassField *field = ((MonoReflectionField*)obj)->field;
 
-               ensure_complete_type (field->parent);
+               ensure_complete_type (field->parent, error);
+               return_val_if_nok (error, NULL);
+
                if (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 */
+                       MonoType *inflated = mono_class_inflate_generic_type_checked (&field->parent->byval_arg, context, error);
+                       return_val_if_nok (error, NULL);
 
                        MonoClass *klass = mono_class_from_mono_type (inflated);
                        MonoClassField *inflated_field;
@@ -13416,15 +13868,15 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                if (!result) {
                        MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)fb->typeb;
 
-                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, error);
+                       return_val_if_nok (error, NULL);
                        result = fb->handle;
                }
 
                if (fb->handle && fb->handle->parent->generic_container) {
                        MonoClass *klass = fb->handle->parent;
-                       MonoType *type = mono_class_inflate_generic_type_checked (&klass->byval_arg, context, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *type = mono_class_inflate_generic_type_checked (&klass->byval_arg, context, error);
+                       return_val_if_nok (error, NULL);
 
                        MonoClass *inflated = mono_class_from_mono_type (type);
 
@@ -13435,8 +13887,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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
+               return_val_if_nok (error, NULL);
                MonoClass *klass;
 
                klass = type->data.klass;
@@ -13445,8 +13897,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                        result = klass;
                }
                else {
-                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       mono_domain_try_type_resolve_checked (mono_domain_get (), NULL, (MonoObject*)tb, error);
+                       return_val_if_nok (error, NULL);
                        result = type->data.klass;
                        g_assert (result);
                }
@@ -13478,8 +13930,11 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                /* 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, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       sig->params [i] = mono_type_array_get_and_resolve (helper->arguments, i, error);
+                       if (!is_ok (error)) {
+                               image_g_free (image, sig);
+                               return NULL;
+                       }
                }
 
                result = sig;
@@ -13491,20 +13946,20 @@ 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, &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 */
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, error);
+               return_val_if_nok (error, NULL);
+               type = mono_class_inflate_generic_type_checked (type, context, error);
+               return_val_if_nok (error, NULL);
 
                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, &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 */
+               MonoType *type = mono_reflection_type_get_handle ((MonoReflectionType*)obj, error);
+               return_val_if_nok (error, NULL);
+               type = mono_class_inflate_generic_type_checked (type, context, error);
+               return_val_if_nok (error, NULL);
 
                result = mono_class_from_mono_type (type);
                *handle_class = mono_defaults.typehandle_class;
@@ -13523,24 +13978,29 @@ 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)));
 
-               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 */
+               MonoType *finst = mono_reflection_type_get_handle ((MonoReflectionType*)f->inst, error);
+               return_val_if_nok (error, NULL);
+               type = mono_class_inflate_generic_type_checked (finst, context, error);
+               return_val_if_nok (error, NULL);
 
                inflated = mono_class_from_mono_type (type);
 
                result = field = mono_class_get_field_from_name (inflated, mono_field_get_name (field));
-               ensure_complete_type (field->parent);
+               ensure_complete_type (field->parent, error);
+               if (!is_ok (error)) {
+                       mono_metadata_free_type (type);
+                       return NULL;
+               }
+
                g_assert (result);
                mono_metadata_free_type (type);
                *handle_class = mono_defaults.fieldhandle_class;
        } else if (strcmp (obj->vtable->klass->name, "ConstructorOnTypeBuilderInst") == 0) {
                MonoReflectionCtorOnTypeBuilderInst *c = (MonoReflectionCtorOnTypeBuilderInst*)obj;
-               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 */
+               MonoType *cinst = mono_reflection_type_get_handle ((MonoReflectionType*)c->inst, error);
+               return_val_if_nok (error, NULL);
+               MonoType *type = mono_class_inflate_generic_type_checked (cinst, context, error);
+               return_val_if_nok (error, NULL);
 
                MonoClass *inflated_klass = mono_class_from_mono_type (type);
                MonoMethod *method;
@@ -13558,17 +14018,17 @@ 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, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       result = mono_reflection_method_on_tb_inst_get_handle (m, error);
+                       return_val_if_nok (error, NULL);
                        if (context) {
-                               result = mono_class_inflate_generic_method_checked ((MonoMethod *)result, context, &error);
-                               mono_error_assert_ok (&error);
+                               result = mono_class_inflate_generic_method_checked ((MonoMethod *)result, context, error);
+                               mono_error_assert_ok (error);
                        }
                } else {
-                       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 */
+                       MonoType *minst = mono_reflection_type_get_handle ((MonoReflectionType*)m->inst, error);
+                       return_val_if_nok (error, NULL);
+                       MonoType *type = mono_class_inflate_generic_type_checked (minst, context, error);
+                       return_val_if_nok (error, NULL);
 
                        MonoClass *inflated_klass = mono_class_from_mono_type (type);
                        MonoMethod *method;
@@ -13592,8 +14052,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
                gpointer iter;
                char *name;
 
-               mtype = mono_reflection_type_get_handle (m->parent, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               mtype = mono_reflection_type_get_handle (m->parent, error);
+               return_val_if_nok (error, NULL);
                klass = mono_class_from_mono_type (mtype);
 
                /* Find the method */
@@ -13616,12 +14076,12 @@ 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, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoType *type = mono_reflection_type_get_handle (ref_type, error);
+               return_val_if_nok (error, NULL);
 
                if (context) {
-                       MonoType *inflated = mono_class_inflate_generic_type_checked (type, context, &error);
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+                       MonoType *inflated = mono_class_inflate_generic_type_checked (type, context, error);
+                       return_val_if_nok (error, NULL);
 
                        result = mono_class_from_mono_type (inflated);
                        mono_metadata_free_type (inflated);
@@ -13688,7 +14148,7 @@ mono_image_set_wrappers_type (MonoReflectionModuleBuilder *moduleb, MonoReflecti
 }
 
 MonoReflectionModule *
-mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName)
+mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName, MonoError *error)
 {
        g_assert_not_reached ();
        return NULL;
@@ -13728,8 +14188,9 @@ mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, Mono
 }
 
 void
-mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides)
+mono_reflection_get_dynamic_overrides (MonoClass *klass, MonoMethod ***overrides, int *num_overrides, MonoError *error)
 {
+       mono_error_init (error);
        *overrides = NULL;
        *num_overrides = 0;
 }
@@ -13780,8 +14241,9 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean
 }
 
 MonoType*
-mono_reflection_type_get_handle (MonoReflectionType* ref)
+mono_reflection_type_get_handle (MonoReflectionType* ref, MonoError *error)
 {
+       mono_error_init (error);
        if (!ref)
                return NULL;
        return ref->type;
@@ -14221,13 +14683,14 @@ mono_declsec_get_assembly_action (MonoAssembly *assembly, guint32 action, MonoDe
 }
 
 gboolean
-mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass)
+mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass, MonoError *error)
 {
-       MonoError error;
        MonoObject *res, *exc;
        void *params [1];
        static MonoMethod *method = NULL;
 
+       mono_error_init (error);
+
        if (method == NULL) {
                method = mono_class_get_method_from_name (mono_class_get_type_builder_class (), "IsAssignableTo", 1);
                g_assert (method);
@@ -14240,13 +14703,13 @@ mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass)
        g_assert (mono_class_get_ref_info (klass));
        g_assert (!strcmp (((MonoObject*)(mono_class_get_ref_info (klass)))->vtable->klass->name, "TypeBuilder"));
 
-       params [0] = mono_type_get_object_checked (mono_domain_get (), &oklass->byval_arg, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       params [0] = mono_type_get_object_checked (mono_domain_get (), &oklass->byval_arg, error);
+       return_val_if_nok (error, FALSE);
 
-       res = mono_runtime_try_invoke (method, (MonoObject*)(mono_class_get_ref_info (klass)), params, &exc, &error);
+       res = mono_runtime_try_invoke (method, (MonoObject*)(mono_class_get_ref_info (klass)), params, &exc, error);
 
-       if (exc || !mono_error_ok (&error)) {
-               mono_error_cleanup (&error);
+       if (exc || !mono_error_ok (error)) {
+               mono_error_cleanup (error);
                return FALSE;
        } else
                return *(MonoBoolean*)mono_object_unbox (res);