[reflection] Use MonoError for mono_custom_attrs_from_field
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 25 Feb 2016 21:58:01 +0000 (16:58 -0500)
committerAleksey Kliger <aleksey@xamarin.com>
Mon, 29 Feb 2016 16:16:29 +0000 (11:16 -0500)
Mark it external only.  Runtime should use mono_custom_attrs_from_field_checked.

mono/metadata/object.c
mono/metadata/reflection-internals.h
mono/metadata/reflection.c
mono/metadata/reflection.h
mono/mini/debugger-agent.c

index eef91fc09fa35f7d48227021e3ec9300ba89dd53..623cccef8552dfb34d3c0ebf826b9a787eb93f6a 100644 (file)
@@ -1046,9 +1046,11 @@ field_is_special_static (MonoClass *fklass, MonoClassField *field)
 {
        MONO_REQ_GC_NEUTRAL_MODE;
 
+       MonoError error;
        MonoCustomAttrInfo *ainfo;
        int i;
-       ainfo = mono_custom_attrs_from_field (fklass, field);
+       ainfo = mono_custom_attrs_from_field_checked (fklass, field, &error);
+       mono_error_cleanup (&error); /* FIXME don't swallow the error? */
        if (!ainfo)
                return FALSE;
        for (i = 0; i < ainfo->num_attrs; ++i) {
index fdb51276890b919eceb9756e368ddf0671e9cbd0..41d249206bb49ad7cc985ea5984aaa2cbe42927d 100644 (file)
@@ -29,6 +29,8 @@ MonoCustomAttrInfo*
 mono_custom_attrs_from_property_checked        (MonoClass *klass, MonoProperty *property, MonoError *error);
 MonoCustomAttrInfo*
 mono_custom_attrs_from_event_checked   (MonoClass *klass, MonoEvent *event, MonoError *error);
+MonoCustomAttrInfo*
+mono_custom_attrs_from_field_checked   (MonoClass *klass, MonoClassField *field, MonoError *error);
 
 
 char*
index eba4885f60abdebbf26fd7a845861508d5a674f7..26a8c06bd46714894ba8bf7dddd4593d4c6dcc6d 100644 (file)
@@ -9739,7 +9739,17 @@ MonoCustomAttrInfo*
 mono_custom_attrs_from_field (MonoClass *klass, MonoClassField *field)
 {
        MonoError error;
+       MonoCustomAttrInfo * result = mono_custom_attrs_from_field_checked (klass, field, &error);
+       mono_error_cleanup (&error); /* FIXME want a better API that doesn't swallow the error */
+       return result;
+}
+
+MonoCustomAttrInfo*
+mono_custom_attrs_from_field_checked (MonoClass *klass, MonoClassField *field, MonoError *error)
+{
        guint32 idx;
+       mono_error_init (error);
+
        if (image_is_dynamic (klass->image)) {
                field = mono_metadata_get_corresponding_field_from_generic_type_definition (field);
                return lookup_custom_attr (klass->image, field);
@@ -9747,12 +9757,7 @@ mono_custom_attrs_from_field (MonoClass *klass, MonoClassField *field)
        idx = find_field_index (klass, field);
        idx <<= MONO_CUSTOM_ATTR_BITS;
        idx |= MONO_CUSTOM_ATTR_FIELDDEF;
-       MonoCustomAttrInfo * result = mono_custom_attrs_from_index_checked (klass->image, idx, &error);
-       if (!is_ok (&error)) {
-               mono_loader_set_error_from_mono_error (&error); /* FIXME don't set loader error here */
-               return NULL;
-       }
-       return result;
+       return mono_custom_attrs_from_index_checked (klass->image, idx, error);
 }
 
 /**
@@ -9947,7 +9952,8 @@ mono_reflection_get_custom_attrs_info_checked (MonoObject *obj, MonoError *error
                return_val_if_nok (error, NULL);
        } else if (strcmp ("MonoField", klass->name) == 0) {
                MonoReflectionField *rfield = (MonoReflectionField*)obj;
-               cinfo = mono_custom_attrs_from_field (rfield->field->parent, rfield->field);
+               cinfo = mono_custom_attrs_from_field_checked (rfield->field->parent, rfield->field, error);
+               return_val_if_nok (error, NULL);
        } else if ((strcmp ("MonoMethod", klass->name) == 0) || (strcmp ("MonoCMethod", klass->name) == 0)) {
                MonoReflectionMethod *rmethod = (MonoReflectionMethod*)obj;
                cinfo = mono_custom_attrs_from_method_checked (rmethod->method, error);
index 4e8ffae7758fefa782acf27cc2d5ea726f05377e..1cf62e837f26806574316ae15c9756df99f56b93 100644 (file)
@@ -90,6 +90,7 @@ MONO_RT_EXTERNAL_ONLY
 MONO_API MonoCustomAttrInfo* mono_custom_attrs_from_property (MonoClass *klass, MonoProperty *property);
 MONO_RT_EXTERNAL_ONLY
 MONO_API MonoCustomAttrInfo* mono_custom_attrs_from_event    (MonoClass *klass, MonoEvent *event);
+MONO_RT_EXTERNAL_ONLY
 MONO_API MonoCustomAttrInfo* mono_custom_attrs_from_field    (MonoClass *klass, MonoClassField *field);
 MONO_API MonoCustomAttrInfo* mono_custom_attrs_from_param    (MonoMethod *method, uint32_t param);
 MONO_API mono_bool           mono_custom_attrs_has_attr      (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass);
index 26b43f79deedca83fd941831472c839b56be9260..65c381bfad082d1e8fa08671d0fbef0fb5a0c4c8 100644 (file)
@@ -8056,7 +8056,11 @@ type_commands_internal (int command, MonoClass *klass, MonoDomain *domain, guint
                if (err != ERR_NONE)
                        return err;
 
-               cinfo = mono_custom_attrs_from_field (klass, field);
+               cinfo = mono_custom_attrs_from_field_checked (klass, field, &error);
+               if (!is_ok (&error)) {
+                       mono_error_cleanup (&error); /* FIXME don't swallow the error message */
+                       return ERR_LOADER_ERROR;
+               }
 
                err = buffer_add_cattrs (buf, domain, klass->image, attr_klass, cinfo);
                if (err != ERR_NONE)