DispatchMapEntry[] BuildDispatchMap(NodeFactory factory) { ArrayBuilder <DispatchMapEntry> dispatchMapEntries = new ArrayBuilder <DispatchMapEntry>(); for (int i = 0; i < _type.RuntimeInterfaces.Length; i++) { var interfaceType = _type.RuntimeInterfaces[i]; Debug.Assert(interfaceType.IsInterface); List <MethodDesc> virtualSlots; factory.VirtualSlots.TryGetValue(interfaceType, out virtualSlots); if (virtualSlots != null) { for (int j = 0; j < virtualSlots.Count; j++) { MethodDesc declMethod = virtualSlots[j]; var implMethod = VirtualFunctionResolution.ResolveInterfaceMethodToVirtualMethodOnType(declMethod, _type.GetClosestMetadataType()); // Interface methods first implemented by a base type in the hierarchy will return null for the implMethod (runtime interface // dispatch will walk the inheritance chain). if (implMethod != null) { var entry = new DispatchMapEntry(); entry.InterfaceIndex = checked ((short)i); entry.InterfaceMethodSlot = checked ((short)j); entry.ImplementationMethodSlot = checked ((short)VirtualMethodSlotHelper.GetVirtualMethodSlot(factory, implMethod)); dispatchMapEntries.Add(entry); } } } } return(dispatchMapEntries.ToArray()); }
DispatchMapEntry[] BuildDispatchMap(NodeFactory factory) { ArrayBuilder<DispatchMapEntry> dispatchMapEntries = new ArrayBuilder<DispatchMapEntry>(); for (int i = 0; i < _type.RuntimeInterfaces.Length; i++) { var interfaceType = _type.RuntimeInterfaces[i]; Debug.Assert(interfaceType.IsInterface); List<MethodDesc> virtualSlots; factory.VirtualSlots.TryGetValue(interfaceType, out virtualSlots); if (virtualSlots != null) { for (int j = 0; j < virtualSlots.Count; j++) { MethodDesc declMethod = virtualSlots[j]; var implMethod = VirtualFunctionResolution.ResolveInterfaceMethodToVirtualMethodOnType(declMethod, _type.GetClosestMetadataType()); // Interface methods first implemented by a base type in the hierarchy will return null for the implMethod (runtime interface // dispatch will walk the inheritance chain). if (implMethod != null) { var entry = new DispatchMapEntry(); entry.InterfaceIndex = checked((short)i); entry.InterfaceMethodSlot = checked((short)j); entry.ImplementationMethodSlot = checked((short)VirtualMethodSlotHelper.GetVirtualMethodSlot(factory, implMethod)); dispatchMapEntries.Add(entry); } } } } return dispatchMapEntries.ToArray(); }