From 1683c95e159006d40a8458d29ef266ca741752c7 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 25 Jul 2013 12:58:56 -0700 Subject: SI-7622 Clean Up Phase Assembly Let optimiser components and continuations plugin opt-out when required flags are not set. Wasted time on a whitespace error in check file, so let --debug dump the processed check file and its diff. --- .../scala/tools/partest/IcodeComparison.scala | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/partest-extras/scala/tools/partest/IcodeComparison.scala (limited to 'src/partest-extras/scala/tools/partest/IcodeComparison.scala') diff --git a/src/partest-extras/scala/tools/partest/IcodeComparison.scala b/src/partest-extras/scala/tools/partest/IcodeComparison.scala new file mode 100644 index 0000000000..24b87e898f --- /dev/null +++ b/src/partest-extras/scala/tools/partest/IcodeComparison.scala @@ -0,0 +1,73 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2013 LAMP/EPFL + * @author Paul Phillips + */ + +package scala.tools.partest + +import scala.tools.partest.nest.FileManager.compareContents +import scala.compat.Platform.EOL + +/** A class for testing icode. All you need is this in a + * partest source file -- + * {{{ + * object Test extends IcodeComparison + * }}} + * -- and the generated output will be the icode for everything + * in that file. See scaladoc for possible customizations. + */ +abstract class IcodeComparison extends DirectTest { + /** The phase after which icode is printed. + * Override to check icode at a different point, + * but you can't print at a phase that is not enabled + * in this compiler run. Defaults to "icode". + */ + def printIcodeAfterPhase = "icode" + + /** When comparing the output of two phases, this is + * the other phase of interest, normally the preceding + * phase. Defaults to "icode" for tests of optimizer phases. + */ + def printSuboptimalIcodeAfterPhase = "icode" + + /** The source code to compile defaults to the test file. + * I.e., the test file compiles itself. For a comparison, + * the test file will be compiled three times. + */ + def code = testPath.slurp() + + /** By default, the test code is compiled with -usejavacp. */ + override def extraSettings: String = "-usejavacp" + + /** Compile the test code and return the contents of all + * (sorted) .icode files, which are immediately deleted. + * @param arg0 at least one arg is required + * @param args must include -Xprint-icode:phase + */ + def collectIcode(arg0: String, args: String*): List[String] = { + compile("-d" :: testOutput.path :: arg0 :: args.toList : _*) + val icodeFiles = testOutput.files.toList filter (_ hasExtension "icode") + + try icodeFiles sortBy (_.name) flatMap (f => f.lines.toList) + finally icodeFiles foreach (f => f.delete()) + } + + /** Collect icode at the default phase, `printIcodeAfterPhase`. */ + def collectIcode(): List[String] = collectIcode(s"-Xprint-icode:$printIcodeAfterPhase") + + /** Default show is showComparison. May be overridden for showIcode or similar. */ + def show() = showComparison() + + /** Compile the test code with and without optimization, and + * then print the diff of the icode. + */ + def showComparison() = { + val lines1 = collectIcode(s"-Xprint-icode:$printSuboptimalIcodeAfterPhase") + val lines2 = collectIcode("-optimise", s"-Xprint-icode:$printIcodeAfterPhase") + + println(compareContents(lines1, lines2)) + } + + /** Print icode at the default phase, `printIcodeAfterPhase`. */ + def showIcode() = println(collectIcode() mkString EOL) +} -- cgit v1.2.3