Compiler bug with nested lambdas and anonymous inner classes?

David Holmes david.holmes at oracle.com
Tue May 9 01:05:16 UTC 2017


Hi Keith,

Thanks - bug reports can be made at http://bugreport.java.com/

Or you could discuss this issue with javac folk via 
compiler-dev at openjdk.java.net (cc'd).

This issue is fixed in JDK 9 but still present in JDK 8u.

Please drop the discuss list from any replies.

Thanks,
David

On 9/05/2017 6:21 AM, Keith Amling wrote:
>> $ cat Bug.java
>> public class Bug {
>>     public static void foo() {
>>         Runnable r1 = () -> {
>>             new Object() {
>>                 Runnable r2 = () -> new Object() { };
>>             };
>>         };
>>     }
>> }
>> $
>
> "Compiles", but bytecode is nonsense (generates aload_0 in static method with
> no args) and fails verification:
>
>> $ javac Bug.java
>> $ javap -private -c -verbose Bug | grep 'foo()' -A 12
>>   public static void foo();
>>     descriptor: ()V
>>     flags: ACC_PUBLIC, ACC_STATIC
>>     Code:
>>       stack=1, locals=1, args_size=0
>>          0: aload_0
>>          1: invokedynamic #2,  0              // InvokeDynamic #0:run:(LBug;)Ljava/lang/Runnable;
>>          6: astore_0
>>          7: return
>>       LineNumberTable:
>>         line 3: 0
>>         line 8: 7
>>
>> $ java Bug
>> Error: A JNI error has occurred, please check your installation and try again
>> Exception in thread "main" java.lang.VerifyError: Bad local variable type
>> Exception Details:
>>   Location:
>>     Bug.foo()V @0: aload_0
>>   Reason:
>>     Type top (current frame, locals[0]) is not assignable to reference type
>>   Current Frame:
>>     bci: @0
>>     flags: { }
>>     locals: { }
>>     stack: { }
>>   Bytecode:
>>     0x0000000: 2aba 0002 0000 4bb1
>>
>> 	at java.lang.Class.getDeclaredMethods0(Native Method)
>> 	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
>> 	at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
>> 	at java.lang.Class.getMethod0(Class.java:3018)
>> 	at java.lang.Class.getMethod(Class.java:1784)
>> 	at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
>> 	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
>> $
>
> This with:
>
>> $ uname -a
>> Linux trtoje 4.9.0-2-amd64 #1 SMP Debian 4.9.10-1 (2017-02-17) x86_64 GNU/Linux
>> $ java -version
>> openjdk version "1.8.0_131"
>> OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-1-b11)
>> OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
>> $
>
> Keith
>


More information about the discuss mailing list