diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go index adba177d0..fde2697b8 100644 --- a/ethereal/ui/ui_lib.go +++ b/ethereal/ui/ui_lib.go @@ -94,7 +94,40 @@ type memAddr struct { Value string } -func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) (string, error) { +type Debugger struct { + ui *UiLib + next chan bool +} + +func (d *Debugger) halting(op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack) { + d.ui.win.Root().Call("clearMem") + d.ui.win.Root().Call("clearStack") + + addr := 0 + for i := 0; i+32 <= mem.Len(); i += 32 { + d.ui.win.Root().Call("setMem", memAddr{fmt.Sprintf("%03d", addr), fmt.Sprintf("% x", mem.Data()[i:i+32])}) + addr++ + } + + for _, val := range stack.Data() { + d.ui.win.Root().Call("setStack", val.String()) + } + +out: + for { + select { + case <-d.next: + break out + default: + } + } +} + +func (d *Debugger) Next() { + d.next <- true +} + +func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) { state := ui.eth.BlockChain().CurrentBlock.State() asm, err := mutan.Compile(strings.NewReader(data), false) @@ -126,21 +159,12 @@ 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++ - } + db := &Debugger{ui, make(chan bool)} + ui.engine.Context().SetVar("db", db) + go func() { + callerClosure.Call(vm, nil, db.halting) - for _, val := range stack.Data() { - ui.win.Root().Call("setStack", val.String()) - } - }) - state.Reset() - - return "", nil + state.Reset() + }() }