В документации ASM говорится, что метка представляет собой базовый блок и является узлом в графе управления. Поэтому я тестирую метод visitLabel
на этом простом примере:
public static void main(String[] args) {
int x = 3, y = 4;
if (x < y) {
x++;
}
}
Для метода visitLabel
я использую собственный API: setID(int id)
, где идентификатор является инкрементным. В этом примере CFG должно иметь 3 узла: один в начале и по одному для каждой ветви оператора if. Поэтому я ожидаю, что setID
будет вызываться в 3 местах. Однако он вызывается 5 раз, а nop
инструкций много. Может ли кто-нибудь объяснить мне, почему?
Вот инструментированный байт-код для вышеуказанной программы.
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: invokestatic #13 // Method setId:(I)V
4: iconst_3
5: istore_1
6: iconst_3
7: invokestatic #13 // Method setId:(I)V
10: iconst_4
11: istore_2
12: iconst_4
13: invokestatic #13 // Method setId:(I)V
16: iload_1
17: iload_2
18: if_icmpge 28
21: iconst_5
22: invokestatic #13 // Method setId:(I)V
25: iinc 1, 1
28: bipush 6
30: invokestatic #13 // Method setId:(I)V
33: return
34: nop
35: nop
36: nop
37: nop
38: athrow
Чего я не понимаю, так это почему перед каждой инструкцией istore
стоит label
. Нет ветвления, чтобы сделать его новым узлом в CFG.