X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Ficall.c;h=e22c730342dc4a3bc8eadcb4932aa9722ad5cc93;hb=6b139f4c98eb90bfb7e1285933fc682dae541cad;hp=d9d9f259325c5c9299ce8121a81d86672d0b29c6;hpb=8e7561bc87ec87bf3d802cdbb94cc1355e9a05a6;p=mono.git diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index d9d9f259325..e22c730342d 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -11,6 +11,7 @@ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) * Copyright 2004-2009 Novell, Inc (http://www.novell.com) * Copyright 2011-2015 Xamarin Inc (http://www.xamarin.com). + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include @@ -207,6 +208,7 @@ ves_icall_System_Array_GetValue (MonoArray *arr, MonoArray *idxs) ICALL_EXPORT void ves_icall_System_Array_SetValueImpl (MonoArray *arr, MonoObject *value, guint32 pos) { + MonoError error; MonoClass *ac, *vc, *ec; gint32 esize, vsize; gpointer *ea, *va; @@ -216,6 +218,8 @@ ves_icall_System_Array_SetValueImpl (MonoArray *arr, MonoObject *value, guint32 gint64 i64 = 0; gdouble r64 = 0; + mono_error_init (&error); + if (value) vc = value->vtable->klass; else @@ -293,19 +297,24 @@ ves_icall_System_Array_SetValueImpl (MonoArray *arr, MonoObject *value, guint32 } if (!ec->valuetype) { - if (!mono_object_isinst (value, ec)) + gboolean castOk = (NULL != mono_object_isinst_checked (value, ec, &error)); + if (mono_error_set_pending_exception (&error)) + return; + if (!castOk) INVALID_CAST; mono_gc_wbarrier_set_arrayref (arr, ea, (MonoObject*)value); return; } - if (mono_object_isinst (value, ec)) { + if (mono_object_isinst_checked (value, ec, &error)) { if (ec->has_references) mono_value_copy (ea, (char*)value + sizeof (MonoObject), ec); else mono_gc_memmove_atomic (ea, (char *)value + sizeof (MonoObject), esize); return; } + if (mono_error_set_pending_exception (&error)) + return; if (!vc->valuetype) INVALID_CAST; @@ -556,7 +565,8 @@ ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray * 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 */ @@ -607,7 +617,8 @@ ves_icall_System_Array_CreateInstanceImpl64 (MonoReflectionType *type, MonoArray 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 */ @@ -702,6 +713,15 @@ ves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length) mono_gc_bzero_atomic (mono_array_addr_with_size_fast (arr, sz, idx), length * sz); } +ICALL_EXPORT MonoArray* +ves_icall_System_Array_Clone (MonoArray *arr) +{ + MonoError error; + MonoArray *result = mono_array_clone_checked (arr, &error); + mono_error_set_pending_exception (&error); + return result; +} + ICALL_EXPORT gboolean ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length) { @@ -1040,7 +1060,10 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this_obj, MonoArray if (values) { int i; - mono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count)); + MonoArray *fields_arr = mono_array_new_checked (mono_domain_get (), mono_defaults.object_class, count, &error); + if (mono_error_set_pending_exception (&error)) + return 0; + mono_gc_wbarrier_generic_store (fields, (MonoObject*) fields_arr); for (i = 0; i < count; ++i) mono_array_setref (*fields, i, values [i]); } else { @@ -1159,7 +1182,10 @@ ves_icall_System_ValueType_Equals (MonoObject *this_obj, MonoObject *that, MonoA if (values) { int i; - mono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count)); + MonoArray *fields_arr = mono_array_new_checked (mono_domain_get (), mono_defaults.object_class, count, &error); + if (mono_error_set_pending_exception (&error)) + return FALSE; + mono_gc_wbarrier_generic_store (fields, (MonoObject*) fields_arr); for (i = 0; i < count; ++i) mono_array_setref_fast (*fields, i, values [i]); return FALSE; @@ -1180,8 +1206,7 @@ ves_icall_System_Object_GetType (MonoObject *obj) #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; } @@ -1199,7 +1224,7 @@ ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *o 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; } @@ -1213,7 +1238,7 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb, 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; } @@ -1222,15 +1247,15 @@ ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE fil { 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 @@ -1260,6 +1285,22 @@ ves_icall_System_Reflection_Emit_AssemblyBuilder_InternalAddModule (MonoReflecti return result; } +/** + * ves_icall_System_Reflection_Emit_TypeBuilder_create_generic_class: + * @tb: a TypeBuilder object + * + * (icall) + * Creates the generic class after all generic parameters have been added. + */ +ICALL_EXPORT void +ves_icall_System_Reflection_Emit_TypeBuilder_create_generic_class (MonoReflectionTypeBuilder *tb) +{ + MonoError error; + (void) mono_reflection_create_generic_class (tb, &error); + mono_error_set_pending_exception (&error); +} + +#ifndef DISABLE_REFLECTION_EMIT ICALL_EXPORT MonoArray* ves_icall_System_Reflection_Emit_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) { @@ -1268,9 +1309,10 @@ ves_icall_System_Reflection_Emit_CustomAttributeBuilder_GetBlob (MonoReflectionA mono_error_set_pending_exception (&error); return result; } +#endif 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; @@ -1278,11 +1320,9 @@ get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer dat 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; } @@ -1290,7 +1330,7 @@ get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer dat } 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; @@ -1298,9 +1338,18 @@ get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer 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; } @@ -1308,7 +1357,7 @@ get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer } 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; @@ -1319,13 +1368,15 @@ get_caller_no_reflection (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed 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; @@ -1341,6 +1392,7 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoErro MonoType *type = NULL; MonoAssembly *assembly = NULL; gboolean type_resolve = FALSE; + MonoImage *rootimage = NULL; mono_error_init (error); @@ -1351,10 +1403,23 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoErro */ 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 @@ -1367,6 +1432,7 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoErro if (dest) { assembly = dest->klass->image->assembly; type_resolve = TRUE; + rootimage = assembly->image; } else { g_warning (G_STRLOC); } @@ -1374,21 +1440,28 @@ type_from_parsed_name (MonoTypeNameParse *info, MonoBoolean ignoreCase, MonoErro 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); } @@ -1414,10 +1487,12 @@ ves_icall_System_Type_internal_from_name (MonoString *name, /* 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; } @@ -1440,7 +1515,6 @@ ves_icall_System_Type_internal_from_name (MonoString *name, if (throwOnError) e = mono_get_exception_type_load (name, NULL); - mono_loader_clear_error (); if (e) { mono_set_pending_exception (e); return NULL; @@ -1459,7 +1533,7 @@ ves_icall_System_Type_internal_from_handle (MonoType *handle) 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; } @@ -1630,8 +1704,13 @@ ves_icall_RuntimeTypeHandle_IsInstanceOfType (MonoReflectionType *type, MonoObje MonoError error; MonoClass *klass = mono_class_from_mono_type (type->type); mono_class_init_checked (klass, &error); - mono_error_raise_exception (&error); - return mono_object_isinst (obj, klass) != NULL; + if (!is_ok (&error)) { + mono_error_set_pending_exception (&error); + return FALSE; + } + guint32 result = (mono_object_isinst_checked (obj, klass, &error) != NULL); + mono_error_set_pending_exception (&error); + return result; } ICALL_EXPORT guint32 @@ -1706,7 +1785,7 @@ ves_icall_System_Reflection_FieldInfo_internal_from_handle_type (MonoClassField } 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; } @@ -1723,7 +1802,7 @@ ves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *fie } 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; } @@ -1836,7 +1915,7 @@ ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean decla 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; @@ -1856,8 +1935,11 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob return NULL; } - if (mono_security_core_clr_enabled ()) - mono_security_core_clr_ensure_reflection_access_field (cf); + if (mono_security_core_clr_enabled () && + !mono_security_core_clr_ensure_reflection_access_field (cf, &error)) { + mono_error_set_pending_exception (&error); + return NULL; + } MonoObject * result = mono_field_get_value_object_checked (domain, cf, obj, &error); mono_error_set_pending_exception (&error); @@ -1878,8 +1960,11 @@ ves_icall_MonoField_SetValueInternal (MonoReflectionField *field, MonoObject *ob return; } - if (mono_security_core_clr_enabled ()) - mono_security_core_clr_ensure_reflection_access_field (cf); + if (mono_security_core_clr_enabled () && + !mono_security_core_clr_ensure_reflection_access_field (cf, &error)) { + mono_error_set_pending_exception (&error); + return; + } type = mono_field_get_type_checked (cf, &error); if (!mono_error_ok (&error)) { @@ -2124,13 +2209,15 @@ ves_icall_MonoPropertyInfo_get_property_info (const MonoReflectionProperty *prop 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); } @@ -2146,7 +2233,8 @@ ves_icall_MonoPropertyInfo_get_property_info (const MonoReflectionProperty *prop (((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; } @@ -2158,7 +2246,8 @@ ves_icall_MonoPropertyInfo_get_property_info (const MonoReflectionProperty *prop (((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; } @@ -2180,12 +2269,14 @@ ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEven 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); @@ -2194,7 +2285,8 @@ ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEven 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; } @@ -2203,7 +2295,8 @@ ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEven 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; } @@ -2212,7 +2305,8 @@ ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEven 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; } @@ -2224,11 +2318,15 @@ ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEven int i, n = 0; while (event->event->other [n]) n++; - MONO_STRUCT_SETREF (info, other_methods, mono_array_new (domain, mono_defaults.method_info_class, n)); + MonoArray *info_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, n, &error); + if (mono_error_set_pending_exception (&error)) + return; + MONO_STRUCT_SETREF (info, other_methods, info_arr); 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); } } @@ -2329,12 +2427,17 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type) len = g_hash_table_size (iface_hash); if (len == 0) { g_hash_table_destroy (iface_hash); - if (!data.domain->empty_types) - data.domain->empty_types = mono_array_new_cached (data.domain, mono_defaults.monotype_class, 0); + if (!data.domain->empty_types) { + data.domain->empty_types = mono_array_new_cached (data.domain, mono_defaults.monotype_class, 0, &error); + if (!is_ok (&error)) + goto fail; + } return data.domain->empty_types; } - data.iface_array = mono_array_new_cached (data.domain, mono_defaults.monotype_class, len); + data.iface_array = mono_array_new_cached (data.domain, mono_defaults.monotype_class, len, &error); + if (!is_ok (&error)) + goto fail; g_hash_table_foreach (iface_hash, fill_iface_array, &data); if (!mono_error_ok (&error)) goto fail; @@ -2362,9 +2465,11 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType 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); @@ -2374,15 +2479,23 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType len = mono_class_num_methods (iclass); domain = mono_object_domain (type); - mono_gc_wbarrier_generic_store (targets, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len)); - mono_gc_wbarrier_generic_store (methods, (MonoObject*) mono_array_new (domain, mono_defaults.method_info_class, len)); + MonoArray *targets_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, len, &error); + if (mono_error_set_pending_exception (&error)) + return; + mono_gc_wbarrier_generic_store (targets, (MonoObject*) targets_arr); + MonoArray *methods_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, len, &error); + if (mono_error_set_pending_exception (&error)) + return; + mono_gc_wbarrier_generic_store (methods, (MonoObject*) methods_arr); 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 ++; @@ -2396,7 +2509,8 @@ ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 * 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; @@ -2416,14 +2530,15 @@ ves_icall_RuntimeTypeHandle_GetElementType (MonoReflectionType *type) 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 @@ -2436,7 +2551,7 @@ ves_icall_RuntimeTypeHandle_GetElementType (MonoReflectionType *type) else return NULL; - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); return ret; } @@ -2455,7 +2570,7 @@ ves_icall_RuntimeTypeHandle_GetBaseType (MonoReflectionType *type) 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; } @@ -2484,7 +2599,8 @@ ves_icall_RuntimeTypeHandle_IsComObject (MonoReflectionType *type) 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); } @@ -2505,8 +2621,7 @@ ves_icall_RuntimeTypeHandle_GetModule (MonoReflectionType *type) 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; } @@ -2517,8 +2632,7 @@ ves_icall_RuntimeTypeHandle_GetAssembly (MonoReflectionType *type) 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; } @@ -2546,7 +2660,7 @@ ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type) 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; } @@ -2600,11 +2714,9 @@ ves_icall_RuntimeTypeHandle_GetArrayRank (MonoReflectionType *type) } static MonoArray* -create_type_array (MonoDomain *domain, MonoBoolean runtimeTypeArray, int count) +create_type_array (MonoDomain *domain, MonoBoolean runtimeTypeArray, int count, MonoError *error) { - MonoArray *res; - res = mono_array_new (domain, runtimeTypeArray ? mono_defaults.runtimetype_class : mono_defaults.systemtype_class, count); - return res; + return mono_array_new_checked (domain, runtimeTypeArray ? mono_defaults.runtimetype_class : mono_defaults.systemtype_class, count, error); } ICALL_EXPORT MonoArray* @@ -2621,21 +2733,27 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type, MonoBoolean ru if (klass->generic_container) { MonoGenericContainer *container = klass->generic_container; - res = create_type_array (domain, runtimeTypeArray, container->type_argc); + res = create_type_array (domain, runtimeTypeArray, container->type_argc, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; for (i = 0; i < container->type_argc; ++i) { 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); } } else if (klass->generic_class) { MonoGenericInst *inst = klass->generic_class->context.class_inst; - res = create_type_array (domain, runtimeTypeArray, inst->type_argc); + res = create_type_array (domain, runtimeTypeArray, inst->type_argc, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; 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); } @@ -2685,7 +2803,7 @@ ves_icall_RuntimeTypeHandle_GetGenericTypeDefinition_impl (MonoReflectionType *t 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; } @@ -2704,7 +2822,8 @@ ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array) 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); @@ -2730,7 +2849,7 @@ ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array) } 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; } @@ -2787,10 +2906,13 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type) for (count = 0, ptr = param_info->constraints; ptr && *ptr; ptr++, count++) ; - res = mono_array_new (domain, mono_defaults.monotype_class, count); + res = mono_array_new_checked (domain, mono_defaults.monotype_class, count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; 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); } @@ -2833,13 +2955,15 @@ ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *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; 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; } } @@ -3009,11 +3133,14 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method) if (inst) { count = inst->type_argc; - res = mono_array_new (domain, mono_defaults.systemtype_class, count); + res = mono_array_new_checked (domain, mono_defaults.systemtype_class, count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; 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); } @@ -3023,7 +3150,9 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method) } count = mono_method_signature (method->method)->generic_param_count; - res = mono_array_new (domain, mono_defaults.systemtype_class, count); + res = mono_array_new_checked (domain, mono_defaults.systemtype_class, count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; for (i = 0; i < count; i++) { MonoGenericContainer *container = mono_method_get_generic_container (method->method); @@ -3031,7 +3160,8 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method) 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); } @@ -3056,8 +3186,11 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo *exc = NULL; - if (mono_security_core_clr_enabled ()) - mono_security_core_clr_ensure_reflection_access_method (m); + if (mono_security_core_clr_enabled () && + !mono_security_core_clr_ensure_reflection_access_method (m, &error)) { + mono_error_set_pending_exception (&error); + return NULL; + } if (!(m->flags & METHOD_ATTRIBUTE_STATIC)) { if (!mono_class_vtable_full (mono_object_domain (method), m->klass, &error)) { @@ -3067,7 +3200,11 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this_arg, Mo } if (this_arg) { - if (!mono_object_isinst (this_arg, m->klass)) { + if (!mono_object_isinst_checked (this_arg, m->klass, &error)) { + if (!is_ok (&error)) { + mono_gc_wbarrier_generic_store (exc, (MonoObject*) mono_error_convert_to_exception (&error)); + return NULL; + } char *this_name = mono_type_get_full_name (mono_object_get_class (this_arg)); char *target_name = mono_type_get_full_name (m->klass); char *msg = g_strdup_printf ("Object of type '%s' doesn't match target type '%s'", this_name, target_name); @@ -3207,18 +3344,20 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M do { MonoClassField* field = mono_class_get_field_from_name (k, str); if (field) { + g_free (str); MonoClass *field_klass = mono_class_from_mono_type (field->type); if (field_klass->valuetype) { result = mono_value_box_checked (domain, field_klass, (char *)this_arg + field->offset, &error); - mono_error_set_pending_exception (&error); - /* fallthru to cleanup */ + if (mono_error_set_pending_exception (&error)) + return NULL; } else result = (MonoObject *)*((gpointer *)((char *)this_arg + field->offset)); - out_args = mono_array_new (domain, mono_defaults.object_class, 1); + out_args = mono_array_new_checked (domain, mono_defaults.object_class, 1, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args); mono_array_setref (out_args, 0, result); - g_free (str); return NULL; } k = k->parent; @@ -3248,6 +3387,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M do { MonoClassField* field = mono_class_get_field_from_name (k, str); if (field) { + g_free (str); MonoClass *field_klass = mono_class_from_mono_type (field->type); MonoObject *val = (MonoObject *)mono_array_get (params, gpointer, 2); @@ -3259,10 +3399,11 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M mono_gc_wbarrier_set_field (this_arg, (char*)this_arg + field->offset, val); } - out_args = mono_array_new (domain, mono_defaults.object_class, 0); + out_args = mono_array_new_checked (domain, mono_defaults.object_class, 0, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_gc_wbarrier_generic_store (outArgs, (MonoObject*) out_args); - g_free (str); return NULL; } @@ -3280,8 +3421,10 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this_arg, M outarg_count++; } - out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count); - + out_args = mono_array_new_checked (domain, mono_defaults.object_class, outarg_count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + /* handle constructors only for objects already allocated */ if (!strcmp (method->method->name, ".ctor")) g_assert (this_arg); @@ -3343,7 +3486,8 @@ write_enum_value (char *mem, int type, guint64 value) break; } case MONO_TYPE_U2: - case MONO_TYPE_I2: { + case MONO_TYPE_I2: + case MONO_TYPE_CHAR: { guint16 *p = (guint16 *)mem; *p = value; break; @@ -3379,12 +3523,14 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, guint64 value) 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; @@ -3419,7 +3565,8 @@ ves_icall_System_Enum_get_value (MonoObject *eobj) 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); @@ -3439,7 +3586,8 @@ ves_icall_System_Enum_get_underlying_type (MonoReflectionType *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; etype = mono_class_enum_basetype (klass); if (!etype) { @@ -3448,7 +3596,7 @@ ves_icall_System_Enum_get_underlying_type (MonoReflectionType *type) } 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; } @@ -3552,7 +3700,9 @@ ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionType *type, MonoArray 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.")); @@ -3562,8 +3712,12 @@ ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionType *type, MonoArray base_type = mono_class_enum_basetype (enumc)->type; nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0; - *names = mono_array_new (domain, mono_defaults.string_class, nvalues); - *values = mono_array_new (domain, mono_defaults.uint64_class, nvalues); + *names = mono_array_new_checked (domain, mono_defaults.string_class, nvalues, &error); + if (mono_error_set_pending_exception (&error)) + return FALSE; + *values = mono_array_new_checked (domain, mono_defaults.uint64_class, nvalues, &error); + if (mono_error_set_pending_exception (&error)) + return FALSE; iter = NULL; while ((field = mono_class_get_fields (enumc, &iter))) { @@ -3629,8 +3783,11 @@ ves_icall_Type_GetFields_internal (MonoReflectionType *type, MonoString *name, g MonoPtrArray tmp_array; domain = ((MonoObject *)type)->vtable->domain; - if (type->type->byref) - return mono_array_new (domain, mono_defaults.field_info_class, 0); + if (type->type->byref) { + MonoArray *result = mono_array_new_checked (domain, mono_defaults.field_info_class, 0, &error); + mono_error_set_pending_exception (&error); + return result; + } klass = startklass = mono_class_from_mono_type (type->type); refklass = mono_class_from_mono_type (reftype->type); @@ -3691,7 +3848,9 @@ handle_parent: if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)) goto handle_parent; - res = mono_array_new_cached (domain, mono_defaults.field_info_class, mono_ptr_array_size (tmp_array)); + res = mono_array_new_cached (domain, mono_defaults.field_info_class, mono_ptr_array_size (tmp_array), &error); + if (!is_ok (&error)) + goto fail; for (i = 0; i < mono_ptr_array_size (tmp_array); ++i) mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i)); @@ -3704,8 +3863,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 @@ -3746,8 +3905,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla /* 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; @@ -3755,7 +3913,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla 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)) @@ -3771,7 +3929,7 @@ mono_class_get_methods_by_name (MonoClass *klass, const char *name, guint32 bfla 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; @@ -3831,8 +3989,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; } @@ -3910,7 +4067,7 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag { MonoDomain *domain; MonoClass *startklass, *klass, *refklass; - MonoArray *res; + MonoArray *res = NULL; MonoMethod *method; MonoObject *member; int i, match; @@ -3918,18 +4075,23 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag MonoPtrArray tmp_array; MonoError error; + domain = ((MonoObject *)type)->vtable->domain; + if (type->type->byref) { + res = mono_array_new_cached (domain, mono_defaults.method_info_class, 0, &error); + mono_error_set_pending_exception (&error); + return res; + } + mono_ptr_array_init (tmp_array, 4, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection constructors list"); /*FIXME, guestimating*/ - domain = ((MonoObject *)type)->vtable->domain; - if (type->type->byref) - return mono_array_new_cached (domain, mono_defaults.method_info_class, 0); + klass = startklass = mono_class_from_mono_type (type->type); refklass = mono_class_from_mono_type (reftype->type); mono_class_setup_methods (klass); if (mono_class_has_failure (klass)) { mono_set_pending_exception (mono_class_get_exception_for_failure (klass)); - return NULL; + goto leave; } iter = NULL; @@ -3959,19 +4121,20 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag if (!match) continue; member = (MonoObject*)mono_method_get_object_checked (domain, method, refklass, &error); - if (!mono_error_ok (&error)) { - mono_error_set_pending_exception (&error); - return NULL; - } + if (mono_error_set_pending_exception (&error)) + goto leave; mono_ptr_array_append (tmp_array, member); } - res = mono_array_new_cached (domain, mono_class_get_constructor_info_class (), mono_ptr_array_size (tmp_array)); + res = mono_array_new_cached (domain, mono_class_get_constructor_info_class (), mono_ptr_array_size (tmp_array), &error); + if (mono_error_set_pending_exception (&error)) + goto leave; 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); return res; @@ -4054,11 +4217,15 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, mono_error_init (&error); + domain = ((MonoObject *)type)->vtable->domain; + if (type->type->byref) { + res = mono_array_new_cached (domain, mono_class_get_property_info_class (), 0, &error); + mono_error_set_pending_exception (&error); + return res; + } + mono_ptr_array_init (tmp_array, 8, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection properties list"); /*This the average for ASP.NET types*/ - domain = ((MonoObject *)type)->vtable->domain; - if (type->type->byref) - return mono_array_new_cached (domain, mono_class_get_property_info_class (), 0); klass = startklass = mono_class_from_mono_type (type->type); if (name != NULL) { @@ -4070,7 +4237,7 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, 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; @@ -4130,7 +4297,9 @@ handle_parent: g_hash_table_destroy (properties); g_free (propname); - res = mono_array_new_cached (domain, mono_class_get_property_info_class (), mono_ptr_array_size (tmp_array)); + res = mono_array_new_cached (domain, mono_class_get_property_info_class (), mono_ptr_array_size (tmp_array), &error); + if (!is_ok (&error)) + goto failure; for (i = 0; i < mono_ptr_array_size (tmp_array); ++i) mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i)); @@ -4143,9 +4312,6 @@ handle_parent: 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: @@ -4193,18 +4359,22 @@ ves_icall_Type_GetEvents_internal (MonoReflectionType *type, MonoString *name, g mono_error_init (&error); + domain = mono_object_domain (type); + if (type->type->byref) { + res = mono_array_new_cached (domain, mono_class_get_event_info_class (), 0, &error); + mono_error_set_pending_exception (&error); + return res; + } + mono_ptr_array_init (tmp_array, 4, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection events list"); - domain = mono_object_domain (type); - if (type->type->byref) - return mono_array_new_cached (domain, mono_class_get_event_info_class (), 0); klass = startklass = mono_class_from_mono_type (type->type); events = g_hash_table_new (event_hash, (GEqualFunc)event_equal); 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; @@ -4272,7 +4442,9 @@ handle_parent: g_hash_table_destroy (events); - res = mono_array_new_cached (domain, mono_class_get_event_info_class (), mono_ptr_array_size (tmp_array)); + res = mono_array_new_cached (domain, mono_class_get_event_info_class (), mono_ptr_array_size (tmp_array), &error); + if (!is_ok (&error)) + goto failure; for (i = 0; i < mono_ptr_array_size (tmp_array); ++i) mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i)); @@ -4287,9 +4459,6 @@ handle_parent: 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: @@ -4312,16 +4481,21 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint 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); + if (type->type->byref) { + MonoArray *result = mono_array_new_cached (domain, mono_defaults.monotype_class, 0, &error); + mono_error_set_pending_exception (&error); + return result; + } klass = mono_class_from_mono_type (type->type); /* @@ -4361,21 +4535,25 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint } 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); } - res = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array)); + res = mono_array_new_cached (domain, mono_defaults.monotype_class, mono_ptr_array_size (tmp_array), &error); + if (!is_ok (&error)) + goto leave; 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); - if (!str) - g_free (str); + g_free (str); + mono_error_set_pending_exception (&error); return res; } @@ -4420,7 +4598,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as 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); @@ -4440,7 +4618,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as 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); @@ -4455,7 +4633,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as 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); @@ -4468,7 +4646,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as } } 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); @@ -4484,20 +4662,9 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as 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) { @@ -4507,7 +4674,6 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as 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; } @@ -4691,8 +4857,11 @@ ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAs ICALL_EXPORT MonoArray* ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) { + MonoError error; MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE]; - MonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows); + MonoArray *result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, table->rows, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; int i; const char *val; @@ -4748,7 +4917,10 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF]; count = t->rows; - result = mono_array_new (domain, mono_class_get_assembly_name_class (), count); + result = mono_array_new_checked (domain, mono_class_get_assembly_name_class (), count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + if (count > 0 && !create_culture) { MonoMethodDesc *desc = mono_method_desc_new ( @@ -4767,7 +4939,8 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse 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]))); @@ -4780,7 +4953,8 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse 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); @@ -4791,7 +4965,8 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse 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); } @@ -4803,14 +4978,26 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) { /* public key token isn't copied - the class library will automatically generate it from the public key if required */ - MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len)); - memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len); + MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + + MONO_OBJECT_SETREF (aname, publicKey, pkey); + memcpy (mono_array_addr (pkey, guint8, 0), pkey_ptr, pkey_len); } else { - MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len)); - memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len); + MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + + MONO_OBJECT_SETREF (aname, keyToken, keyToken); + memcpy (mono_array_addr (keyToken, guint8, 0), pkey_ptr, pkey_len); } } else { - MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0)); + MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 0, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + + MONO_OBJECT_SETREF (aname, keyToken, keyToken); } /* note: this function doesn't return the codebase on purpose (i.e. it can @@ -4878,7 +5065,8 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflection 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); @@ -4958,6 +5146,7 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec ICALL_EXPORT MonoObject* ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) { + MonoError error; MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE]; MonoArray *result = NULL; int i, count; @@ -4988,7 +5177,10 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a count ++; } - result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count); + result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + count = 0; for (i = 0; i < table->rows; ++i) { @@ -5032,16 +5224,21 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly real_module_count ++; klass = mono_class_get_module_class (); - res = mono_array_new (domain, klass, 1 + real_module_count + file_count); + res = mono_array_new_checked (domain, klass, 1 + real_module_count + file_count, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; 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; } @@ -5050,7 +5247,8 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly 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 { @@ -5061,7 +5259,8 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly 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); } } @@ -5086,7 +5285,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; } @@ -5146,7 +5345,7 @@ ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMeth } 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; } @@ -5253,7 +5452,7 @@ vell_icall_MonoType_get_core_clr_security_level (MonoReflectionType *rfield) 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); } @@ -5355,11 +5554,15 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a pkey_ptr = (char*)name->public_key; pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr); - MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len)); + MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, pkey_len, error); + return_if_nok (error); + MONO_OBJECT_SETREF (aname, publicKey, pkey); memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len); aname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG; } else if (default_publickey) { - MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, 0)); + MonoArray *pkey = mono_array_new_checked (domain, mono_defaults.byte_class, 0, error); + return_if_nok (error); + MONO_OBJECT_SETREF (aname, publicKey, pkey); aname->flags |= ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG; } @@ -5368,8 +5571,11 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a int i, j; char *p; - MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8)); - p = mono_array_addr (aname->keyToken, char, 0); + MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 8, error); + return_if_nok (error); + + MONO_OBJECT_SETREF (aname, keyToken, keyToken); + p = mono_array_addr (keyToken, char, 0); for (i = 0, j = 0; i < 8; i++) { *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4; @@ -5377,7 +5583,9 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a p++; } } else if (default_token) { - MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 0)); + MonoArray *keyToken = mono_array_new_checked (domain, mono_defaults.byte_class, 0, error); + return_if_nok (error); + MONO_OBJECT_SETREF (aname, keyToken, keyToken); } } @@ -5527,13 +5735,14 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti } else { count = tdef->rows - 1; } - res = mono_array_new (domain, mono_defaults.monotype_class, count); - *exceptions = mono_array_new (domain, mono_defaults.exception_class, count); + res = mono_array_new_checked (domain, mono_defaults.monotype_class, count, error); + return_val_if_nok (error, NULL); + *exceptions = mono_array_new_checked (domain, mono_defaults.exception_class, count, error); + return_val_if_nok (error, NULL); count = 0; 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); @@ -5569,7 +5778,8 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, 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) { @@ -5580,7 +5790,9 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, 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) { @@ -5590,12 +5802,16 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, len1 = mono_array_length (res); len2 = mono_array_length (res2); - res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2); + res3 = mono_array_new_checked (domain, mono_defaults.monotype_class, len1 + len2, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_memcpy_refs (res3, 0, res, 0, len1); mono_array_memcpy_refs (res3, len1, res2, 0, len2); res = res3; - ex3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2); + ex3 = mono_array_new_checked (domain, mono_defaults.monotype_class, len1 + len2, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; mono_array_memcpy_refs (ex3, 0, exceptions, 0, len1); mono_array_memcpy_refs (ex3, len1, ex2, 0, len2); exceptions = ex3; @@ -5635,9 +5851,11 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, 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); + exl = mono_array_new_checked (domain, mono_defaults.exception_class, length, &error); + if (mono_error_set_pending_exception (&error)) { + g_list_free (list); + return NULL; + } /* Types for which mono_class_get_checked () succeeded */ for (i = 0, tmp = list; tmp; i++, tmp = tmp->next) { MonoException *exc = mono_class_get_exception_for_failure ((MonoClass *)tmp->data); @@ -5660,7 +5878,6 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, mono_error_set_pending_exception (&error); return NULL; } - mono_loader_clear_error (); mono_set_pending_exception (exc); return NULL; } @@ -5779,13 +5996,16 @@ ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *modul MonoArray *exceptions; int i; - if (!module->image) - return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0); - else { + if (!module->image) { + MonoArray *arr = mono_array_new_checked (mono_object_domain (module), mono_defaults.monotype_class, 0, &error); + mono_error_set_pending_exception (&error); + return arr; + } else { 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); @@ -5809,10 +6029,13 @@ mono_memberref_is_method (MonoImage *image, guint32 token) mono_metadata_decode_blob_size (sig, &sig); return (*sig != 0x6); } else { + MonoError error; MonoClass *handle_class; - if (!mono_lookup_dynamic_token_class (image, token, FALSE, &handle_class, NULL)) + if (!mono_lookup_dynamic_token_class (image, token, FALSE, &handle_class, NULL, &error)) { + mono_error_cleanup (&error); /* just probing, ignore error */ return FALSE; + } return mono_defaults.methodhandle_class == handle_class; } @@ -5853,12 +6076,14 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t if (image_is_dynamic (image)) { if ((table == MONO_TABLE_TYPEDEF) || (table == MONO_TABLE_TYPEREF)) { - klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); return klass ? &klass->byval_arg : NULL; } init_generic_context_from_args (&context, type_args, method_args); - klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context); + klass = (MonoClass *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error); + mono_error_cleanup (&error); return klass ? &klass->byval_arg : NULL; } @@ -5901,8 +6126,11 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } if (image_is_dynamic (image)) { - if (table == MONO_TABLE_METHOD) - return (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + if (table == MONO_TABLE_METHOD) { + method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); + return method; + } if ((table == MONO_TABLE_MEMBERREF) && !(mono_memberref_is_method (image, token))) { *resolve_error = ResolveTokenError_BadTable; @@ -5910,7 +6138,9 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } init_generic_context_from_args (&context, type_args, method_args); - return (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context); + method = (MonoMethod *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error); + mono_error_cleanup (&error); + return method; } if ((index <= 0) || (index > image->tables [table].rows)) { @@ -5930,23 +6160,27 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 } ICALL_EXPORT MonoString* -ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error) { + MonoError error; int index = mono_metadata_token_index (token); - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } - if (image_is_dynamic (image)) - return (MonoString *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + if (image_is_dynamic (image)) { + MonoString * result = (MonoString *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); + return result; + } if ((index <= 0) || (index >= image->heap_us.size)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } @@ -5974,8 +6208,11 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 } if (image_is_dynamic (image)) { - if (table == MONO_TABLE_FIELD) - return (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); + if (table == MONO_TABLE_FIELD) { + field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, &error); + mono_error_cleanup (&error); + return field; + } if (mono_memberref_is_method (image, token)) { *resolve_error = ResolveTokenError_BadTable; @@ -5983,7 +6220,9 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 } init_generic_context_from_args (&context, type_args, method_args); - return (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context); + field = (MonoClassField *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, &context, &error); + mono_error_cleanup (&error); + return field; } if ((index <= 0) || (index > image->tables [table].rows)) { @@ -6019,7 +6258,7 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 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; } @@ -6031,7 +6270,7 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 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 @@ -6041,7 +6280,7 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 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 @@ -6052,7 +6291,7 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 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 @@ -6062,7 +6301,7 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 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 @@ -6078,8 +6317,9 @@ ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 } ICALL_EXPORT MonoArray* -ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error) { + MonoError error; int table = mono_metadata_token_table (token); int idx = mono_metadata_token_index (token); MonoTableInfo *tables = image->tables; @@ -6087,7 +6327,7 @@ ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 t const char *ptr; MonoArray *res; - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; /* FIXME: Support other tables ? */ if (table != MONO_TABLE_STANDALONESIG) @@ -6104,7 +6344,9 @@ ves_icall_System_Reflection_Module_ResolveSignature (MonoImage *image, guint32 t ptr = mono_metadata_blob_heap (image, sig); len = mono_metadata_decode_blob_size (ptr, &ptr); - res = mono_array_new (mono_domain_get (), mono_defaults.byte_class, len); + res = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, len, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; memcpy (mono_array_addr (res, guint8, 0), ptr, len); return res; } @@ -6135,7 +6377,7 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon 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 '*': @@ -6173,7 +6415,7 @@ ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, Mon 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; } @@ -6216,7 +6458,7 @@ ves_icall_Type_make_array_type (MonoReflectionType *type, int rank) 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); @@ -6224,7 +6466,7 @@ ves_icall_Type_make_array_type (MonoReflectionType *type, int rank) 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; } @@ -6238,12 +6480,15 @@ ves_icall_Type_make_byref_type (MonoReflectionType *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; + 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; } @@ -6257,14 +6502,16 @@ ves_icall_Type_MakePointerType (MonoReflectionType *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; 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; } @@ -6280,7 +6527,8 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon 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 */ @@ -6292,12 +6540,18 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon } if (mono_security_core_clr_enabled ()) { - if (!mono_security_core_clr_ensure_delegate_creation (method, throwOnBindFailure)) + if (!mono_security_core_clr_ensure_delegate_creation (method, &error)) { + if (throwOnBindFailure) + mono_error_set_pending_exception (&error); + else + mono_error_cleanup (&error); return NULL; + } } 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 */ @@ -6305,8 +6559,10 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon } else { if (target && method->flags & METHOD_ATTRIBUTE_VIRTUAL && method->klass != mono_object_class (target)) method = mono_object_get_virtual_method (target, method); - func = mono_create_ftnptr (mono_domain_get (), - mono_runtime_create_jump_trampoline (mono_domain_get (), method, TRUE)); + gpointer trampoline = mono_runtime_create_jump_trampoline (mono_domain_get (), method, TRUE, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; + func = mono_create_ftnptr (mono_domain_get (), trampoline); } mono_delegate_ctor_with_method (delegate, target, func, method); @@ -6323,7 +6579,9 @@ ves_icall_System_Delegate_AllocDelegateLike_internal (MonoDelegate *delegate) 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; @@ -6335,7 +6593,7 @@ ves_icall_System_Delegate_GetVirtualMethod_internal (MonoDelegate *delegate) 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; } @@ -6445,7 +6703,9 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this_obj, MonoStri 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); @@ -6459,7 +6719,11 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this_obj, MonoStri return NULL; } - tp->custom_type_info = (mono_object_isinst (this_obj, mono_defaults.iremotingtypeinfo_class) != NULL); + tp->custom_type_info = (mono_object_isinst_checked (this_obj, mono_defaults.iremotingtypeinfo_class, &error) != NULL); + if (!is_ok (&error)) { + mono_error_set_pending_exception (&error); + return NULL; + } tp->remote_class = mono_remote_class (domain, class_name, klass, &error); if (!is_ok (&error)) { mono_error_set_pending_exception (&error); @@ -6475,7 +6739,7 @@ ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp) { 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; } @@ -6506,7 +6770,7 @@ ves_icall_System_Environment_get_MachineName (void) 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); @@ -6633,10 +6897,20 @@ char **environ; #endif #endif +ICALL_EXPORT MonoArray * +ves_icall_System_Environment_GetCoomandLineArgs (void) +{ + MonoError error; + MonoArray *result = mono_runtime_get_main_args_checked (&error); + mono_error_set_pending_exception (&error); + return result; +} + ICALL_EXPORT MonoArray * ves_icall_System_Environment_GetEnvironmentVariableNames (void) { #ifdef HOST_WIN32 + MonoError error; MonoArray *names; MonoDomain *domain; MonoString *str; @@ -6660,7 +6934,9 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) } domain = mono_domain_get (); - names = mono_array_new (domain, mono_defaults.string_class, n); + names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; if (env_strings) { n = 0; @@ -6672,7 +6948,9 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) 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++; } @@ -6687,6 +6965,7 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) return names; #else + MonoError error; MonoArray *names; MonoDomain *domain; MonoString *str; @@ -6698,7 +6977,9 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) ++ n; domain = mono_domain_get (); - names = mono_array_new (domain, mono_defaults.string_class, n); + names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; n = 0; for (e = environ; *e != 0; ++ e) { @@ -6816,7 +7097,7 @@ ves_icall_System_Environment_GetWindowsFolderPath (int folder) ++ 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 @@ -6861,18 +7142,24 @@ ves_icall_System_Environment_GetLogicalDrives (void) } while (*dname); dname = ptr; - result = mono_array_new (domain, mono_defaults.string_class, ndrives); + result = mono_array_new_checked (domain, mono_defaults.string_class, ndrives, &error); + if (mono_error_set_pending_exception (&error)) + goto leave; + ndrives = 0; do { len = 0; 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)) + goto leave; + mono_array_setref (result, ndrives++, drivestr); while (*dname++); } while (*dname); +leave: if (ptr != buf) g_free (ptr); @@ -6991,6 +7278,14 @@ ves_icall_System_Environment_BroadcastSettingChange (void) #endif } +ICALL_EXPORT +gint32 +ves_icall_System_Environment_get_TickCount (void) +{ + /* this will overflow after ~24 days */ + return (gint32) (mono_msec_boottime () & 0xffffffff); +} + ICALL_EXPORT gint32 ves_icall_System_Runtime_Versioning_VersioningHelper_GetRuntimeId (void) { @@ -7036,7 +7331,8 @@ ves_icall_Remoting_RemotingServices_GetVirtualMethod ( 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; @@ -7072,7 +7368,7 @@ ves_icall_Remoting_RemotingServices_GetVirtualMethod ( 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; } @@ -7114,7 +7410,8 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas 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")); @@ -7123,7 +7420,9 @@ ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClas if (klass->rank >= 1) { g_assert (klass->rank == 1); - return (MonoObject *) mono_array_new (domain, klass->element_class, 0); + ret = (MonoObject *) mono_array_new_checked (domain, klass->element_class, 0, &error); + mono_error_set_pending_exception (&error); + return ret; } else { MonoVTable *vtable = mono_class_vtable_full (domain, klass, &error); if (!is_ok (&error)) { @@ -7358,14 +7657,15 @@ ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type) 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; } @@ -7426,7 +7726,6 @@ ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definiti */ 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); @@ -7496,7 +7795,7 @@ ves_icall_MonoMethod_get_base_method (MonoReflectionMethod *m, gboolean definiti 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; } @@ -7695,7 +7994,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod * MonoError error; prelink_method (method->method, &error); - mono_error_raise_exception (&error); + mono_error_set_pending_exception (&error); } ICALL_EXPORT void @@ -7707,11 +8006,13 @@ ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType 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; } } @@ -7750,7 +8051,8 @@ type_array_from_modifiers (MonoImage *image, MonoType *type, int optional, MonoE } if (!count) return NULL; - res = mono_array_new (mono_domain_get (), mono_defaults.systemtype_class, count); + res = mono_array_new_checked (mono_domain_get (), mono_defaults.systemtype_class, count, error); + return_val_if_nok (error, NULL); count = 0; for (i = 0; i < type->num_mods; ++i) { if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) { @@ -7806,7 +8108,7 @@ ves_icall_ParameterInfo_GetTypeModifiers (MonoReflectionParameter *param, MonoBo 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; } @@ -7835,7 +8137,7 @@ ves_icall_MonoPropertyInfo_GetTypeModifiers (MonoReflectionProperty *property, M 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; } @@ -7898,7 +8200,8 @@ custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type) 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)) { @@ -7922,7 +8225,8 @@ custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type) 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); @@ -7931,12 +8235,7 @@ custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type) 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* @@ -7977,26 +8276,13 @@ ves_icall_System_ComponentModel_Win32Exception_W32ErrorMessage (guint32 code) 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; } -ICALL_EXPORT int -ves_icall_System_StackFrame_GetILOffsetFromFile (MonoString *path, guint32 method_token, guint32 method_index, int native_offset) -{ - guint32 il_offset; - char *path_str = mono_string_to_utf8 (path); - - if (!mono_seq_point_data_get_il_offset (path_str, method_token, method_index, native_offset, &il_offset)) - il_offset = -1; - - g_free (path_str); - - return il_offset; -} - ICALL_EXPORT gpointer ves_icall_Microsoft_Win32_NativeMethods_GetCurrentProcess (void) {