Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий | Индекс | Спецификация Виртуальной машины JavaTM |
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 | |
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 следующим образом:
[]
, то есть, массив компонентов SC типа, тогда: Object
(§2.4.6).
[]
, то есть, массив компонентов TC типа, тогда одно из следующего должно быть истиной:
Исключение на этапе выполнения
Если objectref не может быть брошен к типу разрешенного класса, checkcast_quick инструкция бросает a ClassCastException
.
Примечания Код операции этой инструкции был первоначально checkcast. Операнды checkcast инструкции не изменяются.
checkcast_quick инструкция очень подобна instanceof_quick инструкции. Это отличается по своей обработке null
, его поведение, когда его тест перестал работать (checkcast_quick выдает исключение, instanceof_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 | |
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 сохраняет свои исходные операнды и использует их, чтобы индексировать в постоянный пул, где смещение и тип поля доступны в разрешенной записи.
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 | |
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 | |
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 | |
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 следующим образом:
[]
, то есть, массив компонентов SC типа, тогда: Object
(§2.4.6).
[]
, то есть, массив компонентов TC типа, тогда одно из следующего должно быть истиной:
Примечания Код операции этой инструкции был первоначально instanceof. Операнды instanceof инструкции не изменяются.
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
метод.
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
.
null
, invokeinterface_quick инструкция бросает a NullPointerException
. Примечания Код операции этой инструкции был первоначально invokeinterface. Начальное значение предположения 0, значение операнда, предоставленное invokeinterface. Идентификаторы, сравниваемые и сохраненные в invokeinterface_quick инструкции, кодируют имя метода и дескриптор как 16-разрядное количество, которое может быть сравнено быстро. Детали кодирования специфичны для реализации. Байты идентификатора для вызываемого метода, idbyte1 и idbyte2, заменяют исходные постоянные индексные байты пула. Идентификатор может быть вычислен, когда каждый метод загружается, или во время выполнения. Значение nargs операнда не изменяется.
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 | |
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 | |
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 | |
индекс | |
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 | |
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 | |
индекс | |
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 | |
индекс |
Описание Индекс является байтом без знака, который должен быть допустимым индексом в постоянный пул текущего класса (§3.6). Постоянный элемент пула по индексу, должно быть, был уже разрешен и должен быть одним широким словом. Элемент выбирается от постоянного пула и продвигается на стек операнда.
Примечания Код операции этой инструкции был первоначально ldc. Операнд ldc инструкции не изменяется.
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 инструкции, за исключением ее более широкого постоянного индекса пула.
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 | |
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 | |
indexbyte1 | |
indexbyte2 |
Описание
indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент по тому индексу, должно быть, был уже разрешен к типу класса. Новый экземпляр того класса создается, и переменные экземпляра нового объекта инициализируются к их начальным значениям по умолчанию (§2.5.1). objectref, a reference
к экземпляру, продвигается на стек операнда.
Примечания Код операции этой инструкции был первоначально нов. Операнды исходной новой инструкции не изменяются.
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 | |
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 сохраняет свои исходные операнды и использует их, чтобы индексировать в постоянный пул, где смещение и тип поля доступны в разрешенной записи.
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.
static
поле в классеputstatic_quick | |
indexbyte1 | |
indexbyte2 |
Формы putstatic_quick = 211 (0xd3)
Описание
indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в постоянный пул текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Постоянный элемент пула должен быть полевой ссылкой на класс (static
) поле, которое, должно быть, было уже успешно разрешено к типу, который является одним широким словом. Значение должно иметь тип, соответствующий тому полю класса. Значение выталкивается от стека операнда, и то поле класса устанавливается оценить.
Примечания
Код операции этой инструкции был первоначально putstatic, работающий на a static
поле, определенное динамически, чтобы быть одним широким словом. Операнды putstatic инструкции не изменяются. Нет никакого эквивалента putfield_quick инструкции, храня смещение класса как операнд инструкции, для одного слова static
поля.
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