dca332f333
Fix #295, deduplicate code and add `inspect` parameter to the vm command to dump AVMs (`contract inspect` works with Go code).
55 lines
1 KiB
Go
55 lines
1 KiB
Go
package vm
|
|
|
|
import (
|
|
"errors"
|
|
"io/ioutil"
|
|
|
|
"github.com/CityOfZion/neo-go/pkg/vm"
|
|
vmcli "github.com/CityOfZion/neo-go/pkg/vm/cli"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
// NewCommand creates a new VM command.
|
|
func NewCommand() cli.Command {
|
|
return cli.Command{
|
|
Name: "vm",
|
|
Usage: "start the virtual machine",
|
|
Action: startVMPrompt,
|
|
Flags: []cli.Flag{
|
|
cli.BoolFlag{Name: "debug, d"},
|
|
},
|
|
Subcommands: []cli.Command{
|
|
{
|
|
Name: "inspect",
|
|
Usage: "dump instructions of the avm file given",
|
|
Action: inspect,
|
|
Flags: []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "in, i",
|
|
Usage: "input file of the program (AVM)",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func startVMPrompt(ctx *cli.Context) error {
|
|
p := vmcli.New()
|
|
return p.Run()
|
|
}
|
|
|
|
func inspect(ctx *cli.Context) error {
|
|
avm := ctx.String("in")
|
|
if len(avm) == 0 {
|
|
return cli.NewExitError(errors.New("no input file given"), 1)
|
|
}
|
|
b, err := ioutil.ReadFile(avm)
|
|
if err != nil {
|
|
return cli.NewExitError(err, 1)
|
|
}
|
|
v := vm.New(0)
|
|
v.LoadScript(b)
|
|
v.PrintOps()
|
|
return nil
|
|
}
|