Moved the repl to a new package

This commit is contained in:
obscuren 2014-07-15 20:34:25 +02:00
parent 288f1c5387
commit 28948d061c
10 changed files with 105 additions and 76 deletions

@ -2,13 +2,14 @@ package main
import ( import (
"github.com/ethereum/eth-go" "github.com/ethereum/eth-go"
"github.com/ethereum/go-ethereum/ethereum/repl"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"io/ioutil" "io/ioutil"
"os" "os"
) )
func InitJsConsole(ethereum *eth.Ethereum) { func InitJsConsole(ethereum *eth.Ethereum) {
repl := NewJSRepl(ethereum) repl := ethrepl.NewJSRepl(ethereum)
go repl.Start() go repl.Start()
utils.RegisterInterrupt(func(os.Signal) { utils.RegisterInterrupt(func(os.Signal) {
repl.Stop() repl.Stop()
@ -24,7 +25,7 @@ func ExecJsFile(ethereum *eth.Ethereum, InputFile string) {
if err != nil { if err != nil {
logger.Fatalln(err) logger.Fatalln(err)
} }
re := NewJSRE(ethereum) re := ethrepl.NewJSRE(ethereum)
utils.RegisterInterrupt(func(os.Signal) { utils.RegisterInterrupt(func(os.Signal) {
re.Stop() re.Stop()
}) })

@ -12,6 +12,7 @@ import (
var Identifier string var Identifier string
var KeyRing string var KeyRing string
var DiffTool bool var DiffTool bool
var DiffType string
var KeyStore string var KeyStore string
var StartRpc bool var StartRpc bool
var RpcPort int var RpcPort int
@ -68,6 +69,7 @@ func Init() {
flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)") flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)") flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0") flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0")
flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false")
flag.BoolVar(&StartMining, "mine", false, "start dagger mining") flag.BoolVar(&StartMining, "mine", false, "start dagger mining")
flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console") flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console")

@ -29,6 +29,7 @@ func main() {
utils.InitConfig(ConfigFile, Datadir, "ETH") utils.InitConfig(ConfigFile, Datadir, "ETH")
ethutil.Config.Diff = DiffTool ethutil.Config.Diff = DiffTool
ethutil.Config.DiffType = DiffType
utils.InitDataDir(Datadir) utils.InitDataDir(Datadir)

@ -1,4 +1,4 @@
package main package ethrepl
import ( import (
"fmt" "fmt"

@ -1,4 +1,4 @@
package main package ethrepl
const jsLib = ` const jsLib = `
function pp(object) { function pp(object) {

83
ethereum/repl/repl.go Normal file

@ -0,0 +1,83 @@
package ethrepl
import (
"bufio"
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethutil"
"io"
"os"
"path"
)
var logger = ethlog.NewLogger("REPL")
type Repl interface {
Start()
Stop()
}
type JSRepl struct {
re *JSRE
prompt string
history *os.File
running bool
}
func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
}
func (self *JSRepl) Start() {
if !self.running {
self.running = true
logger.Infoln("init JS Console")
reader := bufio.NewReader(self.history)
for {
line, err := reader.ReadString('\n')
if err != nil && err == io.EOF {
break
} else if err != nil {
fmt.Println("error reading history", err)
break
}
addHistory(line[:len(line)-1])
}
self.read()
}
}
func (self *JSRepl) Stop() {
if self.running {
self.running = false
self.re.Stop()
logger.Infoln("exit JS Console")
self.history.Close()
}
}
func (self *JSRepl) parseInput(code string) {
defer func() {
if r := recover(); r != nil {
fmt.Println("[native] error", r)
}
}()
value, err := self.re.Run(code)
if err != nil {
fmt.Println(err)
return
}
self.PrintValue(value)
}

@ -1,4 +1,4 @@
package main package ethrepl
// #cgo darwin CFLAGS: -I/usr/local/opt/readline/include // #cgo darwin CFLAGS: -I/usr/local/opt/readline/include
// #cgo darwin LDFLAGS: -L/usr/local/opt/readline/lib // #cgo darwin LDFLAGS: -L/usr/local/opt/readline/lib

@ -1,4 +1,4 @@
package main package ethrepl
import ( import (
"bufio" "bufio"

@ -1,84 +1,26 @@
package main package ethrepl
import ( import (
"bufio"
"fmt" "fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/otto" "github.com/obscuren/otto"
"io"
"os"
"path"
) )
type Repl interface { type JSStateObject struct {
Start() *ethpub.PStateObject
Stop() eth *JSEthereum
} }
type JSRepl struct { func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
re *JSRE cb := call.Argument(0)
self.PStateObject.EachStorage(func(key string, value *ethutil.Value) {
value.Decode()
prompt string cb.Call(self.eth.toVal(self), self.eth.toVal(key), self.eth.toVal(ethutil.Bytes2Hex(value.Bytes())))
})
history *os.File return otto.UndefinedValue()
running bool
}
func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
}
func (self *JSRepl) Start() {
if !self.running {
self.running = true
logger.Infoln("init JS Console")
reader := bufio.NewReader(self.history)
for {
line, err := reader.ReadString('\n')
if err != nil && err == io.EOF {
break
} else if err != nil {
fmt.Println("error reading history", err)
break
}
addHistory(line[:len(line)-1])
}
self.read()
}
}
func (self *JSRepl) Stop() {
if self.running {
self.running = false
self.re.Stop()
logger.Infoln("exit JS Console")
self.history.Close()
}
}
func (self *JSRepl) parseInput(code string) {
defer func() {
if r := recover(); r != nil {
fmt.Println("[native] error", r)
}
}()
value, err := self.re.Run(code)
if err != nil {
fmt.Println(err)
return
}
self.PrintValue(value)
} }
// The JSEthereum object attempts to wrap the PEthereum object and returns // The JSEthereum object attempts to wrap the PEthereum object and returns
@ -110,7 +52,7 @@ func (self *JSEthereum) GetKey() otto.Value {
} }
func (self *JSEthereum) GetStateObject(addr string) otto.Value { func (self *JSEthereum) GetStateObject(addr string) otto.Value {
return self.toVal(self.PEthereum.GetStateObject(addr)) return self.toVal(&JSStateObject{self.PEthereum.GetStateObject(addr), self})
} }
func (self *JSEthereum) GetStateKeyVals(addr string) otto.Value { func (self *JSEthereum) GetStateKeyVals(addr string) otto.Value {