Moved the repl to a new package
This commit is contained in:
parent
288f1c5387
commit
28948d061c
@ -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
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 {
|
Loading…
Reference in New Issue
Block a user