Fixed debugger hang
This commit is contained in:
parent
cc20b0e3a0
commit
ba3623d0cc
@ -163,7 +163,7 @@ ApplicationWindow {
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
TableViewColumn{ id: key ; role: "key" ; title: "#" ; width: storageTableView.width / 2}
|
||||
TableViewColumn{ role: "value" ; title: "value" ; width: storageTableView.width / 2}
|
||||
TableViewColumn{ role: "value" ; title: "Storage" ; width: storageTableView.width / 2}
|
||||
model: storageModel
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
|
||||
}
|
||||
|
||||
win := component.CreateWindow(nil)
|
||||
db := &Debugger{win, make(chan bool), make(chan bool), true}
|
||||
db := &Debugger{win, make(chan bool), make(chan bool), true, false}
|
||||
|
||||
return &DebuggerWindow{engine: engine, win: win, lib: lib, Db: db}
|
||||
}
|
||||
@ -60,6 +60,12 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
|
||||
self.Db.Q <- true
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
self.Logf("compile FAULT: %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) {
|
||||
slice := strings.Split(dataStr, "\n")
|
||||
for _, dataItem := range slice {
|
||||
@ -131,7 +137,11 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
|
||||
|
||||
state.Reset()
|
||||
|
||||
self.Db.done = true
|
||||
if !self.Db.interrupt {
|
||||
self.Db.done = true
|
||||
} else {
|
||||
self.Db.interrupt = false
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
@ -149,10 +159,10 @@ func (self *DebuggerWindow) Next() {
|
||||
}
|
||||
|
||||
type Debugger struct {
|
||||
win *qml.Window
|
||||
N chan bool
|
||||
Q chan bool
|
||||
done bool
|
||||
win *qml.Window
|
||||
N chan bool
|
||||
Q chan bool
|
||||
done, interrupt bool
|
||||
}
|
||||
|
||||
type storeVal struct {
|
||||
@ -185,7 +195,8 @@ out:
|
||||
case <-d.N:
|
||||
break out
|
||||
case <-d.Q:
|
||||
d.done = true
|
||||
d.interrupt = true
|
||||
d.clearBuffers()
|
||||
|
||||
return false
|
||||
}
|
||||
@ -194,6 +205,19 @@ out:
|
||||
return true
|
||||
}
|
||||
|
||||
func (d *Debugger) clearBuffers() {
|
||||
out:
|
||||
// drain
|
||||
for {
|
||||
select {
|
||||
case <-d.N:
|
||||
case <-d.Q:
|
||||
default:
|
||||
break out
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Debugger) Next() {
|
||||
if !d.done {
|
||||
d.N <- true
|
||||
|
@ -154,7 +154,7 @@ func (gui *Gui) createWindow(comp qml.Object) *qml.Window {
|
||||
gui.win = win
|
||||
gui.uiLib.win = win
|
||||
|
||||
db := &Debugger{gui.win, make(chan bool), make(chan bool), true}
|
||||
db := &Debugger{gui.win, make(chan bool), make(chan bool), true, false}
|
||||
gui.lib.Db = db
|
||||
gui.uiLib.Db = db
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user