Fix `LocalBuilder.IsPinned` always returning `false` on CoreCLR runtime (#89411)
authorHamish Arblaster <hamarb123@gmail.com>
Thu, 3 Aug 2023 21:44:07 +0000 (07:44 +1000)
committerGitHub <noreply@github.com>
Thu, 3 Aug 2023 21:44:07 +0000 (16:44 -0500)
src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs
src/libraries/System.Reflection.Emit.ILGeneration/tests/ILGenerator/DeclareLocalTests.cs

index ee72bab..ad564aa 100644 (file)
@@ -43,7 +43,7 @@ namespace System.Reflection.Emit
             if (rtType == null)
                 throw new ArgumentException(SR.Argument_MustBeRuntimeType);
 
-            localBuilder = new LocalBuilder(m_localCount, localType, m_methodBuilder);
+            localBuilder = new LocalBuilder(m_localCount, localType, m_methodBuilder, pinned);
             // add the localType to local signature
             m_localSignature.AddArgument(localType, pinned);
             m_localCount++;
index db4d5b2..573c42c 100644 (file)
@@ -119,6 +119,17 @@ namespace System.Reflection.Emit.Tests
             Assert.Throws<InvalidOperationException>(() => ilGenerator.DeclareLocal(typeof(int)));
         }
 
+        [Fact]
+        public void DeclareLocal_Pinned()
+        {
+            TypeBuilder type = Helpers.DynamicType(TypeAttributes.NotPublic);
+            MethodBuilder method = type.DefineMethod("TestMethod_Pinning", MethodAttributes.Public | MethodAttributes.Static);
+            ILGenerator generator = method.GetILGenerator();
+            Assert.True(generator.DeclareLocal(typeof(int).MakeByRefType(), true).IsPinned);
+            Assert.True(generator.DeclareLocal(typeof(object), true).IsPinned);
+            Assert.True(generator.DeclareLocal(typeof(byte), true).IsPinned);
+        }
+
         private void VerifyDeclareLocal(ILGenerator generator)
         {
             for (int i = 0; i < TestData.Length; i++)