Kaynağa Gözat

2009-12-24 Mark Probst <[email protected]>

        * metadata-internals.h, reflection.c: Use the
        MonoDynamicImage.handleref hash table only with unmanaged keys,
        and add a managed hash table handleref_managed for managed keys.

svn path=/trunk/mono/; revision=148886
Mark Probst 16 yıl önce
ebeveyn
işleme
711c3aed81

+ 6 - 0
mono/metadata/ChangeLog

@@ -1,3 +1,9 @@
+2009-12-24  Mark Probst  <[email protected]>
+
+	* metadata-internals.h, reflection.c: Use the
+	MonoDynamicImage.handleref hash table only with unmanaged keys,
+	and add a managed hash table handleref_managed for managed keys.
+
 2009-12-24  Mark Probst  <[email protected]>
 
 	* sgen-gc.c: Unset to-space bumper between collections.  It might

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

@@ -318,6 +318,7 @@ struct _MonoDynamicImage {
 	GHashTable *typespec;
 	GHashTable *typeref;
 	GHashTable *handleref;
+	MonoGHashTable *handleref_managed;
 	MonoGHashTable *tokens;
 	GHashTable *blob_cache;
 	GHashTable *standalonesig_cache;

+ 17 - 14
mono/metadata/reflection.c

@@ -2565,12 +2565,12 @@ mono_image_get_methodbuilder_token (MonoDynamicImage *assembly, MonoReflectionMe
 	if (mb->generic_params && create_methodspec) 
 		return mono_image_get_methodspec_token_for_generic_method_definition (assembly, mb);
 
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, mb));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, mb));
 	if (token)
 		return token;
 
 	token = mono_image_get_methodref_token_for_methodbuilder (assembly, mb);
-	g_hash_table_insert (assembly->handleref, mb, GUINT_TO_POINTER(token));
+	mono_g_hash_table_insert (assembly->handleref_managed, mb, GUINT_TO_POINTER(token));
 	return token;
 }
 
@@ -2581,7 +2581,7 @@ mono_image_get_ctorbuilder_token (MonoDynamicImage *assembly, MonoReflectionCtor
 	ReflectionMethodBuilder rmb;
 	char *name;
 	
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, mb));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, mb));
 	if (token)
 		return token;
 
@@ -2592,7 +2592,7 @@ mono_image_get_ctorbuilder_token (MonoDynamicImage *assembly, MonoReflectionCtor
 		name, method_builder_encode_signature (assembly, &rmb));
 
 	g_free (name);
-	g_hash_table_insert (assembly->handleref, mb, GUINT_TO_POINTER(token));
+	mono_g_hash_table_insert (assembly->handleref_managed, mb, GUINT_TO_POINTER(token));
 	return token;
 }
 #endif
@@ -2642,7 +2642,7 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoReflectionField *
 	guint32 token;
 	MonoClassField *field;
 
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, f));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, f));
 	if (token)
 		return token;
 	g_assert (f->field->parent);
@@ -2660,7 +2660,7 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoReflectionField *
 	token = mono_image_get_memberref_token (assembly, &f->field->parent->byval_arg, 
 											mono_field_get_name (f->field),  
 											fieldref_encode_signature (assembly, field->parent->image, type));
-	g_hash_table_insert (assembly->handleref, f, GUINT_TO_POINTER(token));
+	mono_g_hash_table_insert (assembly->handleref_managed, f, GUINT_TO_POINTER(token));
 	return token;
 }
 
@@ -2674,7 +2674,7 @@ mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFi
 	MonoType *type;
 	char *name;
 
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, f));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, f));
 	if (token)
 		return token;
 	if (is_sre_field_builder (mono_object_class (f->fb))) {
@@ -2703,7 +2703,7 @@ mono_image_get_field_on_inst_token (MonoDynamicImage *assembly, MonoReflectionFi
 		g_error ("mono_image_get_method_on_inst_token: don't know how to handle %s", name);
 	}
 
-	g_hash_table_insert (assembly->handleref, f, GUINT_TO_POINTER (token));
+	mono_g_hash_table_insert (assembly->handleref_managed, f, GUINT_TO_POINTER (token));
 	return token;
 }
 
@@ -2717,7 +2717,7 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
 
 	/* A ctor cannot be a generic method, so we can ignore create_methodspec */
 
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, c));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, c));
 	if (token)
 		return token;
 
@@ -2756,7 +2756,7 @@ mono_image_get_ctor_on_inst_token (MonoDynamicImage *assembly, MonoReflectionCto
 	}
 
 
-	g_hash_table_insert (assembly->handleref, c, GUINT_TO_POINTER (token));
+	mono_g_hash_table_insert (assembly->handleref_managed, c, GUINT_TO_POINTER (token));
 	return token;
 }
 
@@ -2812,7 +2812,7 @@ mono_image_get_method_on_inst_token (MonoDynamicImage *assembly, MonoReflectionM
 		return token;
 	}
 
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, m));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, m));
 	if (token)
 		return token;
 
@@ -2848,7 +2848,7 @@ mono_image_get_method_on_inst_token (MonoDynamicImage *assembly, MonoReflectionM
 		g_error ("mono_image_get_method_on_inst_token: don't know how to handle %s", name);
 	}
 
-	g_hash_table_insert (assembly->handleref, m, GUINT_TO_POINTER (token));
+	mono_g_hash_table_insert (assembly->handleref_managed, m, GUINT_TO_POINTER (token));
 	return token;
 }
 
@@ -3078,7 +3078,7 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
 	guint32 token, pclass, parent, sig;
 	gchar *name;
 
-	token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->handleref, fb));
+	token = GPOINTER_TO_UINT (mono_g_hash_table_lookup (assembly->handleref_managed, fb));
 	if (token)
 		return token;
 
@@ -3113,7 +3113,7 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi
 
 	token = MONO_TOKEN_MEMBER_REF | table->next_idx;
 	table->next_idx ++;
-	g_hash_table_insert (assembly->handleref, fb, GUINT_TO_POINTER(token));
+	mono_g_hash_table_insert (assembly->handleref_managed, fb, GUINT_TO_POINTER(token));
 	g_free (name);
 	return token;
 }
@@ -4948,6 +4948,7 @@ create_dynamic_mono_image (MonoDynamicAssembly *assembly, char *assembly_name, c
 	image->field_to_table_idx = g_hash_table_new (NULL, NULL);
 	image->method_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);
 	image->tokens = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC);
 	image->generic_def_objects = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC);
 	image->methodspec = mono_g_hash_table_new_type ((GHashFunc)mono_object_hash, NULL, MONO_HASH_KEY_GC);
@@ -5010,6 +5011,8 @@ 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->generic_def_objects)