Refactored CALLDATALOAD to use big int

* Added BigMin
pull/150/head
obscuren 10 years ago
parent eab0b2a90a
commit 20ee1ae65e
  1. 14
      ethchain/vm.go
  2. 19
      ethutil/big.go
  3. 12
      ethutil/common.go

@ -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)

@ -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
}

@ -58,9 +58,11 @@ func CurrencyToString(num *big.Int) string {
// Common big integers often used
var (
Big1 = big.NewInt(1)
Big2 = big.NewInt(2)
Big0 = big.NewInt(0)
Big32 = big.NewInt(32)
Big256 = big.NewInt(0xff)
Big1 = big.NewInt(1)
Big2 = big.NewInt(2)
Big0 = big.NewInt(0)
BigTrue = Big1
BigFalse = Big0
Big32 = big.NewInt(32)
Big256 = big.NewInt(0xff)
)

Loading…
Cancel
Save