# HG changeset patch # User kizune # Date 1392131150 -14400 # Node ID 66245d9d84dbf6669deaf15ad7ffe0fa0fdcc2f5 # Parent 79dc4b992c0a385c1364592801781b747b85c6ca 8033581: Incorrect comment aligment 8033798: javap output has unnecessary trailing whitespace 8033726: StackMapTable does not unindent properly Reviewed-by: ksrini diff -r 79dc4b992c0a -r 66245d9d84db src/share/classes/com/sun/tools/javap/AttributeWriter.java --- a/src/share/classes/com/sun/tools/javap/AttributeWriter.java Thu Feb 06 21:11:27 2014 +0000 +++ b/src/share/classes/com/sun/tools/javap/AttributeWriter.java Tue Feb 11 19:05:50 2014 +0400 @@ -619,6 +619,7 @@ indent(+1); println("offset_delta = " + frame.offset_delta); printMap("locals", frame.locals); + indent(-1); return null; } diff -r 79dc4b992c0a -r 66245d9d84db src/share/classes/com/sun/tools/javap/BasicWriter.java --- a/src/share/classes/com/sun/tools/javap/BasicWriter.java Thu Feb 06 21:11:27 2014 +0000 +++ b/src/share/classes/com/sun/tools/javap/BasicWriter.java Tue Feb 11 19:05:50 2014 +0400 @@ -151,12 +151,22 @@ for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { + case ' ': + pendingSpaces++; + break; + case '\n': println(); break; + default: if (buffer.length() == 0) indent(); + if (pendingSpaces > 0) { + for (int sp = 0; sp < pendingSpaces; sp++) + buffer.append(' '); + pendingSpaces = 0; + } buffer.append(c); } } @@ -164,6 +174,8 @@ } protected void println() { + // ignore/discard pending spaces + pendingSpaces = 0; out.println(buffer); buffer.setLength(0); } @@ -173,26 +185,21 @@ } protected void tab() { - if (buffer.length() == 0) - indent(); - space(indentCount * indentWidth + tabColumn - buffer.length()); + int col = indentCount * indentWidth + tabColumn; + pendingSpaces += (col <= buffer.length() ? 1 : col - buffer.length()); } private void indent() { - space(indentCount * indentWidth); + pendingSpaces += (indentCount * indentWidth); } - private void space(int n) { - for (int i = 0; i < n; i++) - buffer.append(' '); - } - - private PrintWriter out; - private StringBuilder buffer; + private final PrintWriter out; + private final StringBuilder buffer; private int indentCount; - private int indentWidth; - private int tabColumn; + private final int indentWidth; + private final int tabColumn; private boolean pendingNewline; + private int pendingSpaces; } } diff -r 79dc4b992c0a -r 66245d9d84db test/tools/javap/WhitespaceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/WhitespaceTest.java Tue Feb 11 19:05:50 2014 +0400 @@ -0,0 +1,91 @@ +/* + * 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 8033581 8033798 8033726 + * @summary Check whitespace in generated output + */ + +import java.io.*; +import java.util.*; + +public class WhitespaceTest { + public static void main(String... args) throws Exception { + new WhitespaceTest().run(); + } + + void run() throws Exception { + test("-v", "java.lang.String"); + test("-XDtab:1", "-v", "java.lang.String"); + + String testClasses = System.getProperty("test.classes"); + for (int i = 10; i < 40; i++) + test("-XDtab:" + i, "-v", "-classpath", testClasses, "WhitespaceTest$HelloWorld"); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + void test(String... args) throws Exception { + // need to avoid "//" appearing as a constant in the constant pool + String slash = "/"; + String doubleSlash = slash + slash; + System.out.println("test: " + Arrays.asList(args)); + String out = javap(args); + for (String line: out.split("[\r\n]+")) { + if (line.endsWith(" ")) + error("line has trailing whitespace: " + line); + int comment = line.indexOf(doubleSlash); + if (comment > 0 && line.charAt(comment - 1) != ' ') + error("no space before comment: " + line); + if (line.matches(" +}")) + error("bad indentation: " + line); + } + } + + String javap(String... args) throws Exception { + StringWriter sw = new StringWriter(); + PrintWriter out = new PrintWriter(sw); + int rc = com.sun.tools.javap.Main.run(args, out); + out.close(); + System.out.println(sw.toString()); + if (rc < 0) + throw new Exception("javap exited, rc=" + rc); + return sw.toString(); + } + + void error(String msg) { + System.out.println("Error: " + msg); + errors++; + } + + int errors; + + // small class to test repeatedly with different tab values + static class HelloWorld { + public static void main(String... args) { + System.out.println("Hello World!"); + } + } +}