aboutsummaryrefslogtreecommitdiffstats
path: root/ethchain
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-04-11 20:28:30 +0800
committerobscuren <geffobscura@gmail.com>2014-04-11 20:28:30 +0800
commitca747f268800590ee855b1ce593b61e95d073311 (patch)
tree22c5aa975cec4835923a9ac752c1d243108c0c8f /ethchain
parent7d6ba88d2b4a263f2a898c3ef6d40e5258f96bb0 (diff)
downloadgo-tangerine-ca747f268800590ee855b1ce593b61e95d073311.tar
go-tangerine-ca747f268800590ee855b1ce593b61e95d073311.tar.gz
go-tangerine-ca747f268800590ee855b1ce593b61e95d073311.tar.bz2
go-tangerine-ca747f268800590ee855b1ce593b61e95d073311.tar.lz
go-tangerine-ca747f268800590ee855b1ce593b61e95d073311.tar.xz
go-tangerine-ca747f268800590ee855b1ce593b61e95d073311.tar.zst
go-tangerine-ca747f268800590ee855b1ce593b61e95d073311.zip
Added the possibility for debug hooks during closure call
Diffstat (limited to 'ethchain')
-rw-r--r--ethchain/closure.go6
-rw-r--r--ethchain/state_manager.go2
-rw-r--r--ethchain/vm.go45
-rw-r--r--ethchain/vm_test.go2
4 files changed, 11 insertions, 44 deletions
diff --git a/ethchain/closure.go b/ethchain/closure.go
index 8e57a0d03..3d15f2a99 100644
--- a/ethchain/closure.go
+++ b/ethchain/closure.go
@@ -69,10 +69,12 @@ func (c *Closure) Address() []byte {
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
- return vm.RunClosure(c)
+ return vm.RunClosure(c, hook)
}
func (c *Closure) Return(ret []byte) []byte {
diff --git a/ethchain/state_manager.go b/ethchain/state_manager.go
index 3043c3d15..111d2c019 100644
--- a/ethchain/state_manager.go
+++ b/ethchain/state_manager.go
@@ -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
txData: nil,
})
- closure.Call(vm, nil)
+ closure.Call(vm, nil, nil)
// Update the account (refunds)
sm.procState.UpdateAccount(tx.Sender(), caller)
diff --git a/ethchain/vm.go b/ethchain/vm.go
index dd99ee790..dce972cc7 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -48,7 +48,7 @@ func NewVm(state *State, vars RuntimeVars) *Vm {
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 closure.Gas.Cmp(big.NewInt(0)) <= 0 {
// TODO Do something
@@ -372,7 +372,7 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
// Create a new callable closure
closure := NewClosure(closure, contract, contract.script, vm.state, gas, value)
// 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)
case oRETURN:
@@ -404,44 +404,9 @@ func (vm *Vm) RunClosure(closure *Closure) []byte {
}
pc.Add(pc, ethutil.Big1)
- }
-}
-
-/*
-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
+ if hook != nil {
+ hook(op)
+ }
}
-
- return decoder.BigInt()
}
-*/
diff --git a/ethchain/vm_test.go b/ethchain/vm_test.go
index 4075dfbc6..5a1419c0f 100644
--- a/ethchain/vm_test.go
+++ b/ethchain/vm_test.go
@@ -139,5 +139,5 @@ func TestRun4(t *testing.T) {
// XXX Tx data? Could be just an argument to the closure instead
txData: nil,
})
- callerClosure.Call(vm, nil)
+ callerClosure.Call(vm, nil, nil)
}