Fixes process names trimmed to 15 chars.
[mono.git] / mono / metadata / reflection.c
index 8315975c439311ce087055ecfb0a29b1827facb2..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)
 {
@@ -1765,11 +1797,11 @@ static guint32
 encode_constant (MonoDynamicImage *assembly, MonoObject *val, guint32 *ret_type) {
        char blob_size [64];
        char *b = blob_size;
-       char *p, *box_val;
+       char *box_val;
        char* buf;
        guint32 idx = 0, len = 0, dummy = 0;
 
-       p = buf = g_malloc (64);
+       buf = g_malloc (64);
        if (!val) {
                *ret_type = MONO_TYPE_CLASS;
                len = 4;
@@ -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;
 }
 
@@ -2773,7 +2805,6 @@ mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFi
        guint32 token;
        MonoClass *klass;
        MonoGenericClass *gclass;
-       MonoDynamicGenericClass *dgclass;
        MonoType *type;
        char *name;
 
@@ -2786,7 +2817,6 @@ mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFi
                klass = mono_class_from_mono_type (type);
                gclass = type->data.generic_class;
                g_assert (gclass->is_dynamic);
-               dgclass = (MonoDynamicGenericClass *) gclass;
 
                name = mono_string_to_utf8 (fb->name);
                token = mono_image_get_memberref_token (assembly, &klass->byval_arg, name, 
@@ -2826,7 +2856,6 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
 
        if (is_sre_ctor_builder (mono_object_class (c->cb))) {
                MonoReflectionCtorBuilder *cb = (MonoReflectionCtorBuilder *)c->cb;
-               MonoDynamicGenericClass *dgclass;
                ReflectionMethodBuilder rmb;
                char *name;
 
@@ -2835,7 +2864,6 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
 
                gclass = type->data.generic_class;
                g_assert (gclass->is_dynamic);
-               dgclass = (MonoDynamicGenericClass *) gclass;
 
                reflection_methodbuilder_from_ctor_builder (&rmb, cb);
 
@@ -3195,7 +3223,6 @@ static guint32
 mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb)
 {
        MonoDynamicTable *table;
-       MonoClass *klass;
        MonoType *custom = NULL, *type;
        guint32 *values;
        guint32 token, pclass, parent, sig;
@@ -3205,7 +3232,8 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
        if (token)
                return token;
 
-       klass = mono_class_from_mono_type (mono_reflection_type_get_handle (fb->typeb));
+       /* FIXME: is this call necessary? */
+       mono_class_from_mono_type (mono_reflection_type_get_handle (fb->typeb));
        name = mono_string_to_utf8 (fb->name);
 
        /*FIXME this is one more layer of ugliness due how types are created.*/
@@ -3248,7 +3276,6 @@ mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigH
 {
        SigBuffer buf;
        guint32 nargs;
-       guint32 size;
        guint32 i, idx;
 
        if (!assembly->save)
@@ -3262,8 +3289,6 @@ mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigH
        else
                nargs = 0;
 
-       size = 10 + (nargs * 10);
-       
        sigbuffer_init (&buf, 32);
 
        /* Encode calling convention */
@@ -4770,8 +4795,6 @@ mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str)
        char buf [16];
        char *b = buf;
        
-       MONO_ARCH_SAVE_REGS;
-
        if (!module->dynamic_image)
                mono_image_module_basic_init (module);
 
@@ -4797,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;
 }
@@ -4897,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;
 }
 
@@ -5068,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*
@@ -5289,8 +5316,6 @@ mono_image_basic_init (MonoReflectionAssemblyBuilder *assemblyb)
        MonoDynamicImage *image;
        MonoDomain *domain = mono_object_domain (assemblyb);
        
-       MONO_ARCH_SAVE_REGS;
-
        if (assemblyb->dynamic_assembly)
                return;
 
@@ -6384,14 +6409,15 @@ verify_safe_for_managed_space (MonoType *type)
                for (i = 0; i < inst->type_argc; ++i)
                        if (!verify_safe_for_managed_space (inst->type_argv [i]))
                                return FALSE;
-               break;
+               return TRUE;
        }
 #endif
        case MONO_TYPE_VAR:
        case MONO_TYPE_MVAR:
                return TRUE;
+       default:
+               return TRUE;
        }
-       return TRUE;
 }
 
 static MonoType*
@@ -7494,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);
@@ -8275,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 */
@@ -8715,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];
 
@@ -8734,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) {
@@ -8748,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);
@@ -8764,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);
 
@@ -9890,8 +9921,6 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj
        char *buffer, *p;
        guint32 buflen, i;
 
-       MONO_ARCH_SAVE_REGS;
-
        if (strcmp (ctor->vtable->klass->name, "MonoCMethod")) {
                /* sig is freed later so allocate it in the heap */
                sig = ctor_builder_to_signature (NULL, (MonoReflectionCtorBuilder*)ctor);
@@ -9969,8 +9998,6 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
        MonoError error;
        MonoClass *klass, *parent;
 
-       MONO_ARCH_SAVE_REGS;
-
        RESOLVE_TYPE (tb->parent);
 
        mono_loader_lock ();
@@ -10037,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);
@@ -10108,8 +10134,6 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
        MonoClass *klass;
        int count, i;
 
-       MONO_ARCH_SAVE_REGS;
-
        klass = mono_class_from_mono_type (tb->type.type);
 
        count = tb->generic_params ? mono_array_length (tb->generic_params) : 0;
@@ -10153,8 +10177,6 @@ mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb)
 {
        MonoClass *klass;
 
-       MONO_ARCH_SAVE_REGS;
-
        klass = mono_class_from_mono_type (tb->type.type);
 
        mono_loader_lock ();
@@ -10637,13 +10659,10 @@ mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc
        MonoClass *klass;
        MonoReflectionTypeBuilder *tb = NULL;
        gboolean is_dynamic = FALSE;
-       MonoDomain *domain;
        MonoClass *geninst;
 
        mono_loader_lock ();
 
-       domain = mono_object_domain (type);
-
        if (is_sre_type_builder (mono_object_class (type))) {
                tb = (MonoReflectionTypeBuilder *) type;
 
@@ -10707,8 +10726,6 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        MonoType **type_argv;
        int count, i;
 
-       MONO_ARCH_SAVE_REGS;
-
        /*FIXME but this no longer should happen*/
        if (!strcmp (rmethod->object.vtable->klass->name, "MethodBuilder")) {
 #ifndef DISABLE_REFLECTION_EMIT
@@ -10862,8 +10879,6 @@ mono_reflection_generic_class_initialize (MonoReflectionGenericClass *type, Mono
        MonoType *gtype;
        int i;
 
-       MONO_ARCH_SAVE_REGS;
-
        gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type);
        klass = mono_class_from_mono_type (gtype);
        g_assert (gtype->type == MONO_TYPE_GENERICINST);
@@ -11437,8 +11452,6 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb)
        MonoReflectionType* res;
        int i, j;
 
-       MONO_ARCH_SAVE_REGS;
-
        domain = mono_object_domain (tb);
        klass = mono_class_from_mono_type (tb->type.type);
 
@@ -11615,8 +11628,6 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
        MonoClass *pklass;
        MonoError error;
 
-       MONO_ARCH_SAVE_REGS;
-
        image = &gparam->tbuilder->module->dynamic_image->image;
 
        param = mono_image_new0 (image, MonoGenericParamFull, 1);
@@ -11852,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 *
@@ -11889,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);