JDK-8143120 : Compiler generates invalid bytecode in some cases when using lambda syntax
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8u66
  • Priority: P4
  • Status: Resolved
  • Resolution: Duplicate
  • OS: os_x
  • CPU: x86
  • Submitted: 2015-11-12
  • Updated: 2015-11-18
  • Resolved: 2015-11-18
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Darwin vmac769.laudert.intra 12.4.0 Darwin Kernel Version 12.4.0: Wed May  1 17:57:12 PDT 2013; root:xnu-2050.24.15~1/RELEASE_X86_64 x86_64

A DESCRIPTION OF THE PROBLEM :
When i give an object created by an lambda expression using a non static method to a super-constructor, the compiler generates invlaid bytecode.

When in the attached code the method foo is static wverything is fine.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the given code.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No exception.
ACTUAL -
And runtime exception within the JVM

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    TestClass$TestSubFunction.<init>(LTestClass;)V @8: invokedynamic
  Reason:
    Type uninitializedThis (current frame, stack[2]) is not assignable to 'TestClass$TestSubFunction'
  Current Frame:
    bci: @8
    flags: { flagThisUninit }
    locals: { uninitializedThis, 'TestClass' }
    stack: { uninitializedThis, 'TestClass', uninitializedThis }
  Bytecode:
    0x0000000: 2a2b b500 012a 2b2a ba00 0200 00b7 0003
    0x0000010: b1                                     

	at TestClass.bar(TestClass.java:8)
	at TestClass.main(TestClass.java:4)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
public class TestClass {

    public static void main(String[] args) {
        new TestClass().bar();
    }

    public void bar() {
        new TestSubFunction();
    }

    private boolean foo(Long l) {
        return l < 12L;
    }

    private interface MyPredicate {
        boolean run(Long l);
    }

    private class TestFunctional {

        public TestFunctional(MyPredicate predicate) {
        }
    }

    private class TestSubFunction extends TestFunctional {

        public TestSubFunction() {
            super(l -> foo(34L));
        }
    }
}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Make foo static or use explicit object creation instead.


Comments
Problem is not reproducible anymore on JDK 9 dev since this is a duplicate of JDK-8129740 which got resolved recently.
18-11-2015

Test Result: ########## OS: OS X Yosemite Version 10.10.4 JDK: 9ea : Fail 8u65 : Fail 9ea b91: ********** BAVAIDYA-Mac:Users admin$ java -version java version "1.9.0-ea" Java(TM) SE Runtime Environment (build 1.9.0-ea-b91) Java HotSpot(TM) 64-Bit Server VM (build 1.9.0-ea-b91, mixed mode) BAVAIDYA-Mac:tools admin$ vim TestClass.java BAVAIDYA-Mac:tools admin$ javac TestClass.java BAVAIDYA-Mac:tools admin$ java TestClass Exception in thread "main" java.lang.VerifyError: Bad type on operand stack Exception Details: Location: TestClass$TestSubFunction.<init>(LTestClass;)V @8: invokedynamic Reason: Type uninitializedThis (current frame, stack[2]) is not assignable to 'TestClass$TestSubFunction' Current Frame: bci: @8 flags: { flagThisUninit } locals: { uninitializedThis, 'TestClass' } stack: { uninitializedThis, 'TestClass', uninitializedThis } Bytecode: 0000000: 2a2b b500 012a 2b2a ba00 0200 00b7 0003 0000010: b1 at TestClass.bar(TestClass.java:8) at TestClass.main(TestClass.java:4) 8u65 b17 *********** BAVAIDYA-Mac:tools admin$ /library/java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/bin/javac TestClass.java BAVAIDYA-Mac:tools admin$ /library/java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/bin/java TestClass Exception in thread "main" java.lang.VerifyError: Bad type on operand stack Exception Details: Location: TestClass$TestSubFunction.<init>(LTestClass;)V @8: invokedynamic Reason: Type uninitializedThis (current frame, stack[2]) is not assignable to 'TestClass$TestSubFunction' Current Frame: bci: @8 flags: { flagThisUninit } locals: { uninitializedThis, 'TestClass' } stack: { uninitializedThis, 'TestClass', uninitializedThis } Bytecode: 0x0000000: 2a2b b500 012a 2b2a ba00 0200 00b7 0003 0x0000010: b1 at TestClass.bar(TestClass.java:8) at TestClass.main(TestClass.java:4) BAVAIDYA-Mac:tools admin$
17-11-2015