diff options
author | Gilles Dubochet <gilles.dubochet@epfl.ch> | 2005-12-19 13:49:03 +0000 |
---|---|---|
committer | Gilles Dubochet <gilles.dubochet@epfl.ch> | 2005-12-19 13:49:03 +0000 |
commit | ac849228490d5a0e2d3f048d649297d5c59b6ade (patch) | |
tree | 6314f2c06f37e67dec5827c3f94e25cf844a085c /src/compiler/scala/tools/nsc/backend/icode/Printers.scala | |
parent | d6c0efe5b4b89a0337f1cdcdabf8c607d81f4ae1 (diff) | |
download | scala-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.scala | 128 |
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()); + } + } +} |