Recent versions of javac no longer emit a checkcast in the body of the lambda expression below, which seems like a regression.
This was introduced by the fix forJDK-8203338:
http://hg.openjdk.java.net/jdk/jdk/rev/e0eca40cd514
https://bugs.openjdk.java.net/browse/JDK-8203338
```
abstract class T {
interface I<X> {
X d();
}
abstract <X> I<X> c();
void f() {
Runnable r = () -> this.<Long>c().d();
}
}
```
with javac full version "10.0.2+13"
private void lambda$f$0();
descriptor: ()V
flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokevirtual #3 // Method c:()LT$I;
4: invokeinterface #4, 1 // InterfaceMethod T$I.d:()Ljava/lang/Object;
9: checkcast #5 // class java/lang/Long
12: pop
13: return
LineNumberTable:
line 10: 0
with javac full version "11.0.2+9" (and newer):
private void lambda$f$0();
descriptor: ()V
flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokevirtual #3 // Method c:()LT$I;
4: invokeinterface #4, 1 // InterfaceMethod T$I.d:()Ljava/lang/Object;
9: pop
10: return
LineNumberTable:
line 10: 0
This was introduced by the fix for
http://hg.openjdk.java.net/jdk/jdk/rev/e0eca40cd514
https://bugs.openjdk.java.net/browse/JDK-8203338
```
abstract class T {
interface I<X> {
X d();
}
abstract <X> I<X> c();
void f() {
Runnable r = () -> this.<Long>c().d();
}
}
```
with javac full version "10.0.2+13"
private void lambda$f$0();
descriptor: ()V
flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokevirtual #3 // Method c:()LT$I;
4: invokeinterface #4, 1 // InterfaceMethod T$I.d:()Ljava/lang/Object;
9: checkcast #5 // class java/lang/Long
12: pop
13: return
LineNumberTable:
line 10: 0
with javac full version "11.0.2+9" (and newer):
private void lambda$f$0();
descriptor: ()V
flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokevirtual #3 // Method c:()LT$I;
4: invokeinterface #4, 1 // InterfaceMethod T$I.d:()Ljava/lang/Object;
9: pop
10: return
LineNumberTable:
line 10: 0
- relates to
-
JDK-8205189 5.2: Fix heap pollution checks
-
- Open
-
-
JDK-8203338 Unboxing in return from lambda miscompiled to throw ClassCastException
-
- Closed
-