1
1
package vm
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
6
+ "reflect"
5
7
"regexp"
6
8
"strings"
9
+ "text/tabwriter"
7
10
8
11
"github.com/antonmedv/expr/ast"
9
12
"github.com/antonmedv/expr/builtin"
@@ -22,7 +25,8 @@ type Program struct {
22
25
}
23
26
24
27
func (program * Program ) Disassemble () string {
25
- out := ""
28
+ var buf bytes.Buffer
29
+ w := tabwriter .NewWriter (& buf , 0 , 0 , 2 , ' ' , 0 )
26
30
ip := 0
27
31
for ip < len (program .Bytecode ) {
28
32
pp := ip
@@ -31,16 +35,16 @@ func (program *Program) Disassemble() string {
31
35
ip += 1
32
36
33
37
code := func (label string ) {
34
- out + = fmt .Sprintf ( "%v\t %v\n " , pp , label )
38
+ _ , _ = fmt .Fprintf ( w , "%v\t %v\n " , pp , label )
35
39
}
36
40
jump := func (label string ) {
37
- out + = fmt .Sprintf ( "%v\t %v\t %v \t (%v)\n " , pp , label , arg , ip + arg )
41
+ _ , _ = fmt .Fprintf ( w , "%v\t %v\t <%v> \t (%v)\n " , pp , label , arg , ip + arg )
38
42
}
39
43
jumpBack := func (label string ) {
40
- out + = fmt .Sprintf ( "%v\t %v\t %v \t (%v)\n " , pp , label , arg , ip - arg )
44
+ _ , _ = fmt .Fprintf ( w , "%v\t %v\t <%v> \t (%v)\n " , pp , label , arg , ip - arg )
41
45
}
42
46
argument := func (label string ) {
43
- out + = fmt .Sprintf ( "%v\t %v\t %v \n " , pp , label , arg )
47
+ _ , _ = fmt .Fprintf ( w , "%v\t %v\t <%v> \n " , pp , label , arg )
44
48
}
45
49
constant := func (label string ) {
46
50
var c interface {}
@@ -58,14 +62,14 @@ func (program *Program) Disassemble() string {
58
62
if method , ok := c .(* runtime.Method ); ok {
59
63
c = fmt .Sprintf ("{%v %v}" , method .Name , method .Index )
60
64
}
61
- out + = fmt .Sprintf ( "%v\t %v\t %v \t %v\n " , pp , label , arg , c )
65
+ _ , _ = fmt .Fprintf ( w , "%v\t %v\t <%v> \t %v\n " , pp , label , arg , c )
62
66
}
63
67
builtIn := func (label string ) {
64
68
f , ok := builtin .Builtins [arg ]
65
69
if ! ok {
66
70
panic (fmt .Sprintf ("unknown builtin %v" , arg ))
67
71
}
68
- out + = fmt .Sprintf ( "%v\t %v\t %v\n " , pp , "OpBuiltin" , f .Name )
72
+ _ , _ = fmt .Fprintf ( w , "%v\t %v\t %v\n " , pp , "OpBuiltin" , f .Name )
69
73
}
70
74
71
75
switch op {
@@ -223,7 +227,8 @@ func (program *Program) Disassemble() string {
223
227
argument ("OpCallFast" )
224
228
225
229
case OpCallTyped :
226
- argument ("OpCallTyped" )
230
+ signature := reflect .TypeOf (FuncTypes [arg ]).Elem ().String ()
231
+ _ , _ = fmt .Fprintf (w , "%v\t %v\t <%v>\t %v\n " , pp , "OpCallTyped" , arg , signature )
227
232
228
233
case OpBuiltin :
229
234
builtIn ("OpBuiltin" )
@@ -265,8 +270,9 @@ func (program *Program) Disassemble() string {
265
270
code ("OpEnd" )
266
271
267
272
default :
268
- out + = fmt .Sprintf ( "%v\t %#x\n " , ip , op )
273
+ _ , _ = fmt .Fprintf ( w , "%v\t %#x\n " , ip , op )
269
274
}
270
275
}
271
- return out
276
+ _ = w .Flush ()
277
+ return buf .String ()
272
278
}
0 commit comments