void WriteExceptionHandlerCollection(ExceptionHandlerCollection seh) { m_codeWriter.QuadAlign(); if (seh.Count < 0x15 && !IsFat(seh)) { m_codeWriter.Write((byte)MethodDataSection.EHTable); m_codeWriter.Write((byte)(seh.Count * 12 + 4)); m_codeWriter.Write(new byte [2]); foreach (ExceptionHandler eh in seh) { m_codeWriter.Write((ushort)eh.Type); m_codeWriter.Write((ushort)eh.TryStart.Offset); m_codeWriter.Write((byte)(eh.TryEnd.Offset - eh.TryStart.Offset)); m_codeWriter.Write((ushort)eh.HandlerStart.Offset); m_codeWriter.Write((byte)GetLength(eh.HandlerStart, eh.HandlerEnd, seh.Container.Instructions)); WriteHandlerSpecific(eh); } } else { m_codeWriter.Write((byte)(MethodDataSection.FatFormat | MethodDataSection.EHTable)); WriteFatBlockSize(seh); foreach (ExceptionHandler eh in seh) { m_codeWriter.Write((uint)eh.Type); m_codeWriter.Write((uint)eh.TryStart.Offset); m_codeWriter.Write((uint)(eh.TryEnd.Offset - eh.TryStart.Offset)); m_codeWriter.Write((uint)eh.HandlerStart.Offset); m_codeWriter.Write((uint)GetLength(eh.HandlerStart, eh.HandlerEnd, seh.Container.Instructions)); WriteHandlerSpecific(eh); } } }
static bool IsFat(ExceptionHandlerCollection seh) { for (int i = 0; i < seh.Count; i++) { ExceptionHandler eh = seh [i]; if (IsRangeFat(eh.TryStart, eh.TryEnd, seh.Container.Instructions)) { return(true); } if (IsRangeFat(eh.HandlerStart, eh.HandlerEnd, seh.Container.Instructions)) { return(true); } switch (eh.Type) { case ExceptionHandlerType.Filter: if (IsRangeFat(eh.FilterStart, eh.FilterEnd, seh.Container.Instructions)) { return(true); } break; } } return(false); }
void WriteFatBlockSize(ExceptionHandlerCollection seh) { int size = seh.Count * 24 + 4; m_codeWriter.Write((byte)(size & 0xff)); m_codeWriter.Write((byte)((size >> 8) & 0xff)); m_codeWriter.Write((byte)((size >> 16) & 0xff)); }