X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fdynamic-image.c;h=fb381452b5a6127d598d81f5602ca7a57742d8ed;hb=ef7a4c06206976de7ef2e974267407347ddb75a4;hp=9906f43b31838ec448675aeab80c281ee262d8c1;hpb=0b65fb9d99f02f2a330b20eafcfe57fec34c0465;p=mono.git diff --git a/mono/metadata/dynamic-image.c b/mono/metadata/dynamic-image.c index 9906f43b318..fb381452b5a 100644 --- a/mono/metadata/dynamic-image.c +++ b/mono/metadata/dynamic-image.c @@ -1,5 +1,6 @@ -/* - * dynamic-image.c: Images created at runtime. +/** + * \file + * Images created at runtime. * * * Author: @@ -184,15 +185,44 @@ dynamic_image_unlock (MonoDynamicImage *image) mono_image_unlock ((MonoImage*)image); } +#ifndef DISABLE_REFLECTION_EMIT +/* + * mono_dynamic_image_register_token: + * + * Register the TOKEN->OBJ mapping in the mapping table in ASSEMBLY. This is required for + * the Module.ResolveXXXToken () methods to work. + */ void -mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *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); - mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj); + 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, int how_collide) +{ +} +#endif static MonoObject* lookup_dyn_token (MonoDynamicImage *assembly, guint32 token) @@ -208,6 +238,22 @@ lookup_dyn_token (MonoDynamicImage *assembly, guint32 token) return obj; } +#ifndef DISABLE_REFLECTION_EMIT +MonoObjectHandle +mono_dynamic_image_get_registered_token (MonoDynamicImage *dynimage, guint32 token, MonoError *error) +{ + error_init (error); + return MONO_HANDLE_NEW (MonoObject, lookup_dyn_token (dynimage, token)); +} +#else /* DISABLE_REFLECTION_EMIT */ +MonoObjectHandle +mono_dynamic_image_get_registered_token (MonoDynamicImage *dynimage, guint32 token, MonoError *error) +{ + g_assert_not_reached (); + return NULL_HANDLE; +} +#endif + /** * * mono_dynamic_image_is_valid_token: @@ -243,7 +289,7 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean MonoObject *obj; MonoClass *klass; - mono_error_init (error); + error_init (error); obj = lookup_dyn_token (assembly, token); if (!obj) { @@ -260,43 +306,13 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean gpointer result = mono_reflection_resolve_object (image, obj, handle_class, context, error); return result; } - -/* - * mono_image_register_token: - * - * Register the TOKEN->OBJ mapping in the mapping table in ASSEMBLY. This is required for - * the Module.ResolveXXXToken () methods to work. - */ -void -mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj) -{ - MonoObject *prev; - - dynamic_image_lock (assembly); - prev = (MonoObject *)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); -} - #else /* DISABLE_REFLECTION_EMIT */ - gpointer mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean valid_token, MonoClass **handle_class, MonoGenericContext *context, MonoError *error) { - mono_error_init (error); + error_init (error); return NULL; } - -void -mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj) -{ -} - #endif /* DISABLE_REFLECTION_EMIT */ #ifndef DISABLE_REFLECTION_EMIT @@ -314,14 +330,9 @@ mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, c else version = mono_get_runtime_info ()->runtime_version; -#if HAVE_BOEHM_GC - /* The MonoGHashTable's need GC tracking */ - image = (MonoDynamicImage *)GC_MALLOC (sizeof (MonoDynamicImage)); -#else image = g_new0 (MonoDynamicImage, 1); -#endif - 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 */ @@ -344,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); @@ -380,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 (); @@ -464,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); @@ -484,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) @@ -549,10 +556,5 @@ mono_dynamic_image_free (MonoDynamicImage *image) void mono_dynamic_image_free_image (MonoDynamicImage *image) { - /* See create_dynamic_mono_image () */ -#if HAVE_BOEHM_GC - /* Allocated using GC_MALLOC */ -#else g_free (image); -#endif }