Merge branch 'develop' of github.com:ethereum/eth-go into feature/ethutil-refactor

This commit is contained in:
zelig 2014-07-05 12:53:00 +01:00
commit 4fb2905b1e
2 changed files with 28 additions and 23 deletions

@ -24,14 +24,10 @@ var (
GasTx = big.NewInt(500) GasTx = big.NewInt(500)
) )
func CalculateTxGas(initSize *big.Int) *big.Int { type Debugger interface {
totalGas := new(big.Int) BreakHook(step int, op OpCode, mem *Memory, stack *Stack, stateObject *StateObject) bool
StepHook(step int, op OpCode, mem *Memory, stack *Stack, stateObject *StateObject) bool
txTotalBytes := new(big.Int).Set(initSize) BreakPoints() []int64
txTotalBytes.Div(txTotalBytes, ethutil.Big32)
totalGas.Add(totalGas, new(big.Int).Mul(txTotalBytes, GasSStore))
return totalGas
} }
type Vm struct { type Vm struct {
@ -53,14 +49,13 @@ type Vm struct {
err error err error
// Debugging // Debugging
Hook DebugHook Dbg Debugger
BreakPoints []int64 BreakPoints []int64
Stepping bool Stepping bool
Fn string Fn string
} }
type DebugHook func(step int, op OpCode, mem *Memory, stack *Stack, stateObject *StateObject) bool
type RuntimeVars struct { type RuntimeVars struct {
Origin []byte Origin []byte
Block *Block Block *Block
@ -754,12 +749,14 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
vm.Endl() vm.Endl()
if vm.Hook != nil { if vm.Dbg != nil {
for _, instrNo := range vm.BreakPoints { for _, instrNo := range vm.Dbg.BreakPoints() {
if pc.Cmp(big.NewInt(instrNo)) == 0 || vm.Stepping { if pc.Cmp(big.NewInt(instrNo)) == 0 {
vm.Stepping = true if !vm.Dbg.BreakHook(prevStep, op, mem, stack, closure.Object()) {
return nil, nil
if !vm.Hook(prevStep, op, mem, stack, closure.Object()) { }
} else if vm.Stepping {
if !vm.Dbg.StepHook(prevStep, op, mem, stack, closure.Object()) {
return nil, nil return nil, nil
} }
} }

@ -39,7 +39,7 @@ func (msg *logMessage) send(logger LogSystem) {
var logMessages chan (*logMessage) var logMessages chan (*logMessage)
var logSystems []LogSystem var logSystems []LogSystem
var drained = true var quit chan bool
type LogLevel uint8 type LogLevel uint8
@ -54,6 +54,7 @@ const (
// log messages are dispatched to log writers // log messages are dispatched to log writers
func start() { func start() {
out:
for { for {
select { select {
case msg := <-logMessages: case msg := <-logMessages:
@ -62,15 +63,23 @@ func start() {
msg.send(logSystem) msg.send(logSystem)
} }
} }
default: case <-quit:
drained = true break out
} }
} }
} }
// waits until log messages are drained (dispatched to log writers) // waits until log messages are drained (dispatched to log writers)
func Flush() { 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() defer mutex.Unlock()
if logSystems == nil { if logSystems == nil {
logMessages = make(chan *logMessage) logMessages = make(chan *logMessage)
quit = make(chan bool)
go start() go start()
} }
logSystems = append(logSystems, logSystem) logSystems = append(logSystems, logSystem)
@ -96,7 +106,6 @@ func AddLogSystem(logSystem LogSystem) {
func (logger *Logger) sendln(level LogLevel, v ...interface{}) { func (logger *Logger) sendln(level LogLevel, v ...interface{}) {
if logMessages != nil { if logMessages != nil {
msg := newPrintlnLogMessage(level, logger.tag, v...) msg := newPrintlnLogMessage(level, logger.tag, v...)
drained = false
logMessages <- msg logMessages <- msg
} }
} }
@ -104,7 +113,6 @@ func (logger *Logger) sendln(level LogLevel, v ...interface{}) {
func (logger *Logger) sendf(level LogLevel, format string, v ...interface{}) { func (logger *Logger) sendf(level LogLevel, format string, v ...interface{}) {
if logMessages != nil { if logMessages != nil {
msg := newPrintfLogMessage(level, logger.tag, format, v...) msg := newPrintfLogMessage(level, logger.tag, format, v...)
drained = false
logMessages <- msg logMessages <- msg
} }
} }