Как подсчитать индексы локальных переменных в MethodVariableAccess?

#java #bytecode-manipulation #byte-buddy #jvm-bytecode

#java #манипулирование байт-кодом #байт-приятель #jvm-байт-код

Вопрос:

Согласно [1], во фрейме метода массив локальных переменных содержит ссылку на вызываемый экземпляр, параметры и, наконец, любые другие переменные, используемые в коде метода. Кроме того, long и double значения занимают две локальные переменные.

При использовании Byte Buddy для генерации кода метода с помощью манипуляций со стеком MethodVariableAccess.OffsetLoading индекс long и double значения объединяются в один индекс или это необходимо, как при непосредственном использовании ASM, для учета таких значений для вычисления локального индекса var?

[1] https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.6.1

Ответ №1:

MethodVariableAccess.OffsetLoading обращается к смещению, которое не называется индексом, чтобы отличить именно это. Если long double в массиве содержится тип или, это относится к двум слотам. Byte Buddy использует эту абстракцию для взаимодействия с ASM, где для вызова соответствующего посетителя требуется такое же смещение.