changeset 10322:41fd3cb76d9f

8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector Reviewed-by: jrose, psandoz
author vlivanov
date Tue, 09 Dec 2014 09:22:07 -0800
parents 06c3b0d07c88
children db3fb55cc7f4
files src/share/classes/java/lang/invoke/MethodHandles.java test/java/lang/invoke/ExplicitCastArgumentsTest.java
diffstat 2 files changed, 19 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/MethodHandles.java	Thu Dec 04 07:15:37 2014 -0800
+++ b/src/share/classes/java/lang/invoke/MethodHandles.java	Tue Dec 09 09:22:07 2014 -0800
@@ -2029,7 +2029,7 @@
         MethodType oldType = target.type();
         if (oldType == newType)  return target;
         if (oldType.explicitCastEquivalentToAsType(newType)) {
-            return target.asType(newType);
+            return target.asFixedArity().asType(newType);
         }
         return MethodHandleImpl.makePairwiseConvert(target, newType, false);
     }
--- a/test/java/lang/invoke/ExplicitCastArgumentsTest.java	Thu Dec 04 07:15:37 2014 -0800
+++ b/test/java/lang/invoke/ExplicitCastArgumentsTest.java	Tue Dec 09 09:22:07 2014 -0800
@@ -32,21 +32,36 @@
  */
 public class ExplicitCastArgumentsTest {
     private static final boolean VERBOSE = Boolean.getBoolean("verbose");
+    private static final Class<?> THIS_CLASS = ExplicitCastArgumentsTest.class;
 
     public static void main(String[] args) throws Throwable {
+        testVarargsCollector();
+        testRef2Prim();
+        System.out.println("TEST PASSED");
+    }
+
+    public static String[] f(String... args) { return args; }
+
+    public static void testVarargsCollector() throws Throwable {
+        MethodType mt = MethodType.methodType(String[].class, String[].class);
+        MethodHandle mh = MethodHandles.publicLookup().findStatic(THIS_CLASS, "f", mt);
+        mh = MethodHandles.explicitCastArguments(mh, MethodType.methodType(Object.class, Object.class));
+        mh.invokeWithArguments((Object)(new String[] {"str1", "str2"}));
+    }
+
+    public static void testRef2Prim() throws Throwable {
         for (Wrapper from : Wrapper.values()) {
             for (Wrapper to : Wrapper.values()) {
                 if (from == Wrapper.VOID || to == Wrapper.VOID) continue;
-                testRef2Prim (from, to);
+                testRef2Prim(from, to);
             }
         }
-        System.out.println("TEST PASSED");
     }
 
     public static void testRef2Prim(Wrapper from, Wrapper to) throws Throwable {
         // MHs.eCA javadoc:
         //    If T0 is a reference and T1 a primitive, and if the reference is null at runtime, a zero value is introduced.
-        test(from.wrapperType(), to.primitiveType(),        null, false);
+        test(from.wrapperType(), to.primitiveType(), null, false);
     }
 
     public static void test(Class<?> from, Class<?> to, Object param, boolean failureExpected) throws Throwable {