1 /* 2 * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 4975569 6622215 8034861 27 * @summary javap doesn't print new flag bits 28 * @modules jdk.jdeps/com.sun.tools.javap 29 */ 30 31 import java.io.*; 32 import java.util.*; 33 import java.util.regex.Matcher; 34 import java.util.regex.Pattern; 35 36 public class T4975569 { 37 private static final String NEW_LINE = System.getProperty("line.separator"); 38 private static final String TEST_CLASSES = System.getProperty("test.classes", "."); 39 40 public static void main(String... args) { 41 new T4975569().run(); 42 } 43 44 void run() { 45 verify(Anno.class.getName(), "flags: \\(0x2600\\) ACC_INTERFACE, ACC_ABSTRACT, ACC_ANNOTATION"); 46 verify(E.class.getName(), "flags: \\(0x4030\\) ACC_FINAL, ACC_SUPER, ACC_ENUM"); 47 verify(S.class.getName(), "flags: \\(0x1040\\) ACC_BRIDGE, ACC_SYNTHETIC", 48 "InnerClasses:\n static [# =\\w]+; +// "); 49 verify(V.class.getName(), "void m\\(java.lang.String...\\)", 50 "flags: \\(0x0080\\) ACC_VARARGS"); 51 verify(Prot.class.getName(), "InnerClasses:\n protected [# =\\w]+; +// "); 52 verify(Priv.class.getName(), new String[]{"-p"}, 53 "InnerClasses:\n private [# =\\w]+; +// "); 54 55 if (errors > 0) 56 throw new Error(errors + " found."); 57 } 58 59 void verify(String className, String[] flags, String... expects) { 60 String output = javap(className, Arrays.asList(flags)); 61 for (String expect: expects) { 62 Pattern expectPattern = Pattern.compile(expect); 63 Matcher matcher = expectPattern.matcher(output); 64 if (!matcher.find()) { 65 error(expect + " not found"); 66 } 67 } 68 } 69 70 void verify(String className, String... expects) { 71 verify(className, new String[0], expects); 72 } 73 74 int errors; 75 void error(String msg) { 76 System.err.println(msg.replace("\n", NEW_LINE)); 77 errors++; 78 } 79 80 String javap(String className, List<String> flags) { 81 StringWriter sw = new StringWriter(); 82 PrintWriter out = new PrintWriter(sw); 83 List<String> args = new ArrayList<>(flags); 84 args.addAll(Arrays.asList("-v", "-classpath", TEST_CLASSES, className)); 85 int rc = com.sun.tools.javap.Main.run(args.toArray(new String[args.size()]), out); 86 out.close(); 87 String output = sw.toString(); 88 System.err.println("class " + className); 89 System.err.println(output); 90 91 if (rc != 0) 92 throw new Error("javap failed. rc=" + rc); 93 return output.replaceAll(NEW_LINE, "\n"); 94 } 95 96 List x() { return null; } 97 98 class V { void m(String... args) { } } 99 enum E { e } 100 @interface Anno { } 101 static class S extends T4975569 { 102 ArrayList x() { return null; } 103 } 104 105 protected class Prot { } 106 private class Priv { int i; } 107 } 108