From 76cef6cc7d33d7d5c03f71e713111cbd1252e5c7 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 23 May 2024 10:22:54 +0200 Subject: [PATCH] [Blocks] Remove a block callback validation that's apparently too eager. (#20625) The validation verifies that the function pointer for a block callback is the same the return value from the method's MethodInfo.MethodHandle.GetFunctionPointer() method. In actual code, it's equivalent to validating that the following always prints "Equal: true": ```cs [UnmanagedCallersOnly] public static void Invoke () {} static void Test () { delegate* unmanaged fptr1 = &Invoke; IntPtr fptr2 = GetType ().GetMethod ("Invoke").MethodHandle.GetFunctionPointer (); Console.WriteLine ($"fptr1: 0x{((IntPtr) fptr1).ToString ("x")}"); Console.WriteLine ($"fptr2: 0x{fptr2.ToString ("x")}"); Console.WriteLine ($"Equal: ((IntPtr) fptr1) == fptr2}"); // prints "Equal: true" for me } ``` However, this isn't documented, and some feedback indicates it's certainly not a valid assumption for CoreCLR: https://discord.com/channels/732297728826277939/732582981163548703/1242473425759633488 And there's also a customer running into this validation, apparently without cause: https://devdiv.visualstudio.com/DevDiv/_workitems/edit/2054534 So just remove it. --- src/ObjCRuntime/Blocks.cs | 5 ----- tools/mtouch/Errors.designer.cs | 9 --------- tools/mtouch/Errors.resx | 4 +--- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/ObjCRuntime/Blocks.cs b/src/ObjCRuntime/Blocks.cs index 6d5dd9f6be15..44b2765dda45 100644 --- a/src/ObjCRuntime/Blocks.cs +++ b/src/ObjCRuntime/Blocks.cs @@ -172,11 +172,6 @@ static string GetBlockSignature (void* trampoline, MethodInfo trampolineMethod) if (!Runtime.DynamicRegistrationSupported) throw ErrorHelper.CreateError (8050, Errors.MX8050 /* BlockLiteral.GetBlockSignature is not supported when the dynamic registrar has been linked away. */); - // Verify that the function pointer matches the trampoline - var functionPointer = trampolineMethod.MethodHandle.GetFunctionPointer (); - if (functionPointer != (IntPtr) trampoline) - throw ErrorHelper.CreateError (8047, Errors.MX8047 /* The trampoline method {0} does not match the function pointer 0x{1} for the trampolineMethod argument (they're don't refer to the same method) */, trampolineMethod.DeclaringType.FullName + "." + trampolineMethod.Name, ((IntPtr) trampoline).ToString ("x")); - // Verify that there's at least one parameter, and it must be System.IntPtr, void* or ObjCRuntime.BlockLiteral*. var parameters = trampolineMethod.GetParameters (); if (parameters.Length < 1) diff --git a/tools/mtouch/Errors.designer.cs b/tools/mtouch/Errors.designer.cs index ee6059867a00..8ff0567c53d0 100644 --- a/tools/mtouch/Errors.designer.cs +++ b/tools/mtouch/Errors.designer.cs @@ -4168,15 +4168,6 @@ public static string MX8046 { } } - /// - /// Looks up a localized string similar to The trampoline method {0} does not match the function pointer 0x{1} for the trampolineMethod argument (they're don't refer to the same method).. - /// - public static string MX8047 { - get { - return ResourceManager.GetString("MX8047", resourceCulture); - } - } - /// /// Looks up a localized string similar to The trampoline method {0} must have at least one parameter.. /// diff --git a/tools/mtouch/Errors.resx b/tools/mtouch/Errors.resx index f160f2aab889..e68e28c5148a 100644 --- a/tools/mtouch/Errors.resx +++ b/tools/mtouch/Errors.resx @@ -2227,9 +2227,7 @@ Unable to find the method '{0}' in the type '{1}' - - The trampoline method {0} does not match the function pointer 0x{1} for the trampolineMethod argument (they're don't refer to the same method). - + The trampoline method {0} must have at least one parameter.