HI Michael, Nice work, not easy this area!
It may be worth considering, as a separate issue, updating the example section
in JavaDoc to be under @apiNote.
I have a mild preference to maintain the 80 char limit for JavaDoc, to me it’s
easier to read. For code i don’t mind a 100 or more limit.
Add @since 9 to new public methods.
MethodType
—
470 /** Replace the last arrayLength parameter types with the component
type of arrayType.
471 * @param arrayType any array type
472 * @param arrayLength the number of parameter types to change
473 * @return the resulting type
474 */
475 /*non-public*/ MethodType asSpreaderType(Class<?> arrayType, int pos,
int arrayLength) {
476 assert(parameterCount() >= arrayLength);
477 int spreadPos = pos;
Might as well adjust the JavaDoc for the new pos parameter (as you have done
for asCollectorType).
MethodHandles
—
898 * @param spreadArgPos the position (zero-based index) in the argument
list at which spreading should start.
899 * @param arrayType usually {@code Object[]}, the type of the array
argument from which to extract the spread arguments
900 * @param arrayLength the number of arguments to spread from an
incoming array argument
901 * @return a new method handle which spreads an array argument at a
given position,
902 * before calling the original method handle
903 * @throws NullPointerException if {@code arrayType} is a null
reference
904 * @throws IllegalArgumentException if {@code arrayType} is not an
array type,
905 * or if target does not have at least
906 * {@code arrayLength} parameter types,
907 * or if {@code arrayLength} is negative,
908 * or if the resulting method handle's type would have
909 * <a href="MethodHandle.html#maxarity">too many parameters</a>
For the new asSpreader method, what are the constraints for spreadArgPos? What
happens if < 0 or >= arrayLength for example?
Same applies to asCollector.
This is not in your patch but the assert in the following method is redundant
(as reported by the IDE, it’s really handy sometimes apply the patch and view
via diffs in the IDE), as DirectMethodHandle is not a subtype of
BoundMethodHandle:
MethodHandle viewAsType(MethodType newType, boolean strict) {
// No actual conversions, just a new view of the same method.
// Note that this operation must not produce a DirectMethodHandle,
// because retyped DMHs, like any transformed MHs,
// cannot be cracked into MethodHandleInfo.
assert viewAsTypeChecks(newType, strict);
BoundMethodHandle mh = rebind();
assert(!((MethodHandle)mh instanceof DirectMethodHandle));
return mh.copyWith(newType, mh.form);
}
958 /**
959 * Determines if a class can be accessed from the lookup context
defined by this {@code Lookup} object. The
960 * static initializer of the class is not run.
961 *
962 * @param targetClass the class to be accessed
963 *
964 * @return the class that has been accessed
Has it really been accessed by “accessClass” or just checked that it can be
accessed?
965 *
966 * @throws IllegalAccessException if the class is not accessible
from the lookup class, using the allowed access
967 * modes.
968 * @exception SecurityException if a security manager is present
and it
969 * <a
href="MethodHandles.Lookup.html#secmgr">refuses access</a>
970 */
971 public Class<?> accessClass(Class<?> targetClass) throws
IllegalAccessException {
Great use of streams in MethodHandles.loop and good correlation with the
specified steps in the JavaDoc to that in the code. Really clear and well
specified.
3458 * The loop handle's result type is the same as the sole loop
variable's, i.e., the result type of {@code init}.
s/variable’s/variable ?
3488 * // assume MH_initZip, MH_zipPred, and MH_zipStep are handles to the
above methods
3489 * MethodHandle loop = MethodHandles.doWhileLoop(MH_initZip,
MH_zipPred, MH_zipStep);
3490 * List<String> a = Arrays.asList(new String[]{"a", "b", "c", "d"});
3491 * List<String> b = Arrays.asList(new String[]{"e", "f", "g", "h"});
3492 * List<String> zipped = Arrays.asList(new String[]{"a", "e", "b",
"f", "c", "g", "d", "h"});
3493 * assertEquals(zipped, (List<String>) loop.invoke(a.iterator(),
b.iterator()));
3494 * }</pre></blockquote>
You don’t need to create an explicit array and pass that into Arrays.asList.
Same for other related methods.
MethodHandleImpl
—
1720 static MethodHandle makeLoop(Class<?> tloop, List<Class<?>> targs,
List<Class<?>> tvars, List<MethodHandle> init,
1721 List<MethodHandle> step,
List<MethodHandle> pred, List<MethodHandle> fini) {
1722 MethodHandle[] ainit =
toArrayArgs(init).toArray(MH_ARRAY_SENTINEL);
1723 MethodHandle[] astep =
toArrayArgs(step).toArray(MH_ARRAY_SENTINEL);
1724 MethodHandle[] apred =
toArrayArgs(pred).toArray(MH_ARRAY_SENTINEL);
1725 MethodHandle[] afini =
toArrayArgs(fini).toArray(MH_ARRAY_SENTINEL);
…
1751 static List<MethodHandle> toArrayArgs(List<MethodHandle> hs) {
1752 return hs.stream().map(h -> h.asSpreader(Object[].class,
h.type().parameterCount())).collect(Collectors.toList());
1753 }
Can you use Stream.toArray(MethodHandle[]::new) rather than creating a List and
then an array from that? (or expand to a lambda expression if you want to reuse
MH_ARRAY_SENTINEL for an empty array).
I guess in the future there may be ample opporunity to specialize the generic
“loop” mechanism with LambdaForms?
Paul.
> On 13 Nov 2015, at 17:39, Michael Haupt <[email protected]> wrote:
>
> Dear all,
>
> please review this change.
> RFE: https://bugs.openjdk.java.net/browse/JDK-8139885
> Corresponding JEP: https://bugs.openjdk.java.net/browse/JDK-8130227
> Webrev: http://cr.openjdk.java.net/~mhaupt/8139885/webrev.00/
>
> Thanks,
>
> Michael
>
> --
>
>
> Dr. Michael Haupt | Principal Member of Technical Staff
> Phone: +49 331 200 7277 | Fax: +49 331 200 7561
> Oracle Java Platform Group | LangTools Team | Nashorn
> Oracle Deutschland B.V. & Co. KG, Schiffbauergasse 14 | 14467 Potsdam, Germany
> Oracle is committed to developing practices and products that help
> protect the environment
>
> _______________________________________________
> mlvm-dev mailing list
> [email protected]
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
signature.asc
Description: Message signed with OpenPGP using GPGMail
_______________________________________________ mlvm-dev mailing list [email protected] http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
