Merge pull request #2478 from fjl/geth-js-tweak

cmd/geth, jsre: improve the js command
This commit is contained in:
Felix Lange 2016-04-26 10:39:19 +02:00
commit 3d6d828caf
3 changed files with 34 additions and 13 deletions

View File

@ -123,7 +123,7 @@ func (self *jsre) batch(statement string) {
err := self.re.EvalAndPrettyPrint(statement) err := self.re.EvalAndPrettyPrint(statement)
if err != nil { if err != nil {
fmt.Printf("error: %v", err) fmt.Printf("%v", jsErrorString(err))
} }
if self.atexit != nil { if self.atexit != nil {
@ -301,21 +301,19 @@ func (self *jsre) preloadJSFiles(ctx *cli.Context) error {
for _, file := range jsFiles { for _, file := range jsFiles {
filename := common.AbsolutePath(assetPath, strings.TrimSpace(file)) filename := common.AbsolutePath(assetPath, strings.TrimSpace(file))
if err := self.re.Exec(filename); err != nil { if err := self.re.Exec(filename); err != nil {
return fmt.Errorf("%s: %v", file, err) return fmt.Errorf("%s: %v", file, jsErrorString(err))
} }
} }
} }
return nil return nil
} }
// exec executes the JS file with the given filename and stops the JSRE // jsErrorString adds a backtrace to errors generated by otto.
func (self *jsre) exec(filename string) error { func jsErrorString(err error) string {
if err := self.re.Exec(filename); err != nil { if ottoErr, ok := err.(*otto.Error); ok {
self.re.Stop(false) return ottoErr.String()
return fmt.Errorf("Javascript Error: %v", err)
} }
self.re.Stop(true) return err.Error()
return nil
} }
func (self *jsre) interactive() { func (self *jsre) interactive() {

View File

@ -21,6 +21,7 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"os/signal"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strconv" "strconv"
@ -353,7 +354,7 @@ func console(ctx *cli.Context) {
// preload user defined JS files into the console // preload user defined JS files into the console
err = repl.preloadJSFiles(ctx) err = repl.preloadJSFiles(ctx)
if err != nil { if err != nil {
utils.Fatalf("unable to preload JS file %v", err) utils.Fatalf("%v", err)
} }
// in case the exec flag holds a JS statement execute it and return // in case the exec flag holds a JS statement execute it and return
@ -372,6 +373,7 @@ func execScripts(ctx *cli.Context) {
// Create and start the node based on the CLI flags // Create and start the node based on the CLI flags
node := utils.MakeSystemNode(ClientIdentifier, nodeNameVersion, makeDefaultExtra(), ctx) node := utils.MakeSystemNode(ClientIdentifier, nodeNameVersion, makeDefaultExtra(), ctx)
startNode(ctx, node) startNode(ctx, node)
defer node.Stop()
// Attach to the newly started node and execute the given scripts // Attach to the newly started node and execute the given scripts
client, err := node.Attach() client, err := node.Attach()
@ -383,10 +385,24 @@ func execScripts(ctx *cli.Context) {
ctx.GlobalString(utils.RPCCORSDomainFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name),
client, false) client, false)
// Run all given files.
for _, file := range ctx.Args() { for _, file := range ctx.Args() {
repl.exec(file) if err = repl.re.Exec(file); err != nil {
break
}
} }
node.Stop() if err != nil {
utils.Fatalf("JavaScript Error: %v", jsErrorString(err))
}
// JS files loaded successfully.
// Wait for pending callbacks, but stop for Ctrl-C.
abort := make(chan os.Signal, 1)
signal.Notify(abort, os.Interrupt)
go func() {
<-abort
repl.re.Stop(false)
}()
repl.re.Stop(true)
} }
// startNode boots up the system node and all registered protocols, after which // startNode boots up the system node and all registered protocols, after which

View File

@ -235,7 +235,14 @@ func (self *JSRE) Exec(file string) error {
if err != nil { if err != nil {
return err return err
} }
self.Do(func(vm *otto.Otto) { _, err = vm.Run(code) }) var script *otto.Script
self.Do(func(vm *otto.Otto) {
script, err = vm.Compile(file, code)
if err != nil {
return
}
_, err = vm.Run(script)
})
return err return err
} }