Это выдержка из руководства пользователя asm
:
Чтобы сэкономить место, скомпилированный метод не содержит один кадр на инструкцию: фактически он содержит только кадры дляинструкции, которые соответствуют целям перехода или обработчикам исключений, или которые следуют безусловным инструкциям перехода.Действительно, другие фреймы могут быть легко и быстро выведены из этих.
Я могу понять, почему jvm нуждается в фреймах стековой карты в целях перехода и для обработчиков исключений, но нет необходимости иметькадр карты стека после goto
является ненужным требованием, поскольку где-то в байт-коде метода должна быть инструкция перехода, которая указывает на инструкцию сразу после инструкции goto
, и этот случай будет обработан первым требованием.Так должно быть, иначе инструкция после goto
будет недоступна и, следовательно, недоступна.
Пример:
Метод и его байт-код приведены ниже:
public class t {
public static void main(String[] s) {
int i = 10;
while ( i > 0 ) {
i = i + 1;
}
int j = 10;
}
}
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: bipush 10
2: istore_1
3: iload_1
4: ifle 14
7: iload_1
8: iconst_1
9: iadd
10: istore_1
11: goto 3
14: bipush 10
16: istore_2
17: return
LineNumberTable:
line 9: 0
line 10: 3
line 11: 7
line 13: 14
line 14: 17
StackMapTable: number_of_entries = 2
frame_type = 252 /* append */
offset_delta = 3
locals = [ int ]
frame_type = 10 /* same */
}
Инструкция с индексом 11
- это инструкция goto, а инструкция с индексом 4
имеет 14
, инструкцию сразу после 11
в качестве цели перехода.
Что является разумным основаниемкадр карты стека после безусловного перехода?