compiler accepts incompatible method reference for Sam conversion

Ali Ebrahimi ali.ebrahimi1781 at gmail.com
Tue Jul 12 21:01:47 PDT 2011


Hi,
I found following bug in current compiler build:
my build relates to before Changeset: 777491a7c4e1: Revised accessibility
check for SAM descriptor as per latest lambda spec draft.

class MethodHandleTest{

     interface Sam1{
        void m(MethodHandleTest m);
    }

    public void test(int i){
     //    System.out.println("test");
    }
...

public static void main(String[] args) throws Throwable {
      Sam1 sam1=MethodHandleTest#test(int); <=====================
      sam1.m(null);
}
...

}


result:
Exception in thread "main" java.lang.invoke.WrongMethodTypeException: cannot
convert MethodHandle(MethodHandleTest,int)void to (MethodHandleTest)void

Also an trouble jvm crash: I know this not relates to this thread.

    public static void sTest(int x,int y){
     //   System.out.println("stest");
    }

    interface Sam{
        void m(int x,int y);
    }

Sam sam = MethodHandleTest#sTest;
sam.m(1,1);    <===============crash

MethodHandle mh = MethodHandles.lookup().findStatic(MethodHandleTest.class,
"sTest", MethodType.methodType(void.class,int.class,int.class));
MethodHandle smh = mh.asSpreader(Object[].class,
mh.type().parameterCount());

smh.invoke(new Object[]{i,i}); <===============crash

main cause: mh.asSpreader

I don't known this crash appears in jdkb147.

Best Regards,
Ali Ebrahimi


More information about the lambda-dev mailing list