On Feb 25, 2015, at 4:02 PM, Charles Oliver Nutter <head...@headius.com> wrote:
> 
> After talking with folks at the Jfokus VM Summit, it seems like
> there's a number of nice-to-have and a few need-to-have features we'd
> like to see get into java.lang.invoke. Vladimir suggested I start a
> thread on these features.
> 
> A few from me:
> 
> * A loop handle :-)
> 
> Given a body and a test, run the body until the test is false. I'm
> guessing there's a good reason we don't have this already.

A few reasons:   1. You can code your own easily.
2. There's no One True Loop the way there is a One True If.
The "run until test is false" model assumes all the real work is
done with side-effects, which are off-center from the MH model.
3. A really clean looping mechanism probably needs a sprinkle
of tail call optimization.

I'm not saying that loops should never have side effects, but I
am saying that a loop mechanism should not mandate them.

Maybe this is general enough:

    MHs.loop(init, predicate, body)(*a)
    => { let i = init(*a); while (predicate(i, *a)) { i = body(i, *a); } return 
i; }

...where the type of i depends on init, and if init returns void then you
have a classic side-effect-only loop.

> * try/finally as a core atom of MethodHandles API.
> 
> Libraries like invokebinder provide a shortcut API To generating the
> large tree of handles needed for try/finally, but the JVM may not be
> able to optimize that tree as well as a purpose-built adapter.

I agree there.  We should put this in.

   MHs.tryFinally(target, cleanup)(*a)
     => { try { return target(*a); } finally { cleanup(*a); } }

(Even here there are non-universalities; what if the cleanup
wants to see the return value and/or the thrown exception?
Should it take those as one or two leading arguments?)

> * Argument grouping operations in the middle of the argument list.
> 
> JRuby has many signatures that vararg somewhere other than the end of
> the argument list, and the juggling required to do that logic in
> handles is complex: shift to-be-boxed args to end, box them, shift box
> back.

We now have MHs.collectArguments.  Do you want MHs.spreadArguments
to reverse the effect?  Or is there something else I'm missing?

> Another point about these more complicated forms: they're ESPECIALLY
> slow early in execution, before LFs have been compiled to bytecode.
> 
> * Implementation-specific inspection API.
> 
> I know there are different ways to express a MH tree on different JVMs
> (e.g. J9) but it would still be a big help for me if there were a good
> way to get some debug-time structural information about a handle I'm
> using. Hidden API would be ok if it's not too hidden :-)

Idea of the day:  An ASM-like library for method handles.
Make a MethodHandleReader which can run a visitor over the MH.
The ops of the visitor would be a selection of public MH operations
like filter, collect, spread, lookup, etc.
Also ASM-like, the library would have a MethodHandleWriter
would could be hooked up with the reader to make filters.

— John
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to