Blocks :
|
|
Relates :
|
|
Relates :
|
FULL PRODUCT VERSION : java version "1.8.0" Java(TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode) FULL OS VERSION : Linux d 3.11.0-19-generic #33-Ubuntu SMP Tue Mar 11 18:48:34 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux A DESCRIPTION OF THE PROBLEM : Compiling the attached code does not produce an error. However, execution fails with a VerifyError. THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: Yes THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : - Compile the attached class. - Run "java Test". EXPECTED VERSUS ACTUAL BEHAVIOR : Expected: The second call in the runTest() method should execute without any problems and behave the same way as the first. Actual: The second call compiles fine but corrupts the class file so it can not be executed. ERROR MESSAGES/STACK TRACES THAT OCCUR : Exception in thread "main" java.lang.VerifyError: Bad type on operand stack Exception Details: Location: Test.lambda$runTest$2(LTest$Worker;)V @2: invokedynamic Reason: Type 'Test$Worker' (current frame, stack[1]) is not assignable to 'Test' Current Frame: bci: @2 flags: { } locals: { 'Test$Worker' } stack: { 'Test$Worker', 'Test$Worker' } Bytecode: 0000000: 2a2a ba00 0b00 00b6 000c b1 at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2688) at java.lang.Class.getMethod0(Class.java:2937) at java.lang.Class.getMethod(Class.java:1771) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- import java.util.function.Function; /** * @author Yawkat */ public class Test { public static void main(String[] args) { new Test().runTest(); } private void runTest() { Worker worker = new Worker(); run(() -> worker.print(field -> new SomeClass(field))); run(() -> worker.print(SomeClass::new)); } private void run(Runnable runnable) { runnable.run(); } private class SomeClass { final Object field; SomeClass(Object field) { this.field = field; } } private static class Worker { void print(Function<Object, Object> i) { System.out.println(i.apply(null)); } } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Replacing "SomeClass::new" with "field -> new SomeClass(field)" resolves the issue.
|