aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-07-05 19:25:16 +0800
committerobscuren <geffobscura@gmail.com>2014-07-05 19:25:16 +0800
commit8e5117444ebfe4eac4aa96ae431dba5c67b2fcc6 (patch)
tree0399c40eff878c381413d96e2e304441edff775d
parent9754c01f561d2a9885e6fe06fe5ee459daff68e4 (diff)
downloaddexon-8e5117444ebfe4eac4aa96ae431dba5c67b2fcc6.tar.gz
dexon-8e5117444ebfe4eac4aa96ae431dba5c67b2fcc6.tar.zst
dexon-8e5117444ebfe4eac4aa96ae431dba5c67b2fcc6.zip
New type of debugger
-rw-r--r--ethereal/debugger.go44
1 files changed, 32 insertions, 12 deletions
diff --git a/ethereal/debugger.go b/ethereal/debugger.go
index 89e0f36eb..64ca316f8 100644
--- a/ethereal/debugger.go
+++ b/ethereal/debugger.go
@@ -15,9 +15,8 @@ type DebuggerWindow struct {
engine *qml.Engine
lib *UiLib
- vm *ethchain.Vm
- Db *Debugger
- breakPoints []int64
+ vm *ethchain.Vm
+ Db *Debugger
}
func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
@@ -30,9 +29,11 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
}
win := component.CreateWindow(nil)
- db := &Debugger{win, make(chan bool), make(chan bool), true, false}
- return &DebuggerWindow{engine: engine, win: win, lib: lib, Db: db, vm: &ethchain.Vm{}}
+ w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: &ethchain.Vm{}}
+ w.Db = NewDebugger(w)
+
+ return w
}
func (self *DebuggerWindow) Show() {
@@ -138,8 +139,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
Value: ethutil.Big(valueStr),
})
vm.Verbose = true
- vm.Hook = self.Db.halting
- vm.BreakPoints = self.breakPoints
+ vm.Dbg = self.Db
self.vm = vm
self.Db.done = false
@@ -201,8 +201,7 @@ func (self *DebuggerWindow) ExecCommand(command string) {
self.Logln(err)
break
}
- self.breakPoints = append(self.breakPoints, int64(lineNo))
- self.vm.BreakPoints = self.breakPoints
+ self.Db.breakPoints = append(self.Db.breakPoints, int64(lineNo))
self.Logf("break point set on instruction %d", lineNo)
} else {
self.Logf("'%s' requires line number", cmd[0])
@@ -211,8 +210,7 @@ func (self *DebuggerWindow) ExecCommand(command string) {
if len(cmd) > 1 {
switch cmd[1] {
case "break", "bp":
- self.breakPoints = nil
- self.vm.BreakPoints = nil
+ self.Db.breakPoints = nil
self.Logln("Breakpoints cleared")
case "log":
@@ -231,16 +229,38 @@ func (self *DebuggerWindow) ExecCommand(command string) {
}
type Debugger struct {
- win *qml.Window
N chan bool
Q chan bool
done, interrupt bool
+ breakPoints []int64
+ main *DebuggerWindow
+ win *qml.Window
+}
+
+func NewDebugger(main *DebuggerWindow) *Debugger {
+ db := &Debugger{make(chan bool), make(chan bool), true, false, nil, main, main.win}
+
+ return db
}
type storeVal struct {
Key, Value string
}
+func (self *Debugger) BreakHook(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack, stateObject *ethchain.StateObject) bool {
+ self.main.Logln("break on instr:", pc)
+
+ return self.halting(pc, op, mem, stack, stateObject)
+}
+
+func (self *Debugger) StepHook(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack, stateObject *ethchain.StateObject) bool {
+ return self.halting(pc, op, mem, stack, stateObject)
+}
+
+func (self *Debugger) BreakPoints() []int64 {
+ return self.breakPoints
+}
+
func (d *Debugger) halting(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack, stateObject *ethchain.StateObject) bool {
d.win.Root().Call("setInstruction", pc)
d.win.Root().Call("clearMem")