
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 }