github.com/aquanetwork/aquachain@v1.7.8/core/vm/intpool.go (about) 1 // Copyright 2017 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 "math/big" 20 21 var checkVal = big.NewInt(-42) 22 23 const poolLimit = 256 24 25 // intPool is a pool of big integers that 26 // can be reused for all big.Int operations. 27 type intPool struct { 28 pool *Stack 29 } 30 31 func newIntPool() *intPool { 32 return &intPool{pool: newstack()} 33 } 34 35 func (p *intPool) get() *big.Int { 36 if p.pool.len() > 0 { 37 return p.pool.pop() 38 } 39 return new(big.Int) 40 } 41 func (p *intPool) put(is ...*big.Int) { 42 if len(p.pool.data) > poolLimit { 43 return 44 } 45 46 for _, i := range is { 47 // verifyPool is a build flag. Pool verification makes sure the integrity 48 // of the integer pool by comparing values to a default value. 49 if verifyPool { 50 i.Set(checkVal) 51 } 52 53 p.pool.push(i) 54 } 55 }