[reflection] Do proper error handling in more cases.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 23 May 2014 18:10:47 +0000 (14:10 -0400)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 23 May 2014 21:34:29 +0000 (17:34 -0400)
Remove all internal usages of mono_custom_attrs_construct and replace with mono_custom_attrs_construct_by_type
that takes a MonoError.

Introduce mono_custom_attrs_get_attr_checked and replace usage of the old one where it's needed.

mono/metadata/Makefile.am.in
mono/metadata/cominterop.c
mono/metadata/marshal.c
mono/metadata/reflection-internals.h [new file with mode: 0644]
mono/metadata/reflection.c

index e5888c35ccfe9637e931578077ac0303e997a789..e4867a8a81a5dbb069d520cdbdd4983235a7e1c1 100644 (file)
@@ -190,7 +190,8 @@ common_sources = \
        threadpool-internals.h  \
        verify.c                \
        verify-internals.h      \
-       wrapper-types.h
+       wrapper-types.h \
+       reflection-internals.h
 
 # These source files have compile time dependencies on GC code
 gc_dependent_sources = \
index 76ef0ff6bc4946cb363718610033a4383f2d3e9a..19b624c3fb52087e312002b20826ea4208b8c02c 100644 (file)
@@ -20,6 +20,7 @@
 #include "metadata/tabledefs.h"
 #include "metadata/exception.h"
 #include "metadata/appdomain.h"
+#include "metadata/reflection-internals.h"
 #include "mono/metadata/debug-helpers.h"
 #include "mono/metadata/threadpool.h"
 #include "mono/metadata/threads.h"
@@ -285,7 +286,9 @@ cominterop_get_com_slot_begin (MonoClass* klass)
                interface_type_attribute = mono_class_from_name (mono_defaults.corlib, "System.Runtime.InteropServices", "InterfaceTypeAttribute");
        cinfo = mono_custom_attrs_from_class (klass);
        if (cinfo) {
-               itf_attr = (MonoInterfaceTypeAttribute*)mono_custom_attrs_get_attr (cinfo, interface_type_attribute);
+               MonoError error;
+               itf_attr = (MonoInterfaceTypeAttribute*)mono_custom_attrs_get_attr_checked (cinfo, interface_type_attribute, &error);
+               g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
                if (!cinfo->cached)
                        mono_custom_attrs_free (cinfo);
        }
@@ -392,7 +395,9 @@ cominterop_class_guid (MonoClass* klass, guint8* guid)
 
        cinfo = mono_custom_attrs_from_class (klass);   
        if (cinfo) {
-               MonoReflectionGuidAttribute *attr = (MonoReflectionGuidAttribute*)mono_custom_attrs_get_attr (cinfo, GuidAttribute);
+               MonoError error;
+               MonoReflectionGuidAttribute *attr = (MonoReflectionGuidAttribute*)mono_custom_attrs_get_attr_checked (cinfo, GuidAttribute, &error);
+               g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
 
                if (!attr)
                        return FALSE;
@@ -420,7 +425,9 @@ cominterop_com_visible (MonoClass* klass)
 
        cinfo = mono_custom_attrs_from_class (klass);
        if (cinfo) {
-               MonoReflectionComVisibleAttribute *attr = (MonoReflectionComVisibleAttribute*)mono_custom_attrs_get_attr (cinfo, ComVisibleAttribute);
+               MonoError error;
+               MonoReflectionComVisibleAttribute *attr = (MonoReflectionComVisibleAttribute*)mono_custom_attrs_get_attr_checked (cinfo, ComVisibleAttribute, &error);
+               g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
 
                if (attr)
                        visible = attr->visible;
@@ -2433,7 +2440,9 @@ cominterop_ccw_get_ids_of_names (MonoCCWInterface* ccwe, gpointer riid,
                if (method) {
                        cinfo = mono_custom_attrs_from_method (method);
                        if (cinfo) {
-                               MonoObject *result = mono_custom_attrs_get_attr (cinfo, ComDispIdAttribute);
+                               MonoError error;
+                               MonoObject *result = mono_custom_attrs_get_attr_checked (cinfo, ComDispIdAttribute, &error);
+                               g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/;
 
                                if (result)
                                        rgDispId[i] = *(gint32*)mono_object_unbox (result);
index 89332a04b45502e68e898bf920ead14fd7bda07e..8a8b6b8b512b3ade4dd00580152c020beae85bed 100644 (file)
@@ -35,6 +35,7 @@
 #include "mono/metadata/attrdefs.h"
 #include "mono/metadata/gc-internal.h"
 #include "mono/metadata/cominterop.h"
+#include "mono/metadata/reflection-internals.h"
 #include "mono/utils/mono-counters.h"
 #include "mono/utils/mono-tls.h"
 #include "mono/utils/mono-memory-model.h"
@@ -461,9 +462,15 @@ parse_unmanaged_function_pointer_attr (MonoClass *klass, MonoMethodPInvoke *piin
                 */
                cinfo = mono_custom_attrs_from_class (klass);
                if (cinfo && !mono_runtime_get_no_exec ()) {
-                       attr = (MonoReflectionUnmanagedFunctionPointerAttribute*)mono_custom_attrs_get_attr (cinfo, UnmanagedFunctionPointerAttribute);
+                       MonoError error;
+                       attr = (MonoReflectionUnmanagedFunctionPointerAttribute*)mono_custom_attrs_get_attr_checked (cinfo, UnmanagedFunctionPointerAttribute, &error);
                        if (attr) {
                                piinfo->piflags = (attr->call_conv << 8) | (attr->charset ? (attr->charset - 1) * 2 : 1) | attr->set_last_error;
+                       } else {
+                               if (!mono_error_ok (&error)) {
+                                       g_warning ("Could not load UnmanagedFunctionPointerAttribute due to %s", mono_error_get_message (&error));
+                                       mono_error_cleanup (&error);
+                               }
                        }
                        if (!cinfo->cached)
                                mono_custom_attrs_free (cinfo);
diff --git a/mono/metadata/reflection-internals.h b/mono/metadata/reflection-internals.h
new file mode 100644 (file)
index 0000000..4b32053
--- /dev/null
@@ -0,0 +1,14 @@
+/* 
+ * Copyright 2014 Xamarin Inc
+ */
+#ifndef __MONO_METADATA_REFLECTION_INTERBALS_H__
+#define __MONO_METADATA_REFLECTION_INTERBALS_H__
+
+#include <mono/metadata/reflection.h>
+#include <mono/utils/mono-compiler.h>
+#include <mono/utils/mono-error.h>
+
+MonoObject*
+mono_custom_attrs_get_attr_checked (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass, MonoError *error) MONO_INTERNAL;
+
+#endif
\ No newline at end of file
index 690c77043cb1d9363cf8ad239fd59aaeee38018c..9802343cc9bf1a483da7198f2acad7d5c58d8bc4 100644 (file)
@@ -12,7 +12,7 @@
 #include <config.h>
 #include "mono/utils/mono-digest.h"
 #include "mono/utils/mono-membar.h"
-#include "mono/metadata/reflection.h"
+#include "mono/metadata/reflection-internals.h"
 #include "mono/metadata/tabledefs.h"
 #include "mono/metadata/metadata-internals.h"
 #include <mono/metadata/profiler-private.h>
@@ -8522,8 +8522,10 @@ MonoArray*
 mono_custom_attrs_construct (MonoCustomAttrInfo *cinfo)
 {
        MonoError error;
+       MonoArray *result = mono_custom_attrs_construct_by_type (cinfo, NULL, &error);
+       g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
 
-       return mono_custom_attrs_construct_by_type (cinfo, NULL, &error);
+       return result;
 }
 
 static MonoArray*
@@ -8822,11 +8824,22 @@ mono_custom_attrs_has_attr (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass)
 
 MonoObject*
 mono_custom_attrs_get_attr (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass)
+{
+       MonoError error;
+       MonoObject *res = mono_custom_attrs_get_attr_checked (ainfo, attr_klass, &error);
+       g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
+       return res;
+}
+
+MonoObject*
+mono_custom_attrs_get_attr_checked (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass, MonoError *error)
 {
        int i, attr_index;
        MonoClass *klass;
        MonoArray *attrs;
 
+       mono_error_init (error);
+
        attr_index = -1;
        for (i = 0; i < ainfo->num_attrs; ++i) {
                klass = ainfo->attrs [i].ctor->klass;
@@ -8838,11 +8851,10 @@ mono_custom_attrs_get_attr (MonoCustomAttrInfo *ainfo, MonoClass *attr_klass)
        if (attr_index == -1)
                return NULL;
 
-       attrs = mono_custom_attrs_construct (ainfo);
-       if (attrs)
-               return mono_array_get (attrs, MonoObject*, attr_index);
-       else
+       attrs = mono_custom_attrs_construct_by_type (ainfo, NULL, error);
+       if (!mono_error_ok (error))
                return NULL;
+       return mono_array_get (attrs, MonoObject*, attr_index);
 }
 
 /*