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