logo

class

compiler::FCodePrinter

sys::Obj
  compiler::FCodePrinter : compiler::FConst
   1  //
   2  // Copyright (c) 2006, Brian Frank and Andy Frank
   3  // Licensed under the Academic Free License version 3.0
   4  //
   5  // History:
   6  //   26 Dec 05  Brian Frank  Creation
   7  //   20 Aug 06  Brian Frank  Ported from Java to Fan
   8  //
   9  
  10  **
  11  ** FCodePrinter prints a human readable syntax for fcode
  12  **
  13  class FCodePrinter : FConst
  14  {
  15  
  16  //////////////////////////////////////////////////////////////////////////
  17  // Constructor
  18  //////////////////////////////////////////////////////////////////////////
  19  
  20    new make(FPod pod, OutStream out := Sys.out)
  21    {
  22      this.pod = pod
  23      this.out = out
  24    }
  25  
  26  //////////////////////////////////////////////////////////////////////////
  27  // Print
  28  //////////////////////////////////////////////////////////////////////////
  29  
  30    Void code(Buf buf)
  31    {
  32      try
  33      {
  34        this.buf = buf.seek(0)
  35  
  36        while (true)
  37        {
  38          op := buf.read
  39          if (op == null) break
  40          this.op(FOp.values[op])
  41        }
  42      }
  43      catch (Err e)
  44      {
  45        e.trace
  46      }
  47  
  48      out.flush
  49      this.buf = null
  50    }
  51  
  52    Void op(FOp op)
  53    {
  54      print("    " + buf.pos.minus(1).toStr.justr(3) + ": " + op.name.justl(19) + " ")
  55      if (op == FOp.Switch) printSwitch
  56      else switch (op.arg)
  57      {
  58        case FOpArg.None:      print
  59        case FOpArg.Int:       i := buf.readU2; print(pod.integer(i).toStr + index(i))
  60        case FOpArg.Float:     i := buf.readU2; print(pod.float(i).toStr + index(i))
  61        case FOpArg.Str:       i := buf.readU2; print(pod.str(i).toStr + index(i))
  62        case FOpArg.Duration:  i := buf.readU2; print(pod.duration(i).toStr + index(i))
  63        case FOpArg.Uri:       i := buf.readU2; print(pod.uri(i).toStr + index(i))
  64        case FOpArg.Register:  i := buf.readU2; print(i)
  65        case FOpArg.TypeRef:   i := buf.readU2; print(pod.typeRefStr(i) + index(i))
  66        case FOpArg.FieldRef:  i := buf.readU2; print(pod.fieldRefStr(i) + index(i))
  67        case FOpArg.MethodRef: i := buf.readU2; print(pod.methodRefStr(i) + index(i))
  68        case FOpArg.Jump:      i := buf.readU2; print(i)
  69        default:       throw Err.make(op.arg.toStr)
  70      }
  71      printLine
  72    }
  73  
  74    Void printSwitch()
  75    {
  76      buf.readU2.times |Int i|
  77      {
  78        printLine
  79        print("          " + i + " -> " + buf.readU2)
  80      }
  81    }
  82  
  83  //////////////////////////////////////////////////////////////////////////
  84  // Print
  85  //////////////////////////////////////////////////////////////////////////
  86  
  87    Str index(Int index)
  88    {
  89      if (showIndex) return "[" + index + "]"
  90      return ""
  91    }
  92  
  93    FCodePrinter print(Obj obj := "") { out.print(obj); return this }
  94    FCodePrinter printLine(Obj obj := "") { out.printLine(obj); return this }
  95  
  96  //////////////////////////////////////////////////////////////////////////
  97  // Fields
  98  //////////////////////////////////////////////////////////////////////////
  99  
 100    FPod pod
 101    OutStream out
 102    Bool showIndex
 103    Buf buf
 104  
 105  }