public NativeMethodInfo Find(MethodInfo Info, bool SkipOverrides = false) { NativeMethodInfo Ret = MethodInfo.FirstOrDefault((VMI) => VMI.Method == Info && (SkipOverrides ? VMI.DoesOverride != true : true)); if (Ret != null && Ret.DoesOverride) { return(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 <int, int> MethodCounter = new Dictionary <int, int>(); Dictionary <int, int> VariableOffsets = new Dictionary <int, int>(); CalculateVTableLayout(T, (VTableOffset, Interface) => { MethodInfo[] Methods = Interface.GetMethods(); if (!MethodCounter.ContainsKey(VTableOffset)) { MethodCounter.Add(VTableOffset, 0); VariableOffsets.Add(VTableOffset, VTablePointerSize); } for (int i = 0; i < Methods.Length; i++) { PropertyInfo Prop; if ((Prop = GetPropertyForMethod(Methods[i])) != null) { if (Prop.GetSetMethod() == Methods[i]) { continue; } NativeVariableInfo VarInfo = new NativeVariableInfo(); VarInfo.Offset = VariableOffsets[VTableOffset]; VarInfo.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(); VMethInfo.Method = Methods[i]; MethodInfo BMI; if (BaseContains(Methods[i], out 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); }