MethodHandles: Support and tests for invokeWithArguments.

Tracks libcore change a8cf0bffdb9e9cf031efd0d3c8b5645d45963562.

Test: make test-art-host
Change-Id: I65fbf3a82b629585324c477bdce6dabd63ae408e
diff --git a/test/957-methodhandle-transforms/src/Main.java b/test/957-methodhandle-transforms/src/Main.java
index 3271108..d0bd816 100644
--- a/test/957-methodhandle-transforms/src/Main.java
+++ b/test/957-methodhandle-transforms/src/Main.java
@@ -36,6 +36,7 @@
     testInvokers();
     testSpreaders_reference();
     testSpreaders_primitive();
+    testInvokeWithArguments();
   }
 
   public static void testThrowException() throws Throwable {
@@ -1223,6 +1224,34 @@
     assertEquals(51, ret);
   }
 
+  public static void testInvokeWithArguments() throws Throwable {
+    MethodType methodType = MethodType.methodType(int.class,
+        new Class<?>[] { String.class, String.class, String.class });
+    MethodHandle handle = MethodHandles.lookup().findStatic(
+        Main.class, "spreadReferences", methodType);
+
+    Object ret = handle.invokeWithArguments(new Object[] { "a", "b", "c"});
+    assertEquals(42, (int) ret);
+    handle.invokeWithArguments(new String[] { "a", "b", "c" });
+    assertEquals(42, (int) ret);
+
+    // Pass in an array that's too small. Should throw an IAE.
+    try {
+      handle.invokeWithArguments(new Object[] { "a", "b" });
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    // Test implicit unboxing.
+    MethodType methodType2 = MethodType.methodType(int.class,
+        new Class<?>[] { String.class, int.class });
+    MethodHandle handle2 = MethodHandles.lookup().findStatic(
+        Main.class, "spreadReferences_Unbox", methodType2);
+
+    ret = (int) handle2.invokeWithArguments(new Object[] { "a", 43 });
+    assertEquals(43, (int) ret);
+  }
+
   public static void fail() {
     System.out.println("FAIL");
     Thread.dumpStack();