From 4ff2c6e1b598a3e7284629074504650aecb380a4 Mon Sep 17 00:00:00 2001 From: kumpera Date: Tue, 6 Apr 2010 23:11:37 +0000 Subject: [PATCH] 2010-04-06 Rodrigo Kumpera * bug-575941.cs: New regression test. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mono@154887 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- mono/tests/ChangeLog | 4 ++++ mono/tests/Makefile.am | 4 ++-- mono/tests/bug-575941.cs | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 mono/tests/bug-575941.cs diff --git a/mono/tests/ChangeLog b/mono/tests/ChangeLog index c1763e4ef..e4c5c93dd 100644 --- a/mono/tests/ChangeLog +++ b/mono/tests/ChangeLog @@ -1,3 +1,7 @@ +2010-04-06 Rodrigo Kumpera + + * bug-575941.cs: New regression test. + 2010-04-05 Rodrigo Kumpera * bug-515884.il: New regression test. diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index b9c0fc984..deb9e1578 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -364,8 +364,8 @@ BASE_TEST_CS_SRC= \ gc-altstack.cs \ large-gc-bitmap.cs \ bug-561239.cs \ - bug-562150.cs - + bug-562150.cs \ + bug-575941.cs TEST_CS_SRC_DIST= \ $(BASE_TEST_CS_SRC) \ diff --git a/mono/tests/bug-575941.cs b/mono/tests/bug-575941.cs new file mode 100644 index 000000000..cade94446 --- /dev/null +++ b/mono/tests/bug-575941.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading; +using System.Reflection; +using System.Reflection.Emit; + +public class Tests +{ + public static int Main (String[] args) { + AssemblyName assemblyName = new AssemblyName (); + assemblyName.Name = "foo"; + + AssemblyBuilder assembly = + Thread.GetDomain ().DefineDynamicAssembly ( + assemblyName, AssemblyBuilderAccess.RunAndSave); + + ModuleBuilder module = assembly.DefineDynamicModule ("foo.dll"); + + TypeBuilder if_tb = module.DefineType ("IF`1", TypeAttributes.Public|TypeAttributes.Abstract|TypeAttributes.Interface); + + GenericTypeParameterBuilder [] typeParams = if_tb.DefineGenericParameters ("T"); + + MethodBuilder if_mb = if_tb.DefineMethod ("foo", MethodAttributes.Public|MethodAttributes.Abstract|MethodAttributes.Virtual, typeParams [0], Type.EmptyTypes); + + + TypeBuilder tb = module.DefineType ("Foo`1", TypeAttributes.Public, typeof (object)); + GenericTypeParameterBuilder [] tbTypeParams = tb.DefineGenericParameters ("T"); + + + Type inst = if_tb.MakeGenericType (tbTypeParams [0]); + + tb.AddInterfaceImplementation (inst); + + var mb0 = tb.DefineMethod ("foo", MethodAttributes.Public|MethodAttributes.Virtual, typeParams [0], Type.EmptyTypes); + mb0.GetILGenerator ().Emit (OpCodes.Ret); + + var mb = tb.DefineMethod ("__foo", MethodAttributes.Public|MethodAttributes.Virtual, typeParams [0],Type.EmptyTypes); + var gen = mb.GetILGenerator (); + var local = gen.DeclareLocal (typeParams [0], false); + gen.Emit (OpCodes.Ldloca, local); + gen.Emit (OpCodes.Initobj, typeParams [0]); + gen.Emit (OpCodes.Ldloc, local); + gen.Emit (OpCodes.Ret); + + tb.DefineMethodOverride (mb, TypeBuilder.GetMethod (inst, if_mb)); + + var k = if_tb.CreateType (); + + Type t = tb.CreateType (); + object obj = Activator.CreateInstance (t.MakeGenericType (new Type [] { typeof (string)})); + var info = k.MakeGenericType (new Type [] { typeof (string) }).GetMethod ("foo"); + var res = info.Invoke (obj, null); + return res == null ? 0 : 1; + } +} + -- 2.11.4.GIT