Unnecessary CHECKCAST converting to a supertype
Issue #262
resolved
ExtendJ 8.1.0-4-ge296850 Java SE 7
In the bytecode generated for the following code, there are two unnecessary CHECKCAST
to convert a String
to Object
:
import java.util.*;
public class An4 {
public static void main(String[] args) {
Map<String, String> score = new HashMap<String, String>();
score.put("Pancake Batter".toLowerCase(), "very nice");
}
}
Expected result: expected the following bytecode (no casts needed):
0: new #2 // class java/util/HashMap
3: dup
4: invokespecial #3 // Method java/util/HashMap."<init>":()V
7: astore_1
8: aload_1
9: ldc #4 // String Pancake Batter
11: invokevirtual #5 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
14: ldc #6 // String very nice
16: invokeinterface #7, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
21: pop
22: return
Actual result: two unnecessary casts are generated (at pc 14 and 19):
0: new #20 // class java/util/HashMap
3: dup
4: invokespecial #21 // Method java/util/HashMap."<init>":()V
7: astore_1
8: aload_1
9: ldc #23 // String Pancake Batter
11: invokevirtual #29 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
14: checkcast #4 // class java/lang/Object
17: ldc #31 // String very nice
19: checkcast #4 // class java/lang/Object
22: invokeinterface #37, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
27: pop
28: return
Comments (2)
-
reporter -
reporter - changed status to resolved
- Log in to comment
Added test for this by inspecting the actual generated bytecode:
api/cast_01p