|
Der JVM-Befehl Im Anschluss an die Mnemonik
Eine switch (index) {
case konstante:
anweisung;
...
default:
...
}Eine Übersetzung einer
Der interne Aufbau des Befehls Die auf den Opcode von default = (default1 << 24) | (default2 << 16) |
(default3 << 8) | default4
low = (low1 << 24) | (low2 << 16) |
(low3 << 8) | low4
high = (high1 << 24) | (high2 << 16) |
(high3 << 8) | high4
offset1 = (offset11 << 24) | (offset12 << 16) |
(offset13 << 8) | offset14
...Falls der auf dem Operandenstapel liegende Wert index
kleiner als low oder größer als high ist,
wird zur Bytecodestelle mit Offset default gesprungen.
Gilt hingegen low <= index <=
high dann wird die Im unmittelbaren Anschluss an den Opcode Beispiel: Eine public class Test {
public static void main(String[] args) {
int a = 4;
int b = 0;
switch (a) {
case 3: b++;
break;
case 4: b += 2;
break;
case 6: b += 3;
break;
default: b += 5;
}
b--;
}
}Das kurze Beispielprogramm kann mittels aa 00 00 00 00 00 31 00 00 00 03 00 00 00 06 00 00 00 1f 00 00 00 25 00 00 00 31 00 00 00 2b Auf den Opcode
Die folgende Übersicht listet die zum betrachteten Programmausschnitt
korrespondierenden JVM-Befehle auf, wie sie mit Hilfe des Klassendatei-Disassemblers
int a = 4; 0: iconst_4
1: istore_1
int b = 0; 2: iconst_0
3: istore_2
switch (a) { 4: iload_1
5: tableswitch { //3 to 6
3: 36;
4: 42;
5: 54;
6: 48;
default: 54 }
case 3: b++; 36: iinc 2, 1
break; 39: goto 57
case 4: b += 2; 42: iinc 2,2
break; 45: goto 57
case 6: b += 3; 48: iinc 2,3
break; 51: goto 57
default: b += 5; 54: iinc 2,5
}
b--; 57: iinc 2,-1
Operationscode des Befehls tableswitch und dessen Operandenbytes (5 - 35):
5: aa Opcode tableswitch
6: 00 00 2 Padding-Bytes
8: 00 00 00 31 default = 49, (5 + 49 = 54)
12: 00 00 00 03 low = 3
16: 00 00 00 06 high = 6
20: 00 00 00 1f offset1 = 31, (5 + 31 = 36)
24: 00 00 00 25 offset2 = 37, (5 + 37 = 42)
28: 00 00 00 31 offset3 = 49, (5 + 49 = 54)
32: 00 00 00 2b offset4 = 43, (5 + 43 = 48)Der 3. Offsetwert offset3 hat den gleichen Wert wie
default und steht "virtuell" für die im Quelltext nicht
vorhandene |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||