Merge pull request #2651 from akoeplinger/dmcs-warning
[mono.git] / mono / metadata / metadata.c
index 3e0316df9d4510bad94fde925574ed4c5f1629b0..7ff64f517ac012a0464202bbb8fb5ff84f0fc457 100644 (file)
@@ -1355,11 +1355,10 @@ mono_metadata_parse_array_internal (MonoImage *m, MonoGenericContainer *containe
 }
 
 MonoArrayType *
-mono_metadata_parse_array_full (MonoImage *m, MonoGenericContainer *container,
-                                                               const char *ptr, const char **rptr)
+mono_metadata_parse_array (MonoImage *m, const char *ptr, const char **rptr)
 {
        MonoError error;
-       MonoArrayType *ret = mono_metadata_parse_array_internal (m, container, FALSE, ptr, rptr, &error);
+       MonoArrayType *ret = mono_metadata_parse_array_internal (m, NULL, FALSE, ptr, rptr, &error);
        if (!ret) {
                mono_loader_set_error_from_mono_error (&error);
                mono_error_cleanup (&error); /*FIXME don't swallow the error message*/
@@ -1367,12 +1366,6 @@ mono_metadata_parse_array_full (MonoImage *m, MonoGenericContainer *container,
        return ret;
 }
 
-MonoArrayType *
-mono_metadata_parse_array (MonoImage *m, const char *ptr, const char **rptr)
-{
-       return mono_metadata_parse_array_full (m, NULL, ptr, rptr);
-}
-
 /*
  * mono_metadata_free_array:
  * @array: array description
@@ -1608,9 +1601,8 @@ mono_metadata_cleanup (void)
  */
 static MonoType*
 mono_metadata_parse_type_internal (MonoImage *m, MonoGenericContainer *container,
-                                                                  short opt_attrs, gboolean transient, const char *ptr, const char **rptr)
+                                                                  short opt_attrs, gboolean transient, const char *ptr, const char **rptr, MonoError *error)
 {
-       MonoError error;
        MonoType *type, *cached;
        MonoType stype;
        gboolean byref = FALSE;
@@ -1619,6 +1611,8 @@ mono_metadata_parse_type_internal (MonoImage *m, MonoGenericContainer *container
        int count = 0; // Number of mod arguments
        gboolean found;
 
+       mono_error_init (error);
+
        /*
         * According to the spec, custom modifiers should come before the byref
         * flag, but the IL produced by ilasm from the following signature:
@@ -1656,8 +1650,10 @@ mono_metadata_parse_type_internal (MonoImage *m, MonoGenericContainer *container
                size = MONO_SIZEOF_TYPE + ((gint32)count) * sizeof (MonoCustomMod);
                type = transient ? (MonoType *)g_malloc0 (size) : (MonoType *)mono_image_alloc0 (m, size);
                type->num_mods = count;
-               if (count > 64)
-                       g_warning ("got more than 64 modifiers in type");
+               if (count > 64) {
+                       mono_error_set_bad_image (error, m, "Invalid type with more than 64 modifiers");
+                       return NULL;
+               }
        } else {     // The type is of standard size, so we can allocate it on the stack.
                type = &stype;
                memset (type, 0, MONO_SIZEOF_TYPE);
@@ -1690,11 +1686,8 @@ mono_metadata_parse_type_internal (MonoImage *m, MonoGenericContainer *container
        type->byref = byref;
        type->pinned = pinned ? 1 : 0;
 
-       if (!do_mono_metadata_parse_type (type, m, container, transient, ptr, &ptr, &error)) {
-               mono_loader_set_error_from_mono_error (&error);
-               mono_error_cleanup (&error); /*FIXME don't swallow the error message*/
+       if (!do_mono_metadata_parse_type (type, m, container, transient, ptr, &ptr, error))
                return NULL;
-       }
 
        if (rptr)
                *rptr = ptr;
@@ -1747,20 +1740,7 @@ MonoType*
 mono_metadata_parse_type_checked (MonoImage *m, MonoGenericContainer *container,
                                                           short opt_attrs, gboolean transient, const char *ptr, const char **rptr, MonoError *error)
 {
-       MonoType *ret;
-
-       mono_error_init (error);
-
-       ret = mono_metadata_parse_type_internal (m, container, opt_attrs, transient, ptr, rptr);
-
-       if (!ret) {
-               if (mono_loader_get_last_error ())
-                       mono_error_set_from_loader_error (error);
-               else
-                       mono_error_set_bad_image (error, m, "Could not parse type at %p due to unknown reasons", ptr);
-       }
-
-       return ret;
+       return mono_metadata_parse_type_internal (m, container, opt_attrs, transient, ptr, rptr, error);
 }
 
 
@@ -1768,7 +1748,15 @@ MonoType*
 mono_metadata_parse_type_full (MonoImage *m, MonoGenericContainer *container,
                                                           short opt_attrs, const char *ptr, const char **rptr)
 {
-       return mono_metadata_parse_type_internal (m, container, opt_attrs, FALSE, ptr, rptr);
+       MonoError error;
+       MonoType * type = mono_metadata_parse_type_internal (m, container, opt_attrs, FALSE, ptr, rptr, &error);
+       mono_loader_assert_no_error ();
+       if (!mono_error_ok (&error)) {
+               mono_loader_set_error_from_mono_error (&error);
+               mono_error_cleanup (&error);
+       }
+
+       return type;
 }
 
 /*
@@ -3764,8 +3752,13 @@ mono_metadata_parse_mh_full (MonoImage *m, MonoGenericContainer *container, cons
                mh = (MonoMethodHeader *)g_malloc0 (MONO_SIZEOF_METHOD_HEADER + len * sizeof (MonoType*) + num_clauses * sizeof (MonoExceptionClause));
                mh->num_locals = len;
                for (i = 0; i < len; ++i) {
-                       mh->locals [i] = mono_metadata_parse_type_internal (m, container,
-                                                                                                                               0, TRUE, locals_ptr, &locals_ptr);
+                       MonoError error;
+                       mh->locals [i] = mono_metadata_parse_type_internal (m, container, 0, TRUE, locals_ptr, &locals_ptr, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_loader_set_error_from_mono_error (&error);
+                               mono_error_cleanup (&error); /* FIXME don't swallow the error */
+                       }
+
                        if (!mh->locals [i])
                                goto fail;
                }
@@ -5901,7 +5894,7 @@ handle_enum:
                        *conv = MONO_MARSHAL_CONV_DEL_FTN;
                        return MONO_NATIVE_FUNC;
                }
-               if (mono_defaults.safehandle_class && type->data.klass == mono_defaults.safehandle_class){
+               if (mono_class_try_get_safehandle_class () && type->data.klass == mono_class_try_get_safehandle_class ()){
                        *conv = MONO_MARSHAL_CONV_SAFEHANDLE;
                        return MONO_NATIVE_INT;
                }