[test] EnumBuilder regression tests for #58361
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 26 Jul 2017 19:27:48 +0000 (15:27 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Thu, 27 Jul 2017 15:41:29 +0000 (11:41 -0400)
Cause the creation of a token for an EnumBuilder object.  Test both typedef
tokens (EnumBuilder from same assembly) and typeref token (EnumBuilder in another assembly)

mcs/class/corlib/Test/System.Reflection.Emit/EnumBuilderTest.cs

index 124f59ef3b9f2b22fccdfa67399abdec51ca7374..5432040c5235a340e7e2d813a85e87f26faddc0b 100644 (file)
@@ -316,6 +316,61 @@ namespace MonoTests.System.Reflection.Emit
                                Assert.Fail ("Expected CreateInstance of a broken type to throw TLE");
                }
 
+               [Test]
+               public void TestEnumBuilderTokenUsable () {
+                       // Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=58361
+                       // Create an EnumBuilder and use it in an ILGenerator that consumes its token.
+                       var modBuilder = GenerateModule ();
+                       EnumBuilder enumBuilder = GenerateEnum (modBuilder);
+
+                       var tb = modBuilder.DefineType ("Foo", TypeAttributes.Public);
+
+                       var cb = tb.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard,
+                                                      Type.EmptyTypes);
+
+                       var ilg = cb.GetILGenerator ();
+
+                       ilg.Emit (OpCodes.Ldtoken, enumBuilder);
+                       ilg.Emit (OpCodes.Pop);
+                       ilg.Emit (OpCodes.Ret);
+
+                       var t = tb.CreateType ();
+                       enumBuilder.CreateType ();
+
+                       var ci = t.GetConstructor (Type.EmptyTypes);
+                       var x = ci.Invoke (null);
+                       Assert.IsNotNull (x);
+               }
+
+               [Test]
+               public void TestEnumBuilderTokenUsableCrossAssembly () {
+                       // Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=58361
+                       // Create an EnumBuilder and use it in an ILGenerator that consumes its token in a different assembly.
+                       var modBuilder = GenerateModule ();
+                       var modBuilder2 = GenerateModule ();
+                       EnumBuilder enumBuilder = GenerateEnum (modBuilder2);
+
+                       // N.B. "tb" is in modBuilder but enumBuilder is in modBuilder2
+                       var tb = modBuilder.DefineType ("Foo", TypeAttributes.Public);
+
+                       var cb = tb.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard,
+                                                      Type.EmptyTypes);
+
+                       var ilg = cb.GetILGenerator ();
+
+                       ilg.Emit (OpCodes.Ldtoken, enumBuilder);
+                       ilg.Emit (OpCodes.Pop);
+                       ilg.Emit (OpCodes.Ret);
+
+                       var t = tb.CreateType ();
+                       enumBuilder.CreateType ();
+
+                       var ci = t.GetConstructor (Type.EmptyTypes);
+                       var x = ci.Invoke (null);
+                       Assert.IsNotNull (x);
+               }
+
+
                private static void VerifyType (Type type)
                {
                        Assert.IsNotNull (type.Assembly, "#V1");