public static ExceptionHandler FromReader(MethodBody methodBody, IBinaryStreamReader reader, bool fatFormat)
{
var offset = reader.Position;
var handerType = fatFormat ? reader.ReadUInt32() : reader.ReadUInt16();
var tryOffset = fatFormat ? reader.ReadInt32() : reader.ReadUInt16();
var tryLength = fatFormat ? reader.ReadInt32() : reader.ReadByte();
var handlerOffset = fatFormat ? reader.ReadInt32() : reader.ReadUInt16();
var handlerLength = fatFormat ? reader.ReadInt32() : reader.ReadByte();
var classTokenOrFilterOffset = reader.ReadUInt32();
var handler = new ExceptionHandler((ExceptionHandlerType)handerType)
{
StartOffset = offset,
IsFat = fatFormat,
TryStart = methodBody.GetInstructionByOffset(tryOffset),
TryEnd = methodBody.GetInstructionByOffset(tryOffset + tryLength),
HandlerStart = methodBody.GetInstructionByOffset(handlerOffset),
HandlerEnd = methodBody.GetInstructionByOffset(handlerOffset + handlerLength),
};
switch (handler.HandlerType)
{
case ExceptionHandlerType.Exception:
handler.CatchType = (ITypeDefOrRef)((IOperandResolver)methodBody).ResolveMember(new MetadataToken(classTokenOrFilterOffset));
break;
case ExceptionHandlerType.Filter:
handler.FilterStart = methodBody.GetInstructionByOffset((int)classTokenOrFilterOffset);
break;
}
return handler;
}