aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd/geth/js.go16
-rw-r--r--cmd/geth/main.go22
-rw-r--r--common/types.go2
-rw-r--r--common/types_test.go38
-rw-r--r--jsre/jsre.go9
5 files changed, 71 insertions, 16 deletions
diff --git a/cmd/geth/js.go b/cmd/geth/js.go
index 767b513c1..2b64303b2 100644
--- a/cmd/geth/js.go
+++ b/cmd/geth/js.go
@@ -123,7 +123,7 @@ func (self *jsre) batch(statement string) {
err := self.re.EvalAndPrettyPrint(statement)
if err != nil {
- fmt.Printf("error: %v", err)
+ fmt.Printf("%v", jsErrorString(err))
}
if self.atexit != nil {
@@ -301,21 +301,19 @@ func (self *jsre) preloadJSFiles(ctx *cli.Context) error {
for _, file := range jsFiles {
filename := common.AbsolutePath(assetPath, strings.TrimSpace(file))
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
}
-// exec executes the JS file with the given filename and stops the JSRE
-func (self *jsre) exec(filename string) error {
- if err := self.re.Exec(filename); err != nil {
- self.re.Stop(false)
- return fmt.Errorf("Javascript Error: %v", err)
+// jsErrorString adds a backtrace to errors generated by otto.
+func jsErrorString(err error) string {
+ if ottoErr, ok := err.(*otto.Error); ok {
+ return ottoErr.String()
}
- self.re.Stop(true)
- return nil
+ return err.Error()
}
func (self *jsre) interactive() {
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 6ab4ed45b..a43daba2f 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -21,6 +21,7 @@ import (
"fmt"
"io/ioutil"
"os"
+ "os/signal"
"path/filepath"
"runtime"
"strconv"
@@ -353,7 +354,7 @@ func console(ctx *cli.Context) {
// preload user defined JS files into the console
err = repl.preloadJSFiles(ctx)
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
@@ -372,6 +373,7 @@ func execScripts(ctx *cli.Context) {
// Create and start the node based on the CLI flags
node := utils.MakeSystemNode(ClientIdentifier, nodeNameVersion, makeDefaultExtra(), ctx)
startNode(ctx, node)
+ defer node.Stop()
// Attach to the newly started node and execute the given scripts
client, err := node.Attach()
@@ -383,10 +385,24 @@ func execScripts(ctx *cli.Context) {
ctx.GlobalString(utils.RPCCORSDomainFlag.Name),
client, false)
+ // Run all given files.
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
diff --git a/common/types.go b/common/types.go
index fec986164..d00884484 100644
--- a/common/types.go
+++ b/common/types.go
@@ -167,7 +167,7 @@ func (a Address) MarshalJSON() ([]byte, error) {
// Parse address from raw json data
func (a *Address) UnmarshalJSON(data []byte) error {
if len(data) > 2 && data[0] == '"' && data[len(data)-1] == '"' {
- data = data[:len(data)-1][1:]
+ data = data[1 : len(data)-1]
}
if len(data) > 2 && data[0] == '0' && data[1] == 'x' {
diff --git a/common/types_test.go b/common/types_test.go
index f2dfbf0c9..de67cfcb5 100644
--- a/common/types_test.go
+++ b/common/types_test.go
@@ -16,7 +16,10 @@
package common
-import "testing"
+import (
+ "math/big"
+ "testing"
+)
func TestBytesConversion(t *testing.T) {
bytes := []byte{5}
@@ -47,7 +50,38 @@ func TestHashJsonValidation(t *testing.T) {
}
for i, test := range tests {
if err := h.UnmarshalJSON(append([]byte(test.Prefix), make([]byte, test.Size)...)); err != test.Error {
- t.Error(i, "expected", test.Error, "got", err)
+ t.Errorf("test #%d: error mismatch: have %v, want %v", i, err, test.Error)
+ }
+ }
+}
+
+func TestAddressUnmarshalJSON(t *testing.T) {
+ var a Address
+ var tests = []struct {
+ Input string
+ ShouldErr bool
+ Output *big.Int
+ }{
+ {"", true, nil},
+ {`""`, true, nil},
+ {`"0x"`, true, nil},
+ {`"0x00"`, true, nil},
+ {`"0xG000000000000000000000000000000000000000"`, true, nil},
+ {`"0x0000000000000000000000000000000000000000"`, false, big.NewInt(0)},
+ {`"0x0000000000000000000000000000000000000010"`, false, big.NewInt(16)},
+ }
+ for i, test := range tests {
+ err := a.UnmarshalJSON([]byte(test.Input))
+ if err != nil && !test.ShouldErr {
+ t.Errorf("test #%d: unexpected error: %v", i, err)
+ }
+ if err == nil {
+ if test.ShouldErr {
+ t.Errorf("test #%d: expected error, got none", i)
+ }
+ if a.Big().Cmp(test.Output) != 0 {
+ t.Errorf("test #%d: address mismatch: have %v, want %v", i, a.Big(), test.Output)
+ }
}
}
}
diff --git a/jsre/jsre.go b/jsre/jsre.go
index 7df022cb1..59730bc0d 100644
--- a/jsre/jsre.go
+++ b/jsre/jsre.go
@@ -235,7 +235,14 @@ func (self *JSRE) Exec(file string) error {
if err != nil {
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
}