MethodHandle.bindTo chain fails with "IllegalArgumentException: no leading reference parameter"
Tobias Hartmann
tobias.hartmann at oracle.com
Tue Jul 25 15:55:22 UTC 2017
(Somehow I missed the RFR for 8184920)
On 25.07.2017 17:51, Tobias Hartmann wrote:
> 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