8075331: jdb eval java.util.Arrays.asList(array) shows inconsistent behaviour
authorsla
Thu, 09 Apr 2015 08:46:19 +0200
changeset 30350 c055af074935
parent 30349 09ee9c48f1c3
child 30351 94434dd8dc9f
8075331: jdb eval java.util.Arrays.asList(array) shows inconsistent behaviour Reviewed-by: jbachorik
jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java
jdk/test/com/sun/jdi/InvokeVarArgs.java
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java	Wed Apr 08 09:33:34 2015 +0000
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java	Thu Apr 09 08:46:19 2015 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -131,6 +131,15 @@
     }
 
     @Override
+    boolean isAssignableTo(ReferenceType type) {
+        if (type.name().equals("java.lang.Object")) {
+            // interfaces are always assignable to j.l.Object
+            return true;
+        }
+        return super.isAssignableTo(type);
+    }
+
+    @Override
     List<InterfaceType> interfaces() {
         return superinterfaces();
     }
@@ -140,4 +149,4 @@
         // method must be directly in this interface
         return this.equals(method.declaringType());
     }
-}
\ No newline at end of file
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jdi/InvokeVarArgs.java	Thu Apr 09 08:46:19 2015 +0200
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ *  @test
+ *  @bug 8075331
+ *  @summary Verify that we can call varargs methods
+ *  @run build TestScaffold VMConnection TargetAdapter TargetListener
+ *  @run compile -g InvokeVarArgs.java
+ *  @run driver InvokeVarArgs
+ */
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.*;
+import java.util.Arrays;
+
+interface MyInterface {
+}
+
+class SomeClass implements MyInterface {
+}
+
+class InvokeVarArgsTarg {
+
+    public static void main(String args[]) {
+        new InvokeVarArgsTarg().run();
+    }
+
+    SomeClass someClass1 = new SomeClass();
+    SomeClass someClass2 = new SomeClass();
+
+    MyInterface[] array = new MyInterface[]{someClass1, someClass2};
+    SomeClass[] array2 = new SomeClass[]{someClass1, someClass2};
+
+    public void run() {
+        System.out.println("size(array) : " + size(array));
+        System.out.println("size(array2) : " + size(array2));
+    }
+
+    int size(Object... value) {
+        return value.length;
+    }
+}
+
+public class InvokeVarArgs extends TestScaffold {
+
+    public static void main(String args[]) throws Exception {
+        new InvokeVarArgs(args).startTests();
+    }
+
+    InvokeVarArgs(String args[]) throws Exception {
+        super(args);
+    }
+
+    protected void runTests() throws Exception {
+
+        BreakpointEvent bpe = startTo("InvokeVarArgsTarg", "run", "()V");
+        StackFrame frame = bpe.thread().frame(0);
+        ObjectReference targetObj = frame.thisObject();
+        ReferenceType targetType = (ReferenceType) targetObj.type();
+        Value arrayVal = targetObj.getValue(targetType.fieldByName("array"));
+        Value array2Val = targetObj.getValue(targetType.fieldByName("array2"));
+        Method sizeMethod = targetType.methodsByName("size", "([Ljava/lang/Object;)I").get(0);
+
+        IntegerValue size = (IntegerValue) targetObj.invokeMethod(bpe.thread(), sizeMethod, Arrays.asList(new Value[]{arrayVal}), 0);
+        if (size.value() != 2) {
+            throw new Exception("size(array) should be 2, but was " + size.value());
+        }
+
+        size = (IntegerValue) targetObj.invokeMethod(bpe.thread(), sizeMethod, Arrays.asList(new Value[]{array2Val}), 0);
+        if (size.value() != 2) {
+            throw new Exception("size(array2) should be 2, but was " + size.value());
+        }
+
+        listenUntilVMDisconnect();
+    }
+}