diff --git a/ethchain/vm.go b/ethchain/vm.go index cfedadb08d..769333649d 100644 --- a/ethchain/vm.go +++ b/ethchain/vm.go @@ -24,14 +24,10 @@ var ( GasTx = big.NewInt(500) ) -func CalculateTxGas(initSize *big.Int) *big.Int { - totalGas := new(big.Int) - - txTotalBytes := new(big.Int).Set(initSize) - txTotalBytes.Div(txTotalBytes, ethutil.Big32) - totalGas.Add(totalGas, new(big.Int).Mul(txTotalBytes, GasSStore)) - - return totalGas +type Debugger interface { + BreakHook(step int, op OpCode, mem *Memory, stack *Stack, stateObject *StateObject) bool + StepHook(step int, op OpCode, mem *Memory, stack *Stack, stateObject *StateObject) bool + BreakPoints() []int64 } type Vm struct { @@ -53,14 +49,13 @@ type Vm struct { err error // Debugging - Hook DebugHook + Dbg Debugger + BreakPoints []int64 Stepping bool Fn string } -type DebugHook func(step int, op OpCode, mem *Memory, stack *Stack, stateObject *StateObject) bool - type RuntimeVars struct { Origin []byte Block *Block @@ -754,12 +749,14 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) { vm.Endl() - if vm.Hook != nil { - for _, instrNo := range vm.BreakPoints { - if pc.Cmp(big.NewInt(instrNo)) == 0 || vm.Stepping { - vm.Stepping = true - - if !vm.Hook(prevStep, op, mem, stack, closure.Object()) { + if vm.Dbg != nil { + for _, instrNo := range vm.Dbg.BreakPoints() { + if pc.Cmp(big.NewInt(instrNo)) == 0 { + if !vm.Dbg.BreakHook(prevStep, op, mem, stack, closure.Object()) { + return nil, nil + } + } else if vm.Stepping { + if !vm.Dbg.StepHook(prevStep, op, mem, stack, closure.Object()) { return nil, nil } } diff --git a/ethlog/loggers.go b/ethlog/loggers.go index 9ebe590967..219c782408 100644 --- a/ethlog/loggers.go +++ b/ethlog/loggers.go @@ -39,7 +39,7 @@ func (msg *logMessage) send(logger LogSystem) { var logMessages chan (*logMessage) var logSystems []LogSystem -var drained = true +var quit chan bool type LogLevel uint8 @@ -54,6 +54,7 @@ const ( // log messages are dispatched to log writers func start() { +out: for { select { case msg := <-logMessages: @@ -62,15 +63,23 @@ func start() { msg.send(logSystem) } } - default: - drained = true + case <-quit: + break out } } } // waits until log messages are drained (dispatched to log writers) func Flush() { - for !drained { + quit <- true + +done: + for { + select { + case <-logMessages: + default: + break done + } } } @@ -88,6 +97,7 @@ func AddLogSystem(logSystem LogSystem) { defer mutex.Unlock() if logSystems == nil { logMessages = make(chan *logMessage) + quit = make(chan bool) go start() } logSystems = append(logSystems, logSystem) @@ -96,7 +106,6 @@ func AddLogSystem(logSystem LogSystem) { func (logger *Logger) sendln(level LogLevel, v ...interface{}) { if logMessages != nil { msg := newPrintlnLogMessage(level, logger.tag, v...) - drained = false logMessages <- msg } } @@ -104,7 +113,6 @@ func (logger *Logger) sendln(level LogLevel, v ...interface{}) { func (logger *Logger) sendf(level LogLevel, format string, v ...interface{}) { if logMessages != nil { msg := newPrintfLogMessage(level, logger.tag, format, v...) - drained = false logMessages <- msg } }