# HG changeset patch # User kizune # Date 1392309267 -14400 # Node ID 3b9176029091494b587b2fc770cac8c212da020b # Parent 08daa4a9ce0ff25bc178797fe38448895b5c4293 8032814: LineNumberTable/LocalVariableTable tables duplication for the "-v -l" combination of options Reviewed-by: ksrini diff -r 08daa4a9ce0f -r 3b9176029091 src/share/classes/com/sun/tools/javap/ClassWriter.java --- a/src/share/classes/com/sun/tools/javap/ClassWriter.java Wed Feb 12 23:52:58 2014 +0400 +++ b/src/share/classes/com/sun/tools/javap/ClassWriter.java Thu Feb 13 20:34:27 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2014, 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 @@ -498,27 +498,23 @@ report("Unexpected or invalid value for Code attribute"); } - if (options.showDisassembled && !options.showAllAttrs) { - if (code != null) { + if (options.showAllAttrs) { + Attribute[] attrs = m.attributes.attrs; + for (Attribute attr: attrs) + attrWriter.write(m, attr, constant_pool); + } else if (code != null) { + if (options.showDisassembled) { println("Code:"); codeWriter.writeInstrs(code); codeWriter.writeExceptionTable(code); } - } - if (options.showLineAndLocalVariableTables) { - if (code != null) { + if (options.showLineAndLocalVariableTables) { attrWriter.write(code, code.attributes.get(Attribute.LineNumberTable), constant_pool); attrWriter.write(code, code.attributes.get(Attribute.LocalVariableTable), constant_pool); } } - if (options.showAllAttrs) { - Attribute[] attrs = m.attributes.attrs; - for (Attribute attr: attrs) - attrWriter.write(m, attr, constant_pool); - } - indent(-1); // set pendingNewline to write a newline before the next method (if any) diff -r 08daa4a9ce0f -r 3b9176029091 test/tools/javap/T8032814.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/T8032814.java Thu Feb 13 20:34:27 2014 +0400 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2014, 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 8032814 + * @summary LineNumberTable/LocalVariableTable tables duplication for the + * "-v -l" combination of options + * @compile -g T8032814.java + * @run main T8032814 + */ + +import java.io.*; +import java.util.*; + +public class T8032814 { + public static void main(String... args) throws Exception { + new T8032814().run(); + } + + void run() throws Exception { + Class clazz = T8032814.class; + int count = clazz.getDeclaredConstructors().length + + clazz.getDeclaredMethods().length; + test(clazz, 0); + test(clazz, count, "-v"); + test(clazz, count, "-l"); + test(clazz, count, "-v", "-l"); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void test(Class clazz, int expectedCount, String... opts) throws Exception { + System.err.println("test class " + clazz.getName() + " " + Arrays.asList(opts) + ": expect: " + expectedCount); + List args = new ArrayList(); + args.addAll(Arrays.asList(opts)); + args.addAll(Arrays.asList("-classpath", System.getProperty("test.classes"))); + args.add(clazz.getName()); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javap.Main.run(args.toArray(new String[args.size()]), pw); + pw.close(); + String out = sw.toString(); + if (rc != 0) + throw new Exception("javap failed unexpectedly: rc=" + rc); + + int lntCount = 0, lvtCount = 0; + for (String line: out.split("[\r\n]+")) { + if (line.matches("^ *LineNumberTable:$")) + lntCount++; + if (line.matches("^ *LocalVariableTable:$")) + lvtCount++; + } + checkEqual("LineNumberTable", lntCount, expectedCount); + checkEqual("LocalVariableTable", lvtCount, expectedCount); + } + + void checkEqual(String attr, int found, int expect) { + if (found != expect) { + error("Unexpected number of occurrences of " + attr + "\n" + + "found: " + found + ", expected: " + expect); + } + } + + void error(String msg) { + System.err.println("Error: " + msg); + errors++; + } + + int errors = 0; +} +