Рабочим названием платформы .NET было |
Язык CIL: инструкции для поддержки объектной модели
Инструкции для работы с типами-значениями
Специальный набор инструкций предусмотрен для поддержки операций с типами-значениями.
Инициализация значения
Инструкция initobj (см. таблицу 3.35) предназначена для инициализации значения типа-значения. Во встроенном операнде этой инструкции содержится токен метаданных, указывающий на информацию о типе-значении. В отличие от инструкции newobj, инструкция initobj не вызывает конструктор.
Инструкция initobj потребляет со стека вычислений адрес значения:
... , addr -> ...
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xFE 0x15 | initobj | token | Заполняет все поля значения нулями |
Загрузка размера значения
Инструкция sizeof (см. таблицу 3.36) загружает на стек вычислений размер в байтах типа-значения (размер представляет собой значение типа unsigned int32 ). Во встроенном операнде этой инструкции содержится токен метаданных, указывающий на информацию о типе-значении.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xFE 0x1C | sizeof | token | Загружает на стек размер значения указанного типа |
Диаграмма стека для инструкций sizeof:
... -> ... , size
Копирование значений
Инструкции, приведенные в таблице 3.37, выполняют копирование значений типов-значений. Во встроенных операндах этих инструкций содержится токен метаданных, указывающий на информацию о типе-значении в таблицах метаданных.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0x70 | cpobj | token | Копирует значение. Диаграмма стека:..., destAddr, srcAddr ->... |
0x71 | ldobj | token | Загружает значение на стек вычислений. Диаграмма стека:..., addr, -> ..., val0bj |
0x81 | stobj | token | Сохраняет значение со стека вычислений в память. Диаграмма стека:..., addr, val0bj ->... |
Инструкция ldobj используется главным образом при вызове методов для загрузки параметров (если вызываемый метод имеет параметры типов-значений). Инструкции cpobj и stobj применяются сравнительно редко, хотя и имеют однобайтовые коды.
Упаковка и распаковка значений
Инструкции, приведенные в таблице 3.38, выполняют упаковку и распаковку значений типов-значений. Во встроенных операндах этих инструкций содержится токен метаданных, указывающий на информацию о типе-значении в таблицах метаданных.
Выполнение инструкции box заключается в создании в куче "объекта-обертки" для значения, после чего осуществляется побитовое копирование значения внутрь "обертки".
При распаковке значения с помощью инструкции unbox никакого копирования не происходит. Вместо этого на стек вычислений загружается адрес значения находящегося внутри "обертки".
Загрузка описателя токена метаданных
Инструкция ldtoken (см. таблицу 3.39) применяется для работы с библиотекой рефлексии. Фактически она переводит токены метаданных в специальные структуры данных рефлексии. Так как переводимый токен жестко зашит в инструкцию (он находится во встроенном операнде), то можно говорить о том, что инструкция ldtoken представляет собой инструкцию загрузки константы.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xD0 | ldtoken | token | Загружает описатель токена метаданных (структуру RuntimeTypeHandle, RuntimeMethodHandle, RuntimeFieldHandle ) |
Диаграмма стека для инструкций ldtoken:
... -> ... , runtimeHandle
Эта инструкция отнесена к группе инструкций для работы с типами-значениями, потому что описатели токенов представляют собой значения типов-значений.