From 063afcee2f5e3f8a9d8a7917f64b1d8a16172624 Mon Sep 17 00:00:00 2001 From: Michael Haupt Date: Wed, 25 Nov 2015 09:23:07 +0100 Subject: [PATCH] 8143798: jck failures: api/java_lang/invoke/MethodHandle/index_MethodsTests[asSpreaderWMTE]: java.lang.VerifyError: Bad type on operand stack Reviewed-by: vlivanov --- .../classes/java/lang/invoke/MethodHandle.java | 2 +- jdk/test/java/lang/invoke/T8139885.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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);