aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ethereal/assets/debugger/debugger.qml70
-rw-r--r--ethereal/debugger.go39
2 files changed, 91 insertions, 18 deletions
diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
index b93308b3e..579e8be3a 100644
--- a/ethereal/assets/debugger/debugger.qml
+++ b/ethereal/assets/debugger/debugger.qml
@@ -7,6 +7,7 @@ import QtQuick.Controls.Styles 1.1
import Ethereum 1.0
ApplicationWindow {
+ id: win
visible: false
title: "IceCREAM"
minimumWidth: 1280
@@ -17,6 +18,10 @@ ApplicationWindow {
property alias codeText: codeEditor.text
property alias dataText: rawDataField.text
+ onClosing: {
+ compileTimer.stop()
+ }
+
MenuBar {
Menu {
title: "Debugger"
@@ -34,12 +39,44 @@ ApplicationWindow {
MenuItem {
text: "Continue"
- shortcut: "Ctrl+c"
+ shortcut: "Ctrl+g"
onTriggered: dbg.continue()
}
+ MenuItem {
+ text: "Command"
+ shortcut: "Ctrl+l"
+ onTriggered: {
+ dbgCommand.focus = true
+ }
+ }
+ MenuItem {
+ text: "Focus code"
+ shortcut: "Ctrl+1"
+ onTriggered: {
+ codeEditor.focus = true
+ }
+ }
+ MenuItem {
+ text: "Focus data"
+ shortcut: "Ctrl+2"
+ onTriggered: {
+ rawDataField.focus = true
+ }
+ }
+
+ /*
+ MenuItem {
+ text: "Close window"
+ shortcut: "Ctrl+w"
+ onTriggered: {
+ win.close()
+ }
+ }
+ */
}
}
+
SplitView {
anchors.fill: parent
property var asmModel: ListModel {
@@ -73,6 +110,15 @@ ApplicationWindow {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: settings.left
+ focus: true
+
+ Timer {
+ id: compileTimer
+ interval: 500 ; running: true ; repeat: true
+ onTriggered: {
+ dbg.compile(codeEditor.text)
+ }
+ }
}
Column {
@@ -185,7 +231,7 @@ ApplicationWindow {
}
height: parent.height
width: parent.width
- TableViewColumn{ id: message ; role: "message" ; title: "log" ; width: logTableView.width }
+ TableViewColumn{ id: message ; role: "message" ; title: "log" ; width: logTableView.width -1 }
model: logModel
}
}
@@ -207,7 +253,7 @@ ApplicationWindow {
y: 1
x: asmTableView.width
width: 500
- placeholderText: "Debugger command (help for help)"
+ placeholderText: "Debugger (type 'help')"
Keys.onReturnPressed: {
exec()
}
@@ -225,6 +271,7 @@ ApplicationWindow {
}
toolBar: ToolBar {
+ height: 30
RowLayout {
spacing: 5
@@ -254,6 +301,23 @@ ApplicationWindow {
text: "Continue"
}
}
+
+
+ ComboBox {
+ id: snippets
+ anchors.right: parent.right
+ model: ListModel {
+ ListElement { text: "Snippets" ; value: "" }
+ ListElement { text: "Call Contract" ; value: "var[2] in;\nvar ret;\n\nin[0] = \"arg1\"\nin[1] = 0xdeadbeef\n\nvar success = call(0x0c542ddea93dae0c2fcb2cf175f03ad80d6be9a0, 0, 7000, in, ret)\n\nreturn ret" }
+ }
+ onCurrentIndexChanged: {
+ if(currentIndex != 0) {
+ var code = snippets.model.get(currentIndex).value;
+ codeEditor.insert(codeEditor.cursorPosition, code)
+ }
+ }
+ }
+
}
function debugCurrent() {
diff --git a/ethereal/debugger.go b/ethereal/debugger.go
index 8eab04b4d..d1516c5d5 100644
--- a/ethereal/debugger.go
+++ b/ethereal/debugger.go
@@ -52,13 +52,27 @@ func (self *DebuggerWindow) SetCode(code string) {
func (self *DebuggerWindow) SetData(data string) {
self.win.Set("dataText", data)
}
-func (self *DebuggerWindow) SetAsm(data string) {
- dis := ethchain.Disassemble(ethutil.Hex2Bytes(data))
+func (self *DebuggerWindow) SetAsm(data []byte) {
+ self.win.Root().Call("clearAsm")
+
+ dis := ethchain.Disassemble(data)
for _, str := range dis {
self.win.Root().Call("setAsm", str)
}
}
+func (self *DebuggerWindow) Compile(code string) {
+ var err error
+ script := ethutil.StringToByteFunc(code, func(s string) (ret []byte) {
+ ret, err = ethutil.Compile(s)
+ return
+ })
+
+ if err == nil {
+ self.SetAsm(script)
+ }
+}
+
func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, dataStr string) {
if !self.Db.done {
self.Db.Q <- true
@@ -91,27 +105,21 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
return
}
- dis := ethchain.Disassemble(script)
- self.win.Root().Call("clearAsm")
-
- for _, str := range dis {
- self.win.Root().Call("setAsm", str)
- }
+ self.SetAsm(script)
var (
gas = ethutil.Big(gasStr)
gasPrice = ethutil.Big(gasPriceStr)
value = ethutil.Big(valueStr)
// Contract addr as test address
- keyPair = self.lib.eth.KeyManager().KeyPair()
- callerTx = ethchain.NewContractCreationTx(ethutil.Big(valueStr), gas, gasPrice, script)
+ keyPair = self.lib.eth.KeyManager().KeyPair()
)
- callerTx.Sign(keyPair.PrivateKey)
- state := self.lib.eth.BlockChain().CurrentBlock.State()
+ state := self.lib.eth.StateManager().TransState()
account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address())
- contract := ethchain.MakeContract(callerTx, state)
+ contract := ethchain.NewStateObject([]byte{0})
contract.Amount = value
+
callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice)
block := self.lib.eth.BlockChain().CurrentBlock
@@ -179,8 +187,9 @@ func (self *DebuggerWindow) ExecCommand(command string) {
cmd := strings.Split(command, " ")
switch cmd[0] {
case "help":
- self.Logln("Debgger commands:")
- self.Logln("break, bp Set breakpoint")
+ self.Logln("Debugger commands:")
+ self.Logln("break, bp Set breakpoint on instruction")
+ self.Logln("clear [break, bp] Clears previous set sub-command(s)")
case "break", "bp":
if len(cmd) > 1 {
lineNo, err := strconv.Atoi(cmd[1])