Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / tests / dynamic-generic-size.cs
1 using System;
2 using System.Threading;
3 using System.Reflection;
4 using System.Reflection.Emit;
5 using System.Collections.Generic;
6
7 namespace GenericSize
8 {
9     class GenericSize 
10     {
11     static int Iterations = 10000;
12                 static AssemblyBuilder assembly;
13                 static ModuleBuilder module;
14                 static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.TypeBuilderTest";
15
16                 static void SetUp ()
17                 {
18                         AssemblyName assemblyName = new AssemblyName ();
19                         assemblyName.Name = ASSEMBLY_NAME;
20
21                         assembly =
22                                 Thread.GetDomain ().DefineDynamicAssembly (assemblyName, AssemblyBuilderAccess.Run);
23
24                         module = assembly.DefineDynamicModule ("module1");
25                 }
26
27                 static int Main()
28                 {
29                         SetUp ();
30
31                         TypeBuilder tb = module.DefineType ("Test", TypeAttributes.Public);
32                         tb.DefineGenericParameters ("T");
33                         var tb_ctor = tb.DefineDefaultConstructor (MethodAttributes.Public);
34
35                         var tb2 = module.DefineType ("Test2", TypeAttributes.Public);
36                         var g0 = tb2.DefineGenericParameters ("T");
37
38                         var mb = tb2.DefineMethod ("Foo", MethodAttributes.Public | MethodAttributes.Static, typeof (object), new Type [0]);
39
40                         var il = mb.GetILGenerator();
41                         il.Emit(OpCodes.Newobj, TypeBuilder.GetConstructor (tb.MakeGenericType (g0), tb_ctor));
42                         il.Emit(OpCodes.Ret);
43
44                         var t1 = tb.CreateType ();
45                         var t2 = tb2.CreateType ();
46
47                         var ginst = t2.MakeGenericType (typeof (string));
48                         var method = ginst.GetMethod ("Foo", BindingFlags.Public | BindingFlags.Static);
49
50                         var lst = new List<Object>();
51
52                         for (int i = 0; i < GenericSize.Iterations; i++) {
53                                 lst.Add (method.Invoke (null, null));
54                                 if (i % 15 == 0)
55                                         GC.Collect();
56                         }
57
58                         return 0;
59                 }
60         }
61 }