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;
}