Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8038776

VerifyError when running successfully compiled java class

XMLWordPrintable

    • b22
    • x86_64
    • linux_ubuntu
    • Verified

        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.

              rfield Robert Field (Inactive)
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              7 Start watching this issue

                Created:
                Updated:
                Resolved: