summaryrefslogtreecommitdiff
path: root/src/partest-extras/scala/tools/partest/IcodeComparison.scala
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2013-07-25 12:58:56 -0700
committerSom Snytt <som.snytt@gmail.com>2013-08-21 18:02:35 -0700
commit1683c95e159006d40a8458d29ef266ca741752c7 (patch)
tree69d40c95510159340ed3e660f0809f1bfef97ed7 /src/partest-extras/scala/tools/partest/IcodeComparison.scala
parentf3731f9ace5d3d5e213ea786fe0027ea66c5358b (diff)
downloadscala-1683c95e159006d40a8458d29ef266ca741752c7.tar.gz
scala-1683c95e159006d40a8458d29ef266ca741752c7.tar.bz2
scala-1683c95e159006d40a8458d29ef266ca741752c7.zip
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.
Diffstat (limited to 'src/partest-extras/scala/tools/partest/IcodeComparison.scala')
-rw-r--r--src/partest-extras/scala/tools/partest/IcodeComparison.scala73
1 files changed, 73 insertions, 0 deletions
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)
+}