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)
case CALLDATALOAD:
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 big.NewInt(int64(len(closure.Args))).Cmp(big.NewInt(offset)) >= 0 {
l := int64(math.Min(float64(offset+32), float64(len(closure.Args))))
if lenData.Cmp(offset) >= 0 {
length := new(big.Int).Add(offset, ethutil.Big32)
length = ethutil.BigMin(length, lenData)
copy(data, closure.Args[offset:l])
copy(data, closure.Args[offset.Int64():length.Int64()])
}
vm.Printf(" => 0x%x", data)

View File

@ -4,14 +4,6 @@ import (
"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
//
// Returns the power of two big integers
@ -73,3 +65,14 @@ func BigMax(x, y *big.Int) *big.Int {
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)
Big2 = big.NewInt(2)
Big0 = big.NewInt(0)
BigTrue = Big1
BigFalse = Big0
Big32 = big.NewInt(32)
Big256 = big.NewInt(0xff)
)