good morning!!!!

Skip to content
Snippets Groups Projects
Commit 29499900 authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Added CALLSTATELESS

parent d91357d0
Branches
Tags
No related merge requests found
...@@ -283,7 +283,7 @@ func (self *StateTransition) Eval(msg *ethstate.Message, script []byte, context ...@@ -283,7 +283,7 @@ func (self *StateTransition) Eval(msg *ethstate.Message, script []byte, context
for e := vm.Queue().Front(); e != nil; e = e.Next() { for e := vm.Queue().Front(); e != nil; e = e.Next() {
msg := e.Value.(*ethvm.Message) msg := e.Value.(*ethvm.Message)
msg.Exec(transactor) msg.Exec(msg.Addr(), transactor)
} }
} }
......
...@@ -201,7 +201,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { ...@@ -201,7 +201,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
require(4) require(4)
newMemSize = stack.data[stack.Len()-1].Uint64() + stack.data[stack.Len()-4].Uint64() newMemSize = stack.data[stack.Len()-1].Uint64() + stack.data[stack.Len()-4].Uint64()
case CALL: case CALL, CALLSTATELESS:
require(7) require(7)
gas.Set(GasCall) gas.Set(GasCall)
addStepGasUsage(stack.data[stack.Len()-1]) addStepGasUsage(stack.data[stack.Len()-1])
...@@ -752,7 +752,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { ...@@ -752,7 +752,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
closure.UseGas(closure.Gas) closure.UseGas(closure.Gas)
msg := NewMessage(self, addr, input, gas, closure.Price, value) msg := NewMessage(self, addr, input, gas, closure.Price, value)
ret, err := msg.Exec(closure) ret, err := msg.Exec(addr, closure)
if err != nil { if err != nil {
stack.Push(ethutil.BigFalse) stack.Push(ethutil.BigFalse)
...@@ -816,7 +816,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { ...@@ -816,7 +816,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
if self.Dbg != nil { if self.Dbg != nil {
self.Dbg.SetCode(closure.Code) self.Dbg.SetCode(closure.Code)
} }
case CALL: case CALL, CALLSTATELESS:
require(7) require(7)
self.Endl() self.Endl()
...@@ -834,8 +834,15 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { ...@@ -834,8 +834,15 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
snapshot := self.env.State().Copy() snapshot := self.env.State().Copy()
msg := NewMessage(self, addr.Bytes(), args, gas, closure.Price, value) var executeAddr []byte
ret, err := msg.Exec(closure) if op == CALLSTATELESS {
executeAddr = closure.Address()
} else {
executeAddr = addr.Bytes()
}
msg := NewMessage(self, executeAddr, args, gas, closure.Price, value)
ret, err := msg.Exec(addr.Bytes(), closure)
if err != nil { if err != nil {
stack.Push(ethutil.BigFalse) stack.Push(ethutil.BigFalse)
...@@ -1017,7 +1024,11 @@ func (self *Message) Postpone() { ...@@ -1017,7 +1024,11 @@ func (self *Message) Postpone() {
self.vm.queue.PushBack(self) self.vm.queue.PushBack(self)
} }
func (self *Message) Exec(caller ClosureRef) (ret []byte, err error) { func (self *Message) Addr() []byte {
return self.address
}
func (self *Message) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err error) {
queue := self.vm.queue queue := self.vm.queue
self.vm.queue = list.New() self.vm.queue = list.New()
...@@ -1049,8 +1060,11 @@ func (self *Message) Exec(caller ClosureRef) (ret []byte, err error) { ...@@ -1049,8 +1060,11 @@ func (self *Message) Exec(caller ClosureRef) (ret []byte, err error) {
caller.Object().SubAmount(self.value) caller.Object().SubAmount(self.value)
stateObject.AddAmount(self.value) stateObject.AddAmount(self.value)
// Retrieve the executing code
code := self.vm.env.State().GetCode(codeAddr)
// Create a new callable closure // Create a new callable closure
c := NewClosure(msg, caller, object, object.Code, self.gas, self.price) c := NewClosure(msg, caller, object, code, self.gas, self.price)
// Executer the closure and get the return value (if any) // Executer the closure and get the return value (if any)
ret, _, err = c.Call(self.vm, self.input) ret, _, err = c.Call(self.vm, self.input)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment