aboutsummaryrefslogtreecommitdiffstats
path: root/ethereal
diff options
context:
space:
mode:
Diffstat (limited to 'ethereal')
-rw-r--r--ethereal/assets/debugger/debugger.qml114
-rw-r--r--ethereal/assets/qml/wallet.qml14
-rw-r--r--ethereal/ui/debugger.go86
-rw-r--r--ethereal/ui/ui_lib.go14
4 files changed, 222 insertions, 6 deletions
diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
new file mode 100644
index 000000000..b7d954e73
--- /dev/null
+++ b/ethereal/assets/debugger/debugger.qml
@@ -0,0 +1,114 @@
+import QtQuick 2.0
+import QtQuick.Controls 1.0;
+import QtQuick.Layouts 1.0;
+import QtQuick.Dialogs 1.0;
+import QtQuick.Window 2.1;
+import QtQuick.Controls.Styles 1.1
+import Ethereum 1.0
+
+ApplicationWindow {
+ id: debugWindow
+ visible: false
+ title: "Debugger"
+ minimumWidth: 600
+ minimumHeight: 600
+ width: 800
+ height: 600
+
+ SplitView {
+ anchors.fill: parent
+ property var asmModel: ListModel {
+ id: asmModel
+ }
+ TableView {
+ id: asmTableView
+ width: 200
+ TableViewColumn{ role: "value" ; title: "" ; width: 100 }
+ model: asmModel
+ }
+
+ Rectangle {
+ anchors.left: asmTableView.right
+ anchors.right: parent.right
+ SplitView {
+ orientation: Qt.Vertical
+ anchors.fill: parent
+
+ TableView {
+ property var memModel: ListModel {
+ id: memModel
+ }
+ height: parent.height/2
+ width: parent.width
+ TableViewColumn{ id:mnumColmn ; role: "num" ; title: "#" ; width: 50}
+ TableViewColumn{ role: "value" ; title: "Memory" ; width: 750}
+ model: memModel
+ }
+
+ SplitView {
+ orientation: Qt.Horizontal
+ TableView {
+ property var debuggerLog: ListModel {
+ id: debuggerLog
+ }
+ TableViewColumn{ role: "value"; title: "Debug messages" }
+ model: debuggerLog
+ }
+ TableView {
+ property var stackModel: ListModel {
+ id: stackModel
+ }
+ height: parent.height/2
+ width: parent.width
+ TableViewColumn{ role: "value" ; title: "Stack" ; width: 200 }
+ model: stackModel
+ }
+ }
+ }
+ }
+ }
+ statusBar: StatusBar {
+ RowLayout {
+ anchors.fill: parent
+ Button {
+ property var enabled: true
+ id: debugNextButton
+ onClicked: {
+ //db.next()
+ }
+ text: "Next"
+ }
+ }
+ }
+
+ function setAsm(asm) {
+ asmModel.append({asm: asm})
+ }
+
+ function setInstruction(num) {
+ asmTableView.selection.clear()
+ asmTableView.selection.select(num-1)
+ }
+
+ function clearAsm() {
+ asmModel.clear()
+ }
+
+ function setMem(mem) {
+ memModel.append({num: mem.num, value: mem.value})
+ }
+ function clearMem(){
+ memModel.clear()
+ }
+
+ function setStack(stack) {
+ stackModel.append({value: stack})
+ }
+ function addDebugMessage(message){
+ debuggerLog.append({value: message})
+ }
+
+ function clearStack() {
+ stackModel.clear()
+ }
+}
diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index f42cf3b1b..40de8624e 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -294,6 +294,7 @@ ApplicationWindow {
statusBar: StatusBar {
RowLayout {
anchors.fill: parent
+ /*
Button {
property var enabled: true
id: connectButton
@@ -304,10 +305,19 @@ ApplicationWindow {
}
text: "Connect"
}
+ */
+ Button {
+ property var enabled: true
+ id: debuggerWindow
+ onClicked: {
+ ui.startDebugger()
+ }
+ text: "Debugger"
+ }
Button {
id: importAppButton
- anchors.left: connectButton.right
+ anchors.left: debuggerWindow.right
anchors.leftMargin: 5
onClicked: openAppDialog.open()
text: "Import App"
@@ -473,7 +483,7 @@ ApplicationWindow {
}
height: parent.height/2
width: parent.width
- TableViewColumn{ role: "value" ; title: "Stack" ; width: parent.width }
+ TableViewColumn{ role: "value" ; title: "Stack" ; width: 300 }
model: stackModel
}
}
diff --git a/ethereal/ui/debugger.go b/ethereal/ui/debugger.go
new file mode 100644
index 000000000..4debc05b2
--- /dev/null
+++ b/ethereal/ui/debugger.go
@@ -0,0 +1,86 @@
+package ethui
+
+import (
+ "fmt"
+ "github.com/ethereum/eth-go/ethchain"
+ "github.com/ethereum/eth-go/ethutil"
+ "github.com/go-qml/qml"
+)
+
+type DebuggerWindow struct {
+ win *qml.Window
+ engine *qml.Engine
+ lib *UiLib
+ Db *Debugger
+}
+
+func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
+ engine := qml.NewEngine()
+ component, err := engine.LoadFile(lib.AssetPath("debugger/debugger.qml"))
+ if err != nil {
+ fmt.Println(err)
+
+ return nil
+ }
+
+ win := component.CreateWindow(nil)
+ db := &Debugger{win, make(chan bool), true}
+
+ return &DebuggerWindow{engine: engine, win: win, lib: lib, Db: db}
+}
+
+func (self *DebuggerWindow) Show() {
+ go func() {
+ self.win.Show()
+ self.win.Wait()
+ }()
+}
+
+func (self *DebuggerWindow) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) {
+ state := self.lib.eth.BlockChain().CurrentBlock.State()
+
+ script, err := ethutil.Compile(data)
+ if err != nil {
+ ethutil.Config.Log.Debugln(err)
+
+ return
+ }
+
+ dis := ethchain.Disassemble(script)
+ self.lib.win.Root().Call("clearAsm")
+
+ for _, str := range dis {
+ self.lib.win.Root().Call("setAsm", str)
+ }
+ // Contract addr as test address
+ keyPair := ethutil.GetKeyRing().Get(0)
+ callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), script)
+ callerTx.Sign(keyPair.PrivateKey)
+
+ account := self.lib.eth.StateManager().TransState().GetStateObject(keyPair.Address())
+ contract := ethchain.MakeContract(callerTx, state)
+ callerClosure := ethchain.NewClosure(account, contract, contract.Init(), state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr))
+
+ block := self.lib.eth.BlockChain().CurrentBlock
+ vm := ethchain.NewVm(state, self.lib.eth.StateManager(), ethchain.RuntimeVars{
+ Origin: account.Address(),
+ BlockNumber: block.BlockInfo().Number,
+ PrevHash: block.PrevHash,
+ Coinbase: block.Coinbase,
+ Time: block.Time,
+ Diff: block.Difficulty,
+ })
+
+ self.Db.done = false
+ go func() {
+ callerClosure.Call(vm, contract.Init(), self.Db.halting)
+
+ state.Reset()
+
+ self.Db.done = true
+ }()
+}
+
+func (self *DebuggerWindow) Next() {
+ self.Db.Next()
+}
diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go
index 51fa26a88..c3f9f52e6 100644
--- a/ethereal/ui/ui_lib.go
+++ b/ethereal/ui/ui_lib.go
@@ -90,6 +90,12 @@ func (ui *UiLib) AssetPath(p string) string {
return path.Join(ui.assetPath, p)
}
+func (self *UiLib) StartDebugger() {
+ dbWindow := NewDebuggerWindow(self)
+
+ dbWindow.Show()
+}
+
func DefaultAssetPath() string {
var base string
// If the current working directory is the go-ethereum dir
@@ -163,9 +169,7 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string)
}
func (ui *UiLib) Next() {
- if !ui.Db.done {
- ui.Db.Next()
- }
+ ui.Db.Next()
}
type Debugger struct {
@@ -200,5 +204,7 @@ out:
}
func (d *Debugger) Next() {
- d.N <- true
+ if !d.done {
+ d.N <- true
+ }
}