github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/chain/core/vm/common.go (about)

     1  package vm
     2  
     3  import (
     4  	"math/big"
     5  
     6  	"github.com/neatlab/neatio/utilities/common"
     7  	"github.com/neatlab/neatio/utilities/common/math"
     8  )
     9  
    10  func calcMemSize64(off, l *big.Int) (uint64, bool) {
    11  	if !l.IsUint64() {
    12  		return 0, true
    13  	}
    14  	return calcMemSize64WithUint(off, l.Uint64())
    15  }
    16  
    17  func calcMemSize64WithUint(off *big.Int, length64 uint64) (uint64, bool) {
    18  
    19  	if length64 == 0 {
    20  		return 0, false
    21  	}
    22  
    23  	if !off.IsUint64() {
    24  		return 0, true
    25  	}
    26  	offset64 := off.Uint64()
    27  	val := offset64 + length64
    28  
    29  	return val, val < offset64
    30  }
    31  
    32  func getData(data []byte, start uint64, size uint64) []byte {
    33  	length := uint64(len(data))
    34  	if start > length {
    35  		start = length
    36  	}
    37  	end := start + size
    38  	if end > length {
    39  		end = length
    40  	}
    41  	return common.RightPadBytes(data[start:end], int(size))
    42  }
    43  
    44  func getDataBig(data []byte, start *big.Int, size *big.Int) []byte {
    45  	dlen := big.NewInt(int64(len(data)))
    46  
    47  	s := math.BigMin(start, dlen)
    48  	e := math.BigMin(new(big.Int).Add(s, size), dlen)
    49  	return common.RightPadBytes(data[s.Uint64():e.Uint64()], int(size.Uint64()))
    50  }
    51  
    52  func bigUint64(v *big.Int) (uint64, bool) {
    53  	return v.Uint64(), !v.IsUint64()
    54  }
    55  
    56  func toWordSize(size uint64) uint64 {
    57  	if size > math.MaxUint64-31 {
    58  		return math.MaxUint64/32 + 1
    59  	}
    60  
    61  	return (size + 31) / 32
    62  }
    63  
    64  func allZero(b []byte) bool {
    65  	for _, byte := range b {
    66  		if byte != 0 {
    67  			return false
    68  		}
    69  	}
    70  	return true
    71  }