Moved the repl to a new package

pull/109/merge
obscuren 11 years ago
parent 288f1c5387
commit 28948d061c
  1. 5
      ethereum/cmd.go
  2. 2
      ethereum/flags.go
  3. 1
      ethereum/main.go
  4. 2
      ethereum/repl/javascript_runtime.go
  5. 2
      ethereum/repl/js_lib.go
  6. 83
      ethereum/repl/repl.go
  7. 2
      ethereum/repl/repl_darwin.go
  8. 0
      ethereum/repl/repl_linux.go
  9. 2
      ethereum/repl/repl_windows.go
  10. 82
      ethereum/repl/types.go

@ -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) {

@ -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 {
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) { func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
defer func() { cb := call.Argument(0)
if r := recover(); r != nil { self.PStateObject.EachStorage(func(key string, value *ethutil.Value) {
fmt.Println("[native] error", r) value.Decode()
}
}()
value, err := self.re.Run(code) cb.Call(self.eth.toVal(self), self.eth.toVal(key), self.eth.toVal(ethutil.Bytes2Hex(value.Bytes())))
if err != nil { })
fmt.Println(err)
return
}
self.PrintValue(value) return otto.UndefinedValue()
} }
// 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…
Cancel
Save