summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/backend/icode/Printers.scala
diff options
context:
space:
mode:
authorGilles Dubochet <gilles.dubochet@epfl.ch>2005-12-19 13:49:03 +0000
committerGilles Dubochet <gilles.dubochet@epfl.ch>2005-12-19 13:49:03 +0000
commitac849228490d5a0e2d3f048d649297d5c59b6ade (patch)
tree6314f2c06f37e67dec5827c3f94e25cf844a085c /src/compiler/scala/tools/nsc/backend/icode/Printers.scala
parentd6c0efe5b4b89a0337f1cdcdabf8c607d81f4ae1 (diff)
downloadscala-ac849228490d5a0e2d3f048d649297d5c59b6ade.tar.gz
scala-ac849228490d5a0e2d3f048d649297d5c59b6ade.tar.bz2
scala-ac849228490d5a0e2d3f048d649297d5c59b6ade.zip
Switching to the new build system and to the ne...
Switching to the new build system and to the new build system. This is a MAJOR commit, so be careful when updating.
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/icode/Printers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Printers.scala128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Printers.scala b/src/compiler/scala/tools/nsc/backend/icode/Printers.scala
new file mode 100644
index 0000000000..dbc7badb9a
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/icode/Printers.scala
@@ -0,0 +1,128 @@
+/* NSC -- new scala compiler
+ * Copyright 2005 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+// $Id$
+
+package scala.tools.nsc.backend.icode;
+
+import java.io.PrintWriter;
+
+import scala.tools.nsc.util.Position;
+import scala.tools.nsc.symtab.Flags;
+
+abstract class Printers {
+ val global: Global;
+ import global._;
+ import global.icodes.opcodes._;
+ import global.icodes._;
+
+ class TextPrinter(writer: PrintWriter) {
+ var margin = 0;
+ var out = writer;
+ val linearizer = new NormalLinearizer();
+
+ final val TAB = 2;
+
+ def setWriter(w: PrintWriter) = (out = w);
+
+ def indent = margin = margin + TAB;
+ def undent = margin = margin - TAB;
+
+ def print(s: String) = out.print(s);
+ def print(o: Any): Unit = print(o.toString());
+
+ def println(s: String): Unit = {
+ print(s);
+ println
+ }
+
+ def println = {
+ out.println();
+ var i = 0;
+ while (i < margin) {
+ print(" ");
+ i = i + 1;
+ }
+ }
+
+ def printList[a](l: List[a], sep: String): Unit = l match {
+ case Nil => ();
+ case x :: Nil => print(x);
+ case x :: xs => print(x); print(sep); printList(xs, sep);
+ }
+
+ def printList[a](pr: a => Unit)(l: List[a], sep: String): Unit = l match {
+ case Nil => ();
+ case x :: Nil => pr(x);
+ case x :: xs => pr(x); print(sep); printList(pr)(xs, sep);
+ }
+
+
+ private var clazz : IClass = _;
+ def printClass(cls: IClass): Unit = {
+ this.clazz = cls;
+ print(cls.symbol.toString()); print(" extends ");
+ printList(cls.symbol.info.parents, ", ");
+ indent; println(" {");
+ println("// fields:");
+ cls.fields.foreach(printField); println;
+ println("// methods");
+ cls.methods.foreach(printMethod);
+ undent; println;
+ println("}");
+ }
+
+ def printField(f: IField): Unit = {
+ print(f.symbol.keyString); print(" ");
+ print(f.symbol.nameString); print(": ");
+ println(f.symbol.info.toString());
+ }
+
+ def printMethod(m: IMethod): Unit = {
+ print("def "); print(m.symbol.name);
+ print("("); printList(printParam)(m.params.reverse, ", "); print(")");
+ print(": "); print(m.symbol.info.resultType);
+
+ if (!m.isDeferred) {
+ println(" {");
+ println("locals: " + m.locals.mkString("", ", ", ""));
+ println;
+ linearizer.linearize(m) foreach printBlock;
+ println("}");
+
+ indent;println("Exception handlers: ");
+ m.exh foreach printExceptionHandler;
+
+ undent;println;
+ } else
+ println;
+ }
+
+ def printParam(p: Local): Unit = {
+ print(p.sym.name); print(": "); print(p.sym.info);
+ print(" ("); print(p.kind); print(")");
+ }
+
+ def printExceptionHandler(e: ExceptionHandler) = {
+ indent;
+ println("catch (" + e.cls.simpleName + ") in " + e.covered + " starting at: " + e.startBlock);
+ undent;
+ println("with finalizer: " + e.finalizer);
+// linearizer.linearize(e.startBlock) foreach printBlock;
+ }
+
+ def printBlock(bb: BasicBlock): Unit = {
+ print(bb.label); print(": "); indent; println;
+ bb traverse printInstruction;
+ undent; println;
+ }
+
+ def printInstruction(i: Instruction): Unit = {
+ if (settings.debug.value)
+ print("/* " + Position.line(clazz.cunit.source, i.pos) + " */ ");
+ println(i.toString());
+ }
+ }
+}