[SRE] Use MonoError for mono_reflection_bind_generic_parameters
[mono.git] / mono / metadata / reflection.c
index ed56fff01712d530d3bdf980b46910e9857f349e..a6ec21dbd55566c9c6fc90d1712f0b09fc5aa896 100644 (file)
@@ -149,7 +149,7 @@ 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 guint32 mono_image_get_methodref_token_for_methodbuilder (MonoDynamicImage *assembly, MonoReflectionMethodBuilder *method, MonoError *error);
@@ -157,7 +157,7 @@ static guint32 encode_generic_method_sig (MonoDynamicImage *assembly, MonoGeneri
 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);
@@ -169,7 +169,7 @@ 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);
@@ -2348,11 +2348,12 @@ mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *ass
 }
 
 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;
@@ -2370,30 +2371,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;
        }
 
@@ -2402,15 +2403,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;
@@ -2429,7 +2431,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 ++;
@@ -2467,11 +2471,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;
@@ -2489,8 +2492,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);
 
        /*
@@ -2528,11 +2531,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;
@@ -2550,8 +2554,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);
        }
@@ -2563,8 +2567,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);
@@ -2623,7 +2627,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;
 }
@@ -2958,9 +2963,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);
 
@@ -3108,9 +3114,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);
@@ -3196,9 +3203,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;
@@ -3210,23 +3216,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);
@@ -3520,9 +3526,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;
@@ -3536,8 +3541,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;
@@ -3561,8 +3566,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);
        }
@@ -3581,18 +3587,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);
@@ -3610,8 +3620,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 ++;
@@ -3619,8 +3630,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 ++;
@@ -3628,6 +3640,9 @@ add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *mod
        }
 
        return t;
+fail:
+       g_free (t);
+       return NULL;
 }
 
 static void
@@ -3644,40 +3659,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;
@@ -3685,6 +3703,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;
@@ -3701,13 +3721,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;
 
@@ -3740,8 +3761,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;
@@ -3753,12 +3774,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);
@@ -3767,17 +3788,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 ++;
@@ -3785,8 +3807,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;
 }
 
@@ -3812,17 +3835,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;
@@ -3830,19 +3853,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 && 
@@ -3863,6 +3890,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;
+
 }
 
 /*
@@ -3983,9 +4016,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];
@@ -3997,9 +4032,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 */
@@ -4284,14 +4321,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);
 
@@ -4305,8 +4344,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);
+               }
        }
 }
 
@@ -5031,7 +5072,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;
@@ -5041,6 +5082,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);
@@ -5072,7 +5115,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);
                                }
                        }
                }
@@ -5141,7 +5185,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];
@@ -5520,7 +5565,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;
@@ -5605,10 +5651,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);
@@ -5616,7 +5664,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);
@@ -6619,10 +6668,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;
@@ -6631,17 +6678,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);
@@ -6669,12 +6717,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 */
@@ -7507,6 +7554,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;
        
@@ -7517,8 +7565,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;
 }
 
@@ -7547,11 +7595,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;
@@ -7566,7 +7613,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;
@@ -7582,12 +7629,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;
 
@@ -7599,7 +7646,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);
@@ -7608,17 +7655,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;
 
@@ -7659,7 +7706,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) {
@@ -7673,7 +7723,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);
@@ -7696,7 +7746,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);
 }
@@ -7704,7 +7755,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;
 }
 
 /*
@@ -7718,18 +7772,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 new 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_exception_instance (error, mono_get_exception_invalid_operation (NULL));
+               return NULL;
+       }
 
        CHECK_OBJECT (MonoReflectionMethodBody *, method, NULL);
 
@@ -7741,8 +7816,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 */
@@ -7766,8 +7841,8 @@ 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);
+       return_val_if_nok (error, NULL);
 
        ret->init_locals = header->init_locals;
        ret->max_stack = header->max_stack;
@@ -7778,11 +7853,11 @@ 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);
+               return_val_if_nok (error, NULL);
 
-               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);
+               return_val_if_nok (error, NULL);
 
                MONO_OBJECT_SETREF (info, local_type, rt);
 
@@ -7794,8 +7869,8 @@ 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);
+               return_val_if_nok (error, NULL);
                MonoExceptionClause *clause = &header->clauses [i];
 
                info->flags = clause->flags;
@@ -7806,8 +7881,8 @@ 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);
+                       return_val_if_nok (error, NULL);
 
                        MONO_OBJECT_SETREF (info, catch_type, rt);
                }
@@ -7831,6 +7906,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;
        
@@ -7840,8 +7916,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;
 }
 
@@ -7913,21 +7989,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);
@@ -8348,12 +8425,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))
@@ -8373,10 +8452,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;
@@ -8479,7 +8559,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;
@@ -8491,7 +8571,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)
@@ -8529,9 +8609,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)
 {
@@ -8574,21 +8675,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;
@@ -8611,20 +8712,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;
 }
 
@@ -8661,17 +8764,43 @@ mono_reflection_free_type_info (MonoTypeNameParse *info)
  */
 MonoType*
 mono_reflection_type_from_name (char *name, MonoImage *image)
+{
+       MonoError error;
+       MonoType  *result = mono_reflection_type_from_name_checked (name, image, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
+
+/**
+ * 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);
+               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);
@@ -8689,9 +8818,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) {
@@ -8710,11 +8857,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 ||
@@ -8740,7 +8889,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);
@@ -8765,10 +8914,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_generic_error (error, "System", "NotImplementedException",
+                                             "MetadataToken is not supported for type '%s.%s'", klass->name_space, klass->name);
+               return 0;
        }
 
        return token;
@@ -8785,11 +8933,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);
@@ -8890,11 +9040,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);
@@ -8943,11 +9095,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);
@@ -10509,7 +10663,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;
@@ -10561,19 +10715,23 @@ mono_reflection_register_with_runtime (MonoReflectionType *type)
  * 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;
 }
@@ -10582,10 +10740,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;
@@ -10595,15 +10756,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;
        }
@@ -10612,15 +10778,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;
        }
@@ -10629,15 +10800,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);
@@ -10649,15 +10819,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));
@@ -10760,7 +10929,8 @@ mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *er
 
        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
@@ -10771,13 +10941,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;
@@ -10856,8 +11027,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) {
@@ -10900,19 +11072,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;
@@ -10952,7 +11127,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;
@@ -11017,9 +11193,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);
@@ -11049,7 +11228,8 @@ 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;
 }
@@ -11070,15 +11250,22 @@ 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 = 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);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
        } else {
                sig = mono_method_signature (((MonoReflectionMethod*)ctor)->method);
        }
@@ -11091,7 +11278,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)
@@ -11107,10 +11295,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);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        *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;
                }
        }
 
@@ -11121,10 +11311,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);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
                        *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;
                }
        }
 
@@ -11133,9 +11325,11 @@ 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);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        return result;
 }
 
@@ -11471,7 +11665,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)
@@ -11769,8 +11965,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;
@@ -11796,8 +11994,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;
@@ -11834,8 +12034,12 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder*
                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);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
                field->type = mono_metadata_type_dup (klass->image, custom);
                g_free (custom);
        } else {
@@ -11856,15 +12060,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))) {
@@ -11885,12 +12100,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;
        }
 
@@ -13120,7 +13339,9 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
                mono_loader_unlock ();
        }
 
-       sig = dynamic_method_to_signature (mb);
+       sig = dynamic_method_to_signature (mb, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
 
        reflection_methodbuilder_from_dynamic_method (&rmb, mb);
 
@@ -13701,7 +13922,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;
@@ -13793,8 +14014,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;