Mosa.Compiler.Framework.MosaTypeLayout.CreateMethodTable C# (CSharp) Method

CreateMethodTable() private method

private CreateMethodTable ( MosaType type ) : List
type MosaType
return List
        private List<MosaMethod> CreateMethodTable(MosaType type)
        {
            List<MosaMethod> methodTable;
            if (typeMethodTables.TryGetValue(type, out methodTable))
            {
                return methodTable;
            }

            methodTable = GetMethodTableFromBaseType(type);

            foreach (var method in type.Methods)
            {
                if (method.IsVirtual)
                {
                    if (method.IsNewSlot)
                    {
                        int slot = methodTable.Count;
                        methodTable.Add(method);
                        methodTableOffsets.Add(method, slot);
                    }
                    else
                    {
                        int slot = FindOverrideSlot(methodTable, method);
                        if (slot != -1)
                        {
                            methodTable[slot] = method;
                            methodTableOffsets.Add(method, slot);
                        }
                        else
                        {
                            slot = methodTable.Count;
                            methodTable.Add(method);
                            methodTableOffsets.Add(method, slot);
                        }
                    }
                }
                else
                {
                    if (method.IsStatic && method.IsRTSpecialName)
                    {
                        int slot = methodTable.Count;
                        methodTable.Add(method);
                        methodTableOffsets.Add(method, slot);
                    }
                    else if (!method.IsInternal && method.ExternMethod == null)
                    {
                        int slot = methodTable.Count;
                        methodTable.Add(method);
                        methodTableOffsets.Add(method, slot);
                    }
                }
            }

            typeMethodTables.Add(type, methodTable);

            return methodTable;
        }