Skip to content

Commit

Permalink
Merge pull request #5005 from lambdageek/bug-57222-2017-04
Browse files Browse the repository at this point in the history
[sre] FieldBuilder:RuntimeResolve shouldn't lookup by name (Fixes #57222)
  • Loading branch information
lambdageek committed Jun 12, 2017
2 parents 4498dc4 + 8077f27 commit c51d134
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 1 deletion.
4 changes: 3 additions & 1 deletion mcs/class/corlib/System.Reflection.Emit/FieldBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,9 @@ internal void ResolveUserTypes () {
}

internal FieldInfo RuntimeResolve () {
return typeb.CreateType ().GetField (this);
// typeb.CreateType() populates this.handle
var type_handle = new RuntimeTypeHandle (typeb.CreateType () as RuntimeType);
return FieldInfo.GetFieldFromHandle (handle, type_handle);
}

public override Module Module {
Expand Down
86 changes: 86 additions & 0 deletions mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11271,5 +11271,91 @@ public void GetGenericTypeDefinitionAfterCreateReturnsBuilder () {

Assert.AreSame (buildX, defX);
}

[Test]
public void FieldsWithSameName () {
// Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=57222
string fileName = CreateTempAssembly ();

var assemblyName = new AssemblyName { Name = "test" };
var dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly (assemblyName, AssemblyBuilderAccess.RunAndSave);
var dynamicModule = dynamicAssembly.DefineDynamicModule (assemblyName.Name, fileName);
var typeBuilder = dynamicModule.DefineType ("type1", TypeAttributes.Public | TypeAttributes.Class);

var mainMethod = typeBuilder.DefineMethod ("Main", MethodAttributes.Public | MethodAttributes.Static, typeof (int), new Type[0]);
var mainMethodIl = mainMethod.GetILGenerator ();

var f1 = typeBuilder.DefineField ("x", typeof (byte), FieldAttributes.Private | FieldAttributes.Static);
var f2 = typeBuilder.DefineField ("x", typeof (sbyte), FieldAttributes.Private | FieldAttributes.Static);

mainMethodIl.Emit (OpCodes.Ldsflda, f1);
mainMethodIl.Emit (OpCodes.Ldsflda, f2);
mainMethodIl.Emit (OpCodes.Pop);
mainMethodIl.Emit (OpCodes.Pop);
mainMethodIl.Emit (OpCodes.Ldc_I4_0);
mainMethodIl.Emit (OpCodes.Ret);

typeBuilder.CreateType ();
dynamicAssembly.SetEntryPoint (mainMethod);

dynamicAssembly.Save (fileName);
}
[Test]
public void FieldsWithSameNameAndType () {
// https://bugzilla.xamarin.com/show_bug.cgi?id=57222
string fileName = CreateTempAssembly ();

var assemblyName = new AssemblyName { Name = "test" };
var dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly (assemblyName, AssemblyBuilderAccess.RunAndSave);
var dynamicModule = dynamicAssembly.DefineDynamicModule (assemblyName.Name, fileName);
var typeBuilder = dynamicModule.DefineType ("type1", TypeAttributes.Public | TypeAttributes.Class);

var mainMethod = typeBuilder.DefineMethod ("Main", MethodAttributes.Public | MethodAttributes.Static, typeof (int), new Type[0]);
var mainMethodIl = mainMethod.GetILGenerator ();

var f1 = typeBuilder.DefineField ("x", typeof (sbyte), FieldAttributes.Private | FieldAttributes.Static);
var f2 = typeBuilder.DefineField ("x", typeof (sbyte), FieldAttributes.Private | FieldAttributes.Static);

mainMethodIl.Emit (OpCodes.Ldsflda, f1);
mainMethodIl.Emit (OpCodes.Ldsflda, f2);
mainMethodIl.Emit (OpCodes.Pop);
mainMethodIl.Emit (OpCodes.Pop);
mainMethodIl.Emit (OpCodes.Ldc_I4_0);
mainMethodIl.Emit (OpCodes.Ret);

typeBuilder.CreateType ();
dynamicAssembly.SetEntryPoint (mainMethod);

dynamicAssembly.Save (fileName);
}

[Test]
public void MethodsWithSameNameAndSig () {
// https://bugzilla.xamarin.com/show_bug.cgi?id=57222
string fileName = CreateTempAssembly ();

var assemblyName = new AssemblyName { Name = "test" };
var dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly (assemblyName, AssemblyBuilderAccess.RunAndSave);
var dynamicModule = dynamicAssembly.DefineDynamicModule (assemblyName.Name, fileName);
var typeBuilder = dynamicModule.DefineType ("type1", TypeAttributes.Public | TypeAttributes.Class);

var mainMethod = typeBuilder.DefineMethod ("Main", MethodAttributes.Public | MethodAttributes.Static, typeof (int), new Type[0]);
var mainMethodIl = mainMethod.GetILGenerator ();

var m1 = typeBuilder.DefineMethod ("X", MethodAttributes.Private | MethodAttributes.Static, typeof (void), new Type [0]);
var m2 = typeBuilder.DefineMethod ("X", MethodAttributes.Private | MethodAttributes.Static, typeof (void), new Type [0]);
m1.GetILGenerator ().Emit (OpCodes.Ret);
m2.GetILGenerator ().Emit (OpCodes.Ret);

mainMethodIl.Emit (OpCodes.Call, m1);
mainMethodIl.Emit (OpCodes.Call, m2);
mainMethodIl.Emit (OpCodes.Ldc_I4_0);
mainMethodIl.Emit (OpCodes.Ret);

typeBuilder.CreateType ();
dynamicAssembly.SetEntryPoint (mainMethod);

dynamicAssembly.Save (fileName);
}
}
}

0 comments on commit c51d134

Please sign in to comment.