8175384: SA: clhsdb 'printall' throws ClassCastException while printing out the bytecodes
authorjgeorge
Fri, 09 Feb 2018 12:09:21 +0530
changeset 48949 d2a860bc50a3
parent 48887 368d7a786111
child 48950 f323537c9b75
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
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ConstantPool.java
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java
test/hotspot/jtreg/serviceability/sa/ClhsdbLauncher.java
test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java
test/hotspot/jtreg/serviceability/sa/LingeredAppWithEnum.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;
--- 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);
--- 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;
--- 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;
     }
 
--- /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<String> cmds = List.of("printall");
+
+            Map<String, List<String>> expStrMap = new HashMap<>();
+            Map<String, List<String>> 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<LSong;>;]",
+                "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");
+    }
+}
--- /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);
+    }
+ }