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"? src/share/classes/java/lang/invoke/Invokers.java: + if (targetType == targetType.erase() && targetType.parameterCount() < 10) The same here for "10". Actually, exactInvoker and generalInvoker's code could be factored into one method. + /*non-public*/ MethodHandle basicInvoker() { + //invoker.form.compileToBytecode(); 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. + // 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. src/share/classes/java/lang/invoke/LambdaForm.java: static void traceInterpreter(String event, Object obj, Object... args) { + if (!(TRACE_INTERPRETER && INIT_DONE)) return; 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? 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. + 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. 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. 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. 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. 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