public MemberDefinition ReadMemberDefinition()
{
#if DEBUG_GR2_SERIALIZATION
var defnOffset = Stream.Position;
#endif
var defn = new MemberDefinition();
int typeId = Reader.ReadInt32();
if (typeId > (uint)MemberType.Max)
throw new ParsingException(String.Format("Unsupported member type: {0}", typeId));
defn.Type = (MemberType)typeId;
var name = ReadStringReference();
Debug.Assert(!defn.IsValid || name.IsValid);
if (defn.IsValid)
{
defn.Name = name.Resolve(this);
defn.GrannyName = defn.Name;
}
defn.Definition = ReadStructReference();
defn.ArraySize = Reader.ReadUInt32();
defn.Extra = new UInt32[MemberDefinition.ExtraTagCount];
for (var i = 0; i < MemberDefinition.ExtraTagCount; i++)
defn.Extra[i] = Reader.ReadUInt32();
// TODO 64-bit: ???
if (Magic.Is32Bit)
defn.Unknown = Reader.ReadUInt32();
else
defn.Unknown = (UInt32)Reader.ReadUInt64();
Debug.Assert(defn.Unknown == 0);
if (defn.Type == MemberType.Inline || defn.Type == MemberType.Reference || defn.Type == MemberType.ArrayOfReferences ||
defn.Type == MemberType.ReferenceToArray)
Debug.Assert(defn.Definition.IsValid);
#if DEBUG_GR2_SERIALIZATION
string description;
if (defn.IsValid)
{
if (defn.ArraySize != 0)
description = String.Format(" [{0:X8}] {1}: {2}[{3}]", defnOffset, defn.Name, defn.Type.ToString(), defn.ArraySize);
else
description = String.Format(" [{0:X8}] {1}: {2}", defnOffset, defn.Name, defn.Type.ToString());
if (defn.Definition.IsValid)
{
if (!DebugPendingResolve.Contains(defn.Definition))
{
DebugPendingResolve.Add(defn.Definition);
System.Console.WriteLine(String.Format(" ===== Debug resolve for {0:X8} ===== ", defn.Definition.Offset));
defn.Definition.Resolve(this);
System.Console.WriteLine(String.Format(" ===== End debug resolve for {0:X8} ===== ", defn.Definition.Offset));
}
description += String.Format(" <struct {0:X8}>", defn.Definition.Offset);
}
if (defn.Extra[0] != 0 || defn.Extra[1] != 0 || defn.Extra[2] != 0)
description += String.Format(" Extra: {0} {1} {2}", defn.Extra[0], defn.Extra[1], defn.Extra[2]);
}
else
{
description = String.Format(" <invalid>: {0}", defn.Type.ToString());
}
System.Console.WriteLine(description);
#endif
return defn;
}