Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 67 стр.

UptoLike

Диаграмма стека для инструкции leave:
... - >
Как видно из диаграммы, побочным эффектом при выполнении ин-
струкции leave является очистка стека вычислений.
Инструкция endfinally (см. таблицу 3.49) используется для выхода из
областей обработчиков без фильтрации. У нее есть псевдоним – endfault.
Таблица 3.49. Инструкция endfinally
Диаграмма стека для инструкции endfinally:
... - > ...
Инструкция endfilter (см. таблицу 3.50) завершает область фильтра.
Ее основная задача состоит в том, чтобы вернуть целое число (0 или 1).
Значение 0 означает, что данное исключение не может быть обработано и
нужно поискать другой обработчик. Значение 1 говорит о том, что нужно
передать управление на обработчик.
Таблица 3.50. Инструкция endfilter
Диаграмма стека для инструкции endfilter:
... , value -> ...
3.4.3. Правила размещения областей
Итак, в общем случае, предложение обработки исключений опреде-
ляет три области в коде метода: область защищенного блока, область
фильтра и область обработчика (фильтр может отсутствовать). Эти области
должны быть расположены в соответствии с определенными правилами:
1. Области, определяемые в предложении обработки исключений,
не могут перекрываться.
2. Область фильтра всегда расположена непосредственно перед
областью обработчика и завершается инструкцией endfilter.
3. Для любой пары предложений обработки исключений A и B
должно быть справедливо следующее:
Common Intermediate Language
121
Диаграмма стека для инструкции throw:
... , obj -> ...
Объектная ссылка, которую инструкция throw потребляет со стека
вычислений, должна указывать на объект в куче, описывающий исключе-
ние. Вообще говоря, в качестве такого объекта может выступать объект
любого типа, в том числе упакованный тип-значение, но спецификация
CLS требует, чтобы базовым классом для типа объекта-исключения являл-
ся класс System.Exception.
Если при выполнении инструкции throw на стеке вычислений
лежит нулевая ссылка, то генерируется исключение
System.NullReferenceException.
Инструкция rethrow (см. таблицу 3.47) разрешена только внутри обра-
ботчика исключений с фильтрацией по типу и предназначена для генерации
того же самого исключения, которое было поймано обработчиком.
Таблица 3.47. Инструкция rethrow
Диаграмма стека для инструкции rethrow:
... - > ...
3.4.2.2. Инструкции передачи управления между блоками
Инструкции, представленные в таблице 3.48, являются аналогами
инструкций безусловного перехода и используются для выхода из защи-
щенных областей и областей обработчиков с фильтрацией. Необходи-
мость существования этих инструкций обусловлена тем фактом, что обыч-
ные инструкции безусловного перехода не могут пересекать границы этих
областей.
Таблица 3.48. Инструкция leave
120
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0xFE 0x1A rethrow –Генерирует то же самое исклю-
чение, что было поймано обра-
ботчиком
Код Инструкция Встроенный Описание
операнд
0xDC endfinally Выход из обработчиков finally и
(endfault) fault
Код Инструкция Встроенный Описание
операнд
0xFE 0x11 endfilter Завершение области фильтра
Код Инструкция Встроенный Описание
операнд
0xDD leave int32 Выход из области
0xDE leave.s int8 Выход из области (короткий пе-
реход)
120                          CIL и системное программирование в Microsoft .NET   Common Intermediate Language                                           121


     Диаграмма стека для инструкции throw:                                            Диаграмма стека для инструкции leave:
     ... , obj -> ...                                                                 ... ->
     Объектная ссылка, которую инструкция throw потребляет со стека                   Как видно из диаграммы, побочным эффектом при выполнении ин-
вычислений, должна указывать на объект в куче, описывающий исключе-              струкции leave является очистка стека вычислений.
ние. Вообще говоря, в качестве такого объекта может выступать объект                  Инструкция endfinally (см. таблицу 3.49) используется для выхода из
любого типа, в том числе упакованный тип-значение, но спецификация               областей обработчиков без фильтрации. У нее есть псевдоним – endfault.
CLS требует, чтобы базовым классом для типа объекта-исключения являл-
ся класс System.Exception.                                                             Таблица 3.49. Инструкция endfinally
     Если при выполнении инструкции throw на стеке вычислений
                                                                                 Код        Инструкция          Встроенный Описание
лежит       нулевая    ссылка,     то      генерируется     исключение
System.NullReferenceException.                                                                                  операнд
     Инструкция rethrow (см. таблицу 3.47) разрешена только внутри обра-         0xDC       endfinally          –          Выход из обработчиков finally и
ботчика исключений с фильтрацией по типу и предназначена для генерации                      (endfault)                     fault
того же самого исключения, которое было поймано обработчиком.
                                                                                      Диаграмма стека для инструкции endfinally:
      Таблица 3.47. Инструкция rethrow                                                ... -> ...
                                                                                      Инструкция endfilter (см. таблицу 3.50) завершает область фильтра.
Код           Инструкция Встроенный Описание                                     Ее основная задача состоит в том, чтобы вернуть целое число (0 или 1).
                         операнд                                                 Значение 0 означает, что данное исключение не может быть обработано и
                                                                                 нужно поискать другой обработчик. Значение 1 говорит о том, что нужно
0xFE 0x1A     rethrow    –          Генерирует то же самое исклю-
                                                                                 передать управление на обработчик.
                                    чение, что было поймано обра-
                                    ботчиком                                           Таблица 3.50. Инструкция endfilter

      Диаграмма стека для инструкции rethrow:                                    Код            Инструкция Встроенный Описание
      ... -> ...                                                                                           операнд
                                                                                 0xFE 0x11      endfilter  –          Завершение области фильтра
3.4.2.2. Инструкции передачи управления между блоками
      Инструкции, представленные в таблице 3.48, являются аналогами                    Диаграмма стека для инструкции endfilter:
инструкций безусловного перехода и используются для выхода из защи-                    ... , value -> ...
щенных областей и областей обработчиков с фильтрацией. Необходи-
мость существования этих инструкций обусловлена тем фактом, что обыч-
                                                                                 3.4.3. Правила размещения областей
ные инструкции безусловного перехода не могут пересекать границы этих                 Итак, в общем случае, предложение обработки исключений опреде-
областей.                                                                        ляет три области в коде метода: область защищенного блока, область
                                                                                 фильтра и область обработчика (фильтр может отсутствовать). Эти области
      Таблица 3.48. Инструкция leave                                             должны быть расположены в соответствии с определенными правилами:
Код           Инструкция Встроенный Описание                                            1. Области, определяемые в предложении обработки исключений,
                                                                                           не могут перекрываться.
                         операнд
                                                                                        2. Область фильтра всегда расположена непосредственно перед
0xDD          leave      int32      Выход из области                                       областью обработчика и завершается инструкцией endfilter.
0xDE          leave.s    int8       Выход из области (короткий пе-                      3. Для любой пары предложений обработки исключений A и B
                                    реход)                                                 должно быть справедливо следующее: