Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / tests / bug-462592.cs
1 using System;
2 using System.Threading;
3 using System.Reflection;
4 using System.Reflection.Emit;
5
6 public class Test
7 {
8         public virtual void Foo<T> (int i)
9         {
10         }
11 }
12
13 class Driver
14 {
15                 static AssemblyBuilder assembly;
16                 static ModuleBuilder module;
17                 static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.TypeBuilderTest";
18
19                 static void SetUp ()
20                 {
21                         AssemblyName assemblyName = new AssemblyName ();
22                         assemblyName.Name = ASSEMBLY_NAME;
23
24                         assembly =
25                                 Thread.GetDomain ().DefineDynamicAssembly (
26                                         assemblyName, AssemblyBuilderAccess.RunAndSave, ".");
27
28                         module = assembly.DefineDynamicModule ("repro", "bug-462592-result.exe");
29                 }
30
31                 static int Main()
32                 {
33                         SetUp ();
34
35                         MethodInfo foo = typeof (Test).GetMethod ("Foo");
36                         TypeBuilder type = module.DefineType ("TestType", TypeAttributes.Public, typeof (Test), Type.EmptyTypes);
37
38                         MethodBuilder mb = type.DefineMethod ("Foo", MethodAttributes.Public | MethodAttributes.Virtual, typeof (void), new Type[] { typeof (int) });
39                         mb.DefineGenericParameters ("T");
40
41                         ILGenerator il = mb.GetILGenerator ();
42                         il.Emit (OpCodes.Ldarg_0);
43                         il.Emit (OpCodes.Ldc_I4, 0);
44                         il.Emit (OpCodes.Call, foo);
45                         il.Emit (OpCodes.Ret);
46
47                         type.DefineMethodOverride (mb, foo);
48
49                         MethodBuilder main = type.DefineMethod ("Main", MethodAttributes.Public | MethodAttributes.Static, typeof (void), Type.EmptyTypes);
50                         il = main.GetILGenerator ();
51                         il.Emit (OpCodes.Newobj, type.DefineDefaultConstructor (MethodAttributes.Public));
52                         il.Emit (OpCodes.Ldc_I4, 0);
53                         il.Emit (OpCodes.Callvirt, mb.MakeGenericMethod (new Type[] { typeof (string) }));
54                         il.Emit (OpCodes.Ret);
55
56                         type.CreateType ();
57                         assembly.SetEntryPoint (main);
58
59                         assembly.Save ("bug-462592-result.exe");
60
61                         Assembly res = Assembly.LoadFrom ("bug-462592-result.exe");
62                         res.EntryPoint.Invoke (null, new object[0]);
63                         return 0;
64                 }
65 }
66