|
|
@ -5,27 +5,9 @@ import ( |
|
|
|
"github.com/ethereum/eth-go/ethchain" |
|
|
|
"github.com/ethereum/eth-go/ethchain" |
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
"github.com/go-qml/qml" |
|
|
|
"github.com/go-qml/qml" |
|
|
|
"math/big" |
|
|
|
|
|
|
|
"strings" |
|
|
|
"strings" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func formatData(data string) []byte { |
|
|
|
|
|
|
|
if len(data) == 0 { |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// Simple stupid
|
|
|
|
|
|
|
|
d := new(big.Int) |
|
|
|
|
|
|
|
if data[0:1] == "\"" && data[len(data)-1:] == "\"" { |
|
|
|
|
|
|
|
d.SetBytes([]byte(data[1 : len(data)-1])) |
|
|
|
|
|
|
|
} else if data[:2] == "0x" { |
|
|
|
|
|
|
|
d.SetBytes(ethutil.FromHex(data[2:])) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
d.SetString(data, 0) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ethutil.BigToBytes(d, 256) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type DebuggerWindow struct { |
|
|
|
type DebuggerWindow struct { |
|
|
|
win *qml.Window |
|
|
|
win *qml.Window |
|
|
|
engine *qml.Engine |
|
|
|
engine *qml.Engine |
|
|
@ -77,17 +59,10 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data |
|
|
|
self.Db.Q <- true |
|
|
|
self.Db.Q <- true |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
defer func() { |
|
|
|
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
|
|
|
fmt.Println(r) |
|
|
|
|
|
|
|
self.Db.done = true |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { |
|
|
|
data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { |
|
|
|
slice := strings.Split(dataStr, "\n") |
|
|
|
slice := strings.Split(dataStr, "\n") |
|
|
|
for _, dataItem := range slice { |
|
|
|
for _, dataItem := range slice { |
|
|
|
d := formatData(dataItem) |
|
|
|
d := ethutil.FormatData(dataItem) |
|
|
|
ret = append(ret, d...) |
|
|
|
ret = append(ret, d...) |
|
|
|
} |
|
|
|
} |
|
|
|
return |
|
|
|
return |
|
|
@ -100,7 +75,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
ethutil.Config.Log.Debugln(err) |
|
|
|
self.Logln(err) |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
@ -130,11 +105,17 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data |
|
|
|
Coinbase: block.Coinbase, |
|
|
|
Coinbase: block.Coinbase, |
|
|
|
Time: block.Time, |
|
|
|
Time: block.Time, |
|
|
|
Diff: block.Difficulty, |
|
|
|
Diff: block.Difficulty, |
|
|
|
|
|
|
|
Value: ethutil.Big(valueStr), |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
self.Db.done = false |
|
|
|
self.Db.done = false |
|
|
|
go func() { |
|
|
|
go func() { |
|
|
|
callerClosure.Call(vm, data, self.Db.halting) |
|
|
|
ret, _, err := callerClosure.Call(vm, data, self.Db.halting) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
self.Logln("exited with errors:", err) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
self.Logf("exited: %v", ret) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
state.Reset() |
|
|
|
state.Reset() |
|
|
|
|
|
|
|
|
|
|
@ -142,6 +123,15 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data |
|
|
|
}() |
|
|
|
}() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (self *DebuggerWindow) Logf(format string, v ...interface{}) { |
|
|
|
|
|
|
|
self.win.Root().Call("setLog", fmt.Sprintf(format, v...)) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (self *DebuggerWindow) Logln(v ...interface{}) { |
|
|
|
|
|
|
|
str := fmt.Sprintln(v...) |
|
|
|
|
|
|
|
self.Logf("%s", str[:len(str)-1]) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *DebuggerWindow) Next() { |
|
|
|
func (self *DebuggerWindow) Next() { |
|
|
|
self.Db.Next() |
|
|
|
self.Db.Next() |
|
|
|
} |
|
|
|
} |
|
|
|