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) {