diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java index 3be1b7ea7df..2db85563d71 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java @@ -938,7 +938,7 @@ assertEquals("[A, B, C]", (String) caToString2.invokeExact('A', "BC".toCharArray Class arrayElement = arrayType.getComponentType(); MethodType mtype = type(); boolean match = true, fail = false; - for (int i = pos; i < arrayLength; i++) { + for (int i = pos; i < pos + arrayLength; i++) { Class ptype = mtype.parameterType(i); if (ptype != arrayElement) { match = false; diff --git a/jdk/test/java/lang/invoke/T8139885.java b/jdk/test/java/lang/invoke/T8139885.java index 913111c9efe..fb6ba77301b 100644 --- a/jdk/test/java/lang/invoke/T8139885.java +++ b/jdk/test/java/lang/invoke/T8139885.java @@ -34,6 +34,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles.Lookup; import java.lang.invoke.MethodType; +import java.lang.invoke.WrongMethodTypeException; import java.util.*; import static java.lang.invoke.MethodType.methodType; @@ -412,6 +413,18 @@ public class T8139885 { assertEquals(illegalPos.length, caught); } + @Test + public static void testAsSpreaderIllegalMethodType() throws Throwable { + MethodHandle h = MethodHandles.dropArguments(MethodHandles.constant(String.class, ""), 0, int.class, int.class); + boolean caught = false; + try { + MethodHandle s = h.asSpreader(String[].class, 1); + } catch (WrongMethodTypeException wmte) { + caught = true; + } + assertTrue(caught); + } + @Test public static void testAsCollector() throws Throwable { MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 1);