1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using Xunit;
6 
7 namespace System.Reflection.Emit.Tests
8 {
9     public class MethodBuilderGetILGenerator
10     {
11         [Theory]
12         [InlineData(20)]
13         [InlineData(-10)]
GetILGenerator_Int(int size)14         public void GetILGenerator_Int(int size)
15         {
16             TypeBuilder type = Helpers.DynamicType(TypeAttributes.Public);
17             MethodBuilder method = type.DefineMethod("TestMethod", MethodAttributes.Public | MethodAttributes.Static, typeof(int), new Type[0]);
18 
19             ILGenerator ilGenerator = method.GetILGenerator(size);
20             int expectedReturn = 5;
21             ilGenerator.Emit(OpCodes.Ldc_I4, expectedReturn);
22             ilGenerator.Emit(OpCodes.Ret);
23 
24             Type createdType = type.CreateTypeInfo().AsType();
25             MethodInfo createedMethod = createdType.GetMethod("TestMethod");
26             Assert.Equal(expectedReturn, createedMethod.Invoke(null, null));
27         }
28 
29         [Theory]
30         [InlineData(TypeAttributes.Public, MethodAttributes.Public | MethodAttributes.PinvokeImpl)]
31         [InlineData(TypeAttributes.Abstract, MethodAttributes.PinvokeImpl)]
32         [InlineData(TypeAttributes.Abstract, MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)]
GetILGenerator_NoMethodBody_ThrowsInvalidOperationException(TypeAttributes typeAttributes, MethodAttributes methodAttributes)33         public void GetILGenerator_NoMethodBody_ThrowsInvalidOperationException(TypeAttributes typeAttributes, MethodAttributes methodAttributes)
34         {
35             TypeBuilder type = Helpers.DynamicType(typeAttributes);
36             MethodBuilder method = type.DefineMethod("TestMethod", methodAttributes);
37 
38             Assert.Throws<InvalidOperationException>(() => method.GetILGenerator());
39             Assert.Throws<InvalidOperationException>(() => method.GetILGenerator(10));
40         }
41 
42         [Theory]
43         [InlineData(MethodAttributes.Abstract)]
44         [InlineData(MethodAttributes.Assembly)]
45         [InlineData(MethodAttributes.CheckAccessOnOverride)]
46         [InlineData(MethodAttributes.FamANDAssem)]
47         [InlineData(MethodAttributes.Family)]
48         [InlineData(MethodAttributes.FamORAssem)]
49         [InlineData(MethodAttributes.Final)]
50         [InlineData(MethodAttributes.HasSecurity)]
51         [InlineData(MethodAttributes.HideBySig)]
52         [InlineData(MethodAttributes.MemberAccessMask)]
53         [InlineData(MethodAttributes.NewSlot)]
54         [InlineData(MethodAttributes.Private)]
55         [InlineData(MethodAttributes.PrivateScope)]
56         [InlineData(MethodAttributes.Public)]
57         [InlineData(MethodAttributes.RequireSecObject)]
58         [InlineData(MethodAttributes.ReuseSlot)]
59         [InlineData(MethodAttributes.RTSpecialName)]
60         [InlineData(MethodAttributes.SpecialName)]
61         [InlineData(MethodAttributes.Static)]
62         [InlineData(MethodAttributes.UnmanagedExport)]
63         [InlineData(MethodAttributes.Virtual)]
64         [InlineData(MethodAttributes.VtableLayoutMask)]
65         [InlineData(MethodAttributes.Assembly | MethodAttributes.CheckAccessOnOverride |
66                 MethodAttributes.FamORAssem | MethodAttributes.Final |
67                 MethodAttributes.HasSecurity | MethodAttributes.HideBySig | MethodAttributes.MemberAccessMask |
68                 MethodAttributes.NewSlot | MethodAttributes.Private |
69                 MethodAttributes.PrivateScope | MethodAttributes.RequireSecObject |
70                 MethodAttributes.RTSpecialName | MethodAttributes.SpecialName |
71                 MethodAttributes.Static | MethodAttributes.UnmanagedExport)]
GetILGenerator_DifferentAttributes(MethodAttributes attributes)72         public void GetILGenerator_DifferentAttributes(MethodAttributes attributes)
73         {
74             TypeBuilder type = Helpers.DynamicType(TypeAttributes.Abstract);
75             MethodBuilder method = type.DefineMethod(attributes.ToString(), attributes);
76             Assert.NotNull(method.GetILGenerator());
77         }
78     }
79 }
80