public VirtualTable(MethodTable mtable) { Name = mtable.GetNameKey(); foreach (var kv in mtable.EntryMap) { EntryMap.Add( new TypeMethodPair(kv.Key.Item1.GetTypeX(), kv.Key.Item2), new TypeMethodImpl(kv.Value)); } foreach (var kv in mtable.SameTypeReplaceMap) { SameTypeReplaceMap.Add( kv.Key, new TypeMethodPair(kv.Value.Item1.GetTypeX(), kv.Value.Item2)); } foreach (var kv in mtable.NewSlotEntryMap) { NewSlotEntryMap.Add( kv.Key, new TypeMethodPair(kv.Value.Item1.GetTypeX(), kv.Value.Item2)); } }
public MethodTable ExpandTable(IList <TypeSig> genArgs) { Debug.Assert(genArgs.IsCollectionValid()); Debug.Assert(!InstGenArgs.IsCollectionValid()); Debug.Assert(Def.GenericParameters.Count == genArgs.Count); bool isInterface = Def.IsInterface; MethodTable expMetTable = new MethodTable(TypeMgr, Def); expMetTable.DerivedLevel = DerivedLevel; expMetTable.InstGenArgs = genArgs; expMetTable.GetNameKey(); IGenericReplacer replacer = new TypeDefGenReplacer(Def, genArgs); StringBuilder sb = new StringBuilder(); foreach (var kv in SlotMap) { Debug.Assert(kv.Value.Entries.Count != 0); VirtualSlot vslot = ExpandVirtualSlot(kv.Value, expMetTable, replacer); TableMethodPair metPair = vslot.Entries.First(); string metNameKey = metPair.Item1.GetExpandedMethodNameKey(sb, metPair.Item2); // 接口合并相同签名的方法 if (isInterface) { expMetTable.MergeInterfaces(metNameKey, vslot.Entries); } else { expMetTable.SlotMap[metNameKey] = vslot; } } var expEntryMap = expMetTable.EntryMap; foreach (var kv in EntryMap) { var entry = ExpandMethodPair(kv.Key, expMetTable, replacer); var impl = ExpandMethodPair(kv.Value.MethodPair, expMetTable, replacer); MergeExpandedEntry(expEntryMap, entry, impl, kv.Value.Level); } foreach (var kv in SameTypeReplaceMap) { expMetTable.SameTypeReplaceMap[kv.Key] = ExpandMethodPair(kv.Value, expMetTable, replacer); } foreach (var kv in NewSlotEntryMap) { expMetTable.NewSlotEntryMap[kv.Key] = ExpandMethodPair(kv.Value, expMetTable, replacer); } return(expMetTable); }