John,
I cleaned javadoc a little [1], so it is more readable in the browser now.
The test code looks ok, though the logic is over-complicated.
But the whole MethodHandlesTest is written in the same vein.
Best regards,
Vladimir Ivanov
diff --git a/src/share/classes/java/lang/invoke/MethodHandles.java
b/src/share/classes/java/lang/invoke/MethodHandles.java
--- a/src/share/classes/java/lang/invoke/MethodHandles.java
+++ b/src/share/classes/java/lang/invoke/MethodHandles.java
@@ -2013,6 +2013,7 @@
* <p>
* In all cases, {@code pos} must be greater than or equal to
zero, and
* {@code pos} must also be less than or equal to the target's arity.
+ * <p>
* <b>Example:</b>
* <p><blockquote><pre>
import static java.lang.invoke.MethodHandles.*;
@@ -2020,17 +2021,22 @@
...
MethodHandle deepToString = publicLookup()
.findStatic(Arrays.class, "deepToString", methodType(String.class,
Object[].class));
+
MethodHandle ts1 = deepToString.asCollector(String[].class, 1);
assertEquals("[strange]", (String) ts1.invokeExact("strange"));
+
MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
assertEquals("[up, down]", (String) ts2.invokeExact("up", "down"));
+
MethodHandle ts3 = deepToString.asCollector(String[].class, 3);
MethodHandle ts3_ts2 = collectArguments(ts3, 1, ts2);
assertEquals("[top, [up, down], strange]",
(String) ts3_ts2.invokeExact("top", "up", "down",
"strange"));
+
MethodHandle ts3_ts2_ts1 = collectArguments(ts3_ts2, 3, ts1);
assertEquals("[top, [up, down], [strange]]",
(String) ts3_ts2_ts1.invokeExact("top", "up", "down",
"strange"));
+
MethodHandle ts3_ts2_ts3 = collectArguments(ts3_ts2, 1, ts3);
assertEquals("[top, [[up, down, strange], charm], bottom]",
(String) ts3_ts2_ts3.invokeExact("top", "up", "down",
"strange", "charm", "bottom"));
On 9/13/13 6:55 AM, John Rose wrote:
Please review this change for a change to the JSR 292 implementation:
http://cr.openjdk.java.net/~jrose/8001110/webrev.00/
Summary: promote an existing private method; make unit tests on all argument
positions to arity 10 with mixed types
The change is to javadoc and unit tests, documenting and testing some corner
cases of JSR 292 APIs.
Bug Description: Currently, a method handle can be transformed so that
multiple arguments are collected and passed to the original method handle.
However, the two routes to doing this are both limited to special purposes.
(They are asCollector, which collects only trailing arguments, and only into an
array; and foldArguments, which collects only leading arguments into filter
function, and passes both the filtered result *and* the original arguments to
the original.)
MethodHandles.collectArguments(mh, pos, collector) should produce a method
handle which acts like lambda(a*, b*, c*) { x = collector(b*); return mh(a*, x,
c*) }, where the span of arguments b* is located by pos and the arity of the
collector.
There is internal machinery in any JSR 292 implementation to do this. It should
be made available to users.
This is a missing part of the JSR 292 spec.
Thanks,
— John
P.S. Since this is a change which oriented toward JSR 292 functionality, the
review request is to mlvm-dev and core-libs-dev.
Changes which are oriented toward performance will go to mlvm-dev and
hotspot-compiler-dev.