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




Объект 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.
Я видел эту информацию об избыточности, но все равно было любопытно, почему значение отличается. Теперь понятно, спасибо ;)