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

Reply via email to