8032814: LineNumberTable/LocalVariableTable tables duplication for the "-v -l" combination of options
authorjjg
Mon, 27 Jan 2014 17:48:47 -0800
changeset 22693 d9f55dfc5f3b
parent 22692 51651a2a3443
child 22694 9a7197a9a0f6
8032814: LineNumberTable/LocalVariableTable tables duplication for the "-v -l" combination of options Reviewed-by: ksrini
langtools/src/share/classes/com/sun/tools/javap/ClassWriter.java
langtools/test/tools/javap/T8032814.java
--- a/langtools/src/share/classes/com/sun/tools/javap/ClassWriter.java	Mon Jan 27 16:07:32 2014 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javap/ClassWriter.java	Mon Jan 27 17:48:47 2014 -0800
@@ -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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javap/T8032814.java	Mon Jan 27 17:48:47 2014 -0800
@@ -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<String> args = new ArrayList<String>();
+        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;
+}
+