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 }
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 }