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. > 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/ 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