Hi Charlie
The same "hack" applies to every situation where a generic
returntype "needs" to defined but is not needed in the end. Void
is the wrapper type to void and the returnvalue is just discarded
whatever it was.

Cheers
Chris

Am 24.01.2012 08:26, schrieb Charles Oliver Nutter:
> 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 <m...@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@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:
>> noctar...@jabber.ccc.de 
>> _______________________________________________ mlvm-dev
>> mailing list mlvm-dev@openjdk.java.net 
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
> _______________________________________________ mlvm-dev
> mailing list mlvm-dev@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: noctar...@jabber.ccc.de
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to