vromero@1428: vromero@1428: /* vromero@1428: * @test /nodynamiccopyright/ vromero@1428: * @bug 7190862 7109747 vromero@1428: * @summary javap shows an incorrect type for operands if the 'wide' prefix is used vromero@1428: */ vromero@1428: vromero@1428: import com.sun.source.util.JavacTask; vromero@1428: import com.sun.tools.javap.JavapFileManager; vromero@1428: import com.sun.tools.javap.JavapTask; vromero@1428: import java.io.PrintWriter; vromero@1428: import java.io.StringWriter; vromero@1428: import java.net.URI; vromero@1428: import java.util.Arrays; vromero@1428: import java.util.List; vromero@1428: import java.util.Locale; vromero@1428: import javax.tools.Diagnostic; vromero@1428: import javax.tools.DiagnosticCollector; vromero@1428: import javax.tools.JavaCompiler; vromero@1428: import javax.tools.JavaFileManager; vromero@1428: import javax.tools.JavaFileObject; vromero@1428: import javax.tools.SimpleJavaFileObject; vromero@1428: import javax.tools.ToolProvider; vromero@1428: vromero@1428: public class T7190862 { vromero@1428: vromero@1428: enum TypeWideInstructionMap { vromero@1428: INT("int", new String[]{"istore_w", "iload_w"}), vromero@1428: LONG("long", new String[]{"lstore_w", "lload_w"}), vromero@1428: FLOAT("float", new String[]{"fstore_w", "fload_w"}), vromero@1428: DOUBLE("double", new String[]{"dstore_w", "dload_w"}), vromero@1428: OBJECT("Object", new String[]{"astore_w", "aload_w"}); vromero@1428: vromero@1428: String type; vromero@1428: String[] instructions; vromero@1428: vromero@1428: TypeWideInstructionMap(String type, String[] instructions) { vromero@1428: this.type = type; vromero@1428: this.instructions = instructions; vromero@1428: } vromero@1428: } vromero@1428: vromero@1428: JavaSource source; vromero@1428: vromero@1428: public static void main(String[] args) { vromero@1428: JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); vromero@1428: new T7190862().run(comp); vromero@1428: } vromero@1428: vromero@1428: private void run(JavaCompiler comp) { vromero@1428: String code; vromero@1428: for (TypeWideInstructionMap typeInstructionMap: TypeWideInstructionMap.values()) { vromero@1428: if (typeInstructionMap != TypeWideInstructionMap.OBJECT) { vromero@1428: code = createWideLocalSource(typeInstructionMap.type, 300); vromero@1428: } else { vromero@1428: code = createWideLocalSourceForObject(300); vromero@1428: } vromero@1428: source = new JavaSource(code); vromero@1428: compile(comp); vromero@1428: check(typeInstructionMap.instructions); vromero@1428: } vromero@1428: vromero@1428: //an extra test for the iinc instruction vromero@1428: code = createIincSource(); vromero@1428: source = new JavaSource(code); vromero@1428: compile(comp); vromero@1428: check(new String[]{"iinc_w"}); vromero@1428: } vromero@1428: vromero@1428: private void compile(JavaCompiler comp) { vromero@1428: JavacTask ct = (JavacTask)comp.getTask(null, null, null, null, null, Arrays.asList(source)); vromero@1428: try { vromero@1428: if (!ct.call()) { vromero@1428: throw new AssertionError("Error thrown when compiling the following source:\n" + source.getCharContent(true)); vromero@1428: } vromero@1428: } catch (Throwable ex) { vromero@1428: throw new AssertionError("Error thrown when compiling the following source:\n" + source.getCharContent(true)); vromero@1428: } vromero@1428: } vromero@1428: vromero@1428: private void check(String[] instructions) { vromero@1428: String out = javap(Arrays.asList("-c"), Arrays.asList("Test.class")); vromero@1428: for (String line: out.split(System.getProperty("line.separator"))) { vromero@1428: line = line.trim(); vromero@1428: for (String instruction: instructions) { vromero@1428: if (line.contains(instruction) && line.contains("#")) { vromero@1428: throw new Error("incorrect type for operands for instruction " + instruction); vromero@1428: } vromero@1428: } vromero@1428: } vromero@1428: } vromero@1428: vromero@1428: private String javap(List args, List classes) { vromero@1428: DiagnosticCollector dc = new DiagnosticCollector(); vromero@1428: StringWriter sw = new StringWriter(); vromero@1428: PrintWriter pw = new PrintWriter(sw); vromero@1428: JavaFileManager fm = JavapFileManager.create(dc, pw); vromero@1428: JavapTask t = new JavapTask(pw, fm, dc, args, classes); vromero@1428: boolean ok = t.run(); vromero@1428: if (!ok) vromero@1428: throw new Error("javap failed unexpectedly"); vromero@1428: vromero@1428: List> diags = dc.getDiagnostics(); vromero@1428: for (Diagnostic d: diags) { vromero@1428: if (d.getKind() == Diagnostic.Kind.ERROR) vromero@1428: throw new Error(d.getMessage(Locale.ENGLISH)); vromero@1428: } vromero@1428: return sw.toString(); vromero@1428: vromero@1428: } vromero@1428: vromero@1428: private String createWideLocalSource(String type, int numberOfVars) { vromero@1428: String result = " " + type + " x0 = 0;\n"; vromero@1428: for (int i = 1; i < numberOfVars; i++) { vromero@1428: result += " " + type + " x" + i + " = x" + (i - 1) + " + 1;\n"; vromero@1428: } vromero@1428: return result; vromero@1428: } vromero@1428: vromero@1428: private String createWideLocalSourceForObject(int numberOfVars) { vromero@1428: String result = " Object x0 = new Object();\n"; vromero@1428: for (int i = 1; i < numberOfVars; i++) { vromero@1428: result += " Object x" + i + " = x0;\n"; vromero@1428: } vromero@1428: return result; vromero@1428: } vromero@1428: vromero@1428: private String createIincSource() { vromero@1428: return " int i = 0;\n" vromero@1428: + " i += 1;\n" vromero@1428: + " i += 51;\n" vromero@1428: + " i += 101;\n" vromero@1428: + " i += 151;\n"; vromero@1428: } vromero@1428: vromero@1428: class JavaSource extends SimpleJavaFileObject { vromero@1428: vromero@1428: String template = "class Test {\n" + vromero@1428: " public static void main(String[] args)\n" + vromero@1428: " {\n" + vromero@1428: " #C" + vromero@1428: " }\n" + vromero@1428: "}"; vromero@1428: vromero@1428: String source; vromero@1428: vromero@1428: public JavaSource(String code) { vromero@1428: super(URI.create("Test.java"), JavaFileObject.Kind.SOURCE); vromero@1428: source = template.replaceAll("#C", code); vromero@1428: } vromero@1428: vromero@1428: @Override vromero@1428: public CharSequence getCharContent(boolean ignoreEncodingErrors) { vromero@1428: return source; vromero@1428: } vromero@1428: } vromero@1428: }