invokeinterface - значение счетчика - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь понять байт-код 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;

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

Согласно JVM doc :

Операндом count является беззнаковый байт, который не должен быть равен нулю

Это причина, по которой многие аргументы кажутся nargs + 1?

1 Ответ

4 голосов
/ 18 июня 2019

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

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

Операнд count инструкции invokeinterface записывает меру количества значений аргумента, гдеЗначение аргумента типа long или типа double добавляет две единицы к значению count, а аргумент любого другого типа добавляет одну единицу.Эта информация также может быть получена из дескриптора выбранного метода.Избыточность историческая.

...