[10] RFR 8186469 MethodHandle.invokeWithArguments jumbo-arity

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Tue Aug 22 16:52:18 UTC 2017


Overall, looks good.

Some comments/questions:

src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java:

+            if (elemType == null)  // must be array type
+                return asFixedArity().invokeWithArguments(arguments);

Since it's in AsVarargsCollector, is it possible that the last argument 
is not an array?


+            Object collArgs = (elemType == Object[].class)
+                ? new Object[collected] : 
Array.newInstance(arrayType.getComponentType(), collected);

I'm curious why there's a special case for Object[].class.
Also, should Object.class be used instead of Object[].class?


test/java/lang/invoke/BigArityTest.java:

The test doesn't cover cases with uncollected arguments (uncollected > 
0). It's easy to extend it, e.g. [1].

Best regards,
Vladimir Ivanov

[1]

diff --git a/test/java/lang/invoke/BigArityTest.java 
b/test/java/lang/invoke/BigArityTest.java
--- a/test/java/lang/invoke/BigArityTest.java
+++ b/test/java/lang/invoke/BigArityTest.java
@@ -77,9 +77,36 @@
          }
          return hashArguments(wrappedArgs);
      }
+
+    static Object hashArguments1(Object o, Object... args) {
+        Object[] arr = new Object[args.length+1];
+        arr[0] = 0;
+        System.arraycopy(args, 0, arr, 1, args.length);
+        return Objects.hash(arr);
+    }
+    static Object hashArguments1(int i0, int... args) {
+        Object[] wrappedArgs = new Object[args.length+1];
+        wrappedArgs[0] = i0;
+        for (int i = 0; i < args.length; i++) {
+            wrappedArgs[i+1] = args[i];
+        }
+        return hashArguments(wrappedArgs);
+    }
+    static Object hashArguments1(long l0, long... args) {
+        Object[] wrappedArgs = new Object[args.length+1];
+        wrappedArgs[0] = l0;
+        for (int i = 0; i < args.length; i++) {
+            wrappedArgs[i+1] = (int) args[i];
+        }
+        return hashArguments(wrappedArgs);
+    }
+
      static final MethodHandle MH_hashArguments_VA;
      static final MethodHandle MH_hashArguments_IVA;
      static final MethodHandle MH_hashArguments_JVA;
+    static final MethodHandle MH_hashArguments1_VA;
+    static final MethodHandle MH_hashArguments1_IVA;
+    static final MethodHandle MH_hashArguments1_JVA;
      static {
          try {
              MH_hashArguments_VA =
@@ -91,6 +118,15 @@
              MH_hashArguments_JVA =
                  MethodHandles.lookup().unreflect(
 
BigArityTest.class.getDeclaredMethod("hashArguments", long[].class));
+            MH_hashArguments1_VA =
+                    MethodHandles.lookup().unreflect(
+ 
BigArityTest.class.getDeclaredMethod("hashArguments1", Object.class, 
Object[].class));
+            MH_hashArguments1_IVA =
+                    MethodHandles.lookup().unreflect(
+ 
BigArityTest.class.getDeclaredMethod("hashArguments1", int.class, 
int[].class));
+            MH_hashArguments1_JVA =
+                    MethodHandles.lookup().unreflect(
+ 
BigArityTest.class.getDeclaredMethod("hashArguments1", long.class, 
long[].class));
          } catch (ReflectiveOperationException ex) {
              throw new Error(ex);
          }
@@ -377,11 +413,19 @@
              Object r0 = Objects.hash(args);
              Object r = MH_hashArguments_VA.invokeWithArguments(args);
              assertEquals("jumbo arity="+arity, r0, r);
+
+            assertEquals("jumbo arity="+arity, r0, 
MH_hashArguments1_VA.invokeWithArguments(args));
+
              // use primitive typed argument lists also:
              Object r1 = MH_hashArguments_IVA.invokeWithArguments(args);
              assertEquals("jumbo int arity="+arity, r0, r1);
+
+            assertEquals("jumbo int arity="+arity, r0, 
MH_hashArguments1_IVA.invokeWithArguments(args));
+
              Object r2 = MH_hashArguments_JVA.invokeWithArguments(args);
              assertEquals("jumbo long arity="+arity, r0, r2);
+
+            assertEquals("jumbo long arity="+arity, r0, 
MH_hashArguments1_JVA.invokeWithArguments(args));
          }
          System.out.println("  jumbo arities = "+arities);
      }


On 8/19/17 2:11 AM, Paul Sandoz wrote:
> Hi,
> 
> Please review this API enhancement for MethodHandle.invokeWithArguments to support jumbo-arity and for
> BSM invocation to be specified in terms of MethodHandle.invokeWithArguments:
> 
>    http://cr.openjdk.java.net/~psandoz/jdk10/JDK-8185992-invoke-with-arguments-jumbo/webrev/
> 
> This patch is brought to you by John Rose and initially reviewed by myself.
> 
> It’s low hanging fruit that is the first deliverable from the JEP 309: Dynamic Class-File Constants [1] effort.
> 
> A CSR is underway.
> 
> Paul.
> 
> [1] http://openjdk.java.net/jeps/309
> 
> 


More information about the core-libs-dev mailing list