filtering JAVAC.STRINGSWITCH
Evgeny Mandrikov edited this page Sep 29, 2017
·
5 revisions
This page discusses a not yet available feature!
Starting from Java 7 possible to use String
object in the expression of switch
statement. In such case compiler generates additional switch that uses hashCode
and additional conditions that use equals
.
switch (x) {
case "AaAa":
// case 1
break;
case "BBBB":
// case 2
break;
}
javac 1.8.0_121
...
INVOKEVIRTUAL java/lang/String.hashCode ()I
LOOKUPSWITCH
2031744: L1
default: L2
L1
ALOAD 2
LDC "BBBB"
INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
IFEQ L3
ICONST_1
ISTORE 3
GOTO L2
L3
ALOAD 2
LDC "AaAa"
INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
IFEQ L2
ICONST_0
ISTORE 3
L2
ILOAD 3
LOOKUPSWITCH
0: C1
1: C2
default: L4
C1:
// case 1
goto L4
C2:
// case 2
L4
...
ecj 4.6.1
INVOKEVIRTUAL java/lang/String.hashCode ()I
LOOKUPSWITCH
2031744: L1
default: L2
L1:
ALOAD 2
LDC "AaAa"
INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
IFNE C1
ALOAD 2
LDC "BBBB"
INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
IFNE C2
GOTO L2
C1:
// case 1
GOTO L2
C2:
// case 2
L2:
...