ICALL_EXPORT MonoReflectionMarshalAsAttribute*
ves_icall_System_Reflection_FieldInfo_get_marshal_info (MonoReflectionField *field)
{
+ MonoError error;
MonoClass *klass = field->field->parent;
MonoMarshalType *info;
MonoType *ftype;
if (info->fields [i].field == field->field) {
if (!info->fields [i].mspec)
return NULL;
- else
- return mono_reflection_marshal_as_attribute_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);
+ else {
+ MonoReflectionMarshalAsAttribute* obj;
+ obj = mono_reflection_marshal_as_attribute_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec, &error);
+ if (!mono_error_ok (&error))
+ mono_error_set_pending_exception (&error);
+ return obj;
+ }
}
}
ICALL_EXPORT MonoReflectionMarshalAsAttribute*
ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)
{
+ MonoError error;
MonoDomain *domain = mono_domain_get ();
MonoReflectionMarshalAsAttribute* res = NULL;
MonoMarshalSpec **mspecs;
mspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);
mono_method_get_marshal_info (method, mspecs);
- if (mspecs [0])
- res = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [0]);
+ if (mspecs [0]) {
+ res = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [0], &error);
+ if (!mono_error_ok (&error)) {
+ mono_error_set_pending_exception (&error);
+ return NULL;
+ }
+ }
for (i = mono_method_signature (method)->param_count; i >= 0; i--)
if (mspecs [i])
ICALL_EXPORT MonoArray*
ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
{
- MonoException *ex;
+ MonoError error;
MonoDomain *domain;
static MonoClass *System_Reflection_PropertyInfo;
MonoClass *startklass, *klass;
GHashTable *properties = NULL;
MonoPtrArray tmp_array;
+ mono_error_init (&error);
+
mono_ptr_array_init (tmp_array, 8, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection properties list"); /*This the average for ASP.NET types*/
if (!System_Reflection_PropertyInfo)
if (g_hash_table_lookup (properties, prop))
continue;
- mono_ptr_array_append (tmp_array, mono_property_get_object (domain, startklass, prop));
+ MonoReflectionProperty *pr = mono_property_get_object_checked (domain, startklass, prop, &error);
+ if (!pr)
+ goto failure;
+ mono_ptr_array_append (tmp_array, pr);
g_hash_table_insert (properties, prop, prop);
}
return res;
+
+
loader_error:
+ if (klass->exception_type != MONO_EXCEPTION_NONE) {
+ 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:
if (properties)
g_hash_table_destroy (properties);
if (name)
g_free (propname);
mono_ptr_array_destroy (tmp_array);
- if (klass->exception_type != MONO_EXCEPTION_NONE) {
- ex = mono_class_get_exception_for_failure (klass);
- } else {
- ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());
- mono_loader_clear_error ();
- }
- mono_set_pending_exception (ex);
+ mono_error_set_pending_exception (&error);
+
return NULL;
}
ICALL_EXPORT MonoArray*
ves_icall_Type_GetEvents_internal (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoReflectionType *reftype)
{
- MonoException *ex;
+ MonoError error;
MonoDomain *domain;
static MonoClass *System_Reflection_EventInfo;
MonoClass *startklass, *klass;
GHashTable *events = NULL;
MonoPtrArray tmp_array;
+ mono_error_init (&error);
+
mono_ptr_array_init (tmp_array, 4, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection events list");
if (!System_Reflection_EventInfo)
if (g_hash_table_lookup (events, event))
continue;
- mono_ptr_array_append (tmp_array, mono_event_get_object (domain, startklass, event));
+ MonoReflectionEvent *ev_obj;
+ ev_obj = mono_event_get_object_checked (domain, startklass, event, &error);
+ if (!ev_obj)
+ goto failure;
+ mono_ptr_array_append (tmp_array, ev_obj);
g_hash_table_insert (events, event, event);
}
return res;
loader_error:
- mono_ptr_array_destroy (tmp_array);
if (klass->exception_type != MONO_EXCEPTION_NONE) {
- ex = mono_class_get_exception_for_failure (klass);
+ mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass));
} else {
- ex = mono_loader_error_prepare_exception (mono_loader_get_last_error ());
+ mono_error_set_from_loader_error (&error);
mono_loader_clear_error ();
}
- mono_set_pending_exception (ex);
+
+failure:
+
+ if (events != NULL)
+ g_hash_table_destroy (events);
+ if (utf8_name != NULL)
+ g_free (utf8_name);
+
+ mono_ptr_array_destroy (tmp_array);
+
+ mono_error_set_pending_exception (&error);
return NULL;
}