Fixed state object gas return
This commit is contained in:
@@ -11,13 +11,13 @@ type ClosureRef interface {
|
||||
ReturnGas(*big.Int, *big.Int, *State)
|
||||
Address() []byte
|
||||
GetMem(*big.Int) *ethutil.Value
|
||||
SetStore(*big.Int, *ethutil.Value)
|
||||
SetStorage(*big.Int, *ethutil.Value)
|
||||
N() *big.Int
|
||||
}
|
||||
|
||||
// Basic inline closure object which implement the 'closure' interface
|
||||
type Closure struct {
|
||||
callee *StateObject
|
||||
callee ClosureRef
|
||||
object *StateObject
|
||||
Script []byte
|
||||
State *State
|
||||
@@ -28,7 +28,7 @@ type Closure struct {
|
||||
}
|
||||
|
||||
// Create a new closure for the given data items
|
||||
func NewClosure(callee, object *StateObject, script []byte, state *State, gas, price *big.Int) *Closure {
|
||||
func NewClosure(callee ClosureRef, object *StateObject, script []byte, state *State, gas, price *big.Int) *Closure {
|
||||
c := &Closure{callee: callee, object: object, Script: script, State: state, Args: nil}
|
||||
|
||||
// In most cases gas, price and value are pointers to transaction objects
|
||||
@@ -118,7 +118,7 @@ func (c *Closure) Object() *StateObject {
|
||||
return c.object
|
||||
}
|
||||
|
||||
func (c *Closure) Callee() *StateObject {
|
||||
func (c *Closure) Callee() ClosureRef {
|
||||
return c.callee
|
||||
}
|
||||
|
||||
|
@@ -326,9 +326,15 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
|
||||
case CALLDATALOAD:
|
||||
require(1)
|
||||
offset := stack.Pop().Int64()
|
||||
val := closure.Args[offset : offset+32]
|
||||
|
||||
stack.Push(ethutil.BigD(val))
|
||||
var data []byte
|
||||
if len(closure.Args) >= int(offset+32) {
|
||||
data = closure.Args[offset : offset+32]
|
||||
} else {
|
||||
data = []byte{0}
|
||||
}
|
||||
|
||||
stack.Push(ethutil.BigD(data))
|
||||
case CALLDATASIZE:
|
||||
stack.Push(big.NewInt(int64(len(closure.Args))))
|
||||
case GASPRICE:
|
||||
@@ -498,7 +504,7 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
|
||||
contract.AddAmount(value)
|
||||
|
||||
// Create a new callable closure
|
||||
closure := NewClosure(closure.Object(), contract, contract.script, vm.state, gas, closure.Price)
|
||||
closure := NewClosure(closure, contract, contract.script, vm.state, gas, closure.Price)
|
||||
// Executer the closure and get the return value (if any)
|
||||
ret, _, err := closure.Call(vm, args, hook)
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user