From c1ef19bef9d4207b5f7d6fc5ff40375a5f0d203b Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 3 Mar 2015 11:11:11 +0100 Subject: quad mem --- tests/helper/vm.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index f1c1ffdfc..a1a1a98ca 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -28,6 +28,8 @@ type Env struct { gasLimit *big.Int logs state.Logs + + vmTest bool } func NewEnv(state *state.StateDB) *Env { @@ -92,20 +94,38 @@ func (self *Env) vm(addr, data []byte, gas, price, value *big.Int) *core.Executi } func (self *Env) Call(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + if self.vmTest && self.depth > 0 { + caller.ReturnGas(gas, price) + + return nil, nil + } exe := self.vm(addr, data, gas, price, value) ret, err := exe.Call(addr, caller) self.Gas = exe.Gas return ret, err + } func (self *Env) CallCode(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { + if self.vmTest && self.depth > 0 { + caller.ReturnGas(gas, price) + } exe := self.vm(caller.Address(), data, gas, price, value) return exe.Call(addr, caller) } func (self *Env) Create(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ContextRef) { exe := self.vm(addr, data, gas, price, value) - return exe.Create(caller) + if self.vmTest { + caller.ReturnGas(gas, price) + + nonce := self.state.GetNonce(caller.Address()) + obj := self.state.GetOrNewStateObject(crypto.CreateAddress(caller.Address(), nonce)) + + return nil, nil, obj + } else { + return exe.Create(caller) + } } func RunVm(state *state.StateDB, env, exec map[string]string) ([]byte, state.Logs, *big.Int, error) { @@ -123,6 +143,7 @@ func RunVm(state *state.StateDB, env, exec map[string]string) ([]byte, state.Log caller := state.GetOrNewStateObject(from) vmenv := NewEnvFromMap(state, env, exec) + vmenv.vmTest = true vmenv.skipTransfer = true vmenv.initial = true ret, err := vmenv.Call(caller, to, data, gas, price, value) -- cgit v1.2.3 From 49da6a8d809ecc5f5b1f3c5ccea9ebcd45d4e1c3 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 3 Mar 2015 11:56:28 +0100 Subject: Fixed test helper --- tests/helper/vm.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index a1a1a98ca..8811936fa 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -109,6 +109,8 @@ func (self *Env) Call(caller vm.ContextRef, addr, data []byte, gas, price, value func (self *Env) CallCode(caller vm.ContextRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { if self.vmTest && self.depth > 0 { caller.ReturnGas(gas, price) + + return nil, nil } exe := self.vm(caller.Address(), data, gas, price, value) return exe.Call(addr, caller) -- cgit v1.2.3 From c74c07eed19f8a328f47aca7b9e01dcdf8731847 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 3 Mar 2015 16:20:38 +0100 Subject: Fixed error for invalid transaction --- tests/helper/vm.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index 8811936fa..9ebf8f8b6 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -167,6 +167,7 @@ func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state. // Set pre compiled contracts vm.Precompiled = vm.PrecompiledContracts() + snapshot := statedb.Copy() coinbase := statedb.GetOrNewStateObject(caddr) coinbase.SetGasPool(ethutil.Big(env["currentGasLimit"])) @@ -175,6 +176,9 @@ func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state. st := core.NewStateTransition(vmenv, message, coinbase) vmenv.origin = keyPair.Address() ret, err := st.TransitionState() + if core.IsNonceErr(err) || core.IsInvalidTxErr(err) { + statedb.Set(snapshot) + } statedb.Update(vmenv.Gas) return ret, vmenv.logs, vmenv.Gas, err -- cgit v1.2.3