From ce43a9500f38bae426eef6c3c9d33e006c32c26d Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Sat, 12 Apr 2014 00:12:10 -0400
Subject: Debug steps

---
 ethereal/assets/qml/wallet.qml | 19 ++++++++-
 ethereal/ui/gui.go             |  4 +-
 ethereal/ui/library.go         |  1 +
 ethereal/ui/ui_lib.go          | 89 ++++++++++++++++++++++--------------------
 4 files changed, 68 insertions(+), 45 deletions(-)

(limited to 'ethereal')

diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index 2c8d1f241..22fe96e79 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -619,7 +619,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
@@ -664,10 +675,14 @@ ApplicationWindow {
 	}
 
 	function setAsm(asm) {
-		//for(var i = 0; i < asm.length; i++) {
 		asmModel.append({asm: asm})
-		//}
 	}
+
+	function setInstruction(num) {
+		asmTableView.selection.clear()
+		asmTableView.selection.select(num-1)
+	}
+
 	function clearAsm() {
 		asmModel.clear()
 	}
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index fa4a5c833..d6510bbb6 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -113,10 +113,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 08f99e7db..42aebcd87 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 fde2697b8..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,48 +95,11 @@ func DefaultAssetPath() string {
 	return base
 }
 
-type memAddr struct {
-	Num   string
-	Value string
-}
-
-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)
+	mainInput, _ := ethutil.PreProcess(data)
+	asm, err := mutan.Compile(strings.NewReader(mainInput), false)
 	if err != nil {
 		fmt.Println(err)
 	}
@@ -160,11 +129,47 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string)
 		TxData:      nil,
 	})
 
-	db := &Debugger{ui, make(chan bool)}
-	ui.engine.Context().SetVar("db", db)
 	go func() {
-		callerClosure.Call(vm, nil, db.halting)
+		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:
+		}
+	}
+}
+
+func (d *Debugger) Next() {
+	d.N <- true
+}
-- 
cgit v1.2.3