# HG changeset patch # User jgeorge # Date 1518158361 -19800 # Node ID d2a860bc50a30a2907ab7cde32c9c1437e0d6663 # Parent 368d7a786111fd1e02943108968857e37163de45 8175384: SA: clhsdb 'printall' throws ClassCastException while printing out the bytecodes Summary: While resolving the method invoked by invokevirtual, use java.lang.Object for arrays Reviewed-by: dholmes, sspitsyn diff -r 368d7a786111 -r d2a860bc50a3 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java Thu Feb 08 21:53:06 2018 -0500 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java Fri Feb 09 12:09:21 2018 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, 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 @@ -57,6 +57,7 @@ super(addr); } + public boolean isArrayKlass() { return true; } private static CIntField dimension; private static MetadataField higherDimension; private static MetadataField lowerDimension; diff -r 368d7a786111 -r d2a860bc50a3 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java Thu Feb 08 21:53:06 2018 -0500 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java Fri Feb 09 12:09:21 2018 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, 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 @@ -339,24 +339,28 @@ } // returns null, if not resolved. - public InstanceKlass getFieldOrMethodKlassRefAt(int which) { + public Klass getFieldOrMethodKlassRefAt(int which) { int refIndex = getFieldOrMethodAt(which); int klassIndex = extractLowShortFromInt(refIndex); - return (InstanceKlass) getKlassAt(klassIndex); + return getKlassAt(klassIndex); } // returns null, if not resolved. public Method getMethodRefAt(int which) { - InstanceKlass klass = getFieldOrMethodKlassRefAt(which); + Klass klass = getFieldOrMethodKlassRefAt(which); if (klass == null) return null; Symbol name = getNameRefAt(which); Symbol sig = getSignatureRefAt(which); - return klass.findMethod(name, sig); + // Consider the super class for arrays. (java.lang.Object) + if (klass.isArrayKlass()) { + klass = klass.getJavaSuper(); + } + return ((InstanceKlass)klass).findMethod(name, sig); } // returns null, if not resolved. public Field getFieldRefAt(int which) { - InstanceKlass klass = getFieldOrMethodKlassRefAt(which); + InstanceKlass klass = (InstanceKlass)getFieldOrMethodKlassRefAt(which); if (klass == null) return null; Symbol name = getNameRefAt(which); Symbol sig = getSignatureRefAt(which); diff -r 368d7a786111 -r d2a860bc50a3 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Thu Feb 08 21:53:06 2018 -0500 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Fri Feb 09 12:09:21 2018 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, 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 @@ -86,6 +86,7 @@ } public boolean isKlass() { return true; } + public boolean isArrayKlass() { return false; } // Fields private static AddressField javaMirror; diff -r 368d7a786111 -r d2a860bc50a3 test/hotspot/jtreg/serviceability/sa/ClhsdbLauncher.java --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbLauncher.java Thu Feb 08 21:53:06 2018 -0500 +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbLauncher.java Fri Feb 09 12:09:21 2018 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, 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 @@ -41,7 +41,7 @@ private Process toolProcess; - public void ClhsdbLauncher() { + public ClhsdbLauncher() { toolProcess = null; } diff -r 368d7a786111 -r d2a860bc50a3 test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java Fri Feb 09 12:09:21 2018 +0530 @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018, 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. + */ + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import jdk.test.lib.apps.LingeredApp; + +/* + * @test + * @bug 8175384 + * @summary Test clhsdb 'printall' command + * @library /test/lib + * @run main/othervm/timeout=2400 -Xmx1g ClhsdbPrintAll + */ + +public class ClhsdbPrintAll { + + public static void main(String[] args) throws Exception { + System.out.println("Starting ClhsdbPrintAll test"); + + LingeredAppWithEnum theApp = null; + try { + ClhsdbLauncher test = new ClhsdbLauncher(); + + theApp = new LingeredAppWithEnum(); + LingeredApp.startApp(null, theApp); + System.out.println("Started LingeredAppWithEnum with pid " + theApp.getPid()); + + List cmds = List.of("printall"); + + Map> expStrMap = new HashMap<>(); + Map> unExpStrMap = new HashMap<>(); + expStrMap.put("printall", List.of( + "aload_0", + "Constant Pool of", + "public static void main(java.lang.String[])", + "Bytecode", + "[enum] class Song [signature Ljava/lang/Enum;]", + "Method java.lang.Object clone()", + "public static Song[] values()", + "invokevirtual", + "checkcast", + "Field Song HAVANA", + "Exception Table", + "invokedynamic")); + unExpStrMap.put("printall", List.of( + "cannot be cast to")); + test.run(theApp.getPid(), cmds, expStrMap, unExpStrMap); + } catch (Exception ex) { + throw new RuntimeException("Test ERROR " + ex, ex); + } finally { + LingeredApp.stopApp(theApp); + } + System.out.println("Test PASSED"); + } +} diff -r 368d7a786111 -r d2a860bc50a3 test/hotspot/jtreg/serviceability/sa/LingeredAppWithEnum.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithEnum.java Fri Feb 09 12:09:21 2018 +0530 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018, 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. + */ + +import jdk.test.lib.apps.LingeredApp; + +enum Song { + HALL_OF_FAME, + HAVANA +}; + +public class LingeredAppWithEnum extends LingeredApp { + + public static void main(String args[]) { + for (Song s : Song.values()) { + System.out.println ("song " + s); + } + LingeredApp.main(args); + } + }