diff --git a/src/ObjCRuntime/Class.cs b/src/ObjCRuntime/Class.cs index 200819b31f24..d348b57f167e 100644 --- a/src/ObjCRuntime/Class.cs +++ b/src/ObjCRuntime/Class.cs @@ -25,6 +25,7 @@ public partial class Class : INativeObject // We use the last significant bit of the IntPtr to store if this is a custom class or not. static Dictionary type_to_class; // accessed from multiple threads, locking required. + static Type[] class_to_type; internal IntPtr handle; @@ -33,12 +34,15 @@ internal unsafe static void Initialize (Runtime.InitializationOptions* options) { type_to_class = new Dictionary (Runtime.TypeEqualityComparer); - if (!Runtime.DynamicRegistrationSupported) - return; // Only the dynamic registrar needs the list of registered assemblies. - var map = options->RegistrationMap; if (map == null) return; + + class_to_type = new Type [map->map_count]; + + if (!Runtime.DynamicRegistrationSupported) + return; // Only the dynamic registrar needs the list of registered assemblies. + for (int i = 0; i < map->assembly_count; i++) { var ptr = Marshal.ReadIntPtr (map->assembly, i * IntPtr.Size); @@ -340,10 +344,14 @@ internal unsafe static Type FindType (IntPtr @class, out bool is_custom_type) return null; } + Type type = class_to_type [mapIndex]; + if (type != null) + return type; + // Resolve the map entry we found to a managed type var type_reference = map->map [mapIndex].type_reference; var member = ResolveTokenReference (type_reference, 0x02000000); - var type = member as Type; + type = member as Type; if (type == null && member != null) throw ErrorHelper.CreateError (8022, $"Expected the token reference 0x{type_reference:X} to be a type, but it's a {member.GetType ().Name}. Please file a bug report at https://github.com/xamarin/xamarin-macios/issues/new."); @@ -352,6 +360,8 @@ internal unsafe static Type FindType (IntPtr @class, out bool is_custom_type) Console.WriteLine ($"FindType (0x{@class:X} = {Marshal.PtrToStringAuto (class_getName (@class))}) => {type.FullName}; is custom: {is_custom_type} (token reference: 0x{type_reference:X})."); #endif + class_to_type [mapIndex] = type; + return type; }