Skip to content

filtering JAVAC.STRINGSWITCH

Evgeny Mandrikov edited this page Sep 29, 2017 · 5 revisions

This page discusses a not yet available feature!

Description

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.

Filtering

Source Example

switch (x) {
  case "AaAa":
    // case 1
    break;
  case "BBBB":
    // case 2
    break;
}

Bytecode Pattern

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:
 ...