1 using System;
2 using System.Reflection;
3 
4 public struct A
5 {
ToStringA6 	public override string ToString ()
7 	{
8 		return "A";
9 	}
10 }
11 
12 public class D
13 {
Test()14 	public string Test ()
15 	{
16 		return "Test";
17 	}
18 }
19 
20 enum Enum1
21 {
22 	A,
23 	B
24 }
25 
26 enum Enum2
27 {
28 	C,
29 	D
30 }
31 
32 struct AStruct {
33 	public int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
34 	public int a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
35 }
36 
37 class Tests
38 {
return_enum1()39 	public static Enum1 return_enum1 () {
40 		return Enum1.A;
41 	}
42 
return_enum2()43 	public static Enum2 return_enum2 () {
44 		return Enum2.C;
45 	}
46 
return_long()47 	public static long return_long () {
48 		return 1234;
49 	}
50 
return_ulong()51 	public static ulong return_ulong () {
52 		return UInt64.MaxValue - 5;
53 	}
54 
return_t(T t)55 	public static object return_t<T> (T t) {
56 		return (object)t;
57 	}
58 
Main(string[] args)59 	static int Main (string[] args)
60 	{
61 		return TestDriver.RunTests (typeof (Tests), args);
62 	}
63 
test_0_base()64 	public static int test_0_base () {
65 		Assembly ass = typeof (Tests).Assembly;
66 		Type a_type = ass.GetType ("A");
67 		MethodInfo a_method = a_type.GetMethod ("ToString");
68 
69 		Type d_type = ass.GetType ("D");
70 		MethodInfo d_method = d_type.GetMethod ("Test");
71 
72 		Console.WriteLine ("TEST: {0} {1}", a_method, d_method);
73 
74 		A a = new A ();
75 		D d = new D ();
76 
77 		object a_ret = a_method.Invoke (a, null);
78 		Console.WriteLine (a_ret);
79 
80 		object d_ret = d_method.Invoke (d, null);
81 		Console.WriteLine (d_ret);
82 
83 		return 0;
84 	}
85 
test_0_enum_sharing()86 	public static int test_0_enum_sharing () {
87 		/* Check sharing of wrappers returning enums */
88 		if (typeof (Tests).GetMethod ("return_enum1").Invoke (null, null).GetType () != typeof (Enum1))
89 			return 1;
90 		if (typeof (Tests).GetMethod ("return_enum2").Invoke (null, null).GetType () != typeof (Enum2))
91 			return 2;
92 		return 0;
93 	}
94 
test_0_primitive_sharing()95 	public static int test_0_primitive_sharing () {
96 		/* Check sharing of wrappers returning primitive types */
97 		if (typeof (Tests).GetMethod ("return_long").Invoke (null, null).GetType () != typeof (long))
98 			return 3;
99 		if (typeof (Tests).GetMethod ("return_ulong").Invoke (null, null).GetType () != typeof (ulong))
100 			return 4;
101 
102 		return 0;
103 	}
104 
105 	public struct Foo
106 	{
ToString2Tests.Foo107 		public string ToString2 () {
108 			return "FOO";
109 		}
110 	}
111 
GetNSObject(IntPtr i)112 	public static object GetNSObject (IntPtr i) {
113 		return i;
114 	}
115 
test_0_vtype_method_sharing()116 	public static int test_0_vtype_method_sharing () {
117 		/* Check sharing of wrappers of vtype methods with static methods having an IntPtr argument */
118 		if ((string)(typeof (Foo).GetMethod ("ToString2").Invoke (new Foo (), null)) != "FOO")
119 			return 3;
120 		object o = typeof (Tests).GetMethod ("GetNSObject").Invoke (null, new object [] { new IntPtr (42) });
121 		if (!(o is IntPtr) || ((IntPtr)o != new IntPtr (42)))
122 			return 4;
123 
124 		return 0;
125 	}
126 
test_0_ptr()127 	public static unsafe int test_0_ptr () {
128 		int[] arr = new int [10];
129 		fixed (void *p = &arr [5]) {
130 			object o = typeof (Tests).GetMethod ("data_types_ptr").Invoke (null, new object [1] { new IntPtr (p) });
131 			void *p2 = Pointer.Unbox (o);
132 			if (new IntPtr (p) != new IntPtr (p2))
133 				return 1;
134 
135 			o = typeof (Tests).GetMethod ("data_types_ptr").Invoke (null, new object [1] { null });
136 			p2 = Pointer.Unbox (o);
137 			if (new IntPtr (p2) != IntPtr.Zero)
138 				return 1;
139 		}
140 
141 		return 0;
142 	}
143 
test_0_string_ctor()144 	public static int test_0_string_ctor () {
145 		string res = (string)typeof (String).GetConstructor (new Type [] { typeof (char[]) }).Invoke (new object [] { new char [] { 'A', 'B', 'C' } });
146 		if (res == "ABC")
147 			return 0;
148 		else
149 			return 1;
150 	}
151 
152 	public class Foo<T> {
153 		public T t;
154 	}
155 
test_0_ginst_ref()156 	public static int test_0_ginst_ref () {
157 		Foo<string> f = new Foo<string> { t = "A" };
158 		Foo<string> f2 = (Foo<string>)typeof (Tests).GetMethod ("data_types_ginst_ref").MakeGenericMethod (new Type [] { typeof (string) }).Invoke (null, new object [] { f });
159 		if (f2.t != "A")
160 			return 1;
161 		else
162 			return 0;
163 	}
164 
test_0_ginst_vtype()165 	public static int test_0_ginst_vtype () {
166 		FooStruct<string> f = new FooStruct<string> { t = "A" };
167 		FooStruct<string> f2 = (FooStruct<string>)typeof (Tests).GetMethod ("data_types_ginst_vtype").MakeGenericMethod (new Type [] { typeof (string) }).Invoke (null, new object [] { f });
168 		if (f2.t != "A")
169 			return 1;
170 		else
171 			return 0;
172 	}
173 
data_types_ginst_ref(Foo<T> f)174 	public static Foo<T> data_types_ginst_ref<T> (Foo<T> f) {
175 		return f;
176 	}
177 
178 	public struct FooStruct<T> {
179 		public T t;
180 	}
181 
data_types_ginst_vtype(FooStruct<T> f)182 	public static FooStruct<T> data_types_ginst_vtype<T> (FooStruct<T> f) {
183 		return f;
184 	}
185 
data_types_ptr(int *val)186     public static unsafe int* data_types_ptr (int *val) {
187 		//Console.WriteLine (new IntPtr (val));
188         return val;
189     }
190 
pack_u2(ushort us)191 	public static bool pack_u2 (ushort us) {
192 		return true;
193 	}
194 
pack_i2(short value)195 	public static bool pack_i2 (short value) {
196 		int c = 0;
197 		// Force 'value' to be register allocated
198 		for (int i = 0; i < value; ++i)
199 			c += value;
200 	  return value < 0x80;
201 	}
202 
203 	// #11750
test_0_i2_u2()204 	public static int test_0_i2_u2 () {
205 		typeof (Tests).GetMethod ("pack_u2").Invoke (null, new object [] { (ushort)0 });
206 		var res = typeof (Tests).GetMethod ("pack_i2").Invoke (null, new object [] { (short)-1 });
207 		return (bool)res ? 0 : 1;
208 	}
209 
pack_bool(bool b)210 	public static bool pack_bool (bool b) {
211 		return true;
212 	}
213 
pack_i1(sbyte value)214 	public static bool pack_i1 (sbyte value) {
215 		int c = 0;
216 		// Force 'value' to be register allocated
217 		for (int i = 0; i < value; ++i)
218 			c += value;
219 		return value < -1;
220 	}
221 
test_0_i1_bool()222 	public static int test_0_i1_bool () {
223 		typeof (Tests).GetMethod ("pack_bool").Invoke (null, new object [] { true });
224 		var res = typeof (Tests).GetMethod ("pack_i1").Invoke (null, new object [] { (sbyte)-0x40 });
225 		return (bool)res ? 0 : 1;
226 	}
227 
228 	struct Point {
229 		public int x, y;
230 	}
231 
232 	struct Foo2 {
233 		public Point Location {
234 			get {
235 				return new Point () { x = 10, y = 20 };
236 			}
237 		}
238 	}
239 
test_0_vtype_method_vtype_ret()240 	public static int test_0_vtype_method_vtype_ret () {
241 		var f = new Foo2 ();
242 		var p = (Point)typeof (Foo2).GetMethod ("get_Location").Invoke (f, null);
243 		if (p.x != 10 || p.y != 20)
244 			return 1;
245 		return 0;
246 	}
247 
test_0_array_get_set()248 	public static int test_0_array_get_set () {
249 		int[,,] arr = new int [10, 10, 10];
250 		arr [0, 1, 2] = 42;
251 		var gm = arr.GetType ().GetMethod ("Get");
252 		int i = (int) gm.Invoke (arr, new object [] { 0, 1, 2 });
253 		if (i != 42)
254 			return 1;
255 		var sm = arr.GetType ().GetMethod ("Set");
256 		sm.Invoke (arr, new object [] { 0, 1, 2, 33 });
257 		if (arr [0, 1, 2] != 33)
258 			return 2;
259 		return 0;
260 	}
261 
test_0_multi_dim_array_ctor()262 	public static int test_0_multi_dim_array_ctor () {
263         var type1 = Type.GetType ("System.Char[,]").GetTypeInfo ();
264 
265 		ConstructorInfo ci = null;
266 		foreach (var c in type1.DeclaredConstructors) {
267 			if (c.GetParameters ().Length == 4)
268 				ci = c;
269 		}
270         var res = ci.Invoke (new object[] { 1, 5, -10, 7 });
271 		var a = (Array)res;
272 		if (a.GetLength (0) != 5 || a.GetLowerBound (0) != 1 || a.GetLength (1) != 7 || a.GetLowerBound (1) != -10)
273 			return 1;
274 		return 0;
275 	}
276 
method_invoke_no_modify_by_value_arg_helper(int dummy)277 	private static void method_invoke_no_modify_by_value_arg_helper (int dummy)
278     {
279     }
280 
test_0_method_invoke_no_modify_by_value_arg()281     public static int test_0_method_invoke_no_modify_by_value_arg ()
282     {
283         var args = new object[] { null };
284         var method = typeof (Tests).GetMethod ("method_invoke_no_modify_by_value_arg_helper", BindingFlags.NonPublic | BindingFlags.Static);
285         method.Invoke (null, args);
286         if (args[0] == null)
287             return 0;
288         else
289             return 1;
290     }
291 
test_0_large_arg()292 	public static int test_0_large_arg ()
293 	{
294 		var arg = new AStruct ();
295 		arg.a1 = 1;
296 		arg.a2 = 2;
297 		arg.a3 = 3;
298 		arg.a20 = 20;
299 		var res = typeof (Tests).GetMethod ("return_t").MakeGenericMethod (new Type [] { typeof (AStruct) }).Invoke (null, new object [] { arg });
300 		var arg2 = (AStruct)res;
301 		if (arg2.a20 == 20)
302 			return 0;
303 		else
304 			return 1;
305 	}
306 }
307