Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }