Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }