github.com/aquanetwork/aquachain@v1.7.8/core/vm/common.go (about) 1 // Copyright 2014 The aquachain Authors 2 // This file is part of the aquachain library. 3 // 4 // The aquachain library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The aquachain library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the aquachain library. If not, see <http://www.gnu.org/licenses/>. 16 17 package vm 18 19 import ( 20 "math/big" 21 22 "gitlab.com/aquachain/aquachain/common" 23 "gitlab.com/aquachain/aquachain/common/math" 24 ) 25 26 // calculates the memory size required for a step 27 func calcMemSize(off, l *big.Int) *big.Int { 28 if l.Sign() == 0 { 29 return common.Big0 30 } 31 32 return new(big.Int).Add(off, l) 33 } 34 35 // getData returns a slice from the data based on the start and size and pads 36 // up to size with zero's. This function is overflow safe. 37 func getData(data []byte, start uint64, size uint64) []byte { 38 length := uint64(len(data)) 39 if start > length { 40 start = length 41 } 42 end := start + size 43 if end > length { 44 end = length 45 } 46 return common.RightPadBytes(data[start:end], int(size)) 47 } 48 49 // getDataBig returns a slice from the data based on the start and size and pads 50 // up to size with zero's. This function is overflow safe. 51 func getDataBig(data []byte, start *big.Int, size *big.Int) []byte { 52 dlen := big.NewInt(int64(len(data))) 53 54 s := math.BigMin(start, dlen) 55 e := math.BigMin(new(big.Int).Add(s, size), dlen) 56 return common.RightPadBytes(data[s.Uint64():e.Uint64()], int(size.Uint64())) 57 } 58 59 // bigUint64 returns the integer casted to a uint64 and returns whether it 60 // overflowed in the process. 61 func bigUint64(v *big.Int) (uint64, bool) { 62 return v.Uint64(), v.BitLen() > 64 63 } 64 65 // toWordSize returns the ceiled word size required for memory expansion. 66 func toWordSize(size uint64) uint64 { 67 if size > math.MaxUint64-31 { 68 return math.MaxUint64/32 + 1 69 } 70 71 return (size + 31) / 32 72 } 73 74 func allZero(b []byte) bool { 75 for _, byte := range b { 76 if byte != 0 { 77 return false 78 } 79 } 80 return true 81 }