+2007-06-06 Mark Probst <mark.probst@gmail.com>
+
+ * 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 <mark.probst@gmail.com>
* domain.c, domain-internals.h (MonoDomain): jit_code_hash is a
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;
};
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;
}
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.
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;
}
#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
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 =
}
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);
* Indexed by method tokens and typedef tokens.
*/
GHashTable *method_cache;
- GHashTable *class_cache;
+ MonoInternalHashTable class_cache;
/*
* Indexed by fielddef and memberref tokens
*/