Refactored CALLDATALOAD to use big int

* Added BigMin
This commit is contained in:
obscuren 2014-07-21 20:38:43 +02:00
parent eab0b2a90a
commit 20ee1ae65e
3 changed files with 27 additions and 18 deletions

View File

@ -503,13 +503,17 @@ func (vm *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
vm.Printf(" => %v", vm.vars.Value) vm.Printf(" => %v", vm.vars.Value)
case CALLDATALOAD: case CALLDATALOAD:
require(1) require(1)
offset := stack.Pop().Int64() var (
offset = stack.Pop()
data = make([]byte, 32)
lenData = big.NewInt(int64(len(closure.Args)))
)
data := make([]byte, 32) if lenData.Cmp(offset) >= 0 {
if big.NewInt(int64(len(closure.Args))).Cmp(big.NewInt(offset)) >= 0 { length := new(big.Int).Add(offset, ethutil.Big32)
l := int64(math.Min(float64(offset+32), float64(len(closure.Args)))) length = ethutil.BigMin(length, lenData)
copy(data, closure.Args[offset:l]) copy(data, closure.Args[offset.Int64():length.Int64()])
} }
vm.Printf(" => 0x%x", data) vm.Printf(" => 0x%x", data)

View File

@ -4,14 +4,6 @@ import (
"math/big" "math/big"
) )
var BigInt0 *big.Int = big.NewInt(0)
// True
var BigTrue *big.Int = big.NewInt(1)
// False
var BigFalse *big.Int = big.NewInt(0)
// Big pow // Big pow
// //
// Returns the power of two big integers // Returns the power of two big integers
@ -73,3 +65,14 @@ func BigMax(x, y *big.Int) *big.Int {
return x return x
} }
// Big min
//
// Returns the minimum size big integer
func BigMin(x, y *big.Int) *big.Int {
if x.Cmp(y) >= 0 {
return y
}
return x
}

View File

@ -61,6 +61,8 @@ var (
Big1 = big.NewInt(1) Big1 = big.NewInt(1)
Big2 = big.NewInt(2) Big2 = big.NewInt(2)
Big0 = big.NewInt(0) Big0 = big.NewInt(0)
BigTrue = Big1
BigFalse = Big0
Big32 = big.NewInt(32) Big32 = big.NewInt(32)
Big256 = big.NewInt(0xff) Big256 = big.NewInt(0xff)
) )