Составители:
Рубрика:
найти первый блок, покрывающий диапазон адресов, в который попадает
адрес нужной инструкции. Время выполнения этой операции зависит
только от длины массива описателей, а так как он чаще всего бывает дос-
таточно коротким, время поиска оказывается невелико.
Рис. 4.4. Дерево блоков в структуре графа потока управления
Совсем другая ситуация возникает в графе потока выполнения. Что-
бы определить, в какой блок входит некоторая инструкция графа (то есть
узел графа), мы должны каким-то образом пройти от этой инструкции по
дугам графа в обратном направлении до входа в блок. Время выполнения
этой операции зависит от количества инструкций в блоке и значительно
превышает время поиска блока в случае линейной последовательности
инструкций.
Анализ кода на CIL
139
catch System.OverflowException {
pop
ldc.i4.0
stloc.0
leave.s exit
}
exit: ldloc.0
ret
}
Граф потока управления для метода checkedAdd показан на рис. 4.3.
Рис. 4.3. Граф потока управления для метода checkedAdd
4.1.3. Дерево блоков в графе потока управления
Когда выполнение некоторой инструкции в линейной последова-
тельности инструкций порождает исключение, всегда можно легко опре-
делить защищенный блок, которому эта инструкция принадлежит. Для
этого требуется всего лишь просканировать массив описателей блоков и
138
CIL и системное программирование в Microsoft .NET
Метод
checkedAdd
Защищенный
блок
ldarg.0
Catch-блок
pop
ldloc.0
ret
ldc.i4.0 stloc.0 leave.s
ldarg.1 add.ovf stloc.0 leave.s
Блок тела метода
Защищенный блок
Защищенный блок
Защищенный блок
Инструкции
Инструкции
ИнструкцииИнструкции
Инструкции Инструкции
Блоки обработки
исключений
Блоки обработки
исключений
Блоки обработки
исключений
138 CIL и системное программирование в Microsoft .NET Анализ кода на CIL 139
catch System.OverflowException { найти первый блок, покрывающий диапазон адресов, в который попадает
pop адрес нужной инструкции. Время выполнения этой операции зависит
ldc.i4.0 только от длины массива описателей, а так как он чаще всего бывает дос-
stloc.0 таточно коротким, время поиска оказывается невелико.
leave.s exit
} Блок тела метода
exit: ldloc.0
ret
} Защищенный блок Защищенный блок
Граф потока управления для метода checkedAdd показан на рис. 4.3.
Блоки обработки Блоки обработки
Метод
исключений исключений
checkedAdd
Защищенный
блок Инструкции Инструкции Инструкции
ldarg.0 ldarg.1 add.ovf stloc.0 leave.s
Инструкции
Catch-блок
Защищенный блок Блоки обработки
pop ldc.i4.0 stloc.0 leave.s исключений
ldloc.0
Инструкции Инструкции
ret
Рис. 4.4. Дерево блоков в структуре графа потока управления
Рис. 4.3. Граф потока управления для метода checkedAdd
Совсем другая ситуация возникает в графе потока выполнения. Что-
4.1.3. Дерево блоков в графе потока управления бы определить, в какой блок входит некоторая инструкция графа (то есть
узел графа), мы должны каким-то образом пройти от этой инструкции по
Когда выполнение некоторой инструкции в линейной последова- дугам графа в обратном направлении до входа в блок. Время выполнения
тельности инструкций порождает исключение, всегда можно легко опре- этой операции зависит от количества инструкций в блоке и значительно
делить защищенный блок, которому эта инструкция принадлежит. Для превышает время поиска блока в случае линейной последовательности
этого требуется всего лишь просканировать массив описателей блоков и инструкций.
Страницы
- « первая
- ‹ предыдущая
- …
- 74
- 75
- 76
- 77
- 78
- …
- следующая ›
- последняя »
