github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/vm/intpool.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2017 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package vm
    26  
    27  import (
    28  	"math/big"
    29  	"sync"
    30  )
    31  
    32  var checkVal = big.NewInt(-42)
    33  
    34  const poolLimit = 256
    35  
    36  //intpool是一个包含大整数的池,
    37  //可用于所有大的.int操作。
    38  type intPool struct {
    39  	pool *Stack
    40  }
    41  
    42  func newIntPool() *intPool {
    43  	return &intPool{pool: newstack()}
    44  }
    45  
    46  //get从池中检索一个大整数,如果池为空,则分配一个整数。
    47  //注意,返回的int值是任意的,不会归零!
    48  func (p *intPool) get() *big.Int {
    49  	if p.pool.len() > 0 {
    50  		return p.pool.pop()
    51  	}
    52  	return new(big.Int)
    53  }
    54  
    55  //GetZero从池中检索一个大整数,将其设置为零或分配
    56  //如果池是空的,就换一个新的。
    57  func (p *intPool) getZero() *big.Int {
    58  	if p.pool.len() > 0 {
    59  		return p.pool.pop().SetUint64(0)
    60  	}
    61  	return new(big.Int)
    62  }
    63  
    64  //Put返回一个分配给池的大int,以便稍后由get调用重用。
    65  //注意,保存为原样的值;既不放置也不获取零,整数都不存在!
    66  func (p *intPool) put(is ...*big.Int) {
    67  	if len(p.pool.data) > poolLimit {
    68  		return
    69  	}
    70  	for _, i := range is {
    71  //VerifyPool是一个生成标志。池验证确保完整性
    72  //通过将值与默认值进行比较来获得整数池的值。
    73  		if verifyPool {
    74  			i.Set(checkVal)
    75  		}
    76  		p.pool.push(i)
    77  	}
    78  }
    79  
    80  //Intpool池的默认容量
    81  const poolDefaultCap = 25
    82  
    83  //IntpoolPool管理Intpools池。
    84  type intPoolPool struct {
    85  	pools []*intPool
    86  	lock  sync.Mutex
    87  }
    88  
    89  var poolOfIntPools = &intPoolPool{
    90  	pools: make([]*intPool, 0, poolDefaultCap),
    91  }
    92  
    93  //GET正在寻找可返回的可用池。
    94  func (ipp *intPoolPool) get() *intPool {
    95  	ipp.lock.Lock()
    96  	defer ipp.lock.Unlock()
    97  
    98  	if len(poolOfIntPools.pools) > 0 {
    99  		ip := ipp.pools[len(ipp.pools)-1]
   100  		ipp.pools = ipp.pools[:len(ipp.pools)-1]
   101  		return ip
   102  	}
   103  	return newIntPool()
   104  }
   105  
   106  //放置已分配GET的池。
   107  func (ipp *intPoolPool) put(ip *intPool) {
   108  	ipp.lock.Lock()
   109  	defer ipp.lock.Unlock()
   110  
   111  	if len(ipp.pools) < cap(ipp.pools) {
   112  		ipp.pools = append(ipp.pools, ip)
   113  	}
   114  }