> On 28 Apr 2017, at 14:55, Alex Buckley <alex.buck...@oracle.com> wrote: > > On 4/26/2017 4:06 PM, Paul Sandoz wrote: >> Please review some documentation changes to VarHandle: >> >> http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8167229-varhandle-docs/webrev/index.html > > I notice that "shape" is still mentioned throughout the MethodHandles.Lookup > class. >
Are you looking at the old version? I removed ‘em all from the new version. > 59 * {@code CT1, CT2, ..., CTn}, the types of <em>coordinate > expressions</em> that > 60 * uniquely locate a variable referenced by this VarHandle. > > I'm unsure of "uniquely locate". Distinct coordinate expressions can refer to > the same object, due to aliasing. And there is nothing said later about one > VarHandle being the exclusive systemwide locator of a variable. Do you mean > "that _jointly_ locate a variable …” Ok, good point, it should be unique within the confines of a VarHandle instance, but could be aliased by another VarHandle instance or something else. > ? > > 73 * instance, the initial arguments to the invocation are coordinate > expressions > 74 * that indicate precisely which variable is to be accessed. > > "that indicate _in precisely which object_ the variable is to be accessed.” Ok. > ? > > BTW Since "array elements" are mentioned in the opening paragraph, and since > here is an example involving String[] as a coordinate type later, it would be > nice to say how a VarHandle pointing to an array element can be created. > Ok. > 209 * <h1>Compilation of an access mode's method</h1> > > First, the term "access mode's method" appears only here and in > accessModeType, but I think you mean "mode" not "mode's”. > Yes, i updated all relevant places. > Second, this section isn't about compilation of the method. Access mode > methods are not native and there is nothing to suggest that a suitably > skilled platform developer can't write one in Java and compile it -- yet this > section will not tell them how to compile it. (I appreciate the style comes > from j.l.i.MethodHandle, and it would be better to avoid speaking of "Method > handle compilation" there.) I recommend "Invoking access mode methods from > source code" and "Invoking access mode methods from bytecode". Or "Compiling > invocation of access mode methods" and "Performing invocation of access mode > methods”. I opted for the later. Below is a diff on the webrev. Thanks, Paul. diff -r 64fdd70fe45c src/java.base/share/classes/java/lang/invoke/VarHandle.java --- a/src/java.base/share/classes/java/lang/invoke/VarHandle.java Fri Apr 28 15:03:01 2017 -0700 +++ b/src/java.base/share/classes/java/lang/invoke/VarHandle.java Fri Apr 28 15:36:04 2017 -0700 @@ -57,7 +57,7 @@ * by this VarHandle; and * <li>a list of {@link #coordinateTypes coordinate types} * {@code CT1, CT2, ..., CTn}, the types of <em>coordinate expressions</em> that - * uniquely locate a variable referenced by this VarHandle. + * jointly locate a variable referenced by this VarHandle. * </ul> * Variable and coordinate types may be primitive or reference, and are * represented by {@code Class} objects. The list of coordinate types may be @@ -71,11 +71,11 @@ * <a href="MethodHandle.html#sigpoly">signature polymorphic</a> method named * for the access mode. When an access mode method is invoked on a VarHandle * instance, the initial arguments to the invocation are coordinate expressions - * that indicate precisely which variable is to be accessed. Trailing arguments - * to the invocation represent values of importance to the access mode. For - * example, the various compare-and-set or compare-and-exchange access modes - * require two trailing arguments for the variable's expected value and new - * value. + * that indicate in precisely which object the variable is to be accessed. + * Trailing arguments to the invocation represent values of importance to the + * access mode. For example, the various compare-and-set or compare-and-exchange + * access modes require two trailing arguments for the variable's expected value + * and new value. * * <p>The arity and types of arguments to the invocation of an access mode * method are not checked statically. Instead, each access mode method @@ -101,6 +101,14 @@ * is {@code String}. The access mode type for {@code compareAndSet} on this * VarHandle instance would be * {@code (String[] c1, int c2, String expectedValue, String newValue)boolean}. + * Such a VarHandle instance may produced by the + * {@link MethodHandles#arrayElementVarHandle(Class) array factory method} and + * access array elements as follows: + * <pre> {@code + * String[] sa = ... + * VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class); + * avh.compareAndSet(sa, 10, "expected", "new"); + * }</pre> * * <p>Access modes are grouped into the following categories: * <ul> @@ -206,7 +214,7 @@ * precise phrasing of the specification of access mode methods and memory fence * methods may accompany future updates of the Java Language Specification. * - * <h1>Compilation of an access mode's method</h1> + * <h1>Compiling invocation of access mode methods</h1> * A Java method call expression naming an access mode method can invoke a * VarHandle from Java source code. From the viewpoint of source code, these * methods can take any arguments and their polymorphic result (if expressed) @@ -238,7 +246,7 @@ * except the null reference. * * - * <h1><a name="invoke">Invocation of an access mode's method</a></h1> + * <h1><a name="invoke">Performing invocation of access mode methods</a></h1> * The first time an {@code invokevirtual} instruction is executed it is linked * by symbolically resolving the names in the instruction and verifying that * the method call is statically legal. This also holds for calls to access mode @@ -255,11 +263,11 @@ * invoking is not present on the individual VarHandle being invoked. * * <p> - * Invocation of an access mode's signature-polymorphic method behaves as if an - * invocation of {@link MethodHandle#invoke}, where the receiving method handle - * accepts the VarHandle instance as the leading argument. More specifically, - * the following, where {@code {access-mode}} corresponds to the access mode - * method name: + * Invocation of an access mode method behaves as if an invocation of + * {@link MethodHandle#invoke}, where the receiving method handle accepts the + * VarHandle instance as the leading argument. More specifically, the + * following, where {@code {access-mode}} corresponds to the access mode method + * name: * <pre> {@code * VarHandle vh = .. * R r = (R) vh.{access-mode}(p1, p2, ..., pN); @@ -1856,14 +1864,13 @@ } /** - * Obtains the canonical access mode type for this VarHandle and a given - * access mode. + * Obtains the access mode type for this VarHandle and a given access mode. * * <p>The access mode type's parameter types will consist of a prefix that * is the coordinate types of this VarHandle followed by further - * types as defined by the access mode's method. + * types as defined by the access mode method. * The access mode type's return type is defined by the return type of the - * access mode's method. + * access mode method. * * @param accessMode the access mode, corresponding to the * signature-polymorphic method of the same name @@ -1886,7 +1893,7 @@ * * <p>The return of a {@code false} value for a given access mode indicates * that an {@code UnsupportedOperationException} is thrown on invocation - * of the corresponding access mode's signature-polymorphic method. + * of the corresponding access mode method. * * @param accessMode the access mode, corresponding to the * signature-polymorphic method of the same name