Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / dynamic-image.c
index 9ea2bcf0ee5c5252c362d8b8106a623db82faa87..fb381452b5a6127d598d81f5602ca7a57742d8ed 100644 (file)
@@ -193,17 +193,33 @@ dynamic_image_unlock (MonoDynamicImage *image)
  * the Module.ResolveXXXToken () methods to work.
  */
 void
-mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObjectHandle obj)
+mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObjectHandle obj, int how_collide)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
+       g_assert (!MONO_HANDLE_IS_NULL (obj));
+       g_assert (strcmp (mono_handle_class (obj)->name, "EnumBuilder"));
        dynamic_image_lock (assembly);
+       MonoObject *prev = (MonoObject *)mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+       if (prev) {
+               switch (how_collide) {
+               case MONO_DYN_IMAGE_TOK_NEW:
+                       g_assert_not_reached ();
+               case MONO_DYN_IMAGE_TOK_SAME_OK:
+                       g_assert (prev == MONO_HANDLE_RAW (obj));
+                       break;
+               case MONO_DYN_IMAGE_TOK_REPLACE:
+                       break;
+               default:
+                       g_assert_not_reached ();
+               }
+       }
        mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), MONO_HANDLE_RAW (obj));
        dynamic_image_unlock (assembly);
 }
 #else
 void
-mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObjectHandle obj)
+mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObjectHandle obj, int how_collide)
 {
 }
 #endif
@@ -316,7 +332,7 @@ mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, c
 
        image = g_new0 (MonoDynamicImage, 1);
 
-       mono_profiler_module_event (&image->image, MONO_PROFILE_START_LOAD);
+       MONO_PROFILER_RAISE (image_loading, (&image->image));
        
        /*g_print ("created image %p\n", image);*/
        /* keep in sync with image.c */
@@ -339,7 +355,6 @@ mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, c
        image->method_aux_hash = g_hash_table_new (NULL, NULL);
        image->vararg_aux_hash = g_hash_table_new (NULL, NULL);
        image->handleref = g_hash_table_new (NULL, NULL);
-       image->handleref_managed = mono_g_hash_table_new_type ((GHashFunc)mono_object_hash, NULL, MONO_HASH_KEY_GC, MONO_ROOT_SOURCE_REFLECTION, "dynamic module reference-to-token table");
        image->tokens = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_REFLECTION, "dynamic module tokens table");
        image->generic_def_objects = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_REFLECTION, "dynamic module generic definitions table");
        image->typespec = g_hash_table_new ((GHashFunc)mono_metadata_type_hash, (GCompareFunc)mono_metadata_type_equal);
@@ -375,7 +390,7 @@ mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, c
        image->pe_kind = 0x1; /* ILOnly */
        image->machine = 0x14c; /* I386 */
        
-       mono_profiler_module_loaded (&image->image, MONO_PROFILE_OK);
+       MONO_PROFILER_RAISE (image_loaded, (&image->image));
 
        dynamic_images_lock ();
 
@@ -459,7 +474,6 @@ void
 mono_dynamic_image_release_gc_roots (MonoDynamicImage *image)
 {
        release_hashtable (&image->token_fixups);
-       release_hashtable (&image->handleref_managed);
        release_hashtable (&image->tokens);
        release_hashtable (&image->remapped_tokens);
        release_hashtable (&image->generic_def_objects);
@@ -479,8 +493,6 @@ mono_dynamic_image_free (MonoDynamicImage *image)
                g_hash_table_destroy (di->typeref);
        if (di->handleref)
                g_hash_table_destroy (di->handleref);
-       if (di->handleref_managed)
-               mono_g_hash_table_destroy (di->handleref_managed);
        if (di->tokens)
                mono_g_hash_table_destroy (di->tokens);
        if (di->remapped_tokens)