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

UptoLike

Диаграмма стека для инструкций 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)