Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий | Индекс | Спецификация Виртуальной машины JavaTM |
Работа
Преобразоватьint
кbyte
Формат
i2b
Формы
i2b = 145 (0x91)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типint
. Это выталкивается от стека операнда, усеченного к abyte
, тогда расширенный до знака наint
результат. Тот результат продвигается на стек операнда.
Примечания
i2b инструкция выполняет сужающееся примитивное преобразование (§2.6.3). Это может потерять информацию о полной величине имеющей значение. У результата, возможно, также нет того же самого знака как значение.
Работа
Преобразоватьint
кchar
Формат
i2c
Формы
i2c = 146 (0x92)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типint
. Это выталкивается от стека операнда, усеченного кchar
, тогда расширенный до нуля наint
результат. Тот результат продвигается на стек операнда.
Примечания
i2c инструкция выполняет сужающееся примитивное преобразование (§2.6.3). Это может потерять информацию о полной величине имеющей значение. У результата (который всегда положителен), возможно, также нет того же самого знака как значение.
Работа
Преобразоватьint
кdouble
Формат
i2d
Формы
i2d = 135 (0x87)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типint
. Это выталкивается от стека операнда и преобразовывается в adouble
результат. Результат продвигается на стек операнда.
Примечания
i2d инструкция выполняет расширяющееся примитивное преобразование (§2.6.2). Поскольку все значения типаint
являются точно представимыми типомdouble
, преобразование точно.
Работа
Преобразоватьint
кfloat
Формат
i2f
Формы
i2f = 134 (0x86)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типint
. Это выталкивается от стека операнда и преобразовывается вfloat
результат используя IEEE 754 вокруг для самого близкого режима. Результат продвигается на стек операнда.
Примечания
i2f инструкция выполняет расширяющееся примитивное преобразование (§2.6.2), но может привести к потере точности потому что значения типа float
имейте только 24 бита мантиссы.
Работа
Преобразоватьint
кlong
Формат
i2l
Формы
i2l = 133 (0x85)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типint
. Это выталкивается от стека операнда и расширяется до знака на along
результат. Тот результат продвигается на стек операнда.
Примечания
i2l инструкция выполняет расширяющееся примитивное преобразование (§2.6.2). Поскольку все значения типаint
являются точно представимыми типомlong
, преобразование точно.
Работа
Преобразовать
int
кshort
Формат
i2s
Формы
i2s = 147 (0x93)
Стек операнда
..., значение..., результат
Описание
Значение на вершине стека операнда должно иметь типint
. Это выталкивается от стека операнда, усеченного к ashort
, тогда расширенный до знака наint
результат. Тот результат продвигается на стек операнда.
Примечания
i2s инструкция выполняет сужающееся примитивное преобразование (§2.6.3). Это может потерять информацию о полной величине имеющей значение. У результата, возможно, также нет того же самого знака как значение.
Работа
Добавитьint
Формат
iadd
Формы
iadd = 96 (0x60)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результатом является value1 + value2. Результат продвигается на стек операнда.
Результатом являются 32 бита младшего разряда истинного математического результата в достаточно широком two's-дополнительном формате, представленном как значение типа int
. Если переполнение происходит, то знак результата, возможно, не то же самое как знак математической суммы двух значений.
Несмотря на то, что переполнение может произойти, выполнение iadd инструкции никогда не бросает исключение на этапе выполнения.
Работа
Загрузкаint
от массива
Формат
iaload
Формы
iaload = 46 (0x2e)
Стек операнда
..., arrayref, индекс..., значение
Описание
arrayref должен иметь типreference
и должен обратиться к массиву, компоненты которого имеют типint
. Индекс должен иметь типint
. И arrayref и индекс выталкиваются от стека операнда.int
значение в компоненте массива по индексу получается и продвигается на стек операнда.
Исключения на этапе выполнения
Если arrayrefnull
, iaload бросает aNullPointerException
.
Иначе, если индекс не в пределах границ массива, на который ссылается arrayref, iaload инструкция бросает ArrayIndexOutOfBoundsException
.
Работа
Булевская переменная Иint
Формат
iand
Формы
iand = 126 (0x7e)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Они выталкиваются от стека операнда.int
результат вычисляется, беря поразрядное И (соединение) value1 и value2. Результат продвигается на стек операнда.
Работа
Хранилище вint
массив
Формат
iastore
Формы
iastore = 79 (0x4f)
Стек операнда
..., arrayref, индекс, оценивают...
Описание
arrayref должен иметь типreference
и должен обратиться к массиву, компоненты которого имеют типint
. И индекс и значение должны иметь типint
. arrayref, индекс, и значение выталкиваются от стека операнда.int
значение сохранено как компонент массива, индексированного индексом.
Исключения на этапе выполнения
Если arrayrefnull
, iastore бросает aNullPointerException
.
Иначе, если индекс не в пределах границ массива, на который ссылается arrayref, iastore инструкция бросает ArrayIndexOutOfBoundsException
.
Работа
Продвинутьint
постоянный
Формат
iconst _ <i>
Формы
iconst_m1 = 2 (0x2) iconst_0 = 3 (0x3) iconst_1 = 4 (0x4) iconst_2 = 5 (0x5) iconst_3 = 6 (0x6) iconst_4 = 7 (0x7) iconst_5 = 8 (0x8)
Стек операнда
......, <i>
Описание
Продвиньте int
постоянный <i> (-1, 0, 1, 2, 3, 4 или 5) на стек операнда.
Примечания
Каждое это семейство инструкций эквивалентно bipush <i> для соответствующего значения <i>, за исключением того, что операнд <i> неявен.
Работа
Разделитьсяint
Формат
idiv
Формы
idiv = 108 (0x6c)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результатом является значение выражения value1 / value2 языка программирования Java. Результат продвигается на стек операнда.
int
подразделение округляется к 0; то есть, частное, произведенное дляint
значения в n/dint
оцените q, величина которого как можно больше, удовлетворяя. Кроме того q положителен, когда и n и d имеют тот же самый знак, но q отрицателен, когда и n и d имеют противоположные знаки.
Есть один особый случай, который не удовлетворяет это правило: если дивиденд является отрицательным целым числом самой большой величины для int
введите, и делитель-1, затем переполнитесь, происходит, и результат равен дивиденду. Несмотря на переполнение, никакое исключение не выдается в этом случае.
Исключение на этапе выполнения
Если значение делителя вint
подразделение 0, idiv бросаетArithmeticException
.
Работа
Ответвление, еслиreference
сравнение успешно выполняется
Формат
if_acmp <cond> branchbyte1 branchbyte2
Формы
if_acmpeq = 165 (0xa5) if_acmpne = 166 (0xa6)
Стек операнда
..., value1, value2...
Описание
И value1 и value2 должны иметь тип reference
. Они и выталкиваются от стека операнда и сравниваются. Результаты сравнения следующие:
Если сравнение успешно выполняется, branchbyte1 без знака и branchbyte2 используются, чтобы создать 16-разрядное смещение со знаком, где смещение вычисляется, чтобы быть (branchbyte1 << 8) | branchbyte2. Выполнение тогда продолжает при том смещении от адреса кода операции этого if_acmp <cond> инструкцию. Целевой адрес должен быть адресом кода операции инструкции в пределах метода, который содержит этот if_acmp <cond> инструкция.
Иначе, если сравнение перестало работать, выполнение продолжает в адресе инструкции после этого if_acmp <cond> инструкцию.
Работа
Ответвление, еслиint
сравнение успешно выполняется
Формат
if_icmp <cond> branchbyte1 branchbyte2
Формы
if_icmpeq = 159 (0x9f) if_icmpne = 160 (0xa0) if_icmplt = 161 (0xa1) if_icmpge = 162 (0xa2) if_icmpgt = 163 (0xa3) if_icmple = 164 (0xa4)
Стек операнда
..., value1, value2...
Описание
И value1 и value2 должны иметь тип int
. Они и выталкиваются от стека операнда и сравниваются. Все сравнения подписываются. Результаты сравнения следующие:
Если сравнение успешно выполняется, branchbyte1 без знака и branchbyte2 используются, чтобы создать 16-разрядное смещение со знаком, где смещение вычисляется, чтобы быть (branchbyte1 << 8) | branchbyte2. Выполнение тогда продолжает при том смещении от адреса кода операции этого if_icmp <cond> инструкцию. Целевой адрес должен быть адресом кода операции инструкции в пределах метода, который содержит этот if_icmp <cond> инструкция.
Иначе, выполнение продолжает в адресе инструкции после этого if_icmp <cond> инструкцию.
Работа
Ответвление, еслиint
сравнение с нулем успешно выполняется
Формат
если <cond> branchbyte1 branchbyte2
Формы
ifeq = 153 (0x99) ifne = 154 (0x9a) iflt = 155 (0x9b) ifge = 156 (0x9c) ifgt = 157 (0x9d) ifle = 158 (0x9e)
Стек операнда
..., значение...
Описание
Значение должно иметь тип int
. Это выталкивается от стека операнда и сравнивается с нулем. Все сравнения подписываются. Результаты сравнений следующие:
Если сравнение успешно выполняется, branchbyte1 без знака и branchbyte2 используются, чтобы создать 16-разрядное смещение со знаком, где смещение вычисляется, чтобы быть (branchbyte1 << 8) | branchbyte2. Выполнение тогда продолжается при том смещении от адреса кода операции этого если <cond> инструкция. Целевой адрес должен быть адресом кода операции инструкции в пределах метода, который содержит это если <cond> инструкция.
Иначе, выполнение продолжается в адресе инструкции после этого если <cond> инструкция.
Работа
Ответвление, еслиreference
нетnull
Формат
ifnonnull branchbyte1 branchbyte2
Формы
ifnonnull = 199 (0xc7)
Стек операнда
..., значение...
Описание
Значение должно иметь типreference
. Это выталкивается от стека операнда. Если значение неnull
, branchbyte1 без знака и branchbyte2 используются, чтобы создать 16-разрядное смещение со знаком, где смещение вычисляется, чтобы быть (branchbyte1 << 8) | branchbyte2. Выполнение тогда продолжается при том смещении от адреса кода операции этой ifnonnull инструкции. Целевой адрес должен быть адресом кода операции инструкции в пределах метода, который содержит эту ifnonnull инструкцию.
Иначе, выполнение продолжается в адресе инструкции, следующей этим ifnonnull инструкциям.
Работа
Ответвление, еслиreference
null
Формат
ifnull branchbyte1 branchbyte2
Формы
ifnull = 198 (0xc6)
Стек операнда
..., значение...
Описание
Значение должно типаreference
. Это выталкивается от стека операнда. Если значениеnull
, branchbyte1 без знака и branchbyte2 используются, чтобы создать 16-разрядное смещение со знаком, где смещение вычисляется, чтобы быть (branchbyte1 << 8) | branchbyte2. Выполнение тогда продолжается при том смещении от адреса кода операции этой ifnull инструкции. Целевой адрес должен быть адресом кода операции инструкции в пределах метода, который содержит эту ifnull инструкцию.
Иначе, выполнение продолжается в адресе инструкции, следующей этим ifnull инструкциям.
Работа
Инкрементная локальная переменная постоянным
Формат
iinc индекс константа
Формы
iinc = 132 (0x84)
Стек операнда
Никакое изменение
Описание
Индекс является байтом без знака, который должен быть индексом в массив локальной переменной текущего фрейма (§3.6). Константа является непосредственным байтом со знаком. Локальная переменная по индексу должна содержатьint
. Константа значения сначала расширяется до знака наint
, и затем локальная переменная по индексу постепенно увеличивается тем количеством.
Примечания
iinc код операции может использоваться в соединении с широкой инструкцией, чтобы получить доступ к локальной переменной, используя двухбайтовый индекс без знака и постепенно увеличить это двухбайтовым непосредственным значением.
Работа
Загрузкаint
от локальной переменной
Формат
iload индекс
Формы
iload = 21 (0x15)
Стек операнда
......, значение
Описание
Индекс является байтом без знака, который должен быть индексом в массив локальной переменной текущего фрейма (§3.6). Локальная переменная по индексу должна содержать int
. Значение локальной переменной по индексу продвигается на стек операнда.
Примечания
iload код операции может использоваться в соединении с широкой инструкцией, чтобы получить доступ к локальной переменной, используя двухбайтовый индекс без знака.
Работа
Загрузкаint
от локальной переменной
Формат
iload _ <n>
Формы
iload_0 = 26 (0x1a) iload_1 = 27 (0x1b) iload_2 = 28 (0x1c) iload_3 = 29 (0x1d)
Стек операнда
......, значение
Описание
<n> должен быть индекс в массив локальной переменной текущего фрейма (§3.6). Локальная переменная в <n> должна содержать int
. Значение локальной переменной в <n> продвигается на стек операнда.
Примечания
Каждый из iload _ <n> инструкции является тем же самым как iload с индексом <n>, за исключением того, что операнд <n> неявен.
Умножитьсяint
Формат
imul
Формы
imul = 104 (0x68)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результатом является value1 * value2. Результат продвигается на стек операнда.
Результатом являются 32 бита младшего разряда истинного математического результата в достаточно широком two's-дополнительном формате, представленном как значение типа int
. Если переполнение происходит, то знак результата, возможно, не то же самое как знак математической суммы двух значений.
Несмотря на то, что переполнение может произойти, выполнение imul инструкции никогда не бросает исключение на этапе выполнения.
Работа
Инвертироватьint
Формат
ineg
Формы
ineg = 116 (0x74)
Стек операнда
..., значение..., результат
Описание
Значение должно иметь типint
. Это выталкивается от стека операнда.int
результатом является арифметическое отрицание имеющее значение, - значение. Результат продвигается на стек операнда.
Дляint
значения, отрицание является тем же самым как вычитанием от нуля. Поскольку использование виртуальной машины Java two's-дополнительное представление для целых чисел и диапазона two's-дополнительных значений не симметрично, отрицание максимального отрицанияint
результаты в том же самом максимальном отрицательном числе. Несмотря на то, что переполнение произошло, никакое исключение не выдается.
Для всехint
значенияx
, -x
равняется (~x
) +1
.
Работа
Определите, имеет ли объект данный тип
Формат
instanceof indexbyte1 indexbyte2
Формы
instanceof = 193 (0xc1)
Стек операнда
..., objectref..., результат
Описание
objectref, который должен иметь тип reference
, выталкивается от стека операнда. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в пул константы этапа выполнения текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент пула константы этапа выполнения по индексу должен быть символьной ссылкой на класс, массив, или интерфейсный тип. Именованный класс, массив, или интерфейсный тип разрешаются (§5.4.3.1).
Если objectref неnull
и экземпляр разрешенного класса или массива или реализует разрешенный интерфейс, instanceof инструкция продвигаетint
результат 1 как интервал на стеке операнда. Иначе, это продвигаетint
результат 0.
Следующие правила используются, чтобы определить, ли objectref, который не является null
экземпляр разрешенного типа: Если S является классом объекта, упомянутого objectref, и T является разрешенным классом, массивом, или интерфейсный тип, instanceof определяет, является ли objectref экземпляром T следующим образом:
[]
, то есть, массив компонентов SC типа, тогда:
Соединение Исключений
Во время разрешения символьной ссылки на класс, массив, или интерфейсный тип, может быть выдано любое из исключений, задокументированных в Раздел 5.4.3.1.
Примечания
instanceof инструкция очень подобна checkcast инструкции. Это отличается по своей обработке null
, его поведение, когда его тест перестал работать (checkcast выдает исключение, instanceof, продвигает код результата), и его эффект на стек операнда.
Работа
Вызовите интерфейсный метод
Формат
invokeinterface indexbyte1 indexbyte2 количество 0
Формы
invokeinterface = 185 (0xb9)
Стек операнда
..., objectref, [arg1, [arg2...]]...
Описание
indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в пул константы этапа выполнения текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент пула константы этапа выполнения по тому индексу должен быть символьной ссылкой на интерфейсный метод (§5.1), который дает имя и дескриптор (§4.3.3) интерфейсного метода так же как символьной ссылки на интерфейс, в котором должен быть найден интерфейсный метод. Именованный интерфейсный метод разрешается (§5.4.3.4). Интерфейсный метод не должен быть методом инициализации экземпляра (§3.9) или класс или интерфейсный метод инициализации (§3.9).
Операнд количества является байтом без знака, который не должен быть нулем. objectref должен иметь тип reference
и должен сопровождаться на стеке операнда nargs значениями аргументов, где число, введите, и порядок значений должен быть непротиворечивым с дескриптором разрешенного интерфейсного метода. Значение четвертого байта операнда должно всегда быть нулем.
Позвольте C быть классом objectref. Фактический метод, который будет вызван, выбирается следующей процедурой поиска:
AbstractMethodError
повышается. Если метод synchronized
, монитор, связанный с objectref, получается или повторно вводится.
Если метод неnative
, nargs значения аргументов и objectref выталкиваются от стека операнда. Новый фрейм создается на стеке виртуальной машины Java для вызываемого метода. objectref и значения аргументов последовательно делаются значениями локальных переменных нового фрейма, с objectref в локальной переменной 0, arg1 в локальной переменной 1 (или, если arg1 имеет типlong
илиdouble
, в локальных переменных 1 и 2), и так далее. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть сохраненным в локальной переменной. Новый фрейм тогда делается текущим, и виртуальная машина Javapc
устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.
Если метод native
и зависимый от платформы код, который реализует это, еще не был связан (§5.6) в виртуальную машину Java, которая делается. nargs значения аргументов и objectref выталкиваются от операнда, складывают и передаются как параметры к коду, который реализует метод. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть переданным в качестве параметра. Параметры передают, и код вызывается зависящим от реализации способом. Когда зависимый от платформы код возвращается:
native
метод synchronized
, монитор, связанный с objectref, выпускается или выходится как будто выполнением monitorexit инструкции.
native
метод возвращает значение, возвращаемое значение зависимого от платформы кода преобразовывается зависящим от реализации способом к типу возврата native
метод и продвинутый на стек операнда. Соединение Исключений
Во время разрешения символьной ссылки на интерфейсный метод может быть выдано любое из исключений, задокументированных в §5.4.3.4.
Исключения на этапе выполнения
Иначе, если objectrefnull
, invokeinterface инструкция бросает aNullPointerException
.
Иначе, если класс objectref не реализует разрешенный интерфейс, invokeinterface бросает IncompatibleClassChangeError
.
Иначе, если никакой метод, соответствующий разрешенное имя и дескриптор, не выбирается, invokeinterface бросает AbstractMethodError
.
Иначе, если выбранный метод неpublic
, invokeinterface бросаетIllegalAccessError
.
Иначе, если выбранный методabstract
, invokeinterface бросаетAbstractMethodError
.
Иначе, если выбранный методnative
и код, который реализует метод, не может быть связан, invokeinterface бросаетUnsatisfiedLinkError
.
Примечания
Операнд количества invokeinterface инструкции записывает меру числа значений аргументов, где значение аргумента типаlong
или введитеdouble
вносит два модуля значению количества, и параметр любого другого типа вносит один модуль. Эта информация может также быть получена из дескриптора выбранного метода. Избыточность является исторической.
Четвертый байт операнда существует, чтобы зарезервировать пространство для дополнительного операнда, используемого в уверенности о реализациях Sun, которые заменяют invokeinterface инструкцию специализированной псевдоинструкцией во время выполнения. Это должно быть сохранено для назад совместимости.
nargs значения аргументов и objectref не являются непосредственными с первым nargs + 1 локальная переменная. Значения аргументов типовlong
иdouble
должен быть сохранен в двух последовательных локальных переменных, таким образом больше, чем nargs локальные переменные могут быть обязаны передавать nargs значения аргументов к вызванному методу.
Работа
Вызовите метод экземпляра; специальная обработка для суперкласса, частного, и вызовы метода инициализации экземпляра
Формат
invokespecial indexbyte1 indexbyte2
Формы
invokespecial = 183 (0xb7)
Стек операнда
..., objectref, [arg1, [arg2...]]...
Описание
indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в пул константы этапа выполнения текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент пула константы этапа выполнения по тому индексу должен быть символьной ссылкой на метод (§5.1), который дает имя и дескриптор (§4.3.3) метода так же как символьной ссылки на класс, в котором должен быть найден метод. Именованный метод разрешается (§5.4.3.3). Наконец, если разрешенный метод protected
(§4.6), и это - или элемент текущего класса или элемент суперкласса текущего класса, тогда класс objectref должен быть или текущим классом или подклассом текущего класса.
Затем, разрешенный метод выбирается для вызова, если все следующие условия не являются истиной:
ACC_SUPER
флаг (см. Таблицу 4.1, "Доступ класса и модификаторы свойства") устанавливается для текущего класса.
Если вышеупомянутые условия являются истиной, фактический метод, который будет вызван, выбирается следующей процедурой поиска. Позвольте C быть прямым суперклассом текущего класса:
AbstractMethodError
повышается. objectref должен иметь тип reference
и должен сопровождаться на стеке операнда nargs значениями аргументов, где число, введите, и порядок значений должен быть непротиворечивым с дескриптором выбранного метода экземпляра.
Если метод synchronized
, монитор, связанный с objectref, получается или повторно вводится.
Если метод неnative
, nargs значения аргументов и objectref выталкиваются от стека операнда. Новый фрейм создается на стеке виртуальной машины Java для вызываемого метода. objectref и значения аргументов последовательно делаются значениями локальных переменных нового фрейма, с objectref в локальной переменной 0, arg1 в локальной переменной 1 (или, если arg1 имеет типlong
илиdouble
, в локальных переменных 1 и 2), и так далее. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть сохраненным в локальной переменной. Новый фрейм тогда делается текущим, и виртуальная машина Javapc
устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.
Если метод native
и зависимый от платформы код, который реализует это, еще не был связан (§5.6) в виртуальную машину Java, которая делается. nargs значения аргументов и objectref выталкиваются от операнда, складывают и передаются как параметры к коду, который реализует метод. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть переданным в качестве параметра. Параметры передают, и код вызывается зависящим от реализации способом. Когда зависимый от платформы код возвращается, следующее имейте место:
native
метод synchronized
, монитор, связанный с objectref, выпускается или выходится как будто выполнением monitorexit инструкции.
native
метод возвращает значение, возвращаемое значение зависимого от платформы кода преобразовывается зависящим от реализации способом к типу возврата native
метод и продвинутый на стек операнда. Соединение Исключений
Во время разрешения символьной ссылки на метод может быть выдано любое из исключений, имеющих отношение к разрешению метода, задокументированному в Раздел 5.4.3.3.
Иначе, если разрешенный метод является методом инициализации экземпляра, и класс, в котором он объявляется, не является классом, на который символически ссылается инструкция, a NoSuchMethodError
бросается.
Иначе, если разрешенный метод является классом (static
) метод, invokespecial инструкция бросаетIncompatibleClassChangeError
.
Иначе, если никакой метод, соответствующий разрешенное имя и дескриптор, не выбирается, invokespecial бросает AbstractMethodError
.
Иначе, если выбранный методabstract
, invokespecial бросаетAbstractMethodError
.
Исключения на этапе выполнения
Иначе, если objectrefnull
, invokespecial инструкция бросает aNullPointerException
.
Иначе, если выбранный методnative
и код, который реализует метод, не может быть связан, invokespecial бросаетUnsatisfiedLinkError
.
Примечания
Различие между invokespecial и invokevirtual инструкциями - то, что invokevirtual вызывает метод, основанный на классе объекта. invokespecial инструкция используется, чтобы вызвать методы инициализации экземпляра (§3.9) так же как private
методы и методы суперкласса текущего класса.
invokespecial инструкцию назвали invokenonvirtual до выпуска 1.0.2 JDK Sun.
nargs значения аргументов и objectref не являются непосредственными с первым nargs + 1 локальная переменная. Значения аргументов типовlong
иdouble
должен быть сохранен в двух последовательных локальных переменных, таким образом больше, чем nargs локальные переменные могут быть обязаны передавать nargs значения аргументов к вызванному методу.
Работа
Вызовите класс (static
) метод
Формат
invokestatic indexbyte1 indexbyte2
Формы
invokestatic = 184 (0xb8)
Стек операнда
..., [arg1, [arg2...]]...
Описание
indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в пул константы этапа выполнения текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент пула константы этапа выполнения по тому индексу должен быть символьной ссылкой на метод (§5.1), который дает имя и дескриптор (§4.3.3) метода так же как символьной ссылки на класс, в котором должен быть найден метод. Именованный метод разрешается (§5.4.3.3). Метод не должен быть классом или интерфейсным методом инициализации (§3.9). Это должно бытьstatic
, и поэтому не может бытьabstract
.
На успешном разрешении метода класс, который объявил разрешенное поле, инициализируется (§5.5), если тот класс не был уже инициализирован.
Стек операнда должен содержать nargs значения аргументов, где число, введите, и порядок значений должен быть непротиворечивым с дескриптором разрешенного метода.
Если метод synchronized
, монитор, связанный с разрешенным классом, получается или повторно вводится.
Если метод неnative
, nargs значения аргументов выталкиваются от стека операнда. Новый фрейм создается на стеке виртуальной машины Java для вызываемого метода. nargs значения аргументов последовательно делаются значениями локальных переменных нового фрейма с arg1 в локальной переменной 0 (или, если arg1 имеет типlong
илиdouble
, в локальных переменных 0 и 1) и так далее. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть сохраненным в локальной переменной. Новый фрейм тогда делается текущим, и виртуальная машина Javapc
устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.
Если метод native
и зависимый от платформы код, который реализует это, еще не был связан (§5.6) в виртуальную машину Java, которая делается. nargs значения аргументов выталкиваются от операнда, складывают и передаются как параметры к коду, который реализует метод. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть переданным в качестве параметра. Параметры передают, и код вызывается зависящим от реализации способом. Когда зависимый от платформы код возвращается, следующее имейте место:
native
метод synchronized
, монитор, связанный с разрешенным классом, выпускается или выходится как будто выполнением monitorexit инструкции.
native
метод возвращает значение, возвращаемое значение зависимого от платформы кода преобразовывается зависящим от реализации способом к типу возврата native
метод и продвинутый на стек операнда. Соединение Исключений
Во время разрешения символьной ссылки на метод может быть выдано любое из исключений, имеющих отношение к разрешению метода, задокументированному в Раздел 5.4.3.3.
Иначе, если разрешенный метод является методом экземпляра, invokestatic инструкция бросает IncompatibleClassChangeError
.
Исключения на этапе выполнения
Иначе, если выполнение этой invokestatic инструкции вызывает инициализацию класса, на который ссылаются, invokestatic может бросить Error
как детализировано в Разделе 2.17.5.
Иначе, если разрешенный методnative
и код, который реализует метод, не может быть связан, invokestatic бросаетUnsatisfiedLinkError
.
Примечания
nargs значения аргументов не являются непосредственными с первыми nargs локальными переменными. Значения аргументов типовlong
иdouble
должен быть сохранен в двух последовательных локальных переменных, таким образом больше, чем nargs локальные переменные могут быть обязаны передавать nargs значения аргументов к вызванному методу.
Работа
Вызовите метод экземпляра; диспетчеризируйте основанный на классе
Формат
invokevirtual indexbyte1 indexbyte2
Формы
invokevirtual = 182 (0xb6)
Стек операнда
..., objectref, [arg1, [arg2...]]...
Описание
indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в пул константы этапа выполнения текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент пула константы этапа выполнения по тому индексу должен быть символьной ссылкой на метод (§5.1), который дает имя и дескриптор (§4.3.3) метода так же как символьной ссылки на класс, в котором должен быть найден метод. Именованный метод разрешается (§5.4.3.3). Метод не должен быть методом инициализации экземпляра (§3.9) или класс или интерфейсный метод инициализации (§3.9). Наконец, если разрешенный метод protected
(§4.6), и это - или элемент текущего класса или элемент суперкласса текущего класса, тогда класс objectref должен быть или текущим классом или подклассом текущего класса.
Позвольте C быть классом objectref. Фактический метод, который будет вызван, выбирается следующей процедурой поиска:
AbstractMethodError
повышается. objectref должен сопровождаться на стеке операнда nargs значениями аргументов, где число, введите, и порядок значений должен быть непротиворечивым с дескриптором выбранного метода экземпляра.
Если метод synchronized
, монитор, связанный с objectref, получается или повторно вводится.
Если метод неnative
, nargs значения аргументов и objectref выталкиваются от стека операнда. Новый фрейм создается на стеке виртуальной машины Java для вызываемого метода. objectref и значения аргументов последовательно делаются значениями локальных переменных нового фрейма, с objectref в локальной переменной 0, arg1 в локальной переменной 1 (или, если arg1 имеет типlong
илиdouble
, в локальных переменных 1 и 2), и так далее. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть сохраненным в локальной переменной. Новый фрейм тогда делается текущим, и виртуальная машина Javapc
устанавливается в код операции первой инструкции метода быть вызванным. Выполнение продолжается с первой инструкцией метода.
Если метод native
и зависимый от платформы код, который реализует это, еще не был связан (§5.6) в виртуальную машину Java, которая делается. nargs значения аргументов и objectref выталкиваются от операнда, складывают и передаются как параметры к коду, который реализует метод. Любое значение аргумента, которое имеет тип с плавающей точкой, подвергается преобразованию набора значений (§3.8.3) до того, чтобы быть переданным в качестве параметра. Параметры передают, и код вызывается зависящим от реализации способом. Когда зависимый от платформы код возвращается, следующее имейте место:
native
метод synchronized
, монитор, связанный с objectref, выпускается или выходится как будто выполнением monitorexit инструкции.
native
метод возвращает значение, возвращаемое значение зависимого от платформы кода преобразовывается зависящим от реализации способом к типу возврата native
метод и продвинутый на стек операнда. Соединение Исключений
Во время разрешения символьной ссылки на метод может быть выдано любое из исключений, имеющих отношение к разрешению метода, задокументированному в Раздел 5.4.3.3.
Иначе, если разрешенный метод является классом (static
) метод, invokevirtual инструкция бросаетIncompatibleClassChangeError
.
Исключения на этапе выполнения
Иначе, если objectrefnull
, invokevirtual инструкция бросает aNullPointerException
.
Иначе, если никакой метод, соответствующий разрешенное имя и дескриптор, не выбирается, invokevirtual бросает AbstractMethodError
.
Иначе, если выбранный методabstract
, invokevirtual бросаетAbstractMethodError
.
Иначе, если выбранный методnative
и код, который реализует метод, не может быть связан, invokevirtual бросаетUnsatisfiedLinkError
.
Примечания
nargs значения аргументов и objectref не являются непосредственными с первым nargs + 1 локальная переменная. Значения аргументов типовlong
иdouble
должен быть сохранен в двух последовательных локальных переменных, таким образом больше, чем nargs локальные переменные могут быть обязаны передавать nargs значения аргументов к вызванному методу.
Работа
Булевская переменная ИЛИint
Формат
ior
Формы
ior = 128 (0x80)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Они выталкиваются от стека операнда.int
результат вычисляется, беря поразрядное содержащее ИЛИ value1 и value2. Результат продвигается на стек операнда.
Работа
Остатокint
Формат
irem
Формы
irem = 112 (0x70)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результатом является value1 - (value1 / value2) * value2. Результат продвигается на стек операнда.
Результат irem инструкции так, что(a
/b)*b
+(a%b)
равноa
. Эти идентификационные данные содержат даже в особом случае, в котором дивиденд является отрицаниемint
из самой большой величины для ее типа и делителя -1
(остаток0
). Это следует из этого правила, что результат работы остатка может быть отрицательным, только если дивиденд отрицателен и может быть положительным, только если дивиденд положителен. Кроме того величина результата всегда является меньше чем величина делителя.
Исключение на этапе выполнения
Если значение делителя дляint
оператор остатка 0, irem бросаетArithmeticException
.
Работа
Возвратитьсяint
от метода
Формат
ireturn
Формы
ireturn = 172 (0xac)
Стек операнда
..., оцените [пустой]
Описание
У текущего метода должен быть тип возвратаboolean
,byte
,short
,char
, илиint
. Значение должно иметь типint
. Если текущий метод является asynchronized
метод, монитор, полученный или повторно введенный на вызове метода, выпускается или выходится (соответственно) как будто выполнением monitorexit инструкции. Если никакое исключение не выдается, значение выталкивается от стека операнда текущего фрейма (§3.6) и продвигается на стек операнда фрейма invoker. Любые другие значения на стеке операнда текущего метода отбрасываются.
Интерпретатор тогда возвращает управление invoker метода, восстанавливая фрейм invoker.
Исключения на этапе выполнения
Если текущий метод является asynchronized
метод и текущий поток не являются владельцем монитора, полученного или повторно введенного на вызове метода, ireturn бросаетIllegalMonitorStateException
. Это может произойти, например, если asynchronized
метод содержит monitorexit инструкцию, но никакую monitorenter инструкцию, на объекте, на котором синхронизируется метод.
Иначе, если реализация виртуальной машины осуществляет правила о структурированном использовании блокировок, описанных в Разделе 8.13 и если первое из тех правил нарушается во время вызова текущего метода, то ireturn бросает IllegalMonitorStateException
.
Работа
Сдвиг уехалint
Формат
ishl
Формы
ishl = 120 (0x78)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результат вычисляется, смещаясь value1 оставленный s позициями двоичного разряда, где s является значением низких 5 битов value2. Результат продвигается на стек операнда.
Примечания
Это эквивалентно (даже если переполнение происходит) к умножению 2 к питанию s. Расстояние сдвига, фактически используемое, всегда находится в диапазоне от 0 до 31, включительно, как будто value2 были подвергнуты поразрядному логическому, И с маской оценивают 0x1f.
Работа
Право арифметического сдвигаint
Формат
ishr
Формы
ishr = 122 (0x7a)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результат вычисляется, смещаясь value1 прямо s позициями двоичного разряда с расширением знака, где s является значением низких 5 битов value2. Результат продвигается на стек операнда.
Примечания
Получающееся значение, где s является value2 & 0x1f. Для неотрицательного value1 это эквивалентно усечению int
подразделение 2 к питанию s. Расстояние сдвига, фактически используемое, всегда находится в диапазоне от 0 до 31, включительно, как будто value2 были подвергнуты поразрядному логическому, И с маской оценивают 0x1f.
Работа
Хранилищеint
в локальную переменную
Формат
istore индекс
Формы
istore = 54 (0x36)
Стек операнда
..., значение...
Описание
Индекс является байтом без знака, который должен быть индексом в массив локальной переменной текущего фрейма (§3.6). Значение на вершине стека операнда должно иметь тип int
. Это выталкивается от стека операнда, и значение локальной переменной по индексу устанавливается оценить.
Примечания
istore код операции может использоваться в соединении с широкой инструкцией, чтобы получить доступ к локальной переменной, используя двухбайтовый индекс без знака.
Работа
Хранилищеint
в локальную переменную
Формат
istore _ <n>
Формы
istore_0 = 59 (0x3b) istore_1 = 60 (0x3c) istore_2 = 61 (0x3d) istore_3 = 62 (0x3e)
Стек операнда
..., значение...
Описание
<n> должен быть индекс в массив локальной переменной текущего фрейма (§3.6). Значение на вершине стека операнда должно иметь тип int
. Это выталкивается от стека операнда, и значение локальной переменной в <n> устанавливается оценить.
Примечания
Каждый из istore _ <n> инструкции является тем же самым как istore с индексом <n>, за исключением того, что операнд <n> неявен.
Работа
Вычестьint
Формат
isub
Формы
isub = 100 (0x64)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результатом является value1 - value2. Результат продвигается на стек операнда.
Дляint
вычитание,a
-b
приводит к тому же самому результату какa
+ (-b
). Дляint
значения, вычитание от нуля является тем же самым как отрицанием.
Результатом являются 32 бита младшего разряда истинного математического результата в достаточно широком two's-дополнительном формате, представленном как значение типа int
. Если переполнение происходит, то знак результата, возможно, не то же самое как знак математической суммы двух значений.
Несмотря на то, что переполнение может произойти, выполнение isub инструкции никогда не бросает исключение на этапе выполнения.
Работа
Право логического сдвигаint
Формат
iushr
Формы
iushr = 124 (0x7c)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Значения выталкиваются от стека операнда.int
результат вычисляется, смещаясь value1 прямо s позициями двоичного разряда с дополнением нулями, где s является значением низких 5 битов value2. Результат продвигается на стек операнда.
Примечания
Если value1 положителен, и s является value2 & 0x1f, результатом является то же самое как тот из value1>> s; если value1 отрицателен, результат равен значению выражения (value1>> s) + (2 << ~s). The addition of the (2 << ~s) term cancels out the propagated sign bit. The shift distance actually used is always in the range 0 to 31, inclusive.
Работа
Булев XORint
Формат
ixor
Формы
ixor = 130 (0x82)
Стек операнда
..., value1, value2..., результат
Описание
И value1 и value2 должны иметь типint
. Они выталкиваются от стека операнда.int
результат вычисляется, беря битовое исключающее "ИЛИ" value1 и value2. Результат продвигается на стек операнда.
Содержание | Предыдущий | Следующий | Индекс
Спецификация Виртуальной машины JavaTM
Авторское право © Sun Microsystems, Inc 1999 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jvm@java.sun.com