Merge pull request #2824 from lambdageek/dev/monoerror-icalls-noraise
authormonojenkins <jo.shields+jenkins@xamarin.com>
Thu, 7 Apr 2016 19:06:02 +0000 (20:06 +0100)
committermonojenkins <jo.shields+jenkins@xamarin.com>
Thu, 7 Apr 2016 19:06:02 +0000 (20:06 +0100)
[runtime] Set pending exception in icalls instead of raising.

1  2 
mono/metadata/icall.c

diff --combined mono/metadata/icall.c
index e7d749c6ab9f8f1f89f68226a8554786f4c77c12,8e2fbdf3b650902ff1cd6d1324ae2a89271b5686..e1572c3f55990945c886dee665d5c64f18b1c321
@@@ -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;
  
        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;
        }
  }
  
  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;
  
        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;
        }
  }
  
  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;
  
        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);
  
         */
        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
        if (dest) {
                assembly = dest->klass->image->assembly;
                type_resolve = TRUE;
 +              rootimage = assembly->image;
        } else {
                g_warning (G_STRLOC);
        }
        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<int, Local>
 +      //  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<System.Generic.Dict<int, Local>> 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;
        }
  
                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);
        }
                    (((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;
                }
                    (((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);
  
  
        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;
        }
  
        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;
        }
  
        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;
        }
  
                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);
  
        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
        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);
                }
                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);
        }
  
        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, &param_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);
                        }
                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) {
        }
  
        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;
  
        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))
  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;
  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;
  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);
                }
  
                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);
        }
        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);
                        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);
                        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);
                        }
                }
                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);
                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) {
                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])));
  
                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);
  
                        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;
                }
                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 {
                                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) {
                                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) {
                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) {
                        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;
                }
                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
                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
                        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
                        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 '*':
        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);
                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 */
        }
  
        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;
                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);
                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);
                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;