Explorar o código

2007-06-06 Mark Probst <[email protected]>

	* class.c, image.c, class-internals.h (MonoImage): class_cache is
	a MonoInternalHashTable again (fixed bug in internal hash table
	code).

svn path=/trunk/mono/; revision=78728
Mark Probst %!s(int64=18) %!d(string=hai) anos
pai
achega
5bcd4e6a4d

+ 6 - 0
mono/metadata/ChangeLog

@@ -1,3 +1,9 @@
+2007-06-06  Mark Probst  <[email protected]>
+
+	* class.c, image.c, class-internals.h (MonoImage): class_cache is
+	a MonoInternalHashTable again (fixed bug in internal hash table
+	code).
+
 2007-06-06  Mark Probst  <[email protected]>
 
 	* domain.c, domain-internals.h (MonoDomain): jit_code_hash is a

+ 3 - 0
mono/metadata/class-internals.h

@@ -323,6 +323,9 @@ struct _MonoClass {
 
 	MonoClassRuntimeInfo *runtime_info;
 
+	/* next element in the class_cache hash list (in MonoImage) */
+	MonoClass *next_class_cache;
+
 	/* Generic vtable. Initialized by a call to mono_class_setup_vtable () */
 	MonoMethod **vtable;	
 };

+ 3 - 3
mono/metadata/class.c

@@ -3058,7 +3058,7 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token)
 
 	mono_loader_lock ();
 
-	if ((class = g_hash_table_lookup (image->class_cache, GUINT_TO_POINTER (type_token)))) {
+	if ((class = mono_internal_hash_table_lookup (&image->class_cache, GUINT_TO_POINTER (type_token)))) {
 		mono_loader_unlock ();
 		return class;
 	}
@@ -3079,7 +3079,7 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token)
 	class->type_token = type_token;
 	class->flags = cols [MONO_TYPEDEF_FLAGS];
 
-	g_hash_table_insert (image->class_cache, GUINT_TO_POINTER (type_token), class);
+	mono_internal_hash_table_insert (&image->class_cache, GUINT_TO_POINTER (type_token), class);
 
 	/*
 	 * Check whether we're a generic type definition.
@@ -3096,7 +3096,7 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token)
 		parent = mono_class_get_full (
 			image, mono_metadata_token_from_dor (cols [MONO_TYPEDEF_EXTENDS]), context);
 		if (parent == NULL){
-			g_hash_table_remove (image->class_cache, GUINT_TO_POINTER (type_token));
+			mono_internal_hash_table_remove (&image->class_cache, GUINT_TO_POINTER (type_token));
 			mono_loader_unlock ();
 			return NULL;
 		}

+ 22 - 2
mono/metadata/image.c

@@ -26,6 +26,7 @@
 #include <mono/io-layer/io-layer.h>
 #include <mono/utils/mono-logger.h>
 #include <mono/utils/mono-path.h>
+#include <mono/metadata/class-internals.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #ifdef HAVE_UNISTD_H
@@ -577,12 +578,31 @@ build_guid_table (gboolean refonly)
 	g_hash_table_foreach (loaded_images, register_guid, NULL);
 }
 
+static gpointer
+class_key_extract (gpointer value)
+{
+	MonoClass *class = value;
+
+	return GUINT_TO_POINTER (class->type_token);
+}
+
+static gpointer*
+class_next_value (gpointer value)
+{
+	MonoClass *class = value;
+
+	return (gpointer*)&class->next_class_cache;
+}
+
 void
 mono_image_init (MonoImage *image)
 {
 	image->mempool = mono_mempool_new ();
 	image->method_cache = g_hash_table_new (NULL, NULL);
-	image->class_cache = g_hash_table_new (NULL, NULL);
+	mono_internal_hash_table_init (&image->class_cache,
+				       g_direct_hash,
+				       class_key_extract,
+				       class_next_value);
 	image->field_cache = g_hash_table_new (NULL, NULL);
 
 	image->delegate_begin_invoke_cache = 
@@ -1132,7 +1152,7 @@ mono_image_close (MonoImage *image)
 	}
 
 	g_hash_table_destroy (image->method_cache);
-	g_hash_table_destroy (image->class_cache);
+	mono_internal_hash_table_destroy (&image->class_cache);
 	g_hash_table_destroy (image->field_cache);
 	if (image->array_cache) {
 		g_hash_table_foreach (image->array_cache, free_array_cache_entry, NULL);

+ 1 - 1
mono/metadata/metadata-internals.h

@@ -139,7 +139,7 @@ struct _MonoImage {
 	 * Indexed by method tokens and typedef tokens.
 	 */
 	GHashTable *method_cache;
-	GHashTable *class_cache;
+	MonoInternalHashTable class_cache;
 	/*
 	 * Indexed by fielddef and memberref tokens
 	 */