On Sep 18, 2013, at 6:43 PM, John Rose <john.r.r...@oracle.com> wrote:

> On Sep 18, 2013, at 2:11 PM, Christian Thalinger 
> <christian.thalin...@oracle.com> wrote:
> 
>> src/share/classes/java/lang/invoke/CallSite.java:
>> 
>> +                    if (3 + argv.length > MethodType.MAX_MH_ARITY)
>> +                    MethodType invocationType = 
>> MethodType.genericMethodType(3 + argv.length);
>> +                    MethodHandle spreader = 
>> invocationType.invokers().spreadInvoker(3);
>> 
>> Could we use a defined constant for "3"?
> 
> Yes.
>> 
>> src/share/classes/java/lang/invoke/Invokers.java:
>> 
>> +        if (targetType == targetType.erase() && targetType.parameterCount() 
>> < 10)
>> 
>> The same here for "10".
> 
> Fixed; factored to a subroutine.
> 
>> Actually, exactInvoker and generalInvoker's code could be factored into one 
>> method.
>> 
>> +    /*non-public*/ MethodHandle basicInvoker() {
>> +        //invoker.form.compileToBytecode();
> 
> Done.
> 
>> Please remove commented lines.
>> 
>> +    static MemberName exactInvokeLinkerMethod(MethodType mtype, Object[] 
>> appendixResult) {
>> +    static MemberName genericInvokeLinkerMethod(MethodType mtype, Object[] 
>> appendixResult) {
>> 
>> These two could also be factored into one method.
> 
> Done.  I removed those two, and called the one new method from 
> MethodHandleNatives.
> 
>> +    // Return an adapter for invokeExact or generic invoke, as a MH or 
>> constant pool linker
>> +    // mtype : the caller's method type (either basic or full-custom)
>> +    // customized : whether to use a trailing appendix argument (to carry 
>> the mtype)
>> +    // which&0x01 : whether it is a CP adapter ("linker") or MHs.invoker 
>> value ("invoker")
>> +    // which&0x02 : whether it is for invokeExact or generic invoke
>> +    //
>> +    // If !customized, caller is responsible for supplying, during adapter 
>> execution,
>> +    // a copy of the exact mtype.  This is because the adapter might be 
>> generalized to
>> +    // a basic type.
>> +    private static LambdaForm invokeHandleForm(MethodType mtype, boolean 
>> customized, int which) {
>> 
>> Why are you not using Javadoc style for this method comment?  It's still 
>> helpful in IDEs.
> 
> Fixed.
> 
>> src/share/classes/java/lang/invoke/LambdaForm.java:
>> 
>>    static void traceInterpreter(String event, Object obj, Object... args) {
>> +        if (!(TRACE_INTERPRETER && INIT_DONE))  return;
> 
> Done.
>> 
>> Why not use the same pattern:
>> 
>> +        if (TRACE_INTERPRETER && INIT_DONE)
>> 
>> as the other places?
>> 
>> +    static final boolean INIT_DONE = Boolean.TRUE.booleanValue();
>> 
>> Why are we having this after all?
> 
> I removed it; see webrev.  There's a comment which explains the problem and 
> the nicer replacement.

Good comment.  Thank you.

> 
>> src/share/classes/java/lang/invoke/MemberName.java:
>> 
>> +    public MemberName asNormalOriginal() {
>> 
>> Could you add a comment to this method?  It's not clear to me what "normal" 
>> and "original" mean here.
> 
> Done.
> 
>> +    public MemberName(byte refKind, Class<?> defClass, String name, Object 
>> type) {
>> +        @SuppressWarnings("LocalVariableHidesMemberVariable")
>> +        int kindFlags;
>> 
>> The SuppressWarnings is in the other constructors because of the name 
>> "flags".  You don't need it here.  Maybe rename the others as well and get 
>> rid of the annotation.
> 
> OK; I removed 2/3 of them.
> 
>> src/share/classes/java/lang/invoke/MethodHandleNatives.java:
>> 
>>    static String refKindName(byte refKind) {
>>        assert(refKindIsValid(refKind));
>> -        return REFERENCE_KIND_NAME[refKind];
>> +        switch (refKind) {
>> 
>> After this change REFERENCE_KIND_NAME is not used anymore.
> 
> Good catch.
> 
>> src/share/classes/java/lang/invoke/MethodHandles.java:
>> 
>> +            member.getName().getClass(); member.getType().getClass();  // 
>> NPE
>> 
>> Please don't!  It would be nice to have at least a different line number in 
>> the backtrace.
> 
> OK.  I split three such lines.
> 
> I would like to switch all these to Objects.requireNonNull, but only after a 
> little performance testing to make sure we don't have surprises.
> 
>> src/share/classes/java/lang/invoke/MethodTypeForm.java:
>> 
>> +            //Lookup.findVirtual(MethodHandle.class, name, type);
>> 
>> Either remove it or add a comment why it's there.
> 
> Commented better now.

> 
> While testing, I found a spot in BoundMethodHandle that needed a tweak to 
> avoid a bootstrap problem.  (Too many of those.)

> 
> I sharpened the type of 'caller' in CallSite.makeSite.

> 
> The webrev is updated:
>  http://cr.openjdk.java.net/~jrose/8024761/webrev.01/

This looks good.

> 
> Thanks!
> 
> — John
> 
>> On Sep 12, 2013, at 6:36 PM, John Rose <john.r.r...@oracle.com> wrote:
>> 
>>> Please review this change for a change to the JSR 292 implementation:
>>> 
>>> http://cr.openjdk.java.net/~jrose/8024761/webrev.00/
>>> 
>>> Bug description:  The performance of MethodHandle.invoke is very slow when 
>>> the call site type differs from the method handle type. When the types 
>>> differ, the invocation is defined to proceed as if two steps were taken: 
>>> 
>>> 1. the target method handle is first adjusted to the call site type, by 
>>> MethodHandles.asType 
>>> 
>>> 2. the type-adjusted method handle is invoked directly, by 
>>> MethodHandles.invokeExact 
>>> 
>>> The existing code (from JDK 7) awkwardly performs the type adjustment on 
>>> every call. But performing the type analysis and adapter creation on every 
>>> call is inherently slow. A good fix is to cache the result of step 1 
>>> (MethodHandles.asType), since step 2 is already reasonably fast. 
>>> 
>>> For most applications, a one-element cache on each individual method handle 
>>> is a reasonable choice. It has the particular advantage of speeding up 
>>> invocations of non-varargs bootstrap methods. To benefit from this, the 
>>> bootstrap methods themselves need to be uniquified across multiple class 
>>> files, so this work will also include a cache to benefit commonly-used 
>>> bootstrap methods, such as JDK 8's LambdaMetafactory.metafactory. 
>>> 
>>> Additional caches could be based on the call site, the call site type, the 
>>> target type, or the target's MH.form. 
>>> 
>>> Thanks,
>>> — John
>>> 
>>> P.S. Since this is an implementation change oriented toward performance, 
>>> the review request is to mlvm-dev and hotspot-compiler-dev.
>>> Changes which are oriented toward functionality will go to mlvm-dev and 
>>> core-libs-dev.
>> 
> 
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to