No way to create a no-op MethodHandle that returns void?

Charles Oliver Nutter headius at headius.com
Mon Jan 23 23:26:25 PST 2012


Oh, that does seem to work...what an ugly hack. And actually, you can
just use Object.class but cast the resulting return to void, and it
works.

So basically, I do this:

handler = MethodHandles.constant(Object.class, null)
handler = MethodHandles.asType(void.class)
handler = MethodHandles.dropArguments(0, Throwable.class, String.class)

And then use that as the exception handler.

It's not exactly the no-op I wanted, since it has the cast logic in
there, but it's close enough.

FWIW, I'm using this in the tests for invokebinder, for testing the
tryFinally operation:

    public void testTryFinally3() throws Throwable {
        MethodHandle post = Binder
                .from(void.class, String[].class)
                .invokeStatic(MethodHandles.lookup(),
BinderTest.class, "finallyLogic");

        MethodHandle ignoreException = Binder
                .from(void.class, RuntimeException.class, String[].class)
                .drop(0, 2)
                .cast(Object.class)
                .constant(null);

        MethodHandle handle = Binder
                .from(void.class, String[].class)
                .tryFinally(post)
                .catchException(RuntimeException.class, ignoreException)
                .invokeStatic(MethodHandles.lookup(),
BinderTest.class, "setZeroToFooAndRaise");

        assertEquals(MethodType.methodType(void.class,
String[].class), handle.type());
        String[] stringAry = new String[1];
        try {
            handle.invokeExact(stringAry);
        } catch (RuntimeException re) {
            assertTrue("should not have reached here", false);
        }
        assertEquals("foofinally", stringAry[0]);
    }

invokebinder is my MethodHandle DSL, so I don't have to stand on my
head while building MH chains :)

https://github.com/headius/invokebinder

- Charlie

On Tue, Jan 24, 2012 at 1:07 AM, Noctarius <me at noctarius.com> wrote:
> Hi Charly,
>
> why not use Void and return null what behaves like using void as
> the return type.
>
> Cheers
> Chris
>
> Am 24.01.2012 08:01, schrieb Charles Oliver Nutter:
>> I discovered a possible gap in the MethodHandles API.
>>
>> Say I want to create an exception handler that does nothing but
>> ignore the exception. The target handle is a method that looks
>> like this:
>>
>> void foo(String)
>>
>> I have my "target" handle pointing at foo.
>>
>> I want to catch all Throwable and ignore them, so I would build
>> up a method handle chain that does the following (top-down)
>>
>> 1. receives arguments (Throwable, String) and returns void 2.
>> drops both arguments 3. ???
>>
>> There's no endpoint I can attach it to for a "no-op" void
>> return.
>>
>> "constant" doesn't work because it returns a value, and
>> explicitly forbids void return type.
>>
>> "identity" doesn't work because it returns a value and receives
>> one argument.
>>
>> What I need here is something like MethodHandles.constant, but
>> that takes no arguments and has a void return.
>> MethodHandles.nop anyone?
>>
>> I could filterReturn, but I still would have to attach it to
>> an external method...there's no way to create a filter that
>> returns void entirely with method handles.
>>
>> Am I missing something?
>>
>> - Charlie _______________________________________________
>> mlvm-dev mailing list mlvm-dev at openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>
>
> --
>
>
> ##############################
> # A Digital's Life           #
> ##############################
> Nickname: Noctarius
> Location: Germany
>
> Meet me at:
> Ohloh: http://www.ohloh.net/accounts/noctarius
> Web: http://www.noctarius.com
> XMPP/Jabber: noctarius at jabber.ccc.de
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev


More information about the mlvm-dev mailing list