MethodHandle.bindTo chain fails with "IllegalArgumentException: no leading reference parameter"

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Tue Jul 25 15:35:31 UTC 2017


DVTs were deliberately forbidden in MH.bindTo() (8184920 [1]).

The method contract explicitly states that only reference types can be 
bound:
      * @throws IllegalArgumentException if the target does not have a
      *         leading parameter type that is a reference type

Best regards,
Vladimir Ivanov

[1] https://jbs.oracle.com/browse/JDK-8184920

On 7/25/17 6:26 PM, Tobias Hartmann wrote:
> Hi,
> 
> below test fails with:
> Exception in thread "main" java.lang.IllegalArgumentException: no leading reference parameter
> 	at java.base/java.lang.invoke.MethodHandleStatics.newIllegalArgumentException(MethodHandleStatics.java:134)
> 	at java.base/java.lang.invoke.MethodType.leadingReferenceParameter(MethodType.java:531)
> 	at java.base/java.lang.invoke.MethodHandle.bindTo(MethodHandle.java:1419)
> 	at Test.test(Test.java:35)
> 	at Test.main(Test.java:41)
> 
> Am I doing something wrong or is this case not yet supported?
> 
> Thanks,
> Tobias
> 
> 
> import java.lang.invoke.*;
> 
> __ByValue final class MyValue1 {
>    final int x;
> 
>    private MyValue1() {
>      this.x = 0;
>    }
>    
>    __ValueFactory static MyValue1 createDefaultInline() {
>      return __MakeDefault MyValue1();
>    }
> }
> 
> public class Test {
> 
>    static final MethodHandle mh;
>    static {
>      try {
>        mh = MethodHandles.lookup().unreflect(Test.class.getMethod("test_target", MyValue1.class));
>      } catch (NoSuchMethodException|IllegalAccessException e) {
>        e.printStackTrace();
>        throw new RuntimeException("method handle lookup fails");
>      }
>    }
> 
>    MyValue1 test_vt = MyValue1.createDefaultInline();
> 
>    public int test_target(MyValue1 vt) {
>      return vt.x;
>    }
> 
>    long test() throws Throwable {
>      MethodHandle mh1 = mh.bindTo(this);
>      MethodHandle mh2 = mh1.bindTo(test_vt);
>      return (long)mh2.invoke();
>    }
> 
>    public static void main(String[] args) throws Throwable {
>      Test t = new Test();
>      t.test();
>    }
> }
> 



More information about the valhalla-dev mailing list