Additional MethodHandle.asType() tests

Added along with fixes in libcore MethodHandle implementation that
allows these tests to pass identically on ART and RI.

NB currently 956-methodhandle has one test failing on RI, but changes
added here work identically there.

Bug: 207844518
Test: art/test.py --host -r
Change-Id: I1687829867d91099117bdd1e8cc5200e20541db0
diff --git a/test/956-methodhandles/src/Main.java b/test/956-methodhandles/src/Main.java
index 5dace08..cbe6fe9 100644
--- a/test/956-methodhandles/src/Main.java
+++ b/test/956-methodhandles/src/Main.java
@@ -664,6 +664,28 @@
       assertEquals(Object.class, objMH.type().returnType());
       assertEquals(null, objMH.invoke());
     }
+
+    // Applying asType() twice.
+    {
+      MethodHandle valueOfMH = MethodHandles.lookup().findStatic(Integer.class, "valueOf",
+          MethodType.methodType(Integer.class, int.class));
+      MethodHandle atMH = valueOfMH.asType(MethodType.methodType(int.class, Object.class));
+      MethodHandle at2MH = atMH.asType(MethodType.methodType(Integer.class, int.class));
+      assertEquals(valueOfMH.type(), at2MH.type());
+      assertEquals(Integer.valueOf(2), (Integer) valueOfMH.invokeExact(2));
+      assertEquals(12345678, (int) atMH.invokeExact((Object) Integer.valueOf(12345678)));
+      assertEquals(Integer.valueOf(987654321), (Integer) at2MH.invokeExact(987654321));
+    }
+    {
+      MethodHandle valueOfMH = MethodHandles.lookup().findStatic(Double.class, "valueOf",
+          MethodType.methodType(Double.class, double.class));
+      MethodHandle atMH = valueOfMH.asType(MethodType.methodType(double.class, Object.class));
+      MethodHandle at2MH = atMH.asType(MethodType.methodType(Double.class, double.class));
+      assertEquals(valueOfMH.type(), at2MH.type());
+      assertEquals(Double.valueOf(1.125e3), (Double) valueOfMH.invokeExact(1.125e3));
+      assertEquals(2.5e-3, (double) atMH.invokeExact((Object) Double.valueOf(2.5e-3)));
+      assertEquals(Double.valueOf(3.125e-2), (Double) at2MH.invokeExact(3.125e-2));
+    }
   }
 
   public static void assertTrue(boolean value) {