Ver Fonte

2008-10-21 Zoltan Varga <[email protected]>

	* loader.c (find_method_in_class): Reenable the metadata optimization by
	not using it for generic instances.

svn path=/trunk/mono/; revision=116657
Zoltan Varga há 17 anos atrás
pai
commit
222dd0178b
2 ficheiros alterados com 8 adições e 11 exclusões
  1. 3 0
      mono/metadata/ChangeLog
  2. 5 11
      mono/metadata/loader.c

+ 3 - 0
mono/metadata/ChangeLog

@@ -1,5 +1,8 @@
 2008-10-21  Zoltan Varga  <[email protected]>
 
+	* loader.c (find_method_in_class): Reenable the metadata optimization by
+	not using it for generic instances.
+
 	* class-internals.h (MonoFieldDefaultValue): Extract the rarely used 
 	data/def_type fields from MonoClassField into a separate structure.
 	(struct MonoClassField): Remove data/def_type fields.

+ 5 - 11
mono/metadata/loader.c

@@ -508,11 +508,10 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con
 {
  	int i;
 
-#if 0
-	/* FIXME: This causes test failures in Mono.C5 */
-
 	/* Search directly in the metadata to avoid calling setup_methods () */
-	if (klass->type_token && !klass->image->dynamic && !klass->methods && !klass->rank) {
+
+	/* FIXME: !from_class->generic_class condition causes test failures. */
+	if (klass->type_token && !klass->image->dynamic && !klass->methods && !klass->rank && klass == from_class && !from_class->generic_class) {
 		for (i = 0; i < klass->method.count; ++i) {
 			guint32 cols [MONO_METHOD_SIZE];
 			MonoMethod *method;
@@ -528,15 +527,10 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con
 				continue;
 
 			method = mono_get_method (klass->image, MONO_TOKEN_METHOD_DEF | (klass->method.first + i + 1), klass);
-			if (method && (sig->call_convention != MONO_CALL_VARARG) && mono_metadata_signature_equal (sig, mono_method_signature (method))) {
-				if (from_class->generic_class && from_class->generic_class->container_class == klass)
-					return mono_class_inflate_generic_method_full (method, from_class, mono_class_get_context (from_class));
-				else
-					return method;
-			}
+			if (method && (sig->call_convention != MONO_CALL_VARARG) && mono_metadata_signature_equal (sig, mono_method_signature (method)))
+				return method;
 		}
 	}
-#endif
 
 	mono_class_setup_methods (klass);
 	for (i = 0; i < klass->method.count; ++i) {