RFR: JDK-8184989. Incorrect class file created when passing lambda in inner class constructor and outer is subclass

Srikanth srikanth.adayapalam at oracle.com
Tue Aug 1 12:15:44 UTC 2017


Thanks Andrey.

I'll take a look in the coming week and let you know of any feedback.

Srikanth

On Monday 31 July 2017 08:00 PM, Andrey Petushkov wrote:
> Dear Compiler Team,
>
> We’ve occasionally found out that there is a problem in javac related 
> to lambda support, in part related to referencing the outer’s entity 
> which otherwise would be captured by using inner this, but cannot be 
> since it’s not yet fully initialized. More specifically this seem to 
> be omission in the fix for JDK-8129740 
> <https://bugs.openjdk.java.net/browse/JDK-8129740>:
> it's fix works fine if it deals with the entity from the outer 
> class(es), but fails if the entity is inherited from outer’s parent. 
> Consider the following source code:
>
> A.java
> public class A {
>     public boolean test(){
>         return true;
>     }
>     class AA{
>         public AA(Condition condition) {
>         }
>     }
> }
>
> Condition.java
> public interface Condition<T> {
>     boolean check(T t);
> }
>
> B.java
> public class B extends A {
>     private final BA myBA;
>     public B() {
>         myBA = new BA();
>     }
>     public class BA extends AA{
>         public BA() {
>             super(o -> test());
>         }
>     }
>     public static void main(String[] args) {
>         B b = new B();
>         System.out.println(b);
>     }
> }
>
>
> source compiles but execution of B fails with:
> Exception in thread "main" java.lang.VerifyError: Bad type on operand 
> stack
> Exception Details:
>   Location:
>     B$BA.lambda$new$0(LB;Ljava/lang/Object;)Z @1: getfield
>   Reason:
>     Type 'B' (current frame, stack[0]) is not assignable to 'B$BA'
>   Current Frame:
>     bci: @1
>     flags: { }
>     locals: { 'B', 'java/lang/Object' }
>     stack: { 'B' }
>   Bytecode:
>     0x0000000: 2ab4 0001 b600 04ac
>
> at B.<init>(B.java:6)
> at B.main(B.java:17)
>
> The problem is reproduced on both latest 8u and 9 (by the time of the 
> bug submission)
>
> My naive attempt to fix could be seen here 
> http://cr.openjdk.java.net/~apetushkov/8184989/webrev/ 
> <http://cr.openjdk.java.net/%7Eapetushkov/8184989/webrev/> (based on 
> latest 8u)
> Please could you consider reviewing/improving it or suggesting 
> improvement direction as appropriate
>
> Thanks,
> Andrey

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20170801/1cc4b900/attachment.html>


More information about the compiler-dev mailing list