internal static void GetClassRefs(PEReader buff, TableRow[] typeRefs, ReferenceScope paren, uint[] parIxs)
{
int num = typeRefs.Length;
uint[] fieldStart = new uint[num+1], methStart = new uint[num+1], extends = new uint[num+1];
for (int i=0; i < num; i++) {
uint flags = buff.ReadUInt32();
string name = buff.GetString();
string nameSpace = buff.GetString();
extends[i] = buff.GetCodedIndex(CIx.TypeDefOrRef);
fieldStart[i] = buff.GetIndex(MDTable.Field);
methStart[i] = buff.GetIndex(MDTable.Method);
//Console.WriteLine("flags = " + Hex.Int(flags));
if (i == 0) // ASSERT first entry is always <Module>
typeRefs[i] = paren.GetDefaultClass();
else if (isPublic(flags)) {
if (parIxs[i] != 0) {
typeRefs[i] = new NestedClassRef(paren,nameSpace,name);
} else {
typeRefs[i] = paren.GetExistingClass(nameSpace,name);
if (typeRefs[i] == null) {
typeRefs[i] = new ClassRef(paren,nameSpace,name);
paren.AddToClassList((ClassRef)typeRefs[i]);
}
}
}
}
fieldStart[num] = buff.GetTableSize(MDTable.Field)+1;
methStart[num] = buff.GetTableSize(MDTable.Method)+1;
// Find Nested Classes
for (int i=0; i < typeRefs.Length; i++) {
if ((typeRefs[i] != null) && (typeRefs[i] is NestedClassRef)) {
NestedClassRef nRef = (NestedClassRef)typeRefs[i];
ClassRef nPar = (ClassRef)typeRefs[parIxs[i]-1];
if (nPar == null) { // parent is private, so ignore
typeRefs[i] = null;
} else {
nRef.SetParent(nPar);
nPar.AddToClassList(nRef);
}
}
if (typeRefs[i] != null) {
if (buff.GetCodedElement(CIx.TypeDefOrRef,extends[i]) == MSCorLib.mscorlib.ValueType())
((ClassRef)typeRefs[i]).MakeValueClass();
buff.SetElementPosition(MDTable.Field,fieldStart[i]);
FieldDef.GetFieldRefs(buff,fieldStart[i+1]-fieldStart[i],(ClassRef)typeRefs[i]);
buff.SetElementPosition(MDTable.Method,methStart[i]);
MethodDef.GetMethodRefs(buff,methStart[i+1]-methStart[i],(ClassRef)typeRefs[i]);
}
}
}