Fixes and improved debugger

This commit is contained in:
obscuren 2014-05-28 23:14:23 +02:00
parent 1eda1d25b0
commit 8fab7ce37d
5 changed files with 1228 additions and 1218 deletions

@ -7,12 +7,12 @@ import QtQuick.Controls.Styles 1.1
import Ethereum 1.0 import Ethereum 1.0
ApplicationWindow { ApplicationWindow {
visible: false visible: false
title: "IceCream" title: "IceCream"
minimumWidth: 1280 minimumWidth: 1280
minimumHeight: 900 minimumHeight: 900
width: 1290 width: 1290
height: 900 height: 900
property alias codeText: codeEditor.text property alias codeText: codeEditor.text
property alias dataText: rawDataField.text property alias dataText: rawDataField.text
@ -32,209 +32,229 @@ ApplicationWindow {
onTriggered: dbg.next() onTriggered: dbg.next()
} }
} }
} }
SplitView { SplitView {
anchors.fill: parent anchors.fill: parent
property var asmModel: ListModel { property var asmModel: ListModel {
id: asmModel id: asmModel
} }
TableView { TableView {
id: asmTableView id: asmTableView
width: 200 width: 200
TableViewColumn{ role: "value" ; title: "" ; width: 100 } TableViewColumn{ role: "value" ; title: "" ; width: 100 }
model: asmModel model: asmModel
} }
Rectangle { Rectangle {
color: "#00000000" color: "#00000000"
anchors.left: asmTableView.right anchors.left: asmTableView.right
anchors.right: parent.right anchors.right: parent.right
SplitView { SplitView {
orientation: Qt.Vertical orientation: Qt.Vertical
anchors.fill: parent anchors.fill: parent
Rectangle { Rectangle {
color: "#00000000" color: "#00000000"
height: 500 height: 500
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
TextArea { TextArea {
id: codeEditor id: codeEditor
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.right: settings.left anchors.right: settings.left
} }
Column { Column {
id: settings id: settings
spacing: 5 spacing: 5
width: 300 width: 300
height: parent.height height: parent.height
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
Label { Label {
text: "Arbitrary data" text: "Arbitrary data"
} }
TextArea { TextArea {
id: rawDataField id: rawDataField
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
height: 150 height: 150
} }
Label { Label {
text: "Amount" text: "Amount"
} }
TextField { TextField {
id: txValue id: txValue
width: 200 width: 200
placeholderText: "Amount" placeholderText: "Amount"
validator: RegExpValidator { regExp: /\d*/ } validator: RegExpValidator { regExp: /\d*/ }
} }
Label { Label {
text: "Amount of gas" text: "Amount of gas"
} }
TextField { TextField {
id: txGas id: txGas
width: 200 width: 200
validator: RegExpValidator { regExp: /\d*/ } validator: RegExpValidator { regExp: /\d*/ }
text: "10000" text: "10000"
placeholderText: "Gas" placeholderText: "Gas"
} }
Label { Label {
text: "Gas price" text: "Gas price"
} }
TextField { TextField {
id: txGasPrice id: txGasPrice
width: 200 width: 200
placeholderText: "Gas price" placeholderText: "Gas price"
text: "1000000000000" text: "1000000000000"
validator: RegExpValidator { regExp: /\d*/ } validator: RegExpValidator { regExp: /\d*/ }
} }
} }
} }
SplitView { SplitView {
orientation: Qt.Vertical orientation: Qt.Vertical
id: inspectorPane id: inspectorPane
height: 500 height: 500
SplitView { SplitView {
orientation: Qt.Horizontal orientation: Qt.Horizontal
height: 250 height: 150
TableView { TableView {
id: stackTableView id: stackTableView
property var stackModel: ListModel { property var stackModel: ListModel {
id: stackModel id: stackModel
} }
height: parent.height height: parent.height
width: 300 width: 300
TableViewColumn{ role: "value" ; title: "Stack" ; width: 200 } TableViewColumn{ role: "value" ; title: "Stack" ; width: 200 }
model: stackModel model: stackModel
} }
TableView { TableView {
id: memoryTableView id: memoryTableView
property var memModel: ListModel { property var memModel: ListModel {
id: memModel id: memModel
} }
height: parent.height height: parent.height
width: parent.width - stackTableView.width width: parent.width - stackTableView.width
TableViewColumn{ id:mnumColmn ; role: "num" ; title: "#" ; width: 50} TableViewColumn{ id:mnumColmn ; role: "num" ; title: "#" ; width: 50}
TableViewColumn{ role: "value" ; title: "Memory" ; width: 750} TableViewColumn{ role: "value" ; title: "Memory" ; width: 750}
model: memModel model: memModel
} }
} }
SplitView { Rectangle {
height: 300 height: 100
TableView { width: parent.width
id: storageTableView TableView {
property var memModel: ListModel { id: storageTableView
id: storageModel property var memModel: ListModel {
} id: storageModel
height: parent.height }
width: parent.width - stackTableView.width height: parent.height
TableViewColumn{ id: key ; role: "key" ; title: "#" ; width: storageTableView.width / 2} width: parent.width
TableViewColumn{ role: "value" ; title: "value" ; width: storageTableView.width / 2} TableViewColumn{ id: key ; role: "key" ; title: "#" ; width: storageTableView.width / 2}
model: storageModel TableViewColumn{ role: "value" ; title: "value" ; width: storageTableView.width / 2}
} model: storageModel
} }
} }
}
}
}
toolBar: ToolBar { Rectangle {
RowLayout { height: 200
spacing: 5 width: parent.width
TableView {
id: logTableView
property var logModel: ListModel {
id: logModel
}
height: parent.height
width: parent.width
TableViewColumn{ id: message ; role: "message" ; title: "log" ; width: logTableView.width }
model: logModel
}
}
}
}
}
}
Button { toolBar: ToolBar {
property var enabled: true RowLayout {
id: debugStart spacing: 5
onClicked: {
debugCurrent()
}
text: "Debug"
}
Button { Button {
property var enabled: true property var enabled: true
id: debugNextButton id: debugStart
onClicked: { onClicked: {
dbg.next() debugCurrent()
} }
text: "Next" text: "Debug"
} }
}
}
function debugCurrent() { Button {
dbg.debug(txValue.text, txGas.text, txGasPrice.text, codeEditor.text, rawDataField.text) property var enabled: true
} id: debugNextButton
onClicked: {
dbg.next()
}
text: "Next"
}
}
}
function setAsm(asm) { function debugCurrent() {
asmModel.append({asm: asm}) dbg.debug(txValue.text, txGas.text, txGasPrice.text, codeEditor.text, rawDataField.text)
} }
function clearAsm() { function setAsm(asm) {
asmModel.clear() asmModel.append({asm: asm})
} }
function setInstruction(num) { function clearAsm() {
asmTableView.selection.clear() asmModel.clear()
asmTableView.selection.select(num) }
}
function setMem(mem) { function setInstruction(num) {
memModel.append({num: mem.num, value: mem.value}) asmTableView.selection.clear()
} asmTableView.selection.select(num)
function clearMem(){ }
memModel.clear()
}
function setStack(stack) { function setMem(mem) {
stackModel.append({value: stack}) memModel.append({num: mem.num, value: mem.value})
} }
function addDebugMessage(message){ function clearMem(){
debuggerLog.append({value: message}) memModel.clear()
} }
function clearStack() { function setStack(stack) {
stackModel.clear() stackModel.append({value: stack})
} }
function addDebugMessage(message){
debuggerLog.append({value: message})
}
function clearStorage() { function clearStack() {
storageModel.clear() stackModel.clear()
} }
function setStorage(storage) { function clearStorage() {
storageModel.append({key: storage.key, value: storage.value}) storageModel.clear()
} }
function setStorage(storage) {
storageModel.append({key: storage.key, value: storage.value})
}
function setLog(msg) {
logModel.append({message: msg})
}
} }

File diff suppressed because it is too large Load Diff

@ -9,7 +9,7 @@
<script type="text/javascript"> <script type="text/javascript">
var jefcoinAddr = "518546ffa883dcc838a64bc2dabada0fd64af459" var jefcoinAddr = "de0bd4ea1947deabf1749d7ed633f289358c9f6c"
var mAddr = "" var mAddr = ""
function createTransaction() { function createTransaction() {

@ -5,27 +5,9 @@ import (
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/go-qml/qml" "github.com/go-qml/qml"
"math/big"
"strings" "strings"
) )
func formatData(data string) []byte {
if len(data) == 0 {
return nil
}
// Simple stupid
d := new(big.Int)
if data[0:1] == "\"" && data[len(data)-1:] == "\"" {
d.SetBytes([]byte(data[1 : len(data)-1]))
} else if data[:2] == "0x" {
d.SetBytes(ethutil.FromHex(data[2:]))
} else {
d.SetString(data, 0)
}
return ethutil.BigToBytes(d, 256)
}
type DebuggerWindow struct { type DebuggerWindow struct {
win *qml.Window win *qml.Window
engine *qml.Engine engine *qml.Engine
@ -77,17 +59,10 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
self.Db.Q <- true self.Db.Q <- true
} }
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
self.Db.done = true
}
}()
data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) {
slice := strings.Split(dataStr, "\n") slice := strings.Split(dataStr, "\n")
for _, dataItem := range slice { for _, dataItem := range slice {
d := formatData(dataItem) d := ethutil.FormatData(dataItem)
ret = append(ret, d...) ret = append(ret, d...)
} }
return return
@ -100,7 +75,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
}) })
if err != nil { if err != nil {
ethutil.Config.Log.Debugln(err) self.Logln(err)
return return
} }
@ -130,11 +105,17 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
Coinbase: block.Coinbase, Coinbase: block.Coinbase,
Time: block.Time, Time: block.Time,
Diff: block.Difficulty, Diff: block.Difficulty,
Value: ethutil.Big(valueStr),
}) })
self.Db.done = false self.Db.done = false
go func() { go func() {
callerClosure.Call(vm, data, self.Db.halting) ret, _, err := callerClosure.Call(vm, data, self.Db.halting)
if err != nil {
self.Logln("exited with errors:", err)
} else {
self.Logf("exited: %v", ret)
}
state.Reset() state.Reset()
@ -142,6 +123,15 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
}() }()
} }
func (self *DebuggerWindow) Logf(format string, v ...interface{}) {
self.win.Root().Call("setLog", fmt.Sprintf(format, v...))
}
func (self *DebuggerWindow) Logln(v ...interface{}) {
str := fmt.Sprintln(v...)
self.Logf("%s", str[:len(str)-1])
}
func (self *DebuggerWindow) Next() { func (self *DebuggerWindow) Next() {
self.Db.Next() self.Db.Next()
} }

@ -269,5 +269,5 @@ func (gui *Gui) Transact(recipient, value, gas, gasPrice, data string) (*ethpub.
func (gui *Gui) Create(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) { func (gui *Gui) Create(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) {
keyPair := ethutil.GetKeyRing().Get(0) keyPair := ethutil.GetKeyRing().Get(0)
return gui.pub.Create(ethutil.Hex(keyPair.PrivateKey), value, gas, gasPrice, data) return gui.pub.Transact(ethutil.Hex(keyPair.PrivateKey), recipient, value, gas, gasPrice, data)
} }