From: monojenkins Date: Thu, 7 Apr 2016 19:06:02 +0000 (+0100) Subject: Merge pull request #2824 from lambdageek/dev/monoerror-icalls-noraise X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=1af57bfcb6d04d43043a122a92e4c6d880f9acf0;hp=-c;p=mono.git Merge pull request #2824 from lambdageek/dev/monoerror-icalls-noraise [runtime] Set pending exception in icalls instead of raising. --- 1af57bfcb6d04d43043a122a92e4c6d880f9acf0 diff --combined mono/metadata/icall.c index e7d749c6ab9,8e2fbdf3b65..e1572c3f559 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@@ -565,7 -565,8 +565,8 @@@ ves_icall_System_Array_CreateInstanceIm klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0)) /* vectors are not the same as one dimensional arrays with no-zero bounds */ @@@ -616,7 -617,8 +617,8 @@@ ves_icall_System_Array_CreateInstanceIm klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint64, 0) != 0)) /* vectors are not the same as one dimensional arrays with no-zero bounds */ @@@ -1189,8 -1191,7 +1191,7 @@@ ves_icall_System_Object_GetType (MonoOb #endif ret = mono_type_get_object_checked (mono_object_domain (obj), &obj->vtable->klass->byval_arg, &error); - mono_error_raise_exception (&error); - + mono_error_set_pending_exception (&error); return ret; } @@@ -1208,7 -1209,7 +1209,7 @@@ ves_icall_ModuleBuilder_getToken (MonoR MonoError error; gint32 result = mono_image_create_token (mb->dynamic_image, obj, create_open_instance, TRUE, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return result; } @@@ -1222,7 -1223,7 +1223,7 @@@ ves_icall_ModuleBuilder_getMethodToken MonoError error; gint32 result = mono_image_create_method_token ( mb->dynamic_image, (MonoObject *) method, opt_param_types, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return result; } @@@ -1231,15 -1232,15 +1232,15 @@@ ves_icall_ModuleBuilder_WriteToFile (Mo { MonoError error; mono_image_create_pefile (mb, file, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); } ICALL_EXPORT void ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb) { MonoError error; - if (!mono_image_build_metadata (mb, &error)) - mono_error_raise_exception (&error); + mono_image_build_metadata (mb, &error); + mono_error_set_pending_exception (&error); } ICALL_EXPORT void @@@ -1279,7 -1280,7 +1280,7 @@@ ves_icall_System_Reflection_Emit_Custom } static gboolean -get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) +get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) { MonoMethod **dest = (MonoMethod **)data; @@@ -1287,9 -1288,11 +1288,9 @@@ if (!managed) return FALSE; - if (m == *dest) { - *dest = NULL; - return FALSE; - } if (!(*dest)) { + if (!strcmp (m->klass->name_space, "System.Reflection")) + return FALSE; *dest = m; return TRUE; } @@@ -1297,7 -1300,7 +1298,7 @@@ } static gboolean -get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) +get_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) { MonoMethod **dest = (MonoMethod **)data; @@@ -1305,18 -1308,9 +1306,18 @@@ if (!managed) return FALSE; + if (m->wrapper_type != MONO_WRAPPER_NONE) + return FALSE; + + if (m == *dest) { + *dest = NULL; + return FALSE; + } + + if (m->klass->image == mono_defaults.corlib && !strcmp (m->klass->name_space, "System.Reflection")) + return FALSE; + if (!(*dest)) { - if (!strcmp (m->klass->name_space, "System.Reflection")) - return FALSE; *dest = m; return TRUE; } @@@ -1324,7 -1318,7 +1325,7 @@@ } static gboolean -get_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) +get_caller_no_system_or_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) { MonoMethod **dest = (MonoMethod **)data; @@@ -1335,15 -1329,13 +1336,15 @@@ if (m->wrapper_type != MONO_WRAPPER_NONE) return FALSE; - if (m->klass->image == mono_defaults.corlib && !strcmp (m->klass->name_space, "System.Reflection")) - return FALSE; - if (m == *dest) { *dest = NULL; return FALSE; } + + if (m->klass->image == mono_defaults.corlib && ((!strcmp (m->klass->name_space, "System.Reflection")) + || (!strcmp (m->klass->name_space, "System")))) + return FALSE; + if (!(*dest)) { *dest = m; return TRUE; @@@ -1359,7 -1351,6 +1360,7 @@@ type_from_parsed_name (MonoTypeNamePars MonoType *type = NULL; MonoAssembly *assembly = NULL; gboolean type_resolve = FALSE; + MonoImage *rootimage = NULL; mono_error_init (error); @@@ -1370,23 -1361,10 +1371,23 @@@ */ m = mono_method_get_last_managed (); dest = m; - - mono_stack_walk_no_il (get_caller_no_reflection, &dest); - if (!dest) - dest = m; + if (m && m->klass->image != mono_defaults.corlib) { + /* Happens with inlining */ + } else { + /* Ugly hack: type_from_parsed_name is called from + * System.Type.internal_from_name, which is called most + * directly from System.Type.GetType(string,bool,bool) but + * also indirectly from places such as + * System.Type.GetType(string,func,func) (via + * System.TypeNameParser.GetType and System.TypeSpec.Resolve) + * so we need to skip over all of those to find the true caller. + * + * It would be nice if we had stack marks. + */ + mono_stack_walk_no_il (get_caller_no_system_or_reflection, &dest); + if (!dest) + dest = m; + } /* * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus @@@ -1399,7 -1377,6 +1400,7 @@@ if (dest) { assembly = dest->klass->image->assembly; type_resolve = TRUE; + rootimage = assembly->image; } else { g_warning (G_STRLOC); } @@@ -1407,28 -1384,21 +1408,28 @@@ if (info->assembly.name) assembly = mono_assembly_load (&info->assembly, assembly ? assembly->basedir : NULL, NULL); - if (assembly) { /* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */ - type = mono_reflection_get_type_checked (assembly->image, info, ignoreCase, &type_resolve, error); + type = mono_reflection_get_type_checked (rootimage, assembly->image, info, ignoreCase, &type_resolve, error); return_val_if_nok (error, NULL); } + // XXXX - aleksey - + // Say we're looking for System.Generic.Dict + // we FAIL the get type above, because S.G.Dict isn't in assembly->image. So we drop down here. + // but then we FAIL AGAIN because now we pass null as the image and the rootimage and everything + // is messed up when we go to construct the Local as the type arg... + // + // By contrast, if we started with Mine> we'd go in with assembly->image + // as the root and then even the detour into generics would still not screw us when we went to load Local. if (!info->assembly.name && !type) { /* try mscorlib */ - type = mono_reflection_get_type_checked (NULL, info, ignoreCase, &type_resolve, error); + type = mono_reflection_get_type_checked (rootimage, NULL, info, ignoreCase, &type_resolve, error); return_val_if_nok (error, NULL); } if (assembly && !type && type_resolve) { type_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */ - type = mono_reflection_get_type_checked (assembly->image, info, ignoreCase, &type_resolve, error); + type = mono_reflection_get_type_checked (rootimage, assembly->image, info, ignoreCase, &type_resolve, error); return_val_if_nok (error, NULL); } @@@ -1454,12 -1424,10 +1455,12 @@@ ves_icall_System_Type_internal_from_nam /* mono_reflection_parse_type() mangles the string */ if (!parsedOk) { mono_reflection_free_type_info (&info); - g_free (str); if (throwOnError) { - mono_set_pending_exception (mono_get_exception_argument("typeName", "failed parse")); + mono_error_init (&error); + mono_error_set_argument (&error, "typeName", "failed parse: %s", str); + mono_error_set_pending_exception (&error); } + g_free (str); return NULL; } @@@ -1482,6 -1450,7 +1483,6 @@@ if (throwOnError) e = mono_get_exception_type_load (name, NULL); - mono_loader_clear_error (); if (e) { mono_set_pending_exception (e); return NULL; @@@ -1500,7 -1469,7 +1501,7 @@@ ves_icall_System_Type_internal_from_han MonoDomain *domain = mono_domain_get (); ret = mono_type_get_object_checked (domain, handle, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -1752,7 -1721,7 +1753,7 @@@ ves_icall_System_Reflection_FieldInfo_i } MonoReflectionField *result = mono_field_get_object_checked (mono_domain_get (), klass, handle, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return result; } @@@ -1769,7 -1738,7 +1770,7 @@@ ves_icall_System_Reflection_FieldInfo_G } res = type_array_from_modifiers (field->field->parent->image, type, optional, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } @@@ -1882,7 -1851,7 +1883,7 @@@ ves_icall_MonoField_GetParentType (Mono parent = declaring? field->field->parent: field->klass; ret = mono_type_get_object_checked (mono_object_domain (field), &parent->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; @@@ -2176,13 -2145,15 +2177,15 @@@ ves_icall_MonoPropertyInfo_get_property if ((req_info & PInfo_ReflectedType) != 0) { rt = mono_type_get_object_checked (domain, &property->klass->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; MONO_STRUCT_SETREF (info, parent, rt); } if ((req_info & PInfo_DeclaringType) != 0) { rt = mono_type_get_object_checked (domain, &pproperty->parent->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; MONO_STRUCT_SETREF (info, declaring_type, rt); } @@@ -2198,7 -2169,8 +2201,8 @@@ (((pproperty->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) || pproperty->get->klass == property->klass)) { rm = mono_method_get_object_checked (domain, pproperty->get, property->klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; } else { rm = NULL; } @@@ -2210,7 -2182,8 +2214,8 @@@ (((pproperty->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) != METHOD_ATTRIBUTE_PRIVATE) || pproperty->set->klass == property->klass)) { rm = mono_method_get_object_checked (domain, pproperty->set, property->klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; } else { rm = NULL; } @@@ -2232,12 -2205,14 +2237,14 @@@ ves_icall_MonoEventInfo_get_event_info MonoDomain *domain = mono_object_domain (event); rt = mono_type_get_object_checked (domain, &event->klass->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; MONO_STRUCT_SETREF (info, reflected_type, rt); rt = mono_type_get_object_checked (domain, &event->event->parent->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; MONO_STRUCT_SETREF (info, declaring_type, rt); @@@ -2246,7 -2221,8 +2253,8 @@@ if (event->event->add) { rm = mono_method_get_object_checked (domain, event->event->add, NULL, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; } else { rm = NULL; } @@@ -2255,7 -2231,8 +2263,8 @@@ if (event->event->remove) { rm = mono_method_get_object_checked (domain, event->event->remove, NULL, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; } else { rm = NULL; } @@@ -2264,7 -2241,8 +2273,8 @@@ if (event->event->raise) { rm = mono_method_get_object_checked (domain, event->event->raise, NULL, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; } else { rm = NULL; } @@@ -2280,7 -2258,8 +2290,8 @@@ for (i = 0; i < n; i++) { rm = mono_method_get_object_checked (domain, event->event->other [i], NULL, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; mono_array_setref (info->other_methods, i, rm); } } @@@ -2414,9 -2393,11 +2425,11 @@@ ves_icall_Type_GetInterfaceMapData (Mon MonoError error; mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; mono_class_init_checked (iclass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; mono_class_setup_vtable (klass); @@@ -2431,10 -2412,12 +2444,12 @@@ iter = NULL; while ((method = mono_class_get_methods (iclass, &iter))) { member = mono_method_get_object_checked (domain, method, iclass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; mono_array_setref (*methods, i, member); member = mono_method_get_object_checked (domain, klass->vtable [i + ioffset], klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; mono_array_setref (*targets, i, member); i ++; @@@ -2448,7 -2431,8 +2463,8 @@@ ves_icall_Type_GetPacking (MonoReflecti MonoClass *klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; if (image_is_dynamic (klass->image)) { MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder*)type; @@@ -2468,14 -2452,15 +2484,15 @@@ ves_icall_RuntimeTypeHandle_GetElementT if (!type->type->byref && type->type->type == MONO_TYPE_SZARRAY) { ret = mono_type_get_object_checked (mono_object_domain (type), &type->type->data.klass->byval_arg, &error); - mono_error_raise_exception (&error); - + mono_error_set_pending_exception (&error); return ret; } klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + // GetElementType should only return a type for: // Array Pointer PassedByRef @@@ -2488,7 -2473,7 +2505,7 @@@ else return NULL; - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -2507,7 -2492,7 +2524,7 @@@ ves_icall_RuntimeTypeHandle_GetBaseTyp return NULL; ret = mono_type_get_object_checked (mono_object_domain (type), &klass->parent->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -2536,7 -2521,8 +2553,8 @@@ ves_icall_RuntimeTypeHandle_IsComObjec MonoError error; MonoClass *klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return FALSE; return mono_class_is_com_object (klass); } @@@ -2557,8 -2543,7 +2575,7 @@@ ves_icall_RuntimeTypeHandle_GetModule ( MonoReflectionModule *result = NULL; MonoClass *klass = mono_class_from_mono_type (type->type); result = mono_module_get_object_checked (mono_object_domain (type), klass->image, &error); - if (!mono_error_ok (&error)) - mono_error_set_pending_exception (&error); + mono_error_set_pending_exception (&error); return result; } @@@ -2569,8 -2554,7 +2586,7 @@@ ves_icall_RuntimeTypeHandle_GetAssembl MonoDomain *domain = mono_domain_get (); MonoClass *klass = mono_class_from_mono_type (type->type); MonoReflectionAssembly *result = mono_assembly_get_object_checked (domain, klass->image->assembly, &error); - if (!result) - mono_error_set_pending_exception (&error); + mono_error_set_pending_exception (&error); return result; } @@@ -2598,7 -2582,7 +2614,7 @@@ ves_icall_MonoType_get_DeclaringType (M return NULL; ret = mono_type_get_object_checked (domain, &klass->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -2678,7 -2662,8 +2694,8 @@@ ves_icall_MonoType_GetGenericArguments pklass = mono_class_from_generic_parameter_internal (mono_generic_container_get_param (container, i)); rt = mono_type_get_object_checked (domain, &pklass->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, i, rt); } @@@ -2687,7 -2672,8 +2704,8 @@@ res = create_type_array (domain, runtimeTypeArray, inst->type_argc); for (i = 0; i < inst->type_argc; ++i) { rt = mono_type_get_object_checked (domain, inst->type_argv [i], &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, i, rt); } @@@ -2737,7 -2723,7 +2755,7 @@@ ves_icall_RuntimeTypeHandle_GetGenericT return (MonoReflectionType *)tb; else { ret = mono_type_get_object_checked (mono_object_domain (type), &generic_class->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -2756,7 -2742,8 +2774,8 @@@ ves_icall_Type_MakeGenericType (MonoRef g_assert (IS_MONOTYPE (type)); mono_class_init_checked (mono_class_from_mono_type (type->type), &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; count = mono_array_length (type_array); types = g_new0 (MonoType *, count); @@@ -2782,7 -2769,7 +2801,7 @@@ } ret = mono_type_get_object_checked (mono_object_domain (type), geninst, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -2842,7 -2829,8 +2861,8 @@@ ves_icall_Type_GetGenericParameterConst res = mono_array_new (domain, mono_defaults.monotype_class, count); for (i = 0; i < count; i++) { rt = mono_type_get_object_checked (domain, ¶m_info->constraints [i]->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, i, rt); } @@@ -2885,13 -2873,15 +2905,15 @@@ ves_icall_MonoType_GetCorrespondingInfl klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { if (method->token == generic->method->token) { ret = mono_method_get_object_checked (domain, method, klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; } } @@@ -3065,7 -3055,8 +3087,8 @@@ ves_icall_MonoMethod_GetGenericArgument for (i = 0; i < count; i++) { rt = mono_type_get_object_checked (domain, inst->type_argv [i], &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, i, rt); } @@@ -3083,7 -3074,8 +3106,8 @@@ MonoClass *pklass = mono_class_from_generic_parameter_internal (param); rt = mono_type_get_object_checked (domain, &pklass->byval_arg, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, i, rt); } @@@ -3438,12 -3430,14 +3462,14 @@@ ves_icall_System_Enum_ToObject (MonoRef enumc = mono_class_from_mono_type (enumType->type); mono_class_init_checked (enumc, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; etype = mono_class_enum_basetype (enumc); res = mono_object_new_checked (domain, enumc, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; write_enum_value ((char *)res + sizeof (MonoObject), etype->type, value); return res; @@@ -3478,7 -3472,8 +3504,8 @@@ ves_icall_System_Enum_get_value (MonoOb enumc = mono_class_from_mono_type (mono_class_enum_basetype (eobj->vtable->klass)); res = mono_object_new_checked (mono_object_domain (eobj), enumc, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; dst = (char *)res + sizeof (MonoObject); src = (char *)eobj + sizeof (MonoObject); size = mono_class_value_size (enumc, NULL); @@@ -3498,7 -3493,8 +3525,8 @@@ ves_icall_System_Enum_get_underlying_ty klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; etype = mono_class_enum_basetype (klass); if (!etype) { @@@ -3507,7 -3503,7 +3535,7 @@@ } ret = mono_type_get_object_checked (mono_object_domain (type), etype, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -3611,7 -3607,9 +3639,9 @@@ ves_icall_System_Enum_GetEnumValuesAndN gboolean sorted = TRUE; mono_class_init_checked (enumc, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return FALSE; + if (!enumc->enumtype) { mono_set_pending_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum.")); @@@ -3763,8 -3761,8 +3793,8 @@@ handle_parent return res; fail: mono_ptr_array_destroy (tmp_array); - mono_error_raise_exception (&error); - g_assert_not_reached (); + mono_error_set_pending_exception (&error); + return NULL; } static gboolean @@@ -3805,7 -3803,8 +3835,7 @@@ mono_class_get_methods_by_name (MonoCla /* An optimization for calls made from Delegate:CreateDelegate () */ if (klass->delegate && name && !strcmp (name, "Invoke") && (bflags == (BFLAGS_Public | BFLAGS_Static | BFLAGS_Instance))) { method = mono_get_delegate_invoke (klass); - if (mono_loader_get_last_error ()) - goto loader_error; + g_assert (method); g_ptr_array_add (array, method); return array; @@@ -3813,7 -3812,7 +3843,7 @@@ mono_class_setup_methods (klass); mono_class_setup_vtable (klass); - if (mono_class_has_failure (klass) || mono_loader_get_last_error ()) + if (mono_class_has_failure (klass)) goto loader_error; if (is_generic_parameter (&klass->byval_arg)) @@@ -3829,7 -3828,7 +3859,7 @@@ handle_parent: mono_class_setup_methods (klass); mono_class_setup_vtable (klass); - if (mono_class_has_failure (klass) || mono_loader_get_last_error ()) + if (mono_class_has_failure (klass)) goto loader_error; iter = NULL; @@@ -3889,7 -3888,8 +3919,7 @@@ loader_error if (mono_class_has_failure (klass)) { *ex = mono_class_get_exception_for_failure (klass); } else { - *ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ()); - mono_loader_clear_error (); + *ex = mono_get_exception_execution_engine ("Unknown error"); } return NULL; } @@@ -4127,7 -4127,7 +4157,7 @@@ ves_icall_Type_GetPropertiesByName (Mon handle_parent: mono_class_setup_methods (klass); mono_class_setup_vtable (klass); - if (mono_class_has_failure (klass) || mono_loader_get_last_error ()) + if (mono_class_has_failure (klass)) goto loader_error; iter = NULL; @@@ -4200,6 -4200,9 +4230,6 @@@ loader_error: if (mono_class_has_failure (klass)) { mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass)); - } else { - mono_error_set_from_loader_error (&error); - mono_loader_clear_error (); } failure: @@@ -4258,7 -4261,7 +4288,7 @@@ ves_icall_Type_GetEvents_internal (Mono handle_parent: mono_class_setup_methods (klass); mono_class_setup_vtable (klass); - if (mono_class_has_failure (klass) || mono_loader_get_last_error ()) + if (mono_class_has_failure (klass)) goto loader_error; iter = NULL; @@@ -4341,6 -4344,9 +4371,6 @@@ loader_error: if (mono_class_has_failure (klass)) { mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass)); - } else { - mono_error_set_from_loader_error (&error); - mono_loader_clear_error (); } failure: @@@ -4363,13 -4369,15 +4393,15 @@@ ves_icall_Type_GetNestedTypes (MonoRefl MonoReflectionType *rt; MonoDomain *domain; MonoClass *klass; - MonoArray *res; + MonoArray *res = NULL; int i, match; MonoClass *nested; gpointer iter; char *str = NULL; MonoPtrArray tmp_array; + mono_error_init (&error); + domain = ((MonoObject *)type)->vtable->domain; if (type->type->byref) return mono_array_new (domain, mono_defaults.monotype_class, 0); @@@ -4412,7 -4420,8 +4444,8 @@@ } rt = mono_type_get_object_checked (domain, &nested->byval_arg, &error); - mono_error_raise_exception (&error); + if (!is_ok (&error)) + goto leave; mono_ptr_array_append (tmp_array, (MonoObject*) rt); } @@@ -4422,10 -4431,12 +4455,12 @@@ for (i = 0; i < mono_ptr_array_size (tmp_array); ++i) mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i)); + leave: mono_ptr_array_destroy (tmp_array); g_free (str); + mono_error_set_pending_exception (&error); return res; } @@@ -4470,7 -4481,7 +4505,7 @@@ ves_icall_System_Reflection_Assembly_In if (module != NULL) { if (module->image) { - type = mono_reflection_get_type_checked (module->image, &info, ignoreCase, &type_resolve, &error); + type = mono_reflection_get_type_checked (module->image, module->image, &info, ignoreCase, &type_resolve, &error); if (!is_ok (&error)) { g_free (str); mono_reflection_free_type_info (&info); @@@ -4490,7 -4501,7 +4525,7 @@@ if (abuilder->modules) { for (i = 0; i < mono_array_length (abuilder->modules); ++i) { MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i); - type = mono_reflection_get_type_checked (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve, &error); + type = mono_reflection_get_type_checked (&mb->dynamic_image->image, &mb->dynamic_image->image, &info, ignoreCase, &type_resolve, &error); if (!is_ok (&error)) { g_free (str); mono_reflection_free_type_info (&info); @@@ -4505,7 -4516,7 +4540,7 @@@ if (!type && abuilder->loaded_modules) { for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) { MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i); - type = mono_reflection_get_type_checked (mod->image, &info, ignoreCase, &type_resolve, &error); + type = mono_reflection_get_type_checked (mod->image, mod->image, &info, ignoreCase, &type_resolve, &error); if (!is_ok (&error)) { g_free (str); mono_reflection_free_type_info (&info); @@@ -4518,7 -4529,7 +4553,7 @@@ } } else { - type = mono_reflection_get_type_checked (assembly->assembly->image, &info, ignoreCase, &type_resolve, &error); + type = mono_reflection_get_type_checked (assembly->assembly->image, assembly->assembly->image, &info, ignoreCase, &type_resolve, &error); if (!is_ok (&error)) { g_free (str); mono_reflection_free_type_info (&info); @@@ -4534,9 -4545,20 +4569,9 @@@ if (throwOnError) e = mono_get_exception_type_load (name, NULL); - if (mono_loader_get_last_error () && mono_defaults.generic_ilist_class) - e = mono_loader_error_prepare_exception (mono_loader_get_last_error ()); - - mono_loader_clear_error (); - if (e != NULL) mono_set_pending_exception (e); return NULL; - } else if (mono_loader_get_last_error ()) { - if (throwOnError) { - mono_set_pending_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); - return NULL; - } - mono_loader_clear_error (); } if (type->type == MONO_TYPE_CLASS) { @@@ -4546,6 -4568,7 +4581,6 @@@ if (throwOnError && mono_class_has_failure (klass)) { /* report SecurityException (or others) that occured when loading the assembly */ MonoException *exc = mono_class_get_exception_for_failure (klass); - mono_loader_clear_error (); mono_set_pending_exception (exc); return NULL; } @@@ -4805,7 -4828,8 +4840,8 @@@ ves_icall_System_Reflection_Assembly_Ge aname = (MonoReflectionAssemblyName *) mono_object_new_checked ( domain, mono_class_get_assembly_name_class (), &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]))); @@@ -4818,7 -4842,8 +4854,8 @@@ aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */ version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; MONO_OBJECT_SETREF (aname, version, version); @@@ -4829,7 -4854,8 +4866,8 @@@ args [1] = &assembly_ref; o = mono_runtime_invoke_checked (create_culture, NULL, args, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; MONO_OBJECT_SETREF (aname, cultureInfo, o); } @@@ -4916,7 -4942,8 +4954,8 @@@ ves_icall_System_Reflection_Assembly_Ge MonoReflectionModule *rm = mono_module_get_object_checked (mono_domain_get (), module, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_gc_wbarrier_generic_store (ref_module, (MonoObject*) rm); return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size); @@@ -5073,13 -5100,16 +5112,16 @@@ ves_icall_System_Reflection_Assembly_Ge res = mono_array_new (domain, klass, 1 + real_module_count + file_count); MonoReflectionModule *image_obj = mono_module_get_object_checked (domain, image, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + mono_array_setref (res, 0, image_obj); j = 1; for (i = 0; i < module_count; ++i) if (modules [i]) { MonoReflectionModule *rm = mono_module_get_object_checked (domain, modules[i], &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, j, rm); ++j; } @@@ -5088,7 -5118,8 +5130,8 @@@ mono_metadata_decode_row (table, i, cols, MONO_FILE_SIZE); if (cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA) { MonoReflectionModule *rm = mono_module_file_get_object_checked (domain, image, i, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, j, rm); } else { @@@ -5099,7 -5130,8 +5142,8 @@@ return NULL; } MonoReflectionModule *rm = mono_module_get_object_checked (domain, m, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_setref (res, j, rm); } } @@@ -5124,7 -5156,7 +5168,7 @@@ ves_icall_GetCurrentMethod (void m = ((MonoMethodInflated*)m)->declaring; res = mono_method_get_object_checked (mono_domain_get (), m, NULL, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } @@@ -5184,7 -5216,7 +5228,7 @@@ ves_icall_System_Reflection_MethodBase_ } else klass = method->klass; res = mono_method_get_object_checked (mono_domain_get (), method, klass, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } @@@ -5291,7 -5323,7 +5335,7 @@@ vell_icall_MonoType_get_core_clr_securi MonoClass *klass = mono_class_from_mono_type (rfield->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return mono_security_core_clr_class_level (klass); } @@@ -5571,6 -5603,7 +5615,6 @@@ mono_module_get_types (MonoDomain *doma for (i = 1; i < tdef->rows; ++i) { if (!exportedOnly || mono_module_type_is_visible (tdef, image, i + 1)) { klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, error); - mono_loader_assert_no_error (); /* Plug any leaks */ if (klass) { rt = mono_type_get_object_checked (domain, &klass->byval_arg, error); @@@ -5606,7 -5639,8 +5650,8 @@@ ves_icall_System_Reflection_Assembly_Ge image = assembly->assembly->image; table = &image->tables [MONO_TABLE_FILE]; res = mono_module_get_types (domain, image, &exceptions, exportedOnly, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; /* Append data from all modules in the assembly */ for (i = 0; i < table->rows; ++i) { @@@ -5617,7 -5651,9 +5662,9 @@@ MonoArray *res2; res2 = mono_module_get_types (domain, loaded_image, &ex2, exportedOnly, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + /* Append the new types to the end of the array */ if (mono_array_length (res2) > 0) { @@@ -5672,6 -5708,8 +5719,6 @@@ MonoArray *exl = NULL; int j, length = g_list_length (list) + ex_count; - mono_loader_clear_error (); - exl = mono_array_new (domain, mono_defaults.exception_class, length); /* Types for which mono_class_get_checked () succeeded */ for (i = 0, tmp = list; tmp; i++, tmp = tmp->next) { @@@ -5695,6 -5733,7 +5742,6 @@@ mono_error_set_pending_exception (&error); return NULL; } - mono_loader_clear_error (); mono_set_pending_exception (exc); return NULL; } @@@ -5819,7 -5858,8 +5866,8 @@@ ves_icall_System_Reflection_Module_Inte MonoArray *res; res = mono_module_get_types (mono_object_domain (module), module->image, &exceptions, FALSE, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; for (i = 0; i < mono_array_length (exceptions); ++i) { MonoException *ex = mono_array_get (exceptions, MonoException *, i); @@@ -6072,7 -6112,7 +6120,7 @@@ ves_icall_System_Reflection_Module_Reso MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, type_args, method_args, error); if (t) { ret = (MonoObject*) mono_type_get_object_checked (mono_domain_get (), t, &merror); - mono_error_raise_exception (&merror); + mono_error_set_pending_exception (&merror); return ret; } @@@ -6084,7 -6124,7 +6132,7 @@@ MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error); if (m) { ret = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), m, m->klass, &merror); - mono_error_raise_exception (&merror); + mono_error_set_pending_exception (&merror); return ret; } else @@@ -6094,7 -6134,7 +6142,7 @@@ MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error); if (f) { ret =(MonoObject*)mono_field_get_object_checked (mono_domain_get (), f->parent, f, &merror); - mono_error_raise_exception (&merror); + mono_error_set_pending_exception (&merror); return ret; } else @@@ -6105,7 -6145,7 +6153,7 @@@ MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, type_args, method_args, error); if (m) { ret = (MonoObject*)mono_method_get_object_checked (mono_domain_get (), m, m->klass, &merror); - mono_error_raise_exception (&merror); + mono_error_set_pending_exception (&merror); return ret; } else @@@ -6115,7 -6155,7 +6163,7 @@@ MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, type_args, method_args, error); if (f) { ret = (MonoObject*)mono_field_get_object_checked (mono_domain_get (), f->parent, f, &merror); - mono_error_raise_exception (&merror); + mono_error_set_pending_exception (&merror); return ret; } else @@@ -6188,7 -6228,7 +6236,7 @@@ ves_icall_ModuleBuilder_create_modified g_free (str); ret = mono_type_get_object_checked (mono_object_domain (tb), &klass->this_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; case '*': @@@ -6226,7 -6266,7 +6274,7 @@@ g_free (str); ret = mono_type_get_object_checked (mono_object_domain (tb), &klass->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -6269,7 -6309,7 +6317,7 @@@ ves_icall_Type_make_array_type (MonoRef klass = mono_class_from_mono_type (type->type); check_for_invalid_type (klass, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); if (rank == 0) //single dimentional array aklass = mono_array_class_get (klass, 1); @@@ -6277,7 -6317,7 +6325,7 @@@ aklass = mono_bounded_array_class_get (klass, rank, TRUE); ret = mono_type_get_object_checked (mono_object_domain (type), &aklass->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -6291,12 -6331,15 +6339,15 @@@ ves_icall_Type_make_byref_type (MonoRef klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + check_for_invalid_type (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; ret = mono_type_get_object_checked (mono_object_domain (type), &klass->this_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -6310,14 -6353,16 +6361,16 @@@ ves_icall_Type_MakePointerType (MonoRef klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; check_for_invalid_type (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; pklass = mono_ptr_class_get (type->type); ret = mono_type_get_object_checked (mono_object_domain (type), &pklass->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -6333,7 -6378,8 +6386,8 @@@ ves_icall_System_Delegate_CreateDelegat MonoMethod *method = info->method; mono_class_init_checked (delegate_class, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (!(delegate_class->parent == mono_defaults.multicastdelegate_class)) { /* FIXME improve this exception message */ @@@ -6355,7 -6401,8 +6409,8 @@@ } delegate = mono_object_new_checked (mono_object_domain (type), delegate_class, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (method_is_dynamic (method)) { /* Creating a trampoline would leak memory */ @@@ -6381,7 -6428,9 +6436,9 @@@ ves_icall_System_Delegate_AllocDelegate g_assert (mono_class_has_parent (mono_object_class (delegate), mono_defaults.multicastdelegate_class)); ret = (MonoMulticastDelegate*) mono_object_new_checked (mono_object_domain (delegate), mono_object_class (delegate), &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + ret->delegate.invoke_impl = mono_runtime_create_delegate_trampoline (mono_object_class (delegate)); return ret; @@@ -6393,7 -6442,7 +6450,7 @@@ ves_icall_System_Delegate_GetVirtualMet MonoReflectionMethod *ret = NULL; MonoError error; ret = mono_method_get_object_checked (mono_domain_get (), mono_object_get_virtual_method (delegate->target, delegate->method), mono_object_class (delegate->target), &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -6503,7 -6552,9 +6560,9 @@@ ves_icall_Remoting_RealProxy_GetTranspa MonoClass *klass; res = mono_object_new_checked (domain, mono_defaults.transparent_proxy_class, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + tp = (MonoTransparentProxy*) res; MONO_OBJECT_SETREF (tp, rp, rp); @@@ -6537,7 -6588,7 +6596,7 @@@ ves_icall_Remoting_RealProxy_InternalGe { MonoError error; MonoReflectionType *ret = mono_type_get_object_checked (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -6568,7 -6619,7 +6627,7 @@@ ves_icall_System_Environment_get_Machin if (GetComputerName (buf, (PDWORD) &len)) { MonoError error; result = mono_string_new_utf16_checked (mono_domain_get (), buf, len, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); } g_free (buf); @@@ -6734,7 -6785,9 +6793,9 @@@ ves_icall_System_Environment_GetEnviron g_assert(equal_str); MonoError error; str = mono_string_new_utf16_checked (domain, env_string, equal_str-env_string, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + mono_array_setref (names, n, str); n++; } @@@ -6878,7 -6931,7 +6939,7 @@@ ves_icall_System_Environment_GetWindows ++ len; MonoError error; MonoString *res = mono_string_new_utf16_checked (mono_domain_get (), path, len, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } #else @@@ -6930,7 -6983,9 +6991,9 @@@ ves_icall_System_Environment_GetLogical u16 = dname; while (*u16) { u16++; len ++; } drivestr = mono_string_new_utf16_checked (domain, dname, len, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; + mono_array_setref (result, ndrives++, drivestr); while (*dname++); } while (*dname); @@@ -7098,7 -7153,8 +7161,8 @@@ ves_icall_Remoting_RemotingServices_Get method = rmethod->method; klass = mono_class_from_mono_type (rtype->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (MONO_CLASS_IS_INTERFACE (klass)) return NULL; @@@ -7134,7 -7190,7 +7198,7 @@@ return NULL; ret = mono_method_get_object_checked (mono_domain_get (), res, NULL, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -7176,7 -7232,8 +7240,8 @@@ ves_icall_System_Runtime_Activation_Act domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (MONO_CLASS_IS_INTERFACE (klass) || (klass->flags & TYPE_ATTRIBUTE_ABSTRACT)) { mono_set_pending_exception (mono_get_exception_argument ("type", "Type cannot be instantiated")); @@@ -7420,14 -7477,15 +7485,15 @@@ ves_icall_System_Activator_CreateInstan domain = mono_object_domain (type); klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (mono_class_is_nullable (klass)) /* No arguments -> null */ return NULL; result = mono_object_new_checked (domain, klass, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return result; } @@@ -7488,7 -7546,6 +7554,6 @@@ ves_icall_MonoMethod_get_base_method (M */ MonoGenericContext *parent_inst = NULL; if (mono_class_is_open_constructed_type (mono_class_get_type (parent))) { - MonoError error; parent = mono_class_inflate_generic_class_checked (parent, generic_inst, &error); if (!mono_error_ok (&error)) { mono_error_set_pending_exception (&error); @@@ -7558,7 -7615,7 +7623,7 @@@ return m; ret = mono_method_get_object_checked (mono_domain_get (), result, NULL, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@@ -7757,7 -7814,7 +7822,7 @@@ ves_icall_System_Runtime_InteropService MonoError error; prelink_method (method->method, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); } ICALL_EXPORT void @@@ -7769,11 -7826,13 +7834,13 @@@ ves_icall_System_Runtime_InteropService gpointer iter = NULL; mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; while ((m = mono_class_get_methods (klass, &iter))) { prelink_method (m, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return; } } @@@ -7868,7 -7927,7 +7935,7 @@@ ves_icall_ParameterInfo_GetTypeModifier type = sig->params [pos]; res = type_array_from_modifiers (image, type, optional, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } @@@ -7897,7 -7956,7 +7964,7 @@@ ves_icall_MonoPropertyInfo_GetTypeModif if (!type) return NULL; res = type_array_from_modifiers (image, type, optional, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return res; } @@@ -7960,7 -8019,8 +8027,8 @@@ custom_attrs_defined_internal (MonoObje gboolean found; mono_class_init_checked (attr_class, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return FALSE; cinfo = mono_reflection_get_custom_attrs_info_checked (obj, &error); if (!is_ok (&error)) { @@@ -7984,7 -8044,8 +8052,8 @@@ custom_attrs_get_by_type (MonoObject *o if (attr_class) { mono_class_init_checked (attr_class, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; } res = mono_reflection_get_custom_attrs_by_type (obj, attr_class, &error); @@@ -7993,7 -8054,12 +8062,7 @@@ return NULL; } - if (mono_loader_get_last_error ()) { - mono_set_pending_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); - return NULL; - } else { - return res; - } + return res; } ICALL_EXPORT MonoArray* @@@ -8034,7 -8100,8 +8103,8 @@@ ves_icall_System_ComponentModel_Win32Ex message = mono_string_new (mono_domain_get (), "Error looking up error string"); } else { message = mono_string_new_utf16_checked (mono_domain_get (), buf, ret, &error); - mono_error_raise_exception (&error); + if (mono_error_set_pending_exception (&error)) + return NULL; } return message;