On Mar 6, 2011, at 3:25 PM, Howard Lovatt wrote:
> The new API looks great. I think all the simplifications made,
> particularly around CallSite and no longer having a Bootstrap, have
> really helped. The methods isWrapperInstance, wrappedInstanceTarget,
> and wrapperInstanceType are nice additions to the API.
Thanks, Howard!
> The requirement that a SAM (in MethodHandles.asInstance( ... )) must
> be public and must by an interface is a bit restrictive. Could either
> or both limitations be removed earlier rather than latter?
Broadly speaking, there are at least four cases:
1. SAM conversion, which is a Project Lambda concept that depends on detailed,
complex, and as-yet-undetermined rules.
2. Simple, fast binding of a single method handle to an interface with a
corresponding abstract method.
3. General, fast binding of a group of method handles to an interface with a
corresponding group of methods.
4. Case #3, but for arbitrary types and methods (abstract or non-final).
Requires detailed story for constructor calling and access control.
Doing #1 is physically impossible in JDK 7. I'm no longer using the term "SAM"
to avoid confusion.
The MHs.asInstance call is #2. Handling a single method is intrinsically
simpler than handling multiple methods, from the points of view of both users
and JVM implementors. It is an 80% use case. (The 20% cases include things
like Iterator.) It is also likely that JVMs will be able to optimize such
things better than the general case. So we're relatively confident that this
will be useful and beneficial, and will not be made out of date by developments
in JDK 8 (possibly #3 or #4).
We have several ideas how to do #3 and even #4, but it is too early to tell
which to choose. Project Lambda and user experience in JDK 7 will tell us more.
My favorite solution (at the moment) is a two-phase factory. In this pattern,
all the strange degrees of freedom (which methods in what order, constructor
selection, access and type checks) are resolved in a first phase. The first
phase might involve multiple builder-style calls, but it eventually produces a
constructor. The second phase consists of invoking the constructor (a method
handle, naturally) on a set of positional arguments (method handles to bind,
plus constructor arguments if needed). The second phase can run very fast and
be inlined if the first phase works hard to produce a good constructor. The
first phase is eminently suitable for executing in a bootstrap method.
> Browsing through the javadoc for java.lang.invoke I noticed the
> following (nit picky things that are trivial but should be fixed
> anyway):
>
> 1. Description of MethodHandle: says "// mt is { => int}", should say
> "// mt is ()int"
Thanks; fixed.
> 2. Description of MethodHandle.asType(MethodType): no full stop; end
> of first sentence
Good catch.
> 3. Description of MethodHandles.dropArguments(..., List<Class>) and
> Description of MethodHandles.dropArguments(..., Class...) interchanged
I can't find this bug; I double-checked the docs and they are correct:
http://cr.openjdk.java.net/~jrose/pres/indy-javadoc-mlvm-pr/java/lang/invoke/MethodHandles.html#dropArguments(java.lang.invoke.MethodHandle,%20int,%20java.util.List)
-- John
_______________________________________________
mlvm-dev mailing list
[email protected]
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev