diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml index a4d5cb6424..c3ddfe4b8c 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -371,7 +371,18 @@ ApplicationWindow { width: 800 height: 600 + + Item { + id: keyHandler + focus: true + Keys.onPressed: { + if (event.key == Qt.Key_Space) { + ui.next() + } + } + } SplitView { + anchors.fill: parent property var asmModel: ListModel { id: asmModel @@ -416,59 +427,63 @@ ApplicationWindow { } function setAsm(asm) { - //for(var i = 0; i < asm.length; i++) { - asmModel.append({asm: asm}) - //} - } - function clearAsm() { - asmModel.clear() - } + asmModel.append({asm: asm}) + } - function setMem(mem) { - memModel.append({num: mem.num, value: mem.value}) - } - function clearMem(){ - memModel.clear() - } + function setInstruction(num) { + asmTableView.selection.clear() + asmTableView.selection.select(num-1) + } - function setStack(stack) { - stackModel.append({value: stack}) - } + function clearAsm() { + asmModel.clear() + } - function clearStack() { - stackModel.clear() - } + function setMem(mem) { + memModel.append({num: mem.num, value: mem.value}) + } + function clearMem(){ + memModel.clear() + } - function loadPlugin(name) { - console.log("Loading plugin" + name) - mainView.addPlugin(name) - } + function setStack(stack) { + stackModel.append({value: stack}) + } - function setWalletValue(value) { - walletValueLabel.text = value - } + function clearStack() { + stackModel.clear() + } - function addTx(tx) { - var isContract - if (tx.contract == true){ - isContract = "Yes" - }else{ - isContract = "No" - } - txModel.insert(0, {hash: tx.hash, address: tx.address, value: tx.value, contract: isContract}) - } + function loadPlugin(name) { + console.log("Loading plugin" + name) + mainView.addPlugin(name) + } - function addBlock(block) { - blockModel.insert(0, {number: block.number, hash: block.hash}) - } + function setWalletValue(value) { + walletValueLabel.text = value + } - function addLog(str) { - if(str.len != 0) { - logModel.append({description: str}) - } + function addTx(tx) { + var isContract + if (tx.contract == true){ + isContract = "Yes" + }else{ + isContract = "No" } + txModel.insert(0, {hash: tx.hash, address: tx.address, value: tx.value, contract: isContract}) + } - function setPeers(text) { - peerLabel.text = text + function addBlock(block) { + blockModel.insert(0, {number: block.number, hash: block.hash}) + } + + function addLog(str) { + if(str.len != 0) { + logModel.append({description: str}) } } + + function setPeers(text) { + peerLabel.text = text + } +} diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index c09c5954f0..1065b716e6 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -115,10 +115,12 @@ func (ui *Gui) Start(assetPath string) { ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'") panic(err) } - ui.engine.LoadFile(uiLib.AssetPath("qml/transactions.qml")) ui.win = component.CreateWindow(nil) uiLib.win = ui.win + db := &Debugger{ui.win, make(chan bool)} + ui.lib.Db = db + uiLib.Db = db // Register the ui as a block processor //ui.eth.BlockManager.SecondaryBlockProcessor = ui diff --git a/ethereal/ui/library.go b/ethereal/ui/library.go index 08f99e7dba..42aebcd872 100644 --- a/ethereal/ui/library.go +++ b/ethereal/ui/library.go @@ -15,6 +15,7 @@ type EthLib struct { stateManager *ethchain.StateManager blockChain *ethchain.BlockChain txPool *ethchain.TxPool + Db *Debugger } func (lib *EthLib) ImportAndSetPrivKey(privKey string) bool { diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go index adba177d0b..86855290fb 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 }