diff options
author | Maran <maran.hidskes@gmail.com> | 2014-04-15 01:48:15 +0800 |
---|---|---|
committer | Maran <maran.hidskes@gmail.com> | 2014-04-15 01:48:15 +0800 |
commit | 28a48f1d9a751c00f6bf6be198fc30ad792abf6f (patch) | |
tree | 262468da60af1205bd2d0ce5ccf0ba9944297216 /ethereal/ui/ui_lib.go | |
parent | 8a2698ad5e3d47db9175e838b0a16c3f59b6e071 (diff) | |
parent | d092d05a31554c37f4d7594d96ce9409082b5b20 (diff) | |
download | go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.tar go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.tar.gz go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.tar.bz2 go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.tar.lz go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.tar.xz go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.tar.zst go-tangerine-28a48f1d9a751c00f6bf6be198fc30ad792abf6f.zip |
Merge branch 'develop' of github.com:ethereum/go-ethereum into develop
Diffstat (limited to 'ethereal/ui/ui_lib.go')
-rw-r--r-- | ethereal/ui/ui_lib.go | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go index adba177d0..86855290f 100644 --- a/ethereal/ui/ui_lib.go +++ b/ethereal/ui/ui_lib.go @@ -16,6 +16,11 @@ import ( "strings" ) +type memAddr struct { + Num string + Value string +} + // UI Library that has some basic functionality exposed type UiLib struct { engine *qml.Engine @@ -24,6 +29,7 @@ type UiLib struct { assetPath string // The main application window win *qml.Window + Db *Debugger } func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { @@ -89,15 +95,11 @@ func DefaultAssetPath() string { return base } -type memAddr struct { - Num string - Value string -} - -func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) (string, error) { +func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) { state := ui.eth.BlockChain().CurrentBlock.State() - asm, err := mutan.Compile(strings.NewReader(data), false) + mainInput, _ := ethutil.PreProcess(data) + asm, err := mutan.Compile(strings.NewReader(mainInput), false) if err != nil { fmt.Println(err) } @@ -126,21 +128,48 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) Diff: block.Difficulty, TxData: nil, }) - callerClosure.Call(vm, nil, func(op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack) { - ui.win.Root().Call("clearMem") - ui.win.Root().Call("clearStack") - - addr := 0 - for i := 0; i+32 <= mem.Len(); i += 32 { - ui.win.Root().Call("setMem", memAddr{fmt.Sprintf("%03d", addr), fmt.Sprintf("% x", mem.Data()[i:i+32])}) - addr++ - } - for _, val := range stack.Data() { - ui.win.Root().Call("setStack", val.String()) + go func() { + callerClosure.Call(vm, nil, ui.Db.halting) + + state.Reset() + }() +} + +func (ui *UiLib) Next() { + ui.Db.Next() +} + +type Debugger struct { + win *qml.Window + N chan bool +} + +func (d *Debugger) halting(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack) { + d.win.Root().Call("setInstruction", pc) + d.win.Root().Call("clearMem") + d.win.Root().Call("clearStack") + + addr := 0 + for i := 0; i+32 <= mem.Len(); i += 32 { + d.win.Root().Call("setMem", memAddr{fmt.Sprintf("%03d", addr), fmt.Sprintf("% x", mem.Data()[i:i+32])}) + addr++ + } + + for _, val := range stack.Data() { + d.win.Root().Call("setStack", val.String()) + } + +out: + for { + select { + case <-d.N: + break out + default: } - }) - state.Reset() + } +} - return "", nil +func (d *Debugger) Next() { + d.N <- true } |