JDK-8221373 (?) Missing checkcast in void-returning lambda

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Dec 3 15:46:20 UTC 2019


Hi,
sorry for the delay. I've checked JDK-8221373 and, honestly, I'm not 
sure there's anything to fix. Synthetic casts are only emitted when 
there's a target. If you rewrite the example, dropping the lambda 
expression:

abstract class Test {

interface I<X> {
     X d();
}

abstract <X> I<X> c();

   void f() {
      this.<Long>c().d(); //1
   }
}

The callsite in (1) is translated as follows:

          0: aload_0
          1: invokevirtual #2                  // Method c:()LTest$I;
          4: invokeinterface #3,  1            // InterfaceMethod 
Test$I.d:()Ljava/lang/Object;
          9: pop
         10: return

Again, no checkcast here. So I'd say that the fix we did back than 
brought consistency between these two cases, which is IMHO, a good thing.

Maurizio

On 30/10/2019 12:40, B. Blaser wrote:
> Hi,
>
> Looking a bit at JDK-8221373, I'd like to make sure we are going in
> the right direction before posting a RFR.
>
> Going back to JDK-8203338, we decided in [1] to take the functional
> descriptor's erased return type as translation target which might
> cause some side-effects like in Liam's void-returning lambda where no
> 'checkcast' are emitted anymore.
> So my question is rather simple, should we put in place something
> closer to the initial fix I suggested in [2] to preserve the original
> erased expression typing?
>
> Thanks,
> Bernard
>
> [1] http://mail.openjdk.java.net/pipermail/compiler-dev/2018-June/012086.html
> [2] http://mail.openjdk.java.net/pipermail/compiler-dev/2018-June/012076.html


More information about the compiler-dev mailing list