Introduce mono_class_from_name_case_checked
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 9 Sep 2014 03:18:20 +0000 (23:18 -0400)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 9 Sep 2014 20:34:53 +0000 (16:34 -0400)
mono/metadata/class-internals.h
mono/metadata/class.c
mono/metadata/reflection.c

index 766488983b26dd94382cdfd6e70668c86c27728c..32b5ef4561ef6d3ac52cbb93f3fdf3c48f2ebb56 100644 (file)
@@ -1391,4 +1391,7 @@ mono_class_get_checked (MonoImage *image, guint32 type_token, MonoError *error)
 MonoClass *
 mono_class_get_and_inflate_typespec_checked (MonoImage *image, guint32 type_token, MonoGenericContext *context, MonoError *error) MONO_INTERNAL;
 
+MonoClass *
+mono_class_from_name_case_checked (MonoImage *image, const char* name_space, const char *name, MonoError *error) MONO_INTERNAL;
+
 #endif /* __MONO_METADATA_CLASS_INTERBALS_H__ */
index 98efd9c20219604c69b5f3c6782e4fd3c4c39b96..ec4c2285739f19cd17821f8b1beba25a2f6c966f 100644 (file)
@@ -7419,6 +7419,7 @@ find_nocase (gpointer key, gpointer value, gpointer user_data)
  * @image: The MonoImage where the type is looked up in
  * @name_space: the type namespace
  * @name: the type short name.
+ * @deprecated: use the _checked variant
  *
  * Obtains a MonoClass with a given namespace and a given name which
  * is located in the given MonoImage.   The namespace and name
@@ -7426,6 +7427,15 @@ find_nocase (gpointer key, gpointer value, gpointer user_data)
  */
 MonoClass *
 mono_class_from_name_case (MonoImage *image, const char* name_space, const char *name)
+{
+       MonoError error;
+       MonoClass *res = mono_class_from_name_case_checked (image, name_space, name, &error);
+       g_assert (!mono_error_ok (&error));
+       return res;
+}
+
+MonoClass *
+mono_class_from_name_case_checked (MonoImage *image, const char* name_space, const char *name, MonoError *error)
 {
        MonoTableInfo  *t = &image->tables [MONO_TABLE_TYPEDEF];
        guint32 cols [MONO_TYPEDEF_SIZE];
@@ -7433,6 +7443,8 @@ mono_class_from_name_case (MonoImage *image, const char* name_space, const char
        const char *nspace;
        guint32 i, visib;
 
+       mono_error_init (error);
+
        if (image_is_dynamic (image)) {
                guint32 token = 0;
                FindUserData user_data;
@@ -7461,7 +7473,7 @@ mono_class_from_name_case (MonoImage *image, const char* name_space, const char
                mono_image_unlock (image);
                
                if (token)
-                       return mono_class_get (image, MONO_TOKEN_TYPE_DEF | token);
+                       return mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | token, error);
                else
                        return NULL;
 
@@ -7480,7 +7492,7 @@ mono_class_from_name_case (MonoImage *image, const char* name_space, const char
                n = mono_metadata_string_heap (image, cols [MONO_TYPEDEF_NAME]);
                nspace = mono_metadata_string_heap (image, cols [MONO_TYPEDEF_NAMESPACE]);
                if (mono_utf8_strcasecmp (n, name) == 0 && mono_utf8_strcasecmp (nspace, name_space) == 0)
-                       return mono_class_get (image, MONO_TOKEN_TYPE_DEF | i);
+                       return mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | i, error);
        }
        return NULL;
 }
index 3691da1b5dd352a2173e44a17c0c5f1ab48fab97..1c7ac49f5849bafb1d464ecbdaaf81022eea9ee3 100644 (file)
@@ -7487,10 +7487,13 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
        if (!image)
                image = mono_defaults.corlib;
 
-       if (ignorecase)
-               klass = mono_class_from_name_case (image, info->name_space, info->name);
-       else
+       if (ignorecase) {
+               MonoError error;
+               klass = mono_class_from_name_case_checked (image, info->name_space, info->name, &error);
+               g_assert (mono_error_ok (&error)); /* FIXME Don't swallow the error */
+       } else {
                klass = mono_class_from_name (image, info->name_space, info->name);
+       }
        if (!klass)
                return NULL;
        for (mod = info->nested; mod; mod = mod->next) {