8175384: SA: clhsdb 'printall' throws ClassCastException while printing out the bytecodes
While resolving the method invoked by invokevirtual, use java.lang.Object for arrays Reviewed-by: dholmes, sspitsyn
This commit is contained in:
parent
45f751f518
commit
41a54f3f49
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops
test/hotspot/jtreg/serviceability/sa
@ -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 @@ public class ArrayKlass extends Klass {
|
||||
super(addr);
|
||||
}
|
||||
|
||||
public boolean isArrayKlass() { return true; }
|
||||
private static CIntField dimension;
|
||||
private static MetadataField higherDimension;
|
||||
private static MetadataField lowerDimension;
|
||||
|
@ -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 @@ public class ConstantPool extends Metadata implements ClassConstants {
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
@ -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 class Klass extends Metadata implements ClassConstants {
|
||||
}
|
||||
|
||||
public boolean isKlass() { return true; }
|
||||
public boolean isArrayKlass() { return false; }
|
||||
|
||||
// Fields
|
||||
private static AddressField javaMirror;
|
||||
|
@ -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 @@ public class ClhsdbLauncher {
|
||||
|
||||
private Process toolProcess;
|
||||
|
||||
public void ClhsdbLauncher() {
|
||||
public ClhsdbLauncher() {
|
||||
toolProcess = null;
|
||||
}
|
||||
|
||||
|
77
test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java
Normal file
77
test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java
Normal file
@ -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");
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user