Spec-Zone .ru
спецификации, руководства, описания, API
Содержание | Предыдущий | Следующий | ИндексСпецификация Виртуальной машины JavaTM


anewarray_quick

Работа Создайте новый массив

anewarray_quick
indexbyte1
indexbyte2


из reference

Формы anewarray_quick = 222 (0xde)

Стек ..., количество..., arrayref

Описание Количество должно иметь тип int. Это выталкивается от стека операнда. Количество представляет число компонентов массива, чтобы быть созданным. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент по тому индексу в постоянном пуле, должно быть, уже был успешно разрешен и должен быть классом или интерфейсным типом. Новый массив того типа, количества длины, выделяется от собранной "мусор" "кучи", и a reference arrayref к этому новому объекту массива продвигается на стек операнда. Все компоненты нового массива инициализируются к null, значение по умолчанию для ссылочных типов (§2.5.1).

Исключение на этапе выполнения Если количество является меньше чем нуль, anewarray_quick инструкция бросает a NegativeArraySizeException.

Примечания Код операции этой инструкции был первоначально anewarray. Операнды anewarray инструкции не изменяются.

anewarray_quick инструкция используется, чтобы создать единственную размерность массива ссылок на объект. Это может также использоваться, чтобы создать первую размерность многомерного массива.


checkcast_quick

Работа Проверьте, имеет ли объект данный тип

checkcast_quick
indexbyte1
indexbyte2


Формы checkcast_quick = 224 (0xe0)

Стек ..., objectref..., objectref

Описание objectref должен иметь тип reference. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Объект по тому индексу постоянного пула, должно быть, уже был успешно разрешен и должен быть классом или интерфейсным типом.

Если objectref null или может быть брошен к разрешенному классу, массиву, или интерфейсному типу, стек операнда неизменен; иначе, checkcast_quick инструкция бросает a ClassCastException.

Следующие правила используются, чтобы определить, ли objectref, который не является null может быть брошен к разрешенному типу: Если S является классом объекта, упомянутого objectref, и T является разрешенным классом, массивом, или интерфейсный тип, checkcast_quick определяет, может ли objectref быть брошен к типу T следующим образом:

S не может быть интерфейсным типом, потому что нет никаких экземпляров интерфейсов, только экземпляры классов и массивов.

Исключение на этапе выполнения Если objectref не может быть брошен к типу разрешенного класса, checkcast_quick инструкция бросает a ClassCastException.

Примечания Код операции этой инструкции был первоначально checkcast. Операнды checkcast инструкции не изменяются.

checkcast_quick инструкция очень подобна instanceof_quick инструкции. Это отличается по своей обработке null, его поведение, когда его тест перестал работать (checkcast_quick выдает исключение, instanceof_quick, продвигает код результата), и его эффект на стек операнда.


getfield_quick

Работа Поле выборки от объекта

getfield_quick
смещение
<неиспользованный>


Формы getfield_quick = 206 (0xce)

Стек ..., objectref..., значение

Описание objectref, который должен иметь тип reference, выталкивается от стека операнда. Значение поля с одним словом при смещении в экземпляр класса, на который ссылается objectref, выбирается и продвигается на стек операнда.

Исключение на этапе выполнения Если objectref null, getfield_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально getfield, работающий на поле, решенном динамически иметь смещение в данные экземпляра класса 255 слов или меньше и иметь ширину одного слова.

Когда постоянная запись пула, на которую ссылается getfield инструкция, разрешается, смещение для поля, на которое это ссылается, сгенерировано. То смещение заменяет первый байт операнда исходной getfield инструкции. Второй байт операнда getfield неиспользован getfield_quick.


getfield_quick_w

Работа Поле выборки от объекта

getfield_quick_w
indexbyte1
indexbyte2


Формы getfield_quick_w = 227 (0xe3)

Стек ..., objectref..., значение

ИЛИ

Стек ..., objectref..., значение word1, значение word2

Описание objectref, который должен иметь тип reference, выталкивается от стека операнда. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где индекс (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по индексу должен быть a CONSTANT_Fieldref (§4.4.2), который, должно быть, уже был разрешен и не должен быть классом (static) поле. Полевое смещение, должно быть, было сохранено в постоянном пуле. Значение при том смещении в экземпляр класса, на который ссылается objectref, выбирается и продвигается на стек операнда.

Исключение на этапе выполнения Если objectref null, getfield_quick_w инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально getfield, работающий на поле, решенном динамически иметь смещение в данные экземпляра класса больше чем 255 слов.

Операнды getfield инструкции не изменяются. Поскольку getfield_quick_w инструкция работает и на одном - и на широких полях с двумя словами, это должно знать и полевое смещение и тип того поля. Поскольку исходная getfield инструкция, необходимая 16-разрядный индекс, полевое смещение может быть 16 битов шириной. Как есть недостаточное пространство в инструкции, чтобы сохранить и 16-разрядное смещение и тип поля, getfield_quick_w сохраняет свои исходные операнды и использует их, чтобы индексировать в постоянный пул, где смещение и тип поля доступны в разрешенной записи.


getfield2_quick

Работа Выборка long или double поле от объекта

getfield2_quick
смещение
<неиспользованный>


Формы getfield2_quick = 208 (0xd0)

Стек ..., objectref..., значение word1, значение word2

Описание objectref, который должен иметь тип reference, выталкивается от стека операнда. Значение поля с двумя словами при смещении в экземпляр класса, на который ссылается objectref, выбирается и продвигается на стек операнда.

Исключение на этапе выполнения Если objectref null, getfield2_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально getfield, работающий на поле, решенном динамически иметь смещение в данные экземпляра класса 255 слов или меньше и иметь ширину двух слов.

Когда постоянная запись пула, на которую ссылается getfield инструкция, разрешается, смещение для поля, на которое это ссылается, сгенерировано. То смещение заменяет первый операнд исходной getfield инструкции. Второй операнд getfield неиспользован getfield2_quick.


getstatic_quick

Работа Получите статическое поле от класса

getstatic_quick
indexbyte1
indexbyte2


Формы getstatic_quick = 210 (0xd2)

Стек ......, значение

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по тому индексу должен быть a CONSTANT_Fieldref (§4.4.2), который, должно быть, уже был разрешен и должен быть классом (static) поле, которое является одним широким словом. Значение того поля класса выбирается и продвигается на стек операнда.

Примечания Код операции этой инструкции был первоначально getstatic, работающий на a static поле, определенное динамически, чтобы быть одним широким словом. Операнды getstatic инструкции не изменяются. Нет никакого эквивалента getfield_quick инструкции, храня смещение класса как операнд инструкции, для одного слова static поля.


getstatic2_quick

Работа Получите статическое поле от класса

getstatic2_quick
indexbyte1
indexbyte2


Формы getstatic2_quick = 212 (0xd4)

Стек ......, значение word1, значение word2

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по тому индексу должен быть a CONSTANT_Fieldref (§4.4.2), который, должно быть, уже был разрешен и должен быть классом (static) поле, которое является двумя широкими словами. Значение того поля класса выбирается и продвигается на стек операнда.

Постоянный элемент пула является полевой ссылкой на статическое поле класса. Тип поля должен быть long или double. Значение того поля продвигается на стек.

Примечания Код операции этой инструкции был первоначально getstatic, работающий на поле класса, решенном динамически быть двумя широкими словами. Операнды getstatic инструкции не изменяются. Нет никакого эквивалента getfield2_quick инструкции, храня смещение класса как операнд инструкции, для с двумя словами static поля.


instanceof_quick

Работа

instanceof_quick
indexbyte1
indexbyte2


Определите, имеет ли объект данный тип

Формы instanceof_quick = 225 (0xe1)

Стек ..., objectref..., результат

Описание objectref, который должен иметь тип reference, выталкивается от стека операнда. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Класс по тому индексу постоянного пула, должно быть, был уже успешно разрешен и может быть классом, массивом, или интерфейсом.

Если objectref не null и экземпляр разрешенного класса, массива, или интерфейса, instanceof_quick инструкция продвигает int результат 1 как интервал на стеке операнда. Иначе, это продвигает int результат 0.

Следующие правила используются, чтобы определить, ли objectref, который не является null экземпляр разрешенного типа: Если S является классом объекта, упомянутого objectref, и T является разрешенным классом, массивом, или тип экземпляра, instanceof_quick определяет, является ли objectref экземпляром T следующим образом:


instanceof_quick

S не может быть интерфейсным типом, потому что нет никаких экземпляров интерфейсов, только экземпляры классов и массивов.

Примечания Код операции этой инструкции был первоначально instanceof. Операнды instanceof инструкции не изменяются.


invokeinterface_quick

Работа Вызовите интерфейсный метод

invokeinterface_quick
idbyte1
idbyte2
nargs
предположить


Формы invokeinterface_quick = 218 (0xda)

Стек ..., objectref, [arg1, [arg2...]]...

Описание idbyte1 без знака и idbyte2 используются, чтобы создать идентификатор для имени и дескриптора (§4.3.3) требуемого метода, где значение идентификатора (idbyte1 << 8) | idbyte2.

nargs операнд является байтом без знака, который не должен быть нулем. objectref должен иметь тип reference и должен сопровождаться на стеке операндов nargs - 1 слово параметров. Таблица метода класса типа objectref определяется. Если objectref является типом массива, то таблица метода класса Object используется.

Предположение без знака используется, чтобы индексировать в таблицу метода. Если есть метод в индексном предположении, и если его идентификатор идентичен созданному идентификатору, то тот метод выбирается. Иначе, таблица метода ищется метод, идентификатор которого идентичен созданному идентификатору. Если Вы находитесь, текущая стоимость предположения перезаписывается тем индексом.

Результатом поиска является запись таблицы метода, которая включает прямую ссылку на код для интерфейсного метода и информации о модификаторе метода ((см. Таблицу 4.4, "Доступ метода и модификатор отмечают"). Запись таблицы метода должна быть записью таблицы a public метод.


invokeinterface_quick

Если метод synchronized, монитор, связанный с objectref, получается.

Если метод не native, nargs - 1 слово параметров и objectref выталкивается от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и objectref и слова параметров делаются значениями своих первых nargs локальных переменных, с objectref в локальной переменной 0, arg1 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native и зависимый от платформы код, который реализует это, еще не был загружен и соединен в виртуальную машину Java, которая делается. nargs - 1 слово параметров и objectref выталкивается от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Соединение Исключений Если никакой метод, соответствующий разрешенное имя и дескриптор, не может быть найден в классе objectref, invokeinterface_quick бросает IncompatibleClassChangeError.

Иначе, если выбранный метод является классом (static) метод, invokeinterface_quick инструкция бросает IncompatibleClassChangeError.

Иначе, если выбранный метод не public, в - vokeinterface_quick инструкция бросает IllegalAccess-Error.

Иначе, если выбранный метод abstract, вызовите-interface_quick броски AbstractMethodError.

Иначе, если выбранный метод native и код, который реализует метод, не может быть загружен или соединен, вызвать-interface_quick броски UnsatisfiedLinkError.


invokeinterface_quick

Исключение на этапе выполнения Иначе, если objectref null, invokeinterface_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально invokeinterface. Начальное значение предположения 0, значение операнда, предоставленное invokeinterface. Идентификаторы, сравниваемые и сохраненные в invokeinterface_quick инструкции, кодируют имя метода и дескриптор как 16-разрядное количество, которое может быть сравнено быстро. Детали кодирования специфичны для реализации. Байты идентификатора для вызываемого метода, idbyte1 и idbyte2, заменяют исходные постоянные индексные байты пула. Идентификатор может быть вычислен, когда каждый метод загружается, или во время выполнения. Значение nargs операнда не изменяется.


invokenonvirtual_quick

Работа Вызовите метод инициализации экземпляра или закрытый метод, диспетчеризируя основанный на типе времени компиляции

invokenonvirtual_quick
indexbyte1
indexbyte2


Формы invokenonvirtual_quick = 215 (0xd7)

Стек ..., objectref, [arg1, [arg2...]]...

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по индексу должен быть a CONSTANT_Methodref (§4.4.2), который, должно быть, уже был разрешен успешно. Постоянная запись пула, представляющая разрешенный метод, включает прямую ссылку на код для метода, байт без знака nargs, который должен быть больше чем нуль, и информация о модификаторе метода (см. Таблицу 4.4, "Доступ метода и модификатор отмечают").

Если метод synchronized, монитор, связанный с objectref, получается.

Если метод не native, nargs - 1 слово параметров и objectref выталкивается от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и objectref и слова параметров делаются значениями своих первых nargs локальных переменных, с objectref в локальной переменной 0, arg1 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native, nargs - 1 слово параметров и objectref выталкивается от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Исключение на этапе выполнения Если objectref null, invokenonvirtual_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально invokespecial, и метод, который это вызвало, был решен динамически быть любой методом инициализации экземпляра <init> или a private метод. Операнды invokespecial инструкции не изменяются.

Различие между invokenonvirtual_quick и в - vokevirtual_quick_w инструкции - то, что invokevirtual_quick_w вызывает метод, основанный на фактическом (время выполнения) тип объекта. invokenonvirtual_quick инструкция вызывает метод инициализации экземпляра или private метод, основанный на типе времени компиляции объекта.


invokesuper_quick

Работа Вызовите метод суперкласса, диспетчеризируя основанный на типе времени компиляции

invokesuper_quick
indexbyte1
indexbyte2


Формы invokesuper_quick = 216 (0xd8)

Стек ..., objectref, [arg1, [arg2...]]...

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в таблицу метода суперкласса текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Указанная запись таблицы метода включает прямую ссылку на код для метода, байт без знака nargs, который должен быть больше чем нуль, и информация о модификаторе метода (см. Таблицу 4.4, "Доступ метода и модификатор отмечают").

Если метод synchronized, монитор, связанный с objectref, получается.

Если метод не native, nargs - 1 слово параметров и objectref выталкивается от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и objectref и слова параметров делаются значениями своих первых nargs локальных переменных, с objectref в локальной переменной 0, arg1 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native, nargs - 1 слово параметров и objectref выталкивается от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Исключение на этапе выполнения Если objectref null, invokesuper_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально invokespecial, и метод, который это вызвало, был решен динамически быть методом в суперклассе текущего объекта. Операнды invokespecial инструкции не изменяются.

Различие между invokesuper_quick и invokevirtual_quick_w инструкциями - то, что invokevirtual_quick_w вызывает метод, основанный на классе объекта. invokesuper_quick инструкция используется, чтобы вызвать методы в суперклассе текущего класса.

invokesuper_quick инструкция была представлена в JDK Sun 1.0.2 выпуска, чтобы исправить ошибку в более ранних версиях виртуальной машины Java. До того выпуска invokespecial инструкция (тогда названный invokenonvirtual) всегда преобразовывалась бы в invokenonvirtual_quick инструкцию.


invokestatic_quick

Работа Вызовите класс (статический) метод

invokestatic_quick
indexbyte1
indexbyte2


Формы invokestatic_quick = 217 (0xd9)

Стек ..., [arg1, [arg2...]]...

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по индексу должен быть a CONSTANT_Methodref (§4.4.2), который, должно быть, уже был разрешен успешно.

Постоянная запись пула, представляющая разрешенный метод, включает прямую ссылку на код для метода, байт без знака nargs, который может быть нулем, и информацией о модификаторе метода (см. Таблицу 4.4, "Доступ метода и модификатор отмечают").

Если метод synchronized, монитор, связанный с текущим классом, получается.

Если метод не native, nargs слова параметров выталкиваются от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и слова параметров делаются значениями его первых nargs локальных переменных, с arg1 в локальной переменной 0, arg2 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native, nargs слова параметров выталкиваются от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Примечания Код операции этой инструкции был первоначально invokestatic. Операнды invokestatic инструкции не изменяются.


invokevirtual_quick

Работа Вызовите метод экземпляра

invokevirtual_quick
индекс
nargs


; диспетчеризируйте основанный на классе

Формы invokevirtual_quick = 214 (0xd6)

Стек ..., objectref, [arg1, [arg2...]]...

Описание objectref должен иметь тип reference и должен сослаться на экземпляр класса. Индексный операнд является байтом без знака, и nargs операнд является байтом без знака, который не должен быть нулем. Индекс является индексом в таблицу метода класса типа objectref. Запись таблицы по тому индексу включает код метода и его информацию о модификаторе (см. Таблицу 4.4, "Доступ метода и модификатор отмечают").

Если метод synchronized, монитор, связанный с objectref, получается.

Если метод не native, nargs - 1 слово параметров и objectref выталкивается от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и objectref и слова параметров делаются значениями своих первых nargs локальных переменных, с objectref в локальной переменной 0, arg1 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native и зависимый от платформы код, который реализует это, еще не был загружен и соединен в виртуальную машину Java, которая делается. nargs - 1 слово параметров и objectref выталкивается от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Соединение Исключения Если указанный метод native и код, который реализует метод, не может быть загружен или соединен, invokevirtual_quick инструкция бросает UnsatisfiedLinkError.

Исключение на этапе выполнения Иначе, если objectref null, invokevirtual_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально invokevirtual с objectref, не обращающимся к экземпляру java.lang.Object и с операндами, определенными динамически, чтобы представить метод с табличным индексом метода 255 или меньше. Когда постоянная запись пула, на которую ссылается invokevirtual инструкция, разрешается, сгенерирован однобайтовый индекс для метода, на который это ссылается. Тот индекс заменяет первый байт операнда исходной invokevirtual инструкции. Второй байт операнда invokevirtual инструкции заменяется nargs, числом слов параметра, ожидаемых методом.

invokevirtual инструкция, обращающаяся к экземпляру java.lang.Object и с операндами, представляющими постоянный индекс пула 255 или меньше, будет вместо этого преобразован в invokevirtualobject_quick инструкцию. Любая invokevirtual инструкция с операндами, представляющими постоянный индекс пула, больше чем 255, будет преобразована в invokevirtual_quick_w инструкцию.


invokevirtual_quick_w

Работа Вызовите метод экземпляра

invokevirtual_quick_w
indexbyte1
indexbyte2


, диспетчеризация на классе (широкий индекс)

Формы invokevirtual_quick_w = 226 (0xe2)

Стек ..., objectref, [arg1, [arg2...]]...

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где индекс (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по индексу должен быть a CONSTANT_Methodref (§4.4.2), который, должно быть, уже был разрешен успешно. Постоянная запись пула, представляющая разрешенный метод, включает индекс без знака в таблицу метода разрешенного класса и байта без знака nargs, который не должен быть нулем.

objectref должен иметь тип reference. Индекс используется в качестве индекса в таблицу метода класса типа objectref. Если objectref является типом массива, то таблица метода класса Object используется. Запись таблицы по тому индексу включает код метода и его информацию о модификаторе (см. Таблицу 4.4, "Доступ метода и модификатор отмечают").

Если метод synchronized, монитор, связанный с objectref, получается.

Если метод не native, nargs - 1 слово параметров и objectref выталкивается от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и objectref и слова параметров делаются значениями своих первых nargs локальных переменных, с objectref в локальной переменной 0, arg1 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native и зависимый от платформы код, который реализует это, еще не был загружен и соединен в виртуальную машину Java, которая делается. nargs - 1 слово параметров и objectref выталкивается от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Соединение Исключения Если указанный метод native и код, который реализует метод, не может быть загружен или соединен, invokevirtual_quick_w инструкция бросает UnsatisfiedLinkError.

Исключение на этапе выполнения Иначе, если objectref null, invokevirtual_quick_w инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально invokevirtual с операндами, решенными динамически представлять метод с табличным индексом метода, больше чем 255. Операнды invokevirtual инструкции не изменяются.

invokevirtual_quick и invokevirtualobject_quick инструкции только поддерживают однобайтовое смещение в таблицу метода objectref. invokevirtual_quick_w инструкция может привыкнуть к для вызовов методов, которые не могут быть представлены, используя invokevirtual_quick.


invokevirtualobject_quick

Работа Вызовите метод экземпляра

invokevirtualobject_quick
индекс
nargs


из класса java.lang.Object

Формы invokevirtualobject_quick = 219 (0xdb)

Стек ..., objectref, [arg1, [arg2...]]...

Описание objectref должен иметь тип reference. Индексный операнд является байтом без знака, и nargs операнд является байтом без знака, который не должен быть нулем. Индекс является индексом в таблицу метода класса типа objectref. Если objectref является типом массива, то таблица метода класса Object используется. Запись таблицы по тому индексу включает код метода и его информацию о модификаторе (см. Таблицу 4.4, "Доступ метода и модификатор отмечают").

Если метод synchronized, монитор, связанный с objectref, получается.

Если метод не native, nargs - 1 слово параметров и objectref выталкивается от стека операнда. Новый стековый фрейм создается для метода, вызываемого, и objectref и слова параметров делаются значениями своих первых nargs локальных переменных, с objectref в локальной переменной 0, arg1 в локальной переменной 1, и так далее. Новый стековый фрейм тогда делается текущим, и виртуальная машина Java pc устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.

Если метод native и зависимый от платформы код, который реализует это, еще не был загружен и соединен в виртуальную машину Java, которая делается. nargs - 1 слово параметров и objectref выталкивается от стека операнда; код, который реализует метод, вызывается зависящим от реализации способом.

Соединение Исключения Если указанный метод native и код, который реализует метод, не может быть загружен или соединен, invokevirtual_quick бросает UnsatisfiedLinkError.

Исключение на этапе выполнения Иначе, если objectref null, invokevirtualobject_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально invokevirtual, и это упомянуло метод класса java.lang.Object определенный динамически, чтобы иметь табличный индекс метода 255 или меньше. invokevirtualobject_quick инструкция определенно в пользу массивов.

Когда постоянная запись пула, на которую ссылается invokevirtual инструкция, разрешается, сгенерирован однобайтовый индекс для метода, на который это ссылается. Тот индекс заменяет первый байт операнда исходной invokevirtual инструкции. Второй байт операнда invokevirtual инструкции заменяется nargs, числом слов параметра, ожидаемых методом.

invokevirtualobject_quick инструкция только поддерживает однобайтовый индекс в таблицу метода objectref. Объекты с большими количествами методов, возможно, не в состоянии иметь все свои методы, на которые ссылаются с _quick разновидностями. Это всегда корректно, если менее эффективный, чтобы отказаться преобразовать экземпляр invokevirtual инструкции к invokevirtualobject_quick.

invokevirtual инструкция, не обращающаяся к экземпляру java.lang.Object и с операндами, представляющими постоянный индекс пула 255 или меньше, будет вместо этого преобразован в invokevirtual_quick инструкцию. Любая invokevirtual инструкция с операндами, представляющими постоянный индекс пула, больше чем 255, будет преобразована в invokevirtual_quick_w инструкцию.


ldc_quick

Работа Продвиньте элемент от постоянного пула

ldc_quick
индекс


Формы ldc_quick = 203 (0xcb)

Стек ......, элемент

Описание Индекс является байтом без знака, который должен быть допустимым индексом в постоянный пул текущего класса (§3.6). Постоянный элемент пула по индексу, должно быть, был уже разрешен и должен быть одним широким словом. Элемент выбирается от постоянного пула и продвигается на стек операнда.

Примечания Код операции этой инструкции был первоначально ldc. Операнд ldc инструкции не изменяется.


ldc_w_quick

Работа Продвиньте элемент от постоянного пула

ldc_w_quick
indexbyte1
indexbyte2


(широкий индекс)

Формы ldc_w_quick = 204 (0xcc)

Стек ......, элемент

Описание indexbyte1 без знака и indexbyte2 собираются в 16-разрядный индекс без знака в постоянный пул текущего класса (§3.6), где индекс (indexbyte1 << 8) | indexbyte2. Индекс должен быть допустимым индексом в постоянный пул текущего класса. Постоянный элемент пула по индексу, должно быть, был уже разрешен и должен быть одним широким словом. Элемент выбирается от постоянного пула и продвигается на стек операнда.

Примечания Код операции этой инструкции был первоначально ldc_w. Операнды ldc_w инструкции не изменяются.

ldc_w_quick инструкция идентична ldc_quick инструкции, за исключением ее более широкого постоянного индекса пула.


ldc2_w_quick

Работа Продвинуть long или double от постоянного пула (широкий индекс)

ldc2_w_quick
indexbyte1
indexbyte2


Формы ldc2_w_quick = 205 (0xcd)

Стек ......, элемент word1, элемент word2

Описание indexbyte1 без знака и indexbyte2 собираются в 16-разрядный индекс без знака в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Индекс должен быть допустимым индексом в постоянный пул текущего класса. (64-разрядный) постоянный пул, постоянный по индексу, должно быть, был уже разрешен и должен быть двумя широкими словами.

Примечания Код операции этой инструкции был первоначально ldc2_w. Операнды исходной ldc2_w инструкции не изменяются.

Только широкая индексная версия этой инструкции существует; есть инструкция № ldc2_quick, которая продвигает константу с двумя словами с однобайтовым индексом.


multianewarray_quick

Работа Создайте новый многомерный массив

multianewarray_quick
indexbyte1
indexbyte2
размерности


Формы multianewarray_quick = 223 (0xdf)

Стек ..., count1, [count2...]..., arrayref

Описание Размерности являются байтом без знака, который должен быть больше чем или равным 1. Это представляет число размерностей массива, чтобы быть созданным. Стек операнда должен содержать слова размерностей, которые должны иметь тип int и неотрицательный, каждый представляющий число компонентов в размерности массива, который будет создан. count1 является требуемой длиной в первой размерности, count2 во втором, и т.д.

Все значения количества выталкиваются от стека операнда. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Получающаяся запись, должно быть, была уже разрешена к типу класса массива размерности, больше чем или равная размерностям.

Новый многомерный массив типа массива выделяется от собранной "мусор" "кучи". Компоненты первой размерности массива инициализируются к подмассивам типа второй размерности и так далее. Компоненты массива в заключительной размерности инициализируются к начальному значению по умолчанию для его типа (§2.5.1). A reference arrayref новому массиву продвигается на стек операнда.

Исключение на этапе выполнения Если какое-либо из значений размерностей на стеке операнда является меньше, чем нуль, multianewarray_quick бросает a NegativeArraySize-Exception.

Примечания Код операции этой инструкции был первоначально multianewarray. Операнды multianewarray инструкции не изменяются.


new_quick

Работа Создайте новый объект

new_quick
indexbyte1
indexbyte2


Формы new_quick = 221 (0xdd)

Стек ......, objectref

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент по тому индексу, должно быть, был уже разрешен к типу класса. Новый экземпляр того класса создается, и переменные экземпляра нового объекта инициализируются к их начальным значениям по умолчанию (§2.5.1). objectref, a reference к экземпляру, продвигается на стек операнда.

Примечания Код операции этой инструкции был первоначально нов. Операнды исходной новой инструкции не изменяются.


putfield_quick

Работа Поле набора в объекте

putfield_quick
смещение
неиспользованный


Формы putfield_quick = 207 (0xcf)

Стек ..., objectref, значение...

Описание objectref, который должен иметь тип reference, и значение, которое должно быть значением типа, подходящего для указанного поля, выталкивается от стека операнда. Значение пишется при смещении в экземпляр класса, на который ссылается objectref.

Исключение на этапе выполнения Если objectref null, putfield_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально putfield, работающий на поле, решенном динамически иметь смещение в данные экземпляра класса 255 слов или меньше и иметь ширину одного слова.

Когда постоянная запись пула, на которую ссылается putfield инструкция, разрешается, смещение для поля, на которое это ссылается, сгенерировано. То смещение заменяет первый байт операнда исходной putfield инструкции. Второй байт операнда putfield неиспользован в putfield_quick.


putfield_quick_w

Работа Поле набора в объекте

putfield_quick_w
indexbyte1
indexbyte2


(широкий индекс)

Формы putfield_quick_w = 228 (0xe4)

Стек ..., objectref, значение...

ИЛИ

Стек ..., objectref, значение word1, оценивают word2...

Описание objectref, который должен иметь тип reference, и значение, которое должно быть значением типа, подходящего для указанного поля, выталкивается от стека операнда. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где индекс (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула по индексу должен быть a CONSTANT_Fieldref (§4.4.2), который, должно быть, уже был разрешен и не должен быть классом (static) поле. Значение пишется при смещении в экземпляр класса, на который ссылается objectref.

Исключение на этапе выполнения Если objectref null, putfield_quick_w инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально putfield, работающий на поле, решенном динамически иметь смещение в данные экземпляра класса больше чем 255 слов.

Операнды putfield инструкции не изменяются. Поскольку putfield_quick_w инструкция работает и на одном - и на широких полях с двумя словами, это должно знать и полевое смещение и тип того поля. Поскольку исходная putfield инструкция, необходимая 16-разрядный индекс, полевое смещение может быть 16 битов шириной. Как есть недостаточное пространство в инструкции, чтобы сохранить и 16-разрядное смещение и тип поля, putfield_quick_w сохраняет свои исходные операнды и использует их, чтобы индексировать в постоянный пул, где смещение и тип поля доступны в разрешенной записи.


putfield2_quick

Работа Набор long или double поле в объекте

putfield2_quick
смещение
неиспользованный


Формы putfield2_quick = 209 (0xd1)

Стек ..., objectref, значение word1, оценивают word2...

Описание objectref, который должен иметь тип reference, и значение, которое должно быть значением типа, подходящего для указанного поля, выталкивается от стека операнда. Значение пишется при смещении в экземпляр класса, на который ссылается objectref.

Исключение на этапе выполнения Если objectref null, putfield2_quick инструкция бросает a NullPointerException.

Примечания Код операции этой инструкции был первоначально putfield, работающий на поле, решенном динамически иметь смещение в данные экземпляра класса 255 слов или меньше и иметь ширину двух слов.

Когда постоянная запись пула, на которую ссылается putfield инструкция, разрешается, смещение для поля, на которое это ссылается, сгенерировано. То смещение заменяет первый операнд исходной putfield инструкции. Второй операнд putfield неиспользован putfield2_quick.


putstatic_quick

Работа Набор static поле в классе

putstatic_quick
indexbyte1
indexbyte2


Формы putstatic_quick = 211 (0xd3)

Стек ..., значение...

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула должен быть полевой ссылкой на класс (static) поле, которое, должно быть, было уже успешно разрешено к типу, который является одним широким словом. Значение должно иметь тип, соответствующий тому полю класса. Значение выталкивается от стека операнда, и то поле класса устанавливается оценить.

Примечания Код операции этой инструкции был первоначально putstatic, работающий на a static поле, определенное динамически, чтобы быть одним широким словом. Операнды putstatic инструкции не изменяются. Нет никакого эквивалента putfield_quick инструкции, храня смещение класса как операнд инструкции, для одного слова static поля.


putstatic2_quick

Работа Набор static поле в классе

putstatic2_quick
indexbyte1
indexbyte2


Формы putstatic2_quick = 213 (0xd5)

Стек ..., значение word1, значение word2...

Описание indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула должен быть полевой ссылкой на класс (static) поле, которое, должно быть, было уже успешно разрешено к типу, который является двумя широкими словами. Значение должно иметь тип, соответствующий тому полю класса. Значение выталкивается от стека операнда, и то поле класса устанавливается оценить.

Примечания Код операции этой инструкции был первоначально putstatic, работающий на a static поле, определенное динамически, чтобы быть двумя широкими словами. Операнды putstatic инструкции не изменяются. Нет никакого эквивалента putfield2_quick инструкции, храня смещение класса как операнд инструкции, для с двумя словами static поля.



Содержание | Предыдущий | Следующий | Индекс

Спецификация Виртуальной машины Java
Авторское право © 1996, 1997 Sun Microsystems, Inc. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jvm@java.sun.com

free hit counter