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

Tobias Hartmann tobias.hartmann at oracle.com
Tue Jul 25 15:51:48 UTC 2017


Hi Vladimir,

On 25.07.2017 17:38, Vladimir Ivanov wrote:
>> 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.

Okay, thank you!

Best regards,
Tobias

>> 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