Составители:
Рубрика:
Диаграмма стека для инструкций ldtoken:
... -> ... , runtimeHandle
Эта инструкция отнесена к группе инструкций для работы с типами-
значениями, потому что описатели токенов представляют собой значения
типов-значений.
3.3.4. Инструкции для работы с типизированными ссылками
Типизированные ссылки в системе типов .NET реализованы исклю-
чительно для поддержки некоторых особенностей синтаксиса и семанти-
ки языка Visual Basic .NET. Они представляют собой гибрид управляемого
указателя и типа-значения.
Для работы с типизированными ссылками предусмотрены три инст-
рукции CIL, которые мы рассмотрим в этом разделе.
3.3.4.1. Создание типизированной ссылки
Инструкция mkrefany (см. таблицу 3.40) предназначена для создания
типизированных ссылок. Она упаковывает вместе управляемый указатель
на некоторое значение и токен метаданных, описывающий тип этого зна-
чения. При этом токен содержится во встроенном операнде инструкции.
Таблица 3.40. Инструкция mkrefany
Диаграмма стека для инструкций mkrefany:
... , ptr -> ... , typedRef
3.3.4.2. Загрузка типа типизированной ссылки
Инструкция refanytype (см. таблицу 3.41) загружает токен метадан-
ных, хранящийся в типизированной ссылке, на вершину стека вычисле-
ний.
Таблица 3.41. Инструкция refanytype
Common Intermediate Language
115
3.3.3.4. Упаковка и распаковка значений
Инструкции, приведенные в таблице 3.38, выполняют упаковку и
распаковку значений типов-значений. Во встроенных операндах этих ин-
струкций содержится токен метаданных, указывающий на информацию о
типе-значении в таблицах метаданных.
Таблица 3.38. Инструкции для упаковки и распаковки значений
Выполнение инструкции box заключается в создании в куче «объек-
та-обертки» для значения, после чего осуществляется побитовое копиро-
вание значения внутрь «обертки».
При распаковке значения с помощью инструкции unbox никакого ко-
пирования не происходит. Вместо этого на стек вычислений загружается
адрес значения находящегося внутри «обертки».
3.3.3.5. Загрузка описателя токена метаданных
Инструкция ldtoken (см. таблицу 3.39) применяется для работы с би-
блиотекой рефлексии. Фактически она переводит токены метаданных в
специальные структуры данных рефлексии. Так как переводимый токен
жестко зашит в инструкцию (он находится во встроенном операнде), то
можно говорить о том, что инструкция ldtoken представляет собой инст-
рукцию загрузки константы.
Таблица 3.39. Инструкция ldtoken
114
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0x79 unbox token Выполняет распаковку значе-
ния. Диаграмма стека:
... , obj -> ... , ptr
0x8C box token Упаковывает значение. Диа-
грамма стека:
... , value -> ... , obj
Код Инструкция Встроенный Описание
операнд
0xD0 ldtoken token Загружает описатель токена ме-
таданных (структуру
RuntimeTypeHandle,
RuntimeMethodHandle,
RuntimeFieldHandle)
Код Инструкция Встроенный Описание
операнд
0xC6 mkrefany token Создает типизированную ссылку
на вершине стека вычислений
Код Инструкция Встроенный Описание
операнд
0xFE 0x1D refanytype – Загружает токен, хранящийся в
типизированной ссылке
114 CIL и системное программирование в Microsoft .NET Common Intermediate Language 115
3.3.3.4. Упаковка и распаковка значений Диаграмма стека для инструкций ldtoken:
Инструкции, приведенные в таблице 3.38, выполняют упаковку и ... -> ... , runtimeHandle
распаковку значений типов-значений. Во встроенных операндах этих ин- Эта инструкция отнесена к группе инструкций для работы с типами-
струкций содержится токен метаданных, указывающий на информацию о значениями, потому что описатели токенов представляют собой значения
типе-значении в таблицах метаданных. типов-значений.
Таблица 3.38. Инструкции для упаковки и распаковки значений 3.3.4. Инструкции для работы с типизированными ссылками
Типизированные ссылки в системе типов .NET реализованы исклю-
Код Инструкция Встроенный Описание
чительно для поддержки некоторых особенностей синтаксиса и семанти-
операнд ки языка Visual Basic .NET. Они представляют собой гибрид управляемого
0x79 unbox token Выполняет распаковку значе- указателя и типа-значения.
ния. Диаграмма стека: Для работы с типизированными ссылками предусмотрены три инст-
... , obj -> ... , ptr рукции CIL, которые мы рассмотрим в этом разделе.
0x8C box token Упаковывает значение. Диа-
3.3.4.1. Создание типизированной ссылки
грамма стека:
Инструкция mkrefany (см. таблицу 3.40) предназначена для создания
... , value -> ... , obj типизированных ссылок. Она упаковывает вместе управляемый указатель
на некоторое значение и токен метаданных, описывающий тип этого зна-
Выполнение инструкции box заключается в создании в куче «объек- чения. При этом токен содержится во встроенном операнде инструкции.
та-обертки» для значения, после чего осуществляется побитовое копиро-
вание значения внутрь «обертки». Таблица 3.40. Инструкция mkrefany
При распаковке значения с помощью инструкции unbox никакого ко-
пирования не происходит. Вместо этого на стек вычислений загружается Код Инструкция Встроенный Описание
адрес значения находящегося внутри «обертки». операнд
0xC6 mkrefany token Создает типизированную ссылку
3.3.3.5. Загрузка описателя токена метаданных на вершине стека вычислений
Инструкция ldtoken (см. таблицу 3.39) применяется для работы с би-
блиотекой рефлексии. Фактически она переводит токены метаданных в Диаграмма стека для инструкций mkrefany:
специальные структуры данных рефлексии. Так как переводимый токен ... , ptr -> ... , typedRef
жестко зашит в инструкцию (он находится во встроенном операнде), то
можно говорить о том, что инструкция ldtoken представляет собой инст- 3.3.4.2. Загрузка типа типизированной ссылки
рукцию загрузки константы. Инструкция refanytype (см. таблицу 3.41) загружает токен метадан-
ных, хранящийся в типизированной ссылке, на вершину стека вычисле-
Таблица 3.39. Инструкция ldtoken ний.
Код Инструкция Встроенный Описание Таблица 3.41. Инструкция refanytype
операнд
0xD0 ldtoken token Загружает описатель токена ме- Код Инструкция Встроенный Описание
таданных (структуру операнд
RuntimeTypeHandle, 0xFE 0x1D refanytype – Загружает токен, хранящийся в
RuntimeMethodHandle, типизированной ссылке
RuntimeFieldHandle)
Страницы
- « первая
- ‹ предыдущая
- …
- 62
- 63
- 64
- 65
- 66
- …
- следующая ›
- последняя »
