Remove some special case code from mono_image_get_fieldref_token () which no longer...
authorZoltan Varga <vargaz@gmail.com>
Mon, 14 Jan 2013 21:14:55 +0000 (22:14 +0100)
committerZoltan Varga <vargaz@gmail.com>
Mon, 14 Jan 2013 21:15:12 +0000 (22:15 +0100)
mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs
mono/metadata/reflection.c

index c738b69a3974327859062161a6af42cdb9584857..bcc45a17a23f231f7610e46400120c6d4881fab0 100644 (file)
@@ -10983,5 +10983,45 @@ namespace MonoTests.System.Reflection.Emit
 
                Assert.AreEqual (42, res[0]);
            }
+
+
+               [Test]
+               public void Ldfld_Regress_9531 () {
+                       Build<Example<int>> ();
+               }
+
+               void Build<T> () {
+            var base_class = typeof(T);
+
+            var builder = module.DefineType(genTypeName (),
+                TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.Public,
+                base_class);
+
+            var field = builder.BaseType.GetField("Field", BindingFlags.Instance | BindingFlags.Public);
+            
+            var cb = builder.DefineConstructor(
+                MethodAttributes.Public | MethodAttributes.SpecialName,
+                CallingConventions.HasThis,
+                new[] { typeof(string) });
+            
+            var il = cb.GetILGenerator();
+            
+            if (field == null)
+            {
+                throw new InvalidOperationException("wtf");
+            }
+            
+            il.Emit(OpCodes.Ldarg_0);
+            il.Emit(OpCodes.Ldarg_1);
+            il.Emit(OpCodes.Stfld, field);
+            il.Emit(OpCodes.Ret);
+            
+            builder.CreateType();
+               }
+
+               public class Example<T> {
+                       public string Field;
+               }
+
        }
 }
index 0c3d2364822f6823828307a9b66db80e72c149dd..6041831108c75291c82ed64078c218d921a62547 100644 (file)
@@ -2750,15 +2750,10 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoObject *f, MonoCl
        if (token)
                return token;
 
-       if (field->parent->generic_class && field->parent->generic_class->container_class && field->parent->generic_class->container_class->fields) {
-               int index = field - field->parent->fields;
-               type = field->parent->generic_class->container_class->fields [index].type;
-       } else {
-               if (is_field_on_inst (field))
-                       type = get_field_on_inst_generic_type (field);
-               else
-                       type = mono_field_get_type (field);
-       }
+       if (is_field_on_inst (field))
+               type = get_field_on_inst_generic_type (field);
+       else
+               type = mono_field_get_type (field);
        token = mono_image_get_memberref_token (assembly, &field->parent->byval_arg,
                                                                                        mono_field_get_name (field),
                                                                                        fieldref_encode_signature (assembly, field->parent->image, type));