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

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Tue Jul 25 15:38:45 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

MethodHandles.insertArguments() should be used instead.

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