Что означает IF_ICMPNE?
Для следующего класса Java:
public class ArtClass {
public boolean foo(int x) {
if(x == 3956681)
return true;
else if(x == 9855021)
return true;
else if(x == 63085561)
return true;
else
return false;
}
}
Его инструкции JVM:
I4 Branch 1 IF_ICMPNE L3
I13 Branch 2 IF_ICMPNE L5
I22 Branch 3 IF_ICMPNE L7
Я понимаю, что первая ветвь находится в третьей строке и то же самое для второй и третьей веток, но что делает IF_ICMPNE
значит, а также что I4
, I13
, а также I22
имею в виду?
2 ответа
Это вывод, javap -c
производится для вашего класса (javap
это инструмент, который поставляется с каждым стандартным JDK):
Compiled from "ArtClass.java"
public class ArtClass {
public ArtClass();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public boolean foo(int);
Code:
0: iload_1
1: ldc #2 // int 3956681
3: if_icmpne 8
6: iconst_1
7: ireturn
8: iload_1
9: ldc #3 // int 9855021
11: if_icmpne 16
14: iconst_1
15: ireturn
16: iload_1
17: ldc #4 // int 63085561
19: if_icmpne 24
22: iconst_1
23: ireturn
24: iconst_0
25: ireturn
}
Значение всех инструкций указано в главе "Набор инструкций" в спецификации виртуальной машины Java®. Инструкция if_icmpne будет выдавать два значения, c o mp - их, и переходить к указанной цели, если она не определена.
Выход из javap
довольно ясно показывает, какие цели были указаны в инструкциях ветвления, так как они соответствуют номерам, напечатанным перед каждой инструкцией.
Если вы используете другой инструмент, производящий разные выходные данные, вы должны обратиться к документации инструмента относительно того, как расшифровать выходные данные. Сравнивая с javap
вывод показывает, что эти префиксы, такие как I4
также ссылаются на смещения байт-кода, но без дополнительного контекста, например, видя другие инструкции метода, это бессмысленно.
Вот документ: http://homepages.inf.ed.ac.uk/kwxm/JVM/if_icmpne.html
if_icmpne:
Description: jump to label if the two integer refs are not equal