Составители:
Рубрика:
3.3.1.3. Работа с полями объектов
В таблице 3.27 приведены инструкции, которые загружают на стек
вычислений значения и адреса полей объектов, а также сохраняют значе-
ния со стека в полях объектов. Токены метаданных во встроенных операн-
дах инструкций указывают на информацию о нужном поле.
Таблица 3.27. Инструкция для работы с полями объектов
3.3.1.4. Вызов виртуальных методов
Инструкция callvirt (см. таблицу 3.28) отличается от инструкции
call главным образом тем, что адрес вызываемого метода определяется во
время выполнения программы путем анализа типа объекта, для которого
вызывается метод. Тем самым реализуется идея позднего связывания,
необходимая для поддержки полиморфизма.
Диаграмма стека для инструкции callvirt:
... , obj, arg1, ... , argN -> ... , retVal
Common Intermediate Language
107
Хотя первым (неявным) параметром для любого конструктора явля-
ется ссылка на инициализируемый объект (параметр this), перед вызовом
инструкции newobj этот параметр не должен загружаться на стек вычисле-
ний. Дело в том, что ссылка на объект формируется в процессе выполне-
ния инструкции (после выделения памяти в куче и до вызова конструкто-
ра) и затем автоматически передается конструктору. Происходит как бы
«подкладывание» ссылки this под другие параметры конструктора на сте-
ке вычислений.
Особый случай применения инструкции newobj связан с созданием
экземпляров типов-значений на стеке вычислений. Если указанный во
встроенном операнде конструктор принадлежит типу-значению, то новый
экземпляр этого типа создается не в куче, а прямо на стеке вычислений.
3.3.1.2. Проверка типа объекта
В таблице 3.26 приведены две инструкции, осуществляющие провер-
ку типа объекта, ссылка на который лежит на вершине стека вычислений.
Токен метаданных, находящийся во встроенном операнде инструкции,
указывает на описатель типа в таблицах метаданных.
Таблица 3.26. Инструкция проверки типа объекта
Диаграмма стека для инструкций проверки типа объекта:
... , obj -> ... , obj
Через инструкции проверки типа объекта реализуются операции
приведения типов в языках высокого уровня.
106
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x74 castclass token Проверяет, соответствует ли тип
объекта на вершине стека вы-
числений указанному типу.
В случае несоответствия генери-
рует исключение
InvalidCastException.
0x75 isinst token Проверяет, соответствует ли тип
объекта на вершине стека вы-
числений указанному типу. Если
соответствует, то оставляет объ-
ект на стеке, в противном случае
заменяет объект на null
Код Инструкция Встроенный Описание
операнд
0x7B ldfld token Загружает значение поля объек-
та. Диаграмма стека:
... , obj -> ... , value
0x7C ldflda token Загружает адрес поля объекта.
Диаграмма стека:
... , obj -> ... , addr
0x7D stfld token Сохраняет значение в поле объ-
екта. Диаграмма стека:
... , obj, value -> ...
0x7E ldsfld token Загружает значение статического
поля объекта. Диаграмма стека:
... -> ... , value
0x7F ldsflda token Загружает адрес статического
поля объекта. Диаграмма стека:
... -> ... , addr
0x80 stsfld token Сохраняет значение в статиче-
ском поле объекта. Диаграмма
стека:
... , val -> ...
106 CIL и системное программирование в Microsoft .NET Common Intermediate Language 107 Хотя первым (неявным) параметром для любого конструктора явля- 3.3.1.3. Работа с полями объектов ется ссылка на инициализируемый объект (параметр this), перед вызовом В таблице 3.27 приведены инструкции, которые загружают на стек инструкции newobj этот параметр не должен загружаться на стек вычисле- вычислений значения и адреса полей объектов, а также сохраняют значе- ний. Дело в том, что ссылка на объект формируется в процессе выполне- ния со стека в полях объектов. Токены метаданных во встроенных операн- ния инструкции (после выделения памяти в куче и до вызова конструкто- дах инструкций указывают на информацию о нужном поле. ра) и затем автоматически передается конструктору. Происходит как бы «подкладывание» ссылки this под другие параметры конструктора на сте- Таблица 3.27. Инструкция для работы с полями объектов ке вычислений. Код Инструкция Встроенный Описание Особый случай применения инструкции newobj связан с созданием экземпляров типов-значений на стеке вычислений. Если указанный во операнд встроенном операнде конструктор принадлежит типу-значению, то новый 0x7B ldfld token Загружает значение поля объек- экземпляр этого типа создается не в куче, а прямо на стеке вычислений. та. Диаграмма стека: ... , obj -> ... , value 3.3.1.2. Проверка типа объекта 0x7C ldflda token Загружает адрес поля объекта. В таблице 3.26 приведены две инструкции, осуществляющие провер- Диаграмма стека: ку типа объекта, ссылка на который лежит на вершине стека вычислений. Токен метаданных, находящийся во встроенном операнде инструкции, ... , obj -> ... , addr указывает на описатель типа в таблицах метаданных. 0x7D stfld token Сохраняет значение в поле объ- екта. Диаграмма стека: Таблица 3.26. Инструкция проверки типа объекта ... , obj, value -> ... Код Инструкция Встроенный Описание 0x7E ldsfld token Загружает значение статического операнд поля объекта. Диаграмма стека: 0x74 castclass token Проверяет, соответствует ли тип ... -> ... , value объекта на вершине стека вы- 0x7F ldsflda token Загружает адрес статического числений указанному типу. поля объекта. Диаграмма стека: В случае несоответствия генери- ... -> ... , addr рует исключение 0x80 stsfld token Сохраняет значение в статиче- InvalidCastException. ском поле объекта. Диаграмма 0x75 isinst token Проверяет, соответствует ли тип стека: объекта на вершине стека вы- ... , val -> ... числений указанному типу. Если соответствует, то оставляет объ- 3.3.1.4. Вызов виртуальных методов Инструкция callvirt (см. таблицу 3.28) отличается от инструкции ект на стеке, в противном случае call главным образом тем, что адрес вызываемого метода определяется во заменяет объект на null время выполнения программы путем анализа типа объекта, для которого вызывается метод. Тем самым реализуется идея позднего связывания, Диаграмма стека для инструкций проверки типа объекта: необходимая для поддержки полиморфизма. ... , obj -> ... , obj Диаграмма стека для инструкции callvirt: Через инструкции проверки типа объекта реализуются операции ... , obj, arg1, ... , argN -> ... , retVal приведения типов в языках высокого уровня.
Страницы
- « первая
- ‹ предыдущая
- …
- 58
- 59
- 60
- 61
- 62
- …
- следующая ›
- последняя »