# HG changeset patch # User jjg # Date 1249779397 25200 # Node ID 961dc3acdb06e7bf6d26a361a26675f5bdc0e5dc # Parent cba827f7297722ac425fdd9ccf9676d6ecb02957 6868539: javap should use current names for constant pool tags Reviewed-by: ksrini diff -r cba827f72977 -r 961dc3acdb06 src/share/classes/com/sun/tools/javap/CodeWriter.java --- a/src/share/classes/com/sun/tools/javap/CodeWriter.java Sat Aug 08 17:50:57 2009 -0700 +++ b/src/share/classes/com/sun/tools/javap/CodeWriter.java Sat Aug 08 17:56:37 2009 -0700 @@ -117,7 +117,7 @@ } public void writeInstr(Instruction instr) { - print(String.format("%4d: %-12s ", instr.getPC(), instr.getMnemonic())); + print(String.format("%4d: %-13s ", instr.getPC(), instr.getMnemonic())); instr.accept(instructionPrinter, null); println(); } diff -r cba827f72977 -r 961dc3acdb06 src/share/classes/com/sun/tools/javap/ConstantWriter.java --- a/src/share/classes/com/sun/tools/javap/ConstantWriter.java Sat Aug 08 17:50:57 2009 -0700 +++ b/src/share/classes/com/sun/tools/javap/ConstantWriter.java Sat Aug 08 17:56:37 2009 -0700 @@ -134,10 +134,10 @@ int width = String.valueOf(constant_pool.size()).length() + 1; int cpx = 1; while (cpx < constant_pool.size()) { - print(String.format("const %" + width + "s", ("#" + cpx))); + print(String.format("%" + width + "s", ("#" + cpx))); try { CPInfo cpInfo = constant_pool.get(cpx); - print(String.format(" = %-15s ", tagName(cpInfo.getTag()))); + print(String.format(" = %-18s ", cpTagName(cpInfo))); cpx += cpInfo.accept(v, null); } catch (ConstantPool.InvalidIndex ex) { // should not happen @@ -178,10 +178,15 @@ print(tagName(tag) + " " + stringValue(cpInfo)); } + String cpTagName(CPInfo cpInfo) { + String n = cpInfo.getClass().getSimpleName(); + return n.replace("CONSTANT_", "").replace("_info", ""); + } + String tagName(int tag) { switch (tag) { case CONSTANT_Utf8: - return "Asciz"; + return "Utf8"; case CONSTANT_Integer: return "int"; case CONSTANT_Float: @@ -203,7 +208,7 @@ case CONSTANT_NameAndType: return "NameAndType"; default: - return "unknown tag"; + return "(unknown tag)"; } } diff -r cba827f72977 -r 961dc3acdb06 test/tools/javap/T6868539.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/T6868539.java Sat Aug 08 17:56:37 2009 -0700 @@ -0,0 +1,96 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6868539 6868548 + * @summary javap should use current names for constant pool entries, + * remove spurious ';' from constant pool entries + */ + +import java.io.*; +import java.util.*; + +public class T6868539 + +{ + public static void main(String... args) { + new T6868539().run(); + } + + void run() { + verify("T6868539", "Utf8 +java/lang/String"); // 1: Utf8 + // 2: currently unused + verify("T6868539", "Integer +123456"); // 3: Integer + verify("T6868539", "Float +123456.0f"); // 4: Float + verify("T6868539", "Long +123456l"); // 5: Long + verify("T6868539", "Double +123456.0d"); // 6: Double + verify("T6868539", "Class +#[0-9]+ +// + T6868539"); // 7: Class + verify("T6868539", "String +#[0-9]+ +// + not found"); // 8: String + verify("T6868539", "Fieldref +#[0-9]+\\.#[0-9]+ +// +T6868539.errors:I"); // 9: Fieldref + verify("T6868539", "Methodref +#[0-9]+\\.#[0-9]+ +// +T6868539.run:\\(\\)V"); // 10: Methodref + verify("T6868539", "InterfaceMethodref +#[0-9]+\\.#[0-9]+ +// +java/lang/Runnable\\.run:\\(\\)V"); + // 11: InterfaceMethodref + verify("T6868539", "NameAndType +#[0-9]+:#[0-9]+ +// +run:\\(\\)V"); // 12: NameAndType + if (errors > 0) + throw new Error(errors + " found."); + } + + void verify(String className, String... expects) { + String output = javap(className); + for (String expect: expects) { + if (!output.matches("(?s).*" + expect + ".*")) + error(expect + " not found"); + } + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; + + String javap(String className) { + String testClasses = System.getProperty("test.classes", "."); + StringWriter sw = new StringWriter(); + PrintWriter out = new PrintWriter(sw); + String[] args = { "-v", "-classpath", testClasses, className }; + int rc = com.sun.tools.javap.Main.run(args, out); + if (rc != 0) + throw new Error("javap failed. rc=" + rc); + out.close(); + String output = sw.toString(); + System.out.println("class " + className); + System.out.println(output); + return output; + } + + int i = 123456; + float f = 123456.f; + double d = 123456.; + long l = 123456L; + + void m(Runnable r) { r.run(); } +} +