diff --git a/ethereum/cmd.go b/ethereum/cmd.go index 08147824d..ff2b8409c 100644 --- a/ethereum/cmd.go +++ b/ethereum/cmd.go @@ -2,13 +2,14 @@ package main import ( "github.com/ethereum/eth-go" + "github.com/ethereum/go-ethereum/ethereum/repl" "github.com/ethereum/go-ethereum/utils" "io/ioutil" "os" ) func InitJsConsole(ethereum *eth.Ethereum) { - repl := NewJSRepl(ethereum) + repl := ethrepl.NewJSRepl(ethereum) go repl.Start() utils.RegisterInterrupt(func(os.Signal) { repl.Stop() @@ -24,7 +25,7 @@ func ExecJsFile(ethereum *eth.Ethereum, InputFile string) { if err != nil { logger.Fatalln(err) } - re := NewJSRE(ethereum) + re := ethrepl.NewJSRE(ethereum) utils.RegisterInterrupt(func(os.Signal) { re.Stop() }) diff --git a/ethereum/flags.go b/ethereum/flags.go index af0fd9a69..4f59ddf06 100644 --- a/ethereum/flags.go +++ b/ethereum/flags.go @@ -12,6 +12,7 @@ import ( var Identifier string var KeyRing string var DiffTool bool +var DiffType string var KeyStore string var StartRpc bool var RpcPort int @@ -68,6 +69,7 @@ func Init() { 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.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(&StartJsConsole, "js", false, "launches javascript console") diff --git a/ethereum/main.go b/ethereum/main.go index 39226c1d2..fd4a89aa9 100644 --- a/ethereum/main.go +++ b/ethereum/main.go @@ -29,6 +29,7 @@ func main() { utils.InitConfig(ConfigFile, Datadir, "ETH") ethutil.Config.Diff = DiffTool + ethutil.Config.DiffType = DiffType utils.InitDataDir(Datadir) diff --git a/ethereum/javascript_runtime.go b/ethereum/repl/javascript_runtime.go similarity index 99% rename from ethereum/javascript_runtime.go rename to ethereum/repl/javascript_runtime.go index 852a50487..cd87f9868 100644 --- a/ethereum/javascript_runtime.go +++ b/ethereum/repl/javascript_runtime.go @@ -1,4 +1,4 @@ -package main +package ethrepl import ( "fmt" diff --git a/ethereum/js_lib.go b/ethereum/repl/js_lib.go similarity index 98% rename from ethereum/js_lib.go rename to ethereum/repl/js_lib.go index 189dcc3a0..c781c43d0 100644 --- a/ethereum/js_lib.go +++ b/ethereum/repl/js_lib.go @@ -1,4 +1,4 @@ -package main +package ethrepl const jsLib = ` function pp(object) { diff --git a/ethereum/repl/repl.go b/ethereum/repl/repl.go new file mode 100644 index 000000000..92d4ad86a --- /dev/null +++ b/ethereum/repl/repl.go @@ -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) +} diff --git a/ethereum/repl_darwin.go b/ethereum/repl/repl_darwin.go similarity index 99% rename from ethereum/repl_darwin.go rename to ethereum/repl/repl_darwin.go index 62b40059a..3a91b0d44 100644 --- a/ethereum/repl_darwin.go +++ b/ethereum/repl/repl_darwin.go @@ -1,4 +1,4 @@ -package main +package ethrepl // #cgo darwin CFLAGS: -I/usr/local/opt/readline/include // #cgo darwin LDFLAGS: -L/usr/local/opt/readline/lib diff --git a/ethereum/repl_linux.go b/ethereum/repl/repl_linux.go similarity index 100% rename from ethereum/repl_linux.go rename to ethereum/repl/repl_linux.go diff --git a/ethereum/repl_windows.go b/ethereum/repl/repl_windows.go similarity index 95% rename from ethereum/repl_windows.go rename to ethereum/repl/repl_windows.go index 9d4787772..4106c89bc 100644 --- a/ethereum/repl_windows.go +++ b/ethereum/repl/repl_windows.go @@ -1,4 +1,4 @@ -package main +package ethrepl import ( "bufio" diff --git a/ethereum/repl.go b/ethereum/repl/types.go similarity index 57% rename from ethereum/repl.go rename to ethereum/repl/types.go index 34380a06f..16a18e6e5 100644 --- a/ethereum/repl.go +++ b/ethereum/repl/types.go @@ -1,84 +1,26 @@ -package main +package ethrepl import ( - "bufio" "fmt" - "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethutil" "github.com/obscuren/otto" - "io" - "os" - "path" ) -type Repl interface { - Start() - Stop() +type JSStateObject struct { + *ethpub.PStateObject + eth *JSEthereum } -type JSRepl struct { - re *JSRE +func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value { + 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 - - 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) + return otto.UndefinedValue() } // 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 { - return self.toVal(self.PEthereum.GetStateObject(addr)) + return self.toVal(&JSStateObject{self.PEthereum.GetStateObject(addr), self}) } func (self *JSEthereum) GetStateKeyVals(addr string) otto.Value {