Fixes process names trimmed to 15 chars.
[mono.git] / mono / metadata / reflection.c
index b82a3c23e59fbac10149d110ad67950d24674792..096db3127ae0586e894e39196b9f2b367716450d 100644 (file)
@@ -220,6 +220,38 @@ mono_reflection_init (void)
 {
 }
 
+static inline void
+dynamic_image_lock (MonoDynamicImage *image)
+{
+       mono_image_lock ((MonoImage*)image);
+}
+
+static inline void
+dynamic_image_unlock (MonoDynamicImage *image)
+{
+       mono_image_unlock ((MonoImage*)image);
+}
+
+static void
+register_dyn_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj)
+{
+       dynamic_image_lock (assembly);
+       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
+       dynamic_image_unlock (assembly);
+}
+
+static MonoObject*
+lookup_dyn_token (MonoDynamicImage *assembly, guint32 token)
+{
+       MonoObject *obj;
+
+       dynamic_image_lock (assembly);
+       obj = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+       dynamic_image_unlock (assembly);
+
+       return obj;
+}
+
 static void
 sigbuffer_init (SigBuffer *buf, int size)
 {
@@ -2382,7 +2414,7 @@ mono_image_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboo
                        (type->type != MONO_TYPE_MVAR)) {
                MonoReflectionTypeBuilder *tb = mono_class_get_ref_info (klass);
                token = MONO_TYPEDEFORREF_TYPEDEF | (tb->table_idx << MONO_TYPEDEFORREF_BITS);
-               mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), mono_class_get_ref_info (klass));
+               register_dyn_token (assembly, token, mono_class_get_ref_info (klass));
                return token;
        }
 
@@ -2405,7 +2437,7 @@ mono_image_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboo
        token = MONO_TYPEDEFORREF_TYPEREF | (table->next_idx << MONO_TYPEDEFORREF_BITS); /* typeref */
        g_hash_table_insert (assembly->typeref, type, GUINT_TO_POINTER(token));
        table->next_idx ++;
-       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), mono_class_get_ref_info (klass));
+       register_dyn_token (assembly, token, mono_class_get_ref_info (klass));
        return token;
 }
 
@@ -4788,7 +4820,7 @@ mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str)
                idx = assembly->us.index ++;
        }
 
-       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (MONO_TOKEN_STRING | idx), str);
+       register_dyn_token (assembly, MONO_TOKEN_STRING | idx, (MonoObject*)str);
 
        return MONO_TOKEN_STRING | idx;
 }
@@ -4888,7 +4920,7 @@ mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, Mon
        }
 
        g_hash_table_insert (assembly->vararg_aux_hash, GUINT_TO_POINTER (token), sig);
-       mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
+       register_dyn_token (assembly, token, obj);
        return token;
 }
 
@@ -5059,13 +5091,17 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj,
 void
 mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj)
 {
-       MonoObject *prev = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+       MonoObject *prev;
+
+       dynamic_image_lock (assembly);
+       prev = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
        if (prev) {
                /* There could be multiple MethodInfo objects with the same token */
                //g_assert (prev == obj);
        } else {
                mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
        }
+       dynamic_image_unlock (assembly);
 }
 
 static MonoDynamicImage*
@@ -7484,6 +7520,9 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT
        if (!image)
                image = mono_defaults.corlib;
 
+       if (!rootimage)
+               rootimage = mono_defaults.corlib;
+
        if (ignorecase) {
                MonoError error;
                klass = mono_class_from_name_case_checked (image, info->name_space, info->name, &error);
@@ -8265,7 +8304,7 @@ create_custom_attr (MonoImage *image, MonoMethod *method, const guchar *data, gu
                memset (params, 0, sizeof (void*) * sig->param_count);
        } else {
                /* Allocate using GC so it gets GC tracking */
-               params = mono_gc_alloc_fixed (sig->param_count * sizeof (void*), NULL);
+               params = mono_gc_alloc_fixed (sig->param_count * sizeof (void*), MONO_GC_DESCRIPTOR_NULL);
        }
 
        /* skip prolog */
@@ -8705,6 +8744,7 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
        MonoCustomAttrInfo *ainfo;
        GList *tmp, *list = NULL;
        const char *data;
+       MonoCustomAttrEntry* attr;
 
        ca = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
 
@@ -8724,7 +8764,7 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
        ainfo = g_malloc0 (MONO_SIZEOF_CUSTOM_ATTR_INFO + sizeof (MonoCustomAttrEntry) * len);
        ainfo->num_attrs = len;
        ainfo->image = image;
-       for (i = 0, tmp = list; i < len; ++i, tmp = tmp->next) {
+       for (i = len, tmp = list; i != 0; --i, tmp = tmp->next) {
                mono_metadata_decode_row (ca, GPOINTER_TO_UINT (tmp->data), cols, MONO_CUSTOM_ATTR_SIZE);
                mtoken = cols [MONO_CUSTOM_ATTR_TYPE] >> MONO_CUSTOM_ATTR_TYPE_BITS;
                switch (cols [MONO_CUSTOM_ATTR_TYPE] & MONO_CUSTOM_ATTR_TYPE_MASK) {
@@ -8738,8 +8778,9 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
                        g_error ("Unknown table for custom attr type %08x", cols [MONO_CUSTOM_ATTR_TYPE]);
                        break;
                }
-               ainfo->attrs [i].ctor = mono_get_method (image, mtoken, NULL);
-               if (!ainfo->attrs [i].ctor) {
+               attr = &ainfo->attrs [i - 1];
+               attr->ctor = mono_get_method (image, mtoken, NULL);
+               if (!attr->ctor) {
                        g_warning ("Can't find custom attr constructor image: %s mtoken: 0x%08x", image->name, mtoken);
                        g_list_free (list);
                        g_free (ainfo);
@@ -8754,8 +8795,8 @@ mono_custom_attrs_from_index (MonoImage *image, guint32 idx)
                        return NULL;
                }
                data = mono_metadata_blob_heap (image, cols [MONO_CUSTOM_ATTR_VALUE]);
-               ainfo->attrs [i].data_size = mono_metadata_decode_value (data, &data);
-               ainfo->attrs [i].data = (guchar*)data;
+               attr->data_size = mono_metadata_decode_value (data, &data);
+               attr->data = (guchar*)data;
        }
        g_list_free (list);
 
@@ -10023,8 +10064,7 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
                g_assert (mono_class_get_ref_info (klass) == tb);
        }
 
-       mono_g_hash_table_insert (tb->module->dynamic_image->tokens,
-               GUINT_TO_POINTER (MONO_TOKEN_TYPE_DEF | tb->table_idx), tb);
+       register_dyn_token (tb->module->dynamic_image, MONO_TOKEN_TYPE_DEF | tb->table_idx, (MonoObject*)tb);
 
        if (parent != NULL) {
                mono_class_setup_parent (klass, parent);
@@ -11823,7 +11863,7 @@ mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *mb)
 gboolean
 mono_reflection_is_valid_dynamic_token (MonoDynamicImage *image, guint32 token)
 {
-       return mono_g_hash_table_lookup (image->tokens, GUINT_TO_POINTER (token)) != NULL;
+       return lookup_dyn_token (image, token) != NULL;
 }
 
 MonoMethodSignature *
@@ -11860,9 +11900,7 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean
        MonoObject *obj;
        MonoClass *klass;
 
-       mono_loader_lock ();
-       obj = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
-       mono_loader_unlock ();
+       obj = lookup_dyn_token (assembly, token);
        if (!obj) {
                if (valid_token)
                        g_error ("Could not find required dynamic token 0x%08x", token);