Invokeinterface - значение счетчика

Я пытаюсь понять байт-код JVM, но наткнулся на следующий код:

58: invokeinterface #5,  1            // InterfaceMethod java/util/List.stream:()Ljava/util/stream/Stream;
63: invokedynamiC#6,  0              // InvokeDynamiC#0:test:()Ljava/util/function/Predicate;
68: invokeinterface #7,  2            // InterfaceMethod java/util/stream/Stream.filter:(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;

Кажется, что значение считать всегда равно нарги + 1 (в 58: должно быть 0, но равно 1, в 68: должно быть 1, но равно 2).

Согласно документ JVM:

The count operand is an unsigned byte that must not be zero

Не по этой ли причине ряд аргументов выглядит как нарги + 1?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объект this (называемый objectref в JVMS) всегда является первым неявным аргументом invokeinterface. Он передается в стек операндов вместе с другими nargs аргументами.

На самом деле count — это не количество аргументов, а количество слотов стека, необходимых для передачи аргументов. На самом деле этот байт обычно не используется современными JVM, см. Примечания:

The count operand of the invokeinterface instruction records a measure of the number of argument values, where an argument value of type long or type double contributes two units to the count value and an argument of any other type contributes one unit. This information can also be derived from the descriptor of the selected method. The redundancy is historical.

Я видел эту информацию об избыточности, но все равно было любопытно, почему значение отличается. Теперь понятно, спасибо ;)

Noskol 18.06.2019 13:58

Другие вопросы по теме