public NativeMethodInfo Find(MethodInfo Info, Boolean SkipOverrides = false) { NativeMethodInfo Ret = this.MethodInfo.FirstOrDefault((VMI) => VMI.Method == Info && (SkipOverrides ? VMI.DoesOverride != true : true)); if (Ret != null && Ret.DoesOverride) { return(this.Find(Ret.BaseMethod, true)); } return(Ret); }
public static NativeClassInfo CalculateClassLayout(Type T) { List <NativeMethodInfo> MethodInfos = new List <NativeMethodInfo>(); List <NativeVariableInfo> VariableInfos = new List <NativeVariableInfo>(); Dictionary <Int32, Int32> MethodCounter = new Dictionary <Int32, Int32>(); Dictionary <Int32, Int32> VariableOffsets = new Dictionary <Int32, Int32>(); CalculateVTableLayout(T, (VTableOffset, Interface) => { MethodInfo[] Methods = Interface.GetMethods(); if (!MethodCounter.ContainsKey(VTableOffset)) { MethodCounter.Add(VTableOffset, 0); VariableOffsets.Add(VTableOffset, VTablePointerSize); } for (Int32 i = 0; i < Methods.Length; i++) { PropertyInfo Prop; if ((Prop = GetPropertyForMethod(Methods[i])) != null) { if (Prop.GetSetMethod() == Methods[i]) { continue; } NativeVariableInfo VarInfo = new NativeVariableInfo { Offset = VariableOffsets[VTableOffset], PropertyInfo = Prop }; VarInfo.VariableType = VarInfo.PropertyInfo.PropertyType; VarInfo.Name = VarInfo.PropertyInfo.Name; VariableOffsets[VTableOffset] += Marshal.SizeOf(VarInfo.VariableType); VariableInfos.Add(VarInfo); continue; } NativeMethodInfo VMethInfo = new NativeMethodInfo { Method = Methods[i] }; if (BaseContains(Methods[i], out MethodInfo BMI)) { VMethInfo.BaseMethod = BMI; VMethInfo.DoesOverride = true; } else { VMethInfo.BaseMethod = null; VMethInfo.MethodIndex = MethodCounter[VTableOffset]++; VMethInfo.VTableOffset = VTableOffset; VMethInfo.DoesOverride = false; } MethodInfos.Add(VMethInfo); } }); NativeClassInfo Ret = new NativeClassInfo(); Ret.MethodInfo.AddRange(MethodInfos); Ret.VariableInfo.AddRange(VariableInfos); return(Ret); }