< prev index next >

test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/JavaCodeGenerator.java

Print this page
rev 53171 : 8158646: [jittester] generated tests may not compile by javac
Reviewed-by: duke


  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 package jdk.test.lib.jittester;
  25 
  26 import java.io.IOException;
  27 import java.util.function.Function;
  28 import jdk.test.lib.jittester.visitors.JavaCodeVisitor;
  29 
  30 /**
  31  * Generates java source code from IRTree
  32  */
  33 public class JavaCodeGenerator extends TestsGenerator {
  34     private static final String DEFAULT_SUFFIX = "java_tests";
  35 
  36     JavaCodeGenerator() {
  37         this(DEFAULT_SUFFIX, JavaCodeGenerator::generatePrerunAction, "");
  38     }
  39 
  40     JavaCodeGenerator(String prefix, Function<String, String[]> preRunActions, String jtDriverOptions) {
  41         super(prefix, preRunActions, jtDriverOptions);
  42     }
  43 
  44     @Override
  45     public void accept(IRNode mainClass, IRNode privateClasses) {
  46         String mainClassName = mainClass.getName();
  47         generateSources(mainClass, privateClasses);
  48         compilePrinter();
  49         compileJavaFile(mainClassName);
  50         generateGoldenOut(mainClassName);
  51     }
  52 
  53     private void generateSources(IRNode mainClass, IRNode privateClasses) {
  54         String mainClassName = mainClass.getName();
  55         StringBuilder code = new StringBuilder();
  56         JavaCodeVisitor vis = new JavaCodeVisitor();
  57         code.append(getJtregHeader(mainClassName));
  58         if (privateClasses != null) {
  59             code.append(privateClasses.accept(vis));
  60         }
  61         code.append(mainClass.accept(vis));
  62         ensureExisting(generatorDir);
  63         writeFile(generatorDir, mainClassName + ".java", code.toString());
  64     }
  65 
  66     private void compileJavaFile(String mainClassName) {
  67         String classPath = getRoot().resolve(generatorDir)
  68                                     .toAbsolutePath()
  69                                     .toString();
  70         ProcessBuilder pb = new ProcessBuilder(JAVAC, "-cp", classPath,
  71                 generatorDir.resolve(mainClassName + ".java").toString());
  72         try {
  73             runProcess(pb, generatorDir.resolve(mainClassName).toString());



  74         } catch (IOException | InterruptedException e) {
  75             throw new Error("Can't compile sources ", e);
  76         }
  77     }
  78 
  79     private static String[] generatePrerunAction(String mainClassName) {
  80         return new String[] {"@compile " + mainClassName + ".java"};
  81     }
  82 }


  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 package jdk.test.lib.jittester;
  25 
  26 import java.io.IOException;
  27 import java.util.function.Function;
  28 import jdk.test.lib.jittester.visitors.JavaCodeVisitor;
  29 
  30 /**
  31  * Generates java source code from IRTree
  32  */
  33 public class JavaCodeGenerator extends TestsGenerator {
  34     private static final String DEFAULT_SUFFIX = "java_tests";
  35 
  36     JavaCodeGenerator() {
  37         this(DEFAULT_SUFFIX, JavaCodeGenerator::generatePrerunAction, "-Xcomp");
  38     }
  39 
  40     JavaCodeGenerator(String prefix, Function<String, String[]> preRunActions, String jtDriverOptions) {
  41         super(prefix, preRunActions, jtDriverOptions);
  42     }
  43 
  44     @Override
  45     public void accept(IRNode mainClass, IRNode privateClasses) {
  46         String mainClassName = mainClass.getName();
  47         generateSources(mainClass, privateClasses);
  48         compilePrinter();
  49         compileJavaFile(mainClassName);
  50         generateGoldenOut(mainClassName);
  51     }
  52 
  53     private void generateSources(IRNode mainClass, IRNode privateClasses) {
  54         String mainClassName = mainClass.getName();
  55         StringBuilder code = new StringBuilder();
  56         JavaCodeVisitor vis = new JavaCodeVisitor();
  57         code.append(getJtregHeader(mainClassName));
  58         if (privateClasses != null) {
  59             code.append(privateClasses.accept(vis));
  60         }
  61         code.append(mainClass.accept(vis));
  62         ensureExisting(generatorDir);
  63         writeFile(generatorDir, mainClassName + ".java", code.toString());
  64     }
  65 
  66     private void compileJavaFile(String mainClassName) {
  67         String classPath = tmpDir.toString();
  68         ProcessBuilder pb = new ProcessBuilder(JAVAC,
  69                 "-d", classPath,
  70                 "-cp", classPath,
  71                 generatorDir.resolve(mainClassName + ".java").toString());
  72         try {
  73             int r = runProcess(pb, tmpDir.resolve(mainClassName + ".javac").toString());
  74             if (r != 0) {
  75                 throw new Error("Can't compile sources, exit code = " + r);
  76             }
  77         } catch (IOException | InterruptedException e) {
  78             throw new Error("Can't compile sources ", e);
  79         }
  80     }
  81 
  82     private static String[] generatePrerunAction(String mainClassName) {
  83         return new String[] {"@compile " + mainClassName + ".java"};
  84     }
  85 }
< prev index next >