On Mon, 26 Oct 2020 16:34:10 GMT, Paul Sandoz <psan...@openjdk.org> wrote:

>> The direct use of the enum ordinal is because HotSpot accessing it from the 
>> enum value is (or was) not optimal in C2.
>>  
>> You can avoid the addition of the stable array by doing the following:
>> 
>>     public final MethodType accessModeType(AccessMode accessMode) {
>>         return accessModeType(accessMode.at.ordinal());
>>     }
>> 
>>     @ForceInline
>>     final MethodType accessModeType(int accessModeOrdinal) {
>>         TypesAndInvokers tis = getTypesAndInvokers();
>>         MethodType mt = tis.methodType_table[accessModeOrdinal];
>>         if (mt == null) {
>>             mt = tis.methodType_table[accessModeOrdinal] =
>>                     accessModeTypeUncached(accessModeOrdinal);
>>         }
>>         return mt;
>>     }
>> 
>>     final MethodType accessModeTypeUncached(int accessModeOrdinal) {
>>         return 
>> accessModeTypeUncached(AccessMode.values()[accessModeOrdinal]);
>>     }
>> It's a little odd going back and forth between the ordinal and the enum 
>> value, but it's all on the slow uncached path, and it avoids some 
>> duplication of code.
>> 
>> I'll take a closer looks at the other areas and respond in another comment.
>
> We can clarify the new methods and tie them closer to method handle 
> semantics. I suggest the names `asExactInvoker` and `asInvoker`, referencing 
> `MethodHandles.exactInvoker` and `MethodHandles.invoker` respectively. (The 
> term "generic" is really reserved for erased method types, and otherwise used 
> internally as the generic invoker.)
> 
> The `VarHandle` documentation already specifies that:
> 
>  * <p>
>  * 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);
>  * }</pre>
>  * behaves as if:
>  * <pre> {@code
>  * VarHandle vh = ..
>  * VarHandle.AccessMode am = 
> VarHandle.AccessMode.valueFromMethodName("{access-mode}");
>  * MethodHandle mh = MethodHandles.varHandleExactInvoker(
>  *                       am,
>  *                       vh.accessModeType(am));
>  *
>  * R r = (R) mh.invoke(vh, p1, p2, ..., pN)
>  * }</pre>
>  * (modulo access mode methods do not declare throwing of {@code Throwable}).
> ...
> 
>  We will need to adjust this section, i can help, but first let us reach 
> agreement on this approach.

Paul,
an invoker has the MethodHandle (resp. VarHandle) as first argument so it's not 
the same semantics.

-------------

PR: https://git.openjdk.java.net/jdk/pull/843

Reply via email to