public static MethodBody FromReadingContext(MethodDefinition method, ReadingContext context)
{
var reader = context.Reader;
var body = new MethodBody(method)
{
StartOffset = reader.Position,
};
var bodyHeader = reader.ReadByte();
uint codeSize;
if ((bodyHeader & 0x3) == 0x3)
{
reader.Position--;
var fatBodyHeader = reader.ReadUInt16();
var headerSize = (fatBodyHeader >> 12) * 4;
var hasSections = (fatBodyHeader & 0x8) == 0x8;
body.InitLocals = (fatBodyHeader & 0x10) == 0x10;
body.MaxStack = reader.ReadUInt16();
codeSize = reader.ReadUInt32();
var localVarSig = reader.ReadUInt32();
if (localVarSig != 0)
{
var header = method.Header;
var tableStream = header.GetStream<TableStream>();
MetadataMember signature;
tableStream.TryResolveMember(new MetadataToken(localVarSig), out signature);
body.Signature = signature as StandAloneSignature;
}
if (hasSections)
{
body._sectionReadingContext = context.CreateSubContext(reader.Position + codeSize);
body._sectionReadingContext.Reader.Align(4);
}
}
else if ((bodyHeader & 0x2) == 0x2)
{
codeSize = (uint)(bodyHeader >> 2);
body.MaxStack = 8;
}
else
throw new ArgumentException("Invalid method body header signature.");
body._msilReadingContext = context.CreateSubContext(reader.Position, (int)codeSize);
return body;
}