# HG changeset patch # User lana # Date 1392872501 28800 # Node ID a07271bca831cf1bab35a2ffbcebd8e060b2734b # Parent 043a73c7e343c5a604e620bac171e6d9e7c5673d# Parent c09305701001f41d2abecad9fd566f575b3e5767 Merge diff -r 043a73c7e343 -r a07271bca831 .hgtags --- a/.hgtags Wed Feb 19 13:14:43 2014 -0800 +++ b/.hgtags Wed Feb 19 21:01:41 2014 -0800 @@ -248,4 +248,9 @@ d5aab8300d3b51e8043ab5fe5832ef6c6cbb5552 jdk8u20-b00 436176151e85455e74cd1441a2ba96e791c56785 jdk8-b124 79dc4b992c0a385c1364592801781b747b85c6ca jdk8u20-b01 +436176151e85455e74cd1441a2ba96e791c56785 jdk8-b125 +ba24b63043626003929927f091e8b84190f39261 jdk8-b126 +bb69217ed81202b1a490dc7150dc7cd073689341 jdk8-b127 +09cdd3b493c0d13dc32206e5f12bb1a2f7465687 jdk8-b128 +8fe7202d3c38784f3f14368e3954fc4e0394afa4 jdk8-b129 26b33a6ea08810853af37e81c9b435465b289c98 jdk8u20-b02 diff -r 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java --- a/src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java Wed Feb 19 21:01:41 2014 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -1172,8 +1172,10 @@ DCText string = quotedString(); if (string != null) { skipWhitespace(); - if (ch == '@') + if (ch == '@' + || ch == EOI && bp == buf.length - 1) { return m.at(pos).See(List.of(string)); + } } break; diff -r 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javadoc/JavadocTool.java --- a/src/share/classes/com/sun/tools/javadoc/JavadocTool.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javadoc/JavadocTool.java Wed Feb 19 21:01:41 2014 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -30,6 +30,7 @@ import java.util.Collection; import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.tools.JavaFileManager.Location; @@ -238,10 +239,13 @@ files = lb.toList(); } + Set ufiles = new HashSet<>(); for (JavaFileObject fo : files) { - // messager.notice("main.Loading_source_file", fn); - trees.append(parse(fo)); - hasFiles = true; + if (ufiles.add(fo)) { // ignore duplicates + // messager.notice("main.Loading_source_file", fn); + trees.append(parse(fo)); + hasFiles = true; + } } if (!hasFiles) { diff -r 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javap/AttributeWriter.java --- a/src/share/classes/com/sun/tools/javap/AttributeWriter.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javap/AttributeWriter.java Wed Feb 19 21:01:41 2014 -0800 @@ -547,7 +547,6 @@ for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { w.write(entry); } - println(); indent(-1); return null; } @@ -559,7 +558,6 @@ for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { w.write(entry); } - println(); indent(-1); return null; } @@ -571,14 +569,12 @@ } public Void visit_same_frame(StackMapTable_attribute.same_frame frame, Void p) { - printHeader(frame); - println(" /* same */"); + printHeader(frame, "/* same */"); return null; } public Void visit_same_locals_1_stack_item_frame(StackMapTable_attribute.same_locals_1_stack_item_frame frame, Void p) { - printHeader(frame); - println(" /* same_locals_1_stack_item */"); + printHeader(frame, "/* same_locals_1_stack_item */"); indent(+1); printMap("stack", frame.stack); indent(-1); @@ -586,8 +582,7 @@ } public Void visit_same_locals_1_stack_item_frame_extended(StackMapTable_attribute.same_locals_1_stack_item_frame_extended frame, Void p) { - printHeader(frame); - println(" /* same_locals_1_stack_item_frame_extended */"); + printHeader(frame, "/* same_locals_1_stack_item_frame_extended */"); indent(+1); println("offset_delta = " + frame.offset_delta); printMap("stack", frame.stack); @@ -596,8 +591,7 @@ } public Void visit_chop_frame(StackMapTable_attribute.chop_frame frame, Void p) { - printHeader(frame); - println(" /* chop */"); + printHeader(frame, "/* chop */"); indent(+1); println("offset_delta = " + frame.offset_delta); indent(-1); @@ -605,8 +599,7 @@ } public Void visit_same_frame_extended(StackMapTable_attribute.same_frame_extended frame, Void p) { - printHeader(frame); - println(" /* same_frame_extended */"); + printHeader(frame, "/* same_frame_extended */"); indent(+1); println("offset_delta = " + frame.offset_delta); indent(-1); @@ -614,21 +607,20 @@ } public Void visit_append_frame(StackMapTable_attribute.append_frame frame, Void p) { - printHeader(frame); - println(" /* append */"); + printHeader(frame, "/* append */"); indent(+1); println("offset_delta = " + frame.offset_delta); printMap("locals", frame.locals); + indent(-1); return null; } public Void visit_full_frame(StackMapTable_attribute.full_frame frame, Void p) { - printHeader(frame); if (frame instanceof StackMap_attribute.stack_map_frame) { + printHeader(frame, "offset = " + frame.offset_delta); indent(+1); - println(" offset = " + frame.offset_delta); } else { - println(" /* full_frame */"); + printHeader(frame, "/* full_frame */"); indent(+1); println("offset_delta = " + frame.offset_delta); } @@ -638,8 +630,9 @@ return null; } - void printHeader(StackMapTable_attribute.stack_map_frame frame) { - print(" frame_type = " + frame.frame_type); + void printHeader(StackMapTable_attribute.stack_map_frame frame, String extra) { + print("frame_type = " + frame.frame_type + " "); + println(extra); } void printMap(String name, StackMapTable_attribute.verification_type_info[] map) { diff -r 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javap/BasicWriter.java --- a/src/share/classes/com/sun/tools/javap/BasicWriter.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javap/BasicWriter.java Wed Feb 19 21:01:41 2014 -0800 @@ -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 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javap/ClassWriter.java --- a/src/share/classes/com/sun/tools/javap/ClassWriter.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javap/ClassWriter.java Wed Feb 19 21:01:41 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 @@ -385,6 +385,8 @@ indent(+1); + boolean showBlank = false; + if (options.showDescriptors) println("descriptor: " + getValue(f.descriptor)); @@ -394,12 +396,12 @@ if (options.showAllAttrs) { for (Attribute attr: f.attributes) attrWriter.write(f, attr, constant_pool); - println(); + showBlank = true; } indent(-1); - if (options.showDisassembled || options.showLineAndLocalVariableTables) + if (showBlank || options.showDisassembled || options.showLineAndLocalVariableTables) println(); } @@ -498,27 +500,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 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javap/JavapTask.java --- a/src/share/classes/com/sun/tools/javap/JavapTask.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javap/JavapTask.java Wed Feb 19 21:01:41 2014 -0800 @@ -309,7 +309,9 @@ void process(JavapTask task, String opt, String arg) throws BadArgs { int sep = opt.indexOf(":"); try { - task.options.indentWidth = Integer.valueOf(opt.substring(sep + 1)); + int i = Integer.valueOf(opt.substring(sep + 1)); + if (i > 0) // silently ignore invalid values + task.options.indentWidth = i; } catch (NumberFormatException e) { } } @@ -325,7 +327,9 @@ void process(JavapTask task, String opt, String arg) throws BadArgs { int sep = opt.indexOf(":"); try { - task.options.tabColumn = Integer.valueOf(opt.substring(sep + 1)); + int i = Integer.valueOf(opt.substring(sep + 1)); + if (i > 0) // silently ignore invalid values + task.options.tabColumn = i; } catch (NumberFormatException e) { } } @@ -466,7 +470,7 @@ } catch (BadArgs e) { reportError(e.key, e.args); if (e.showUsage) { - log.println(getMessage("main.usage.summary", progname)); + printLines(getMessage("main.usage.summary", progname)); } return EXIT_CMDERR; } catch (InternalError e) { @@ -561,8 +565,12 @@ } } - if (fileManager.handleOption(name, rest)) - return; + try { + if (fileManager.handleOption(name, rest)) + return; + } catch (IllegalArgumentException e) { + throw new BadArgs("err.invalid.use.of.option", name).showUsage(true); + } throw new BadArgs("err.unknown.option", name).showUsage(true); } @@ -878,27 +886,33 @@ } private void showHelp() { - log.println(getMessage("main.usage", progname)); + printLines(getMessage("main.usage", progname)); for (Option o: recognizedOptions) { String name = o.aliases[0].substring(1); // there must always be at least one name if (name.startsWith("X") || name.equals("fullversion") || name.equals("h") || name.equals("verify")) continue; - log.println(getMessage("main.opt." + name)); + printLines(getMessage("main.opt." + name)); } String[] fmOptions = { "-classpath", "-cp", "-bootclasspath" }; for (String o: fmOptions) { if (fileManager.isSupportedOption(o) == -1) continue; String name = o.substring(1); - log.println(getMessage("main.opt." + name)); + printLines(getMessage("main.opt." + name)); } } private void showVersion(boolean full) { - log.println(version(full ? "full" : "release")); + printLines(version(full ? "full" : "release")); } + private void printLines(String msg) { + log.println(msg.replace("\n", nl)); + } + + private static final String nl = System.getProperty("line.separator"); + private static final String versionRBName = "com.sun.tools.javap.resources.version"; private static ResourceBundle versionRB; diff -r 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javap/Options.java --- a/src/share/classes/com/sun/tools/javap/Options.java Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javap/Options.java Wed Feb 19 21:01:41 2014 -0800 @@ -86,8 +86,8 @@ public boolean showConstants; public boolean sysInfo; public boolean showInnerClasses; - public int indentWidth = 2; // #spaces per indentWidth level - public int tabColumn = 40; // column number for comments + public int indentWidth = 2; // #spaces per indentWidth level; must be > 0 + public int tabColumn = 40; // column number for comments; must be > 0 public boolean compat; // bug-for-bug compatibility mode with old javap } diff -r 043a73c7e343 -r a07271bca831 src/share/classes/com/sun/tools/javap/resources/javap.properties --- a/src/share/classes/com/sun/tools/javap/resources/javap.properties Wed Feb 19 13:14:43 2014 -0800 +++ b/src/share/classes/com/sun/tools/javap/resources/javap.properties Wed Feb 19 21:01:41 2014 -0800 @@ -14,6 +14,7 @@ err.missing.arg=no value given for {0} err.no.classes.specified=no classes specified err.not.standard.file.manager=can only specify class files when using a standard file manager +err.invalid.use.of.option=invalid use of option: {0} err.unknown.option=unknown option: {0} err.verify.not.supported=-verify not supported err.no.SourceFile.attribute=no SourceFile attribute @@ -80,7 +81,7 @@ \ -bootclasspath Override location of bootstrap class files main.opt.constants=\ -\ -constants Show static final constants +\ -constants Show final constants main.opt.sysinfo=\ diff -r 043a73c7e343 -r a07271bca831 test/tools/javac/doctree/SeeTest.java --- a/test/tools/javac/doctree/SeeTest.java Wed Feb 19 13:14:43 2014 -0800 +++ b/test/tools/javac/doctree/SeeTest.java Wed Feb 19 21:01:41 2014 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 7021614 + * @bug 7021614 8031212 * @summary extend com.sun.source API to support parsing javadoc comments * @build DocCommentTester * @run main DocCommentTester SeeTest.java @@ -41,9 +41,9 @@ Text[TEXT, pos:1, abc.] body: empty block tags: 1 - Erroneous[ERRONEOUS, pos:7 - code: compiler.err.dc.unexpected.content - body: @see_"String" + See[SEE, pos:7 + reference: 1 + Text[TEXT, pos:12, "String"] ] ] */ diff -r 043a73c7e343 -r a07271bca831 test/tools/javadoc/parser/7091528/T7091528.java --- a/test/tools/javadoc/parser/7091528/T7091528.java Wed Feb 19 13:14:43 2014 -0800 +++ b/test/tools/javadoc/parser/7091528/T7091528.java Wed Feb 19 21:01:41 2014 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -23,8 +23,8 @@ /** * @test - * @bug 7091528 - * @summary javadoc attempts to parse .class files + * @bug 7091528 8029145 + * @summary ensures javadoc parses unique source files and ignores all class files * @compile p/C1.java p/q/C2.java * @run main T7091528 */ @@ -37,17 +37,22 @@ public static void main(String... args) { new T7091528().run(); } - void run() { File testSrc = new File(System.getProperty("test.src")); File testClasses = new File(System.getProperty("test.classes")); - String[] args = { - "-d", ".", + // 7091528, tests if class files are being ignored + runTest("-d", ".", "-sourcepath", testClasses + File.pathSeparator + testSrc, "-subpackages", - "p" - }; + "p"); + // 8029145, tests if unique source files are parsed + runTest("-d", ".", + "-sourcepath", testSrc.getAbsolutePath(), + "-subpackages", + "p:p.q"); + } + void runTest(String... args) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); String doclet = com.sun.tools.doclets.standard.Standard.class.getName(); diff -r 043a73c7e343 -r a07271bca831 test/tools/javap/StackMapTableTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/StackMapTableTest.java Wed Feb 19 21:01:41 2014 -0800 @@ -0,0 +1,92 @@ +/* + * 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 8033930 8033913 + * @summary bad formatting of StackMapTable entries + */ + +import java.io.*; +import java.util.*; + +public class StackMapTableTest { + public static void main(String... args) throws Exception { + new StackMapTableTest().run(); + } + + void run() throws Exception { + String testClasses = System.getProperty("test.classes"); + String out = javap("-v", "-classpath", testClasses, A.class.getName()); + + String nl = System.getProperty("line.separator"); + out = out.replaceAll(nl, "\n"); + + if (out.contains("\n\n\n")) + error("double blank line found"); + + String expect = + " StackMapTable: number_of_entries = 2\n" + + " frame_type = 252 /* append */\n" + + " offset_delta = 2\n" + + " locals = [ int ]\n" + + " frame_type = 250 /* chop */\n" + + " offset_delta = 18\n"; + if (!out.contains(expect)) + error("expected text not found"); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + 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; + + /** Simple test class to run through javap. */ + public class A { + public void a() { + for (int i = 0; i < 10; i++) { + System.out.println(i); + } + } + public void b() { + } + public void c() { + } + } +} diff -r 043a73c7e343 -r a07271bca831 test/tools/javap/T8032814.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/T8032814.java Wed Feb 19 21:01:41 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 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; +} + diff -r 043a73c7e343 -r a07271bca831 test/tools/javap/T8032819.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/T8032819.java Wed Feb 19 21:01:41 2014 -0800 @@ -0,0 +1,95 @@ +/* + * 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 8032819 + * @summary Extra empty line between field declarations for the "-v -c" and "-v -l" combination of options + * @compile -g T8032819.java + * @run main T8032819 + */ + +import java.io.*; +import java.util.*; + +public class T8032819 { + static class Fields { + int f1; + int f2; + } + + public static void main(String... args) throws Exception { + new T8032819().run(); + } + + void run() throws Exception { + Class clazz = Fields.class; + test(clazz); + test(clazz, "-c"); + test(clazz, "-l"); + test(clazz, "-l", "-c"); + test(clazz, "-v"); + test(clazz, "-v", "-c"); + test(clazz, "-v", "-l"); + test(clazz, "-v", "-l", "-c"); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + static final String sep = System.getProperty("line.separator"); + static final String doubleBlankLine = sep + sep + sep; + + void test(Class clazz, String... opts) throws Exception { + System.err.println("test " + Arrays.asList(opts)); + 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 count = 0; + int i = out.indexOf(doubleBlankLine, 0); + while (i != -1) { + count++; + i = out.indexOf(doubleBlankLine, i + doubleBlankLine.length()); + } + + if (count > 0) + error(count + " double blank lines found"); + } + + void error(String msg) { + System.err.println("Error: " + msg); + errors++; + } + + int errors = 0; +} + diff -r 043a73c7e343 -r a07271bca831 test/tools/javap/T8033180.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/T8033180.java Wed Feb 19 21:01:41 2014 -0800 @@ -0,0 +1,88 @@ +/* + * 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 8033180 + * @summary Bad newline characters + */ + +import java.io.*; +import java.util.*; + +public class T8033180 { + + public static void main(String... args) throws Exception { + new T8033180().run(); + } + + void run() throws Exception { + // fast-track this case, because test cannot fail in this case + if (lineSep.equals(nl)) + return; + + test("-help"); + test("-version"); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + static final String lineSep = System.getProperty("line.separator"); + static final String nl = "\n"; + + void test(String... opts) throws Exception { + System.err.println("test " + Arrays.asList(opts)); + List args = new ArrayList(); + args.addAll(Arrays.asList(opts)); + 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); + + // remove all valid platform newline sequences + String out2 = out.replace(lineSep, ""); + + // count the remaining simple newline characters + int count = 0; + int i = out2.indexOf(nl, 0); + while (i != -1) { + count++; + i = out2.indexOf(nl, i + nl.length()); + } + + if (count > 0) + error(count + " newline characters found"); + } + + void error(String msg) { + System.err.println("Error: " + msg); + errors++; + } + + int errors = 0; +} + diff -r 043a73c7e343 -r a07271bca831 test/tools/javap/T8033711.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/T8033711.java Wed Feb 19 21:01:41 2014 -0800 @@ -0,0 +1,55 @@ +/* + * 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 8033711 + * @summary An exception is thrown if using the "-classpath" option with no arguments + */ + + +import java.io.*; + +public class T8033711 { + public static void main(String[] args) throws Exception { + new T8033711().run(); + } + + public void run() throws Exception { + String out = javap("-classpath"); + if (out.contains("IllegalArgumentException")) + throw new Exception("exception found in javap output"); + if (!out.contains("Error: invalid use of option")) + throw new Exception("expected error message not found in javap output"); + } + + String javap(String... args) { + 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()); + System.out.println("javap exited, rc=" + rc); + return sw.toString(); + } +} diff -r 043a73c7e343 -r a07271bca831 test/tools/javap/WhitespaceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javap/WhitespaceTest.java Wed Feb 19 21:01:41 2014 -0800 @@ -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!"); + } + } +}