OpenJDK / portola / portola
changeset 30350:c055af074935
8075331: jdb eval java.util.Arrays.asList(array) shows inconsistent behaviour
Reviewed-by: jbachorik
author | sla |
---|---|
date | Thu, 09 Apr 2015 08:46:19 +0200 |
parents | 09ee9c48f1c3 |
children | 94434dd8dc9f |
files | jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java jdk/test/com/sun/jdi/InvokeVarArgs.java |
diffstat | 2 files changed, 108 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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(); + } +}