|
3 | 3 |
|
4 | 4 | using Mono.Cecil;
|
5 | 5 | using Mono.Cecil.Metadata;
|
6 |
| - |
| 6 | +using Mono.Collections.Generic; |
7 | 7 | using NUnit.Framework;
|
8 | 8 |
|
9 | 9 | namespace Mono.Cecil.Tests {
|
@@ -236,5 +236,50 @@ public void InstanceAndStaticMethodComparison ()
|
236 | 236 | Assert.AreNotEqual(instance_method, static_method_reference.Resolve ());
|
237 | 237 | });
|
238 | 238 | }
|
| 239 | + |
| 240 | + [Test] |
| 241 | + public void FunctionPointerArgumentOverload () |
| 242 | + { |
| 243 | + TestIL ("others.il", module => { |
| 244 | + var others = module.GetType ("Others"); |
| 245 | + var overloaded_methods = others.Methods.Where (m => m.Name == "OverloadedWithFpArg").ToArray (); |
| 246 | + // Manually create the function-pointer type so `AreSame` won't exit early due to reference equality |
| 247 | + var overloaded_method_int_reference = new MethodReference ("OverloadedWithFpArg", module.TypeSystem.Void, others) |
| 248 | + { |
| 249 | + HasThis = false, |
| 250 | + Parameters = { new ParameterDefinition ("X", ParameterAttributes.None, new FunctionPointerType () { |
| 251 | + HasThis = false, |
| 252 | + ReturnType = module.TypeSystem.Int32, |
| 253 | + Parameters = { new ParameterDefinition (module.TypeSystem.Int32) } |
| 254 | + }) } |
| 255 | + }; |
| 256 | + |
| 257 | + var overloaded_method_long_reference = new MethodReference ("OverloadedWithFpArg", module.TypeSystem.Void, others) |
| 258 | + { |
| 259 | + HasThis = false, |
| 260 | + Parameters = { new ParameterDefinition ("X", ParameterAttributes.None, new FunctionPointerType () { |
| 261 | + HasThis = false, |
| 262 | + ReturnType = module.TypeSystem.Int32, |
| 263 | + Parameters = { new ParameterDefinition (module.TypeSystem.Int64) } |
| 264 | + }) } |
| 265 | + }; |
| 266 | + |
| 267 | + var overloaded_method_cdecl_reference = new MethodReference ("OverloadedWithFpArg", module.TypeSystem.Void, others) |
| 268 | + { |
| 269 | + HasThis = false, |
| 270 | + Parameters = { new ParameterDefinition ("X", ParameterAttributes.None, new FunctionPointerType () { |
| 271 | + CallingConvention = MethodCallingConvention.C, |
| 272 | + HasThis = false, |
| 273 | + ReturnType = module.TypeSystem.Int32, |
| 274 | + Parameters = { new ParameterDefinition (module.TypeSystem.Int32) } |
| 275 | + }) } |
| 276 | + }; |
| 277 | + |
| 278 | + |
| 279 | + Assert.AreEqual (overloaded_methods[0], overloaded_method_int_reference.Resolve ()); |
| 280 | + Assert.AreEqual (overloaded_methods[1], overloaded_method_long_reference.Resolve ()); |
| 281 | + Assert.AreEqual (overloaded_methods[2], overloaded_method_cdecl_reference.Resolve ()); |
| 282 | + }); |
| 283 | + } |
239 | 284 | }
|
240 | 285 | }
|
0 commit comments