diff options
author | obscuren <geffobscura@gmail.com> | 2014-10-17 00:27:05 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-10-17 00:27:05 +0800 |
commit | 93fcabd25189b447cc5c52523134cca2fa1d794e (patch) | |
tree | 152b24831fbb2d547bc2189b0b92a2b18c8f64b7 /ethvm/execution.go | |
parent | bb5038699ef7e08054ef154107e359dce2e3b106 (diff) | |
download | go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.tar go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.tar.gz go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.tar.bz2 go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.tar.lz go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.tar.xz go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.tar.zst go-tangerine-93fcabd25189b447cc5c52523134cca2fa1d794e.zip |
Fixed most of the tests
Diffstat (limited to 'ethvm/execution.go')
-rw-r--r-- | ethvm/execution.go | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/ethvm/execution.go b/ethvm/execution.go index ce90ade15..f5f1ce70d 100644 --- a/ethvm/execution.go +++ b/ethvm/execution.go @@ -10,21 +10,27 @@ import ( type Execution struct { vm VirtualMachine - closure *Closure address, input []byte - gas, price, value *big.Int + Gas, price, value *big.Int object *ethstate.StateObject } func NewExecution(vm VirtualMachine, address, input []byte, gas, gasPrice, value *big.Int) *Execution { - return &Execution{vm: vm, address: address, input: input, gas: gas, price: gasPrice, value: value} + return &Execution{vm: vm, address: address, input: input, Gas: gas, price: gasPrice, value: value} } func (self *Execution) Addr() []byte { return self.address } -func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err error) { +func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) ([]byte, error) { + // Retrieve the executing code + code := self.vm.Env().State().GetCode(codeAddr) + + return self.exec(code, codeAddr, caller) +} + +func (self *Execution) exec(code, caddr []byte, caller ClosureRef) (ret []byte, err error) { env := self.vm.Env() snapshot := env.State().Copy() @@ -44,7 +50,7 @@ func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err object := caller.Object() if object.Balance.Cmp(self.value) < 0 { - caller.ReturnGas(self.gas, self.price) + caller.ReturnGas(self.Gas, self.price) err = fmt.Errorf("Insufficient funds to transfer value. Req %v, has %v", self.value, object.Balance) } else { @@ -55,23 +61,23 @@ func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err stateObject.AddAmount(self.value) // Pre-compiled contracts (address.go) 1, 2 & 3. - naddr := ethutil.BigD(codeAddr).Uint64() + naddr := ethutil.BigD(caddr).Uint64() if p := Precompiled[naddr]; p != nil { - if self.gas.Cmp(p.Gas) >= 0 { + if self.Gas.Cmp(p.Gas) >= 0 { ret = p.Call(self.input) self.vm.Printf("NATIVE_FUNC(%x) => %x", naddr, ret) } } else { + // Create a new callable closure + c := NewClosure(msg, caller, stateObject, code, self.Gas, self.price) + c.exe = self + if self.vm.Depth() == MaxCallDepth { - return nil, fmt.Errorf("Max call depth exceeded (%d)", MaxCallDepth) - } + c.UseGas(c.Gas) - // Retrieve the executing code - code := env.State().GetCode(codeAddr) + return c.Return(nil), fmt.Errorf("Max call depth exceeded (%d)", MaxCallDepth) + } - // Create a new callable closure - c := NewClosure(msg, caller, stateObject, code, self.gas, self.price) - c.exe = self // Executer the closure and get the return value (if any) ret, _, err = c.Call(self.vm, self.input) @@ -81,3 +87,7 @@ func (self *Execution) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err return } + +func (self *Execution) Create(caller ClosureRef) (ret []byte, err error) { + return self.exec(self.input, nil, caller) +} |