forked from cerc-io/plugeth
Added the possibility for debug hooks during closure call
This commit is contained in:
parent
7d6ba88d2b
commit
ca747f2688
@ -69,10 +69,12 @@ func (c *Closure) Address() []byte {
|
|||||||
return c.object.Address()
|
return c.object.Address()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Closure) Call(vm *Vm, args []byte) []byte {
|
type DebugHook func(op OpCode)
|
||||||
|
|
||||||
|
func (c *Closure) Call(vm *Vm, args []byte, hook DebugHook) []byte {
|
||||||
c.Args = args
|
c.Args = args
|
||||||
|
|
||||||
return vm.RunClosure(c)
|
return vm.RunClosure(c, hook)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Closure) Return(ret []byte) []byte {
|
func (c *Closure) Return(ret []byte) []byte {
|
||||||
|
@ -327,7 +327,7 @@ func (sm *StateManager) ProcessContract(contract *Contract, tx *Transaction, blo
|
|||||||
// XXX Tx data? Could be just an argument to the closure instead
|
// XXX Tx data? Could be just an argument to the closure instead
|
||||||
txData: nil,
|
txData: nil,
|
||||||
})
|
})
|
||||||
closure.Call(vm, nil)
|
closure.Call(vm, nil, nil)
|
||||||
|
|
||||||
// Update the account (refunds)
|
// Update the account (refunds)
|
||||||
sm.procState.UpdateAccount(tx.Sender(), caller)
|
sm.procState.UpdateAccount(tx.Sender(), caller)
|
||||||
|
@ -48,7 +48,7 @@ func NewVm(state *State, vars RuntimeVars) *Vm {
|
|||||||
|
|
||||||
var Pow256 = ethutil.BigPow(2, 256)
|
var Pow256 = ethutil.BigPow(2, 256)
|
||||||
|
|
||||||
func (vm *Vm) RunClosure(closure *Closure) []byte {
|
func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) []byte {
|
||||||
// If the amount of gas supplied is less equal to 0
|
// If the amount of gas supplied is less equal to 0
|
||||||
if closure.Gas.Cmp(big.NewInt(0)) <= 0 {
|
if closure.Gas.Cmp(big.NewInt(0)) <= 0 {
|
||||||
// TODO Do something
|
// TODO Do something
|
||||||
@ -372,7 +372,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
|||||||
// Create a new callable closure
|
// Create a new callable closure
|
||||||
closure := NewClosure(closure, contract, contract.script, vm.state, gas, value)
|
closure := NewClosure(closure, contract, contract.script, vm.state, gas, value)
|
||||||
// Executer the closure and get the return value (if any)
|
// Executer the closure and get the return value (if any)
|
||||||
ret := closure.Call(vm, args)
|
ret := closure.Call(vm, args, hook)
|
||||||
|
|
||||||
mem.Set(retOffset.Int64(), retSize.Int64(), ret)
|
mem.Set(retOffset.Int64(), retSize.Int64(), ret)
|
||||||
case oRETURN:
|
case oRETURN:
|
||||||
@ -404,44 +404,9 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pc.Add(pc, ethutil.Big1)
|
pc.Add(pc, ethutil.Big1)
|
||||||
|
|
||||||
|
if hook != nil {
|
||||||
|
hook(op)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func makeInlineTx(addr []byte, value, from, length *big.Int, contract *Contract, state *State) {
|
|
||||||
ethutil.Config.Log.Debugf(" => creating inline tx %x %v %v %v", addr, value, from, length)
|
|
||||||
j := int64(0)
|
|
||||||
dataItems := make([]string, int(length.Uint64()))
|
|
||||||
for i := from.Int64(); i < length.Int64(); i++ {
|
|
||||||
dataItems[j] = contract.GetMem(big.NewInt(j)).Str()
|
|
||||||
j++
|
|
||||||
}
|
|
||||||
|
|
||||||
tx := NewTransaction(addr, value, dataItems)
|
|
||||||
if tx.IsContract() {
|
|
||||||
contract := MakeContract(tx, state)
|
|
||||||
state.UpdateContract(contract)
|
|
||||||
} else {
|
|
||||||
account := state.GetAccount(tx.Recipient)
|
|
||||||
account.Amount.Add(account.Amount, tx.Value)
|
|
||||||
state.UpdateAccount(tx.Recipient, account)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns an address from the specified contract's address
|
|
||||||
func contractMemory(state *State, contractAddr []byte, memAddr *big.Int) *big.Int {
|
|
||||||
contract := state.GetContract(contractAddr)
|
|
||||||
if contract == nil {
|
|
||||||
log.Panicf("invalid contract addr %x", contractAddr)
|
|
||||||
}
|
|
||||||
val := state.trie.Get(memAddr.String())
|
|
||||||
|
|
||||||
// decode the object as a big integer
|
|
||||||
decoder := ethutil.NewValueFromBytes([]byte(val))
|
|
||||||
if decoder.IsNil() {
|
|
||||||
return ethutil.BigFalse
|
|
||||||
}
|
|
||||||
|
|
||||||
return decoder.BigInt()
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
@ -139,5 +139,5 @@ func TestRun4(t *testing.T) {
|
|||||||
// XXX Tx data? Could be just an argument to the closure instead
|
// XXX Tx data? Could be just an argument to the closure instead
|
||||||
txData: nil,
|
txData: nil,
|
||||||
})
|
})
|
||||||
callerClosure.Call(vm, nil)
|
callerClosure.Call(vm, nil, nil)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user